aiMap/src/components/map/index.vue
ylj20011123 7b28725b13 update
2025-11-21 09:38:07 +08:00

2120 lines
66 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.

<script setup lang="ts">
import "./index.less";
// @ts-ignore
import anhuiLine from "./component/anhuiLine";
// @ts-ignore
import yunanLine from "./component/yunanLine";
import { HeatmapLayer, LineLayer, Marker, PointLayer, Scene } from "@antv/l7";
import { GaodeMap } from "@antv/l7-maps";
import { nextTick, onMounted, reactive, ref, watch } from "vue";
import {
getFieldEnumTree,
getFieldGetFieEnumList,
handleGetBaiDuTrafficInfo,
handleGetDecryptString,
handleGetGDNearServiceList,
handleGetMapConfigByProvinceCode,
handleGetMonthlySPINCAnalysis,
handleGetNearServiceList,
handleGetPeriodWarningList,
handleGetProvinceVehicleTreeList,
handleGetServerpartList,
handleGetTransactionDetailList,
} from "./service";
import { handlegetServerConnec } from "../newService";
import { ElLoading, ElMessage } from "element-plus";
// @ts-ignore
import RobotDialogueBox from "./component/RobotDialogueBox.vue";
// @ts-ignore
import RightSearchBox from "./component/RightSearchBox.vue";
// @ts-ignore
import RightDetail from "./component/rightDetail.vue";
// @ts-ignore
import detailText from "./component/detailText";
// @ts-ignore
import RealBox from "./component/realBox.vue";
// @ts-ignore
import RevenueRate from "./component/RevenueRate.vue";
// @ts-ignore
import BusyRanking from "./component/BusyRanking.vue";
import moment from "moment";
import { useRoute } from "vue-router";
import {
formatNumber,
formatNumberData,
formatNumberTo,
parseThousandSeparatedNumber,
} from "../../options/serveice";
// 配色方案一
let colorList1 = [
"#4F83FA",
"#A39BFF",
"#63B6FC",
"#88DFB2",
"#88C3BF",
"#d9dcf3",
];
// 配色方案二
let colorList2 = [
"#627FFF",
"#F6976F",
"#FFDC84",
"#63B6FC",
"#73D6A3",
"#B4E6E3",
];
// 每个省份的 地图默认中心点位置设置
let mapCenter: any = {
"340000": [117.455467, 31.856928], // 安徽
"510000": [104.07, 30.67], // 四川
"520000": [106.71, 26.58], // 贵州
"530000": [102.8329, 24.88], // 云南
};
// 地图实例
const scene = ref<any>();
// 对话框的实例
const RobotDialogueBoxRef = ref();
// 右侧的选择实例
const RightSearchBoxRef = ref();
// 右侧详情抽屉
const RightDetailRef = ref();
// 顶部实时数据的组件
const RealBoxRef = ref();
// 营收区域的组件实例
const revenueRateRef = ref();
// 繁忙度排名的实例
const BusyRankingRef = ref();
// 悬浮框实例
const hoverPoint = ref<any>();
// 所有服务区的数据
let defaultServerPartList = reactive<any>([]);
// 服务区类型的枚举
let ServerpartTypeObj = reactive<any>({});
// 判断是否有加载效果
const isShowLoading = ref<boolean>(false);
// 当前选中的服务区
const currentServerPartDetail = ref<any>();
// 搜索选中的服务区id
let searchSelectServerPartId = reactive<any>([]);
// 当前右侧选中的查询类型
let nowSelectId = ref<string>("");
// 全部服务区的id集合
let allServerPartIdList = reactive<any>([]);
// 是否显示右侧的服务区详情
let showRightDetail = ref<boolean>(false);
// 关于省份的解密 即一些相关数据的带入
let baseInfoObj = ref<any>();
// 实时钱的数据对象
let realMoney = reactive<any>({});
// 片区对应的颜色
let SPREGIONTYPECOLOR = ref<any>();
// 机器人是否显示
let isShowAi = ref<boolean>(false);
// 服务区详情是否显示了
let isShowDetail = ref<boolean>(false);
// 显示实时营收的组件
let isShowRealData = ref<boolean>(false);
// 不同片区的标点颜色数组
let SPREGIONTYPECOLORList = reactive<any>([]);
// 实时经营数据的列表
let realRevenueList = reactive<any>([]);
// 当前到了第几批第五个
let nowFifthIndex = ref<number>(0);
// 地图的实时营收悬浮框
let mapTimer: any;
const route = useRoute();
console.log("route", route);
const pageType = ref(route.params.id); // 获取查询参数 id
// if (route.params.id === "16684D3D52B39939") {
// baseInfoObj.value.ProvinceCode = "340000";
// } else if (route.params.id === "FACB05FA9FFFC126") {
// baseInfoObj.value.ProvinceCode = "530000";
// }
// console.log("pageType", pageType);
onMounted(async () => {
const loadingInstance = ElLoading.service({
fullscreen: true,
background: "#00000080",
text: "数据加载中...",
});
// 先解密地址栏的内容
const data = await handleGetMapConfigByProvinceCode({
ProvinceCode: pageType.value,
});
baseInfoObj.value = data;
localStorage.setItem("baseInfoObj", JSON.stringify(data));
scene.value = new Scene({
id: "map",
map: new GaodeMap({
pitch: 0,
mapStyle: "amap://styles/dark",
center: mapCenter[baseInfoObj.value.ProvinceCode],
// baseInfoObj.value.ProvinceCode === "340000"
// ? [117.455467, 31.856928]
// : baseInfoObj.value.ProvinceCode === "530000"
// ? [102.8329, 24.88]
// : [117.455467, 31.856928],
zoom: 6,
minZoom: 5.5,
token: "edb93fe4f1b3d313128b82082c5b3877",
mapConfig: {
logoVisible: false,
},
}),
});
// 请求枚举
await handleGetEnumeration();
console.log("ServerpartTypeObj", ServerpartTypeObj);
// 请求到所有的服务区
await handleGetAllService();
// 给服务区标上点
handleAllServiceMarkedPoint();
// 标出安徽省的边界
handleGetAnHuiBoundary();
// 服务区实时数据
// handleGetRealServiceList();
hoverPoint.value = handlePointHover();
loadingInstance.close();
});
// 几个小方框的数据 一起调用的方法
const handleSmallBoxData = async () => {
revenueRateRef.value.handleGetData();
await BusyRankingRef.value.handleGetBusyRank();
};
// 标出安徽省的边界
const handleGetAnHuiBoundary = () => {
const blurLine = new LineLayer();
blurLine.name = "blurLine";
// 边界线数据
let provinceObj: any = anhuiLine;
let list: any = provinceObj[baseInfoObj.value.ProvinceCode];
console.log("handleGetAnHuiBoundary", list);
// let list: any =
// baseInfoObj.value.ProvinceCode === "340000"
// ? anhuiLine
// : baseInfoObj.value.ProvinceCode === "530000"
// ? yunanLine
// : [];
blurLine.source(list).size(1).style({
opacity: 0.6,
sourceColor: "#b6cad7",
targetColor: "#b6cad7",
linearDir: "horizontal",
});
scene.value.addLayer(blurLine);
};
// 请求拿到所有服务区数据
const handleGetAllService = async () => {
const req: any = {
Province_Code: baseInfoObj.value.ProvinceCode || "340000",
ShowWeather: true, // 显示天气
};
const data = await handleGetServerpartList(req);
let str: string = "";
console.log("data312312321321321", data);
if (data && data.length > 0) {
let res: any = [];
let allId: any = [];
let SPREGIONTYPETYPELIST: any = {};
// 属性值为具体的颜色
let SPREGIONTYPETYPEObj: any = {};
// 片区名称对应的 颜色数组 用于放在中间底部的
let SPREGIONTYPECOLORLIST: any = [];
let typeID: number = 0;
data.forEach((item: any) => {
if (item.SPREGIONTYPE_ID && item.SPREGIONTYPE_ID !== 89) {
if (
SPREGIONTYPETYPELIST[item.SPREGIONTYPE_ID] ||
SPREGIONTYPETYPELIST[item.SPREGIONTYPE_ID] === 0
) {
item.SPREGIONTYPETYPE = SPREGIONTYPETYPELIST[item.SPREGIONTYPE_ID];
} else {
SPREGIONTYPETYPELIST[item.SPREGIONTYPE_ID] = typeID;
item.SPREGIONTYPETYPE = typeID;
SPREGIONTYPETYPEObj[item.SPREGIONTYPE_ID] = colorList1[typeID];
SPREGIONTYPECOLORLIST.push({
label: item.SPREGIONTYPE_NAME,
value: colorList1[typeID],
});
typeID += 1;
}
if (item.SPREGIONTYPE_ID !== 89 && item.SPREGIONTYPE_ID) {
res.push(item);
allId.push(item.SERVERPART_ID.toString());
}
}
if (str) {
str += `
${item.SERVERPART_NAME} ${item.SERVERPART_ID}`;
} else {
str = `${item.SERVERPART_NAME} ${item.SERVERPART_ID}`;
}
});
defaultServerPartList = res;
allServerPartIdList = allId;
console.log("allId", allId.toString());
SPREGIONTYPECOLORList = SPREGIONTYPECOLORLIST;
SPREGIONTYPECOLOR.value = SPREGIONTYPETYPEObj;
}
return data;
};
// 给所有服务区标上圆点
const handleAllServiceMarkedPoint = async () => {
// 先判断有没有服务区 没有就去请求 有就直接拿
let list: any = [];
if (defaultServerPartList && defaultServerPartList.length > 0) {
list = defaultServerPartList;
} else {
list = await handleGetAllService();
}
// 标点
const pointLayer = new PointLayer({});
pointLayer.name = "pointLayer";
pointLayer.source(list, {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
pointLayer.shape("circle");
pointLayer.size(8);
pointLayer.color("SPREGIONTYPETYPE", (value) => {
return colorList1[value];
// return Number(value || 0) === 65 ||
// Number(value || 0) === 45 ||
// Number(value || 0) === 47
// ? "#34B6B7"
// : "#CEF8D6";
});
pointLayer.style({
opacity: 0.6,
});
pointLayer.on("mousemove", (ev: any) => {
const detail: any = ev.feature;
console.log('detaildetaildetail', detail)
hoverPoint.value.style.top = `${ev.y + 5}px`;
hoverPoint.value.style.left = `${ev.x + 5}px`;
hoverPoint.value.style.display = "block";
hoverPoint.value.innerHTML = `<div>
<div>${detail?.SERVERPART_NAME || ""}${detail?.SERVERPART_TYPE
? `${ServerpartTypeObj ? ServerpartTypeObj[detail?.SERVERPART_TYPE] : ""
}`
: ""
}</div>
${
// 天气
nowSelectId.value && nowSelectId.value.indexOf("1") !== -1
? `
<div style="background-color: black; color: white; border-radius: 5px; font-size: 14px; border: none;box-shadow: none;">
<div>天气情况:</div>
<div>${"今天"}${detail.weatherModel.DAY_WEATHER}${detail.weatherModel.NIGHT_WEATHER
},气温${detail.weatherModel.NIGHT_AIR_TEMPERATURE}℃~${detail.weatherModel.DAY_AIR_TEMPERATURE
}℃</div>
<div>${"明天"}${detail.tmwWeatherModel.DAY_WEATHER}${detail.tmwWeatherModel.NIGHT_WEATHER
},气温${detail.tmwWeatherModel.NIGHT_AIR_TEMPERATURE}℃~${detail.tmwWeatherModel.DAY_AIR_TEMPERATURE
}℃</div>
</div>
`
: ``
}
${
// 路况
(nowSelectId.value && nowSelectId.value.indexOf("2") !== -1) ||
detail.roadConditions
? `
<div style="max-height: 250px;overflow-y: auto">
<div>实时路况(${moment().format("YY月DD日 HH点mm分")}</div>
<div>${detail?.roadConditions?.EXPRESSWAY_NAME
? detail?.roadConditions?.EXPRESSWAY_NAME + ""
: ""
}${detail?.roadConditions?.evaluation?.status === 1
? "双向畅通"
: detail?.roadConditions?.evaluation?.status === 2
? "双向缓行"
: detail?.roadConditions?.evaluation?.status === 3
? "双向拥堵"
: ""
}</div>
</div>
`
: ""
}
${
// 热力图
nowSelectId.value && nowSelectId.value.indexOf("3") !== -1
? `<div>${moment().format("YYYY年MM月")}对客销售累计:${formatNumber(
detail?.revenueData / 10000
)}万元</div>`
: ""
}
${
// 车辆归属地
nowSelectId.value &&
nowSelectId.value.indexOf("4") !== -1 &&
detail.provinceListTooltip &&
detail.provinceListTooltip.length > 0
? `<div>
${detail.provinceListTooltip
.map(
(item: any) =>
`<div>${moment(moment().startOf("y")).format(
"YYYY年MM月"
)}${moment().format("YYYY年MM月")}${detail?.SERVERPART_NAME || ""
}总入区车流:${formatNumber(item.TotalCount || 0)}
${item.children?.length > 0
? `<div>${item.children
.map(
(subItem: any) =>
`<div>${subItem.ProvinceOrCityName
}:占比:${formatNumber(
(subItem.TotalCount / item.TotalCount) * 100
)}% Top3
${subItem.children && subItem.children.length > 0
? `<span>
${subItem.children
.map((thirdItem: any, thirdIndex: number) => {
return thirdItem.ProvinceOrCityName !== "其他"
? `${thirdItem.ProvinceOrCityName}`
: "";
})
.join("")}
</span>`
: ""
}</div>`
)
.join("")}
</div>`
: ""
}
</div>`
)
.join("")}
</div>`
: ""
}
${
// 经营业态
nowSelectId.value && nowSelectId.value.indexOf("5") !== -1
? `<div>
${detail?.tradeType || ""}${detail?.shopName ? `${detail?.shopName}` : ""
}
</div>`
: ""
}
${
// 预警类型
nowSelectId.value && nowSelectId.value.indexOf("6") !== -1
? `<div>
${detail?.waringText || ""}
</div>`
: ""
}
${
// 服务区繁忙程度
nowSelectId.value && nowSelectId.value.indexOf("8") !== -1
? `<div>对客销售:${detail.AVR_TICKET > 30
? "繁忙"
: detail.AVR_TICKET > 15 && detail.AVR_TICKET < 30
? "良好"
: "空闲"
}
</div>`
: ""
}
</div>`;
});
// 鼠标移出
pointLayer.on("mouseout", (ev: any) => {
hoverPoint.value.style.display = "none";
});
// 点击事件
pointLayer.on("click", (e) => {
console.log("e", e);
handleClickPointLayer(e.feature);
});
// 鼠标取消点击
pointLayer.on("unclick", () => {
handleChangeToDefault();
});
scene.value.addLayer(pointLayer);
};
// 点击服务区圆点触发的事件
const handleClickPointLayer = async (detail: any) => {
// 给当前选中的服务区存储值
currentServerPartDetail.value = detail;
// 地图上出现选中服务区的效果
handleAddSelect(detail);
// 先清空现有的全部图层
handleDeleteNoDefault(RightSearchBoxRef.value.selectFilterList);
// 查看右边选中了哪些 调用在新的上面
let nowSelect: string = RightSearchBoxRef.value.selectFilterList;
console.log("nowSelect", nowSelect);
await handleChangeMapShow(nowSelect, false);
// 右侧的详情抽屉
if (nowSelect.indexOf("99") !== -1) {
showRightDetail.value = false;
} else {
showRightDetail.value = true;
}
// 用户判断实时数据的右侧详情是否显示的判断
isShowDetail.value = true;
// // 对话框上方是否选中了
// let selectTab: any = RobotDialogueBoxRef.value.selectTab;
// RobotDialogueBoxRef.value.handleClickTab(selectTab);
};
// 给服务区圆点加上选中效果
const handleAddSelect = (detail: any) => {
let allLayers: any = scene.value.getLayers();
// 判断是否是预警时候的点击
let isWarning: boolean = false;
if (allLayers && allLayers.length > 0) {
allLayers.forEach((item: any) => {
if (item.name === "warningLayer") {
isWarning = true;
}
});
}
let current: any = handleGetThisLayer("lightPointLayer");
if (current) {
scene.value.removeLayer(current);
}
const lightPointLayer = new PointLayer({});
lightPointLayer.name = "lightPointLayer";
lightPointLayer.shape("circle");
lightPointLayer.size(15);
lightPointLayer.color("#efff19");
lightPointLayer.style({
opacity: 0.6,
});
lightPointLayer.source([detail], {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
scene.value.addLayer(lightPointLayer);
if (isWarning) {
console.log("detailisWarning", detail);
RightDetailRef.value.handleScrollProjectList(detail.warningShop);
}
};
// 点击垃圾桶 清除选中效果
const handleDeleteSelect = () => {
handleDeleteLayer("lightPointLayer");
handleDeleteLayer("nearServiceList");
currentServerPartDetail.value = undefined;
};
// 取消服务区选中等效果的实现方法
const handleChangeToDefault = () => {
// 清除当前选中的服务区值
currentServerPartDetail.value = undefined;
// 取消搜索选中的服务区
searchSelectServerPartId = [];
// 取消点击时要清除的图层名称列表
const list: any = ["lightPointLayer", "searchPointLayerText"];
list.forEach((item: any) => {
let current: any = handleGetThisLayer(item);
if (current) {
scene.value.removeLayer(current);
}
});
// 将进入搜索状态的服务区正常圆点 变回正常颜色
let current: any = handleGetThisLayer("pointLayer");
current.color("SPREGIONTYPETYPE", (value: number) => {
return colorList1[value];
// return Number(value || 0) === 65 ||
// Number(value || 0) === 45 ||
// Number(value || 0) === 47
// ? "#34B6B7"
// : "#CEF8D6";
});
current.render();
};
// 鼠标移入点触发的事件
const handlePointHover = () => {
const el = document.createElement("div");
el.style.background = "#000";
el.style.color = "#fff";
el.style.position = "absolute";
el.style.padding = "10px";
el.style.borderRadius = "10px";
el.style.zIndex = "9999";
el.style.transition = "0.5s";
el.style.display = "none";
const wrap: any = document.getElementById("map");
wrap.appendChild(el);
return el;
};
// 需要调用的枚举方法
const handleGetEnumeration = async () => {
const ServerpartTypeList = await getFieldEnumTree({
FieldExplainField: "SERVERPART_TYPE",
});
console.log("ServerpartTypeList", ServerpartTypeList);
const typeObj: any = {};
if (ServerpartTypeList && ServerpartTypeList.length > 0) {
ServerpartTypeList.forEach((item: any) => {
typeObj[item.value] = item.label;
});
}
ServerpartTypeObj = typeObj;
};
// 给传入的服务区 标上高亮点
// 判断当前是否已经存在高亮图层 如果存在的话 就改变值 不用重新添加图层
const handleLightServerpart = (infoList: any) => {
let current: any = handleGetThisLayer("searchPointLayerText");
let idList: any = infoList.split(",");
// infoList.forEach((item: any) => {
// idList.push(item.SERVERPART_ID);
// });
console.log("idList", idList);
searchSelectServerPartId = idList;
let searchRes: any = [];
defaultServerPartList.forEach((item: any) => {
if (idList.indexOf(item.SERVERPART_ID.toString()) !== -1) {
searchRes.push(item);
}
});
console.log("searchRes", searchRes);
// 删除原有的 添加新的
if (current) {
scene.value.removeLayer(current);
}
let searchPointLayerText = new PointLayer({
zIndex: 9,
});
searchPointLayerText.name = "searchPointLayerText";
searchPointLayerText.source(searchRes, {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
searchPointLayerText.shape("circle");
searchPointLayerText.size(8);
searchPointLayerText.color("#fdff3d");
searchPointLayerText.style({
opacity: 0.7, // 透明度
});
// searchPointLayerText.on("mousemove", (ev: any) => {
// const detail: any = ev.feature;
// hoverPoint.value.style.top = `${ev.y}px`;
// hoverPoint.value.style.left = `${ev.x}px`;
// hoverPoint.value.style.display = "block";
// hoverPoint.value.innerHTML = `<div>
// <div>${detail?.SERVERPART_NAME || ""}</div>
// </div>`;
// });
// // 鼠标移出
// searchPointLayerText.on("mouseout", (ev: any) => {
// hoverPoint.value.style.display = "none";
// });
scene.value.addLayer(searchPointLayerText);
};
// 传入服务区id 在地图上出现一个选中的效果 且 id只能传入一个服务区
const handleSelectedServerpart = (id: any) => {
if (defaultServerPartList && defaultServerPartList.length > 0) {
let seletObj: any = {};
defaultServerPartList.forEach((item: any) => {
if (item.SERVERPART_ID === id) {
seletObj = item;
}
});
}
};
// 查找当前全部图层中是否有传入的图层名称 有的话 输出图层数据
const handleGetThisLayer = (name: string) => {
let res: any;
let allLayers: any = scene.value.getLayers();
if (allLayers && allLayers.length > 0) {
allLayers.forEach((item: any) => {
if (item.name === name) {
res = item;
}
});
}
if (res) {
return res;
}
};
// 进入搜索状态 改变现在的服务区点位颜色 全部变成灰色
const handleEnterySearch = () => {
let current: any = handleGetThisLayer("pointLayer");
current.color("#dededd");
current.render();
};
// 添加天气效果
const handleAddWeather = () => {
console.log("defaultServerPartList", defaultServerPartList);
defaultServerPartList.forEach((item: any) => {
if (item.weatherModel) {
if (item.weatherModel.DAY_WEATHER_PIC) {
const el = document.createElement("div");
el.style.width = "32px";
el.style.height = "24px";
el.style.paddingBottom = "4px";
el.style.textAlign = "center";
// 创建并插入 <img> 元素
const img = document.createElement("img");
img.src = item.weatherModel.DAY_WEATHER_PIC;
img.style.width = "15px";
img.style.height = "15px";
img.style.borderRadius = "50%"; // 圆形图片(可选)
// img.title = item.DAY_WEATHER
el.appendChild(img);
const marker = new Marker({ element: el }).setLnglat([
item.SERVERPART_X,
item.SERVERPART_Y,
] as any);
if (currentServerPartDetail.value) {
if (
item.SERVERPART_ID === currentServerPartDetail.value.SERVERPART_ID
) {
scene.value.addMarker(marker);
}
} else if (
searchSelectServerPartId &&
searchSelectServerPartId.length > 0
) {
if (
searchSelectServerPartId.indexOf(item.SERVERPART_ID.toString()) !==
-1
) {
scene.value.addMarker(marker);
}
} else {
scene.value.addMarker(marker);
}
}
}
});
};
// 遍历给实况车流图层的赋值
const handleSetCarData = async (
id: any,
roadTestList: any,
featuresList: any
) => {
let selectObj: any = {};
let selectRoad: any = {};
// 从服务区的道路名称的那个数组里面 取到现在的这个服务区数据
if (roadTestList && roadTestList.length > 0) {
roadTestList.forEach((item: any) => {
if (item.SERVERPART_ID.toString() === id) {
selectObj = item;
}
});
}
let data: any = {};
let roadItem: any = {};
let roadReq: any = {
RoadName: selectObj.EXPRESSWAY_NAME || "",
CityName: selectObj.SERVERPART_ADDRESS || "",
};
data = await handleGetBaiDuTrafficInfo(roadReq);
let roadRes: any = JSON.parse(data);
if (roadRes.status == 2) {
let roadReq: any = {
RoadName: selectObj.SERVERPART_NAME || "",
CityName: selectObj.SERVERPART_ADDRESS || "",
};
data = await handleGetBaiDuTrafficInfo(roadReq);
roadItem = JSON.parse(data);
} else {
roadItem = roadRes;
}
// let roadReq: any = {};
// let heightWay: any = [
// 366, 803, 381, 756, 708, 646, 805, 710, 476, 694, 714, 490, 658, 819, 659,
// 811, 716, 499, 941, 652, 943, 513, 510, 600, 707, 592, 706,
// ];
// if (heightWay.indexOf(Number(selectObj.SERVERPART_ID)) === -1) {
// roadReq = {
// RoadName: selectObj.SERVERPART_NAME || "",
// CityName: selectObj.SERVERPART_ADDRESS || "",
// };
// } else {
// roadReq = {
// RoadName: selectObj.EXPRESSWAY_NAME || "",
// CityName: selectObj.SERVERPART_ADDRESS || "",
// };
// }
// const data = await handleGetBaiDuTrafficInfo(roadReq);
// let roadItem: any = JSON.parse(data);
if (featuresList && featuresList.length > 0) {
featuresList.forEach((item: any) => {
if (item.properties.SERVERPART_ID.toString() === id) {
item.properties.expediteNumber =
roadItem.status === 0 ? roadItem.evaluation.status : null;
selectRoad = item;
}
});
}
// 给服务区的鼠标移入点位显示的内容
if (defaultServerPartList && defaultServerPartList.length > 0) {
defaultServerPartList.forEach((item: any) => {
if (item.SERVERPART_ID === selectObj.SERVERPART_ID) {
nextTick(() => {
item.roadConditions = {
...selectObj,
...roadItem,
};
let allLayers: any = scene.value.getLayers();
if (allLayers && allLayers.length > 0) {
let obj: any = {};
allLayers.forEach((item: any) => {
if (item.name === "pointLayer") {
obj = item;
}
});
if (obj) {
obj.setData(defaultServerPartList);
}
}
});
}
});
}
if (selectRoad) {
return selectRoad;
}
return {};
};
// 拿到实况车流数据
const hanleGetRealTrafficData = async (id: any) => {
let roadList: any = JSON.parse(JSON.stringify(detailText.lineData));
roadList = roadList[baseInfoObj.value.ProvinceCode.toString()];
let roadTestList: any = JSON.parse(JSON.stringify(detailText.roadTest));
roadTestList = roadTestList[baseInfoObj.value.ProvinceCode.toString()];
let onceRoadList: any = {
type: "FeatureCollection",
features: [],
};
let featuresList: any = roadList.features;
let list: any = [];
for (let i = 0; i < id.length; i++) {
// 如果现在选择的右边查询内容 没有实时车况的选中 那就不显示
if (nowSelectId.value.indexOf("2") === -1) {
return;
}
const selectRoad = await handleSetCarData(
id[i],
roadTestList,
featuresList
);
// if (i > 0) {
// return;
// }
list.push(selectRoad);
onceRoadList.features = list;
let allLayers: any = scene.value.getLayers();
let haveList: any = allLayers.filter(
(item: any) => item.name === "lineLayerOnce"
);
if (haveList && haveList.length > 0) {
let obj: any = haveList[0];
nextTick(() => {
scene.value.removeLayer(obj);
const lineLayer = new LineLayer({
zIndex: 11,
});
lineLayer.name = `lineLayerOnce`;
lineLayer
.size(3) // 线条宽度
.shape("line") // 线条形状
.color("expediteNumber", (value) => {
// 根据 expediteNumber 动态设置颜色
if (value === 1) {
return "#35cf66"; // 绿色
} else if (value === 2) {
return "#c99c1c"; // 黄色
} else if (value === 3 || value === 4) {
return "#e64a4a"; // 红色
} else {
return "transparent"; // 灰色
}
})
.style({
opacity: 1, // 透明度
});
lineLayer.source(onceRoadList); // 设置数据源为 GeoJSON
scene.value.addLayer(lineLayer); // 将线图层添加到场景中
});
} else {
const lineLayer = new LineLayer({
zIndex: 11,
});
lineLayer.name = `lineLayerOnce`;
lineLayer
.size(3) // 线条宽度
.shape("line") // 线条形状
.color("expediteNumber", (value) => {
// 根据 expediteNumber 动态设置颜色
if (value === 1) {
return "#35cf66"; // 绿色
} else if (value === 2) {
return "#c99c1c"; // 黄色
} else if (value === 3 || value === 4) {
return "#e64a4a"; // 红色
} else {
return "transparent"; // 灰色
}
})
.style({
opacity: 1, // 透明度
});
lineLayer.source(onceRoadList); // 设置数据源为 GeoJSON
scene.value.addLayer(lineLayer); // 将线图层添加到场景中
}
}
};
// 实况车流
const handleGetRealTraffic = async () => {
let roadList: any = JSON.parse(JSON.stringify(detailText.lineData));
roadList = roadList[baseInfoObj.value.ProvinceCode.toString()];
let roadTestList: any = JSON.parse(JSON.stringify(detailText.roadTest));
roadTestList = roadTestList[baseInfoObj.value.ProvinceCode.toString()];
console.log("roadList", roadList);
console.log("roadTestList", roadTestList);
// 单个服务区查询的车流实况的最后结果 可以直接传入图层当数据
let onceRoadList: any = {
type: "FeatureCollection",
features: [],
};
let featuresList: any = roadList.features;
console.log("featuresList", featuresList);
console.log("currentServerPartDetail.value", currentServerPartDetail.value);
// 选中
if (currentServerPartDetail.value) {
await hanleGetRealTrafficData([
currentServerPartDetail.value.SERVERPART_ID.toString(),
]);
} else if (searchSelectServerPartId && searchSelectServerPartId.length > 0) {
// 查询高亮
console.log("searchSelectServerPartId", searchSelectServerPartId);
await hanleGetRealTrafficData(searchSelectServerPartId);
} else {
// 默认全部
await hanleGetRealTrafficData(allServerPartIdList);
}
};
// 传入名字清除图层
const handleDeleteLayer = (name: string) => {
let allLayers: any = scene.value.getLayers();
if (allLayers && allLayers.length > 0) {
allLayers.forEach((item: any) => {
if (item.name === name) {
scene.value.removeLayer(item);
}
});
}
};
// 清空一些非默认图层
const handleDeleteNoDefault = (nowSelect?: string) => {
if (nowSelect) {
if (nowSelect.indexOf("1") === -1) {
scene.value.removeAllMarkers();
}
if (nowSelect.indexOf("2") === -1) {
handleDeleteLayer("lineLayerOnce");
}
if (nowSelect.indexOf("3") === -1) {
handleDeleteLayer("heatmapLayer");
}
if (nowSelect.indexOf("4") === -1) {
handleDeleteLayer("enterCarPoint");
handleDeleteLayer("enterLine");
}
if (nowSelect.indexOf("5") === -1) {
handleDeleteLayer("BUSINESS_TRADELayer");
}
if (nowSelect.indexOf("6") === -1) {
handleDeleteLayer("warningLayer");
}
if (nowSelect.indexOf("8") === -1) {
isShowRealData.value = false;
clearInterval(mapTimer);
}
} else {
console.log("22222", defaultServerPartList);
scene.value.removeAllMarkers();
handleDeleteLayer("lineLayerOnce");
handleDeleteLayer("heatmapLayer");
handleDeleteLayer("enterCarPoint");
handleDeleteLayer("enterLine");
handleDeleteLayer("warningLayer");
handleDeleteLayer("BUSINESS_TRADELayer");
// handleChangeToDefault();
isShowRealData.value = false;
// 变回正常颜色
let current: any = handleGetThisLayer("pointLayer");
current.color("SPREGIONTYPETYPE", (value: number) => {
return colorList1[value];
});
current.render();
clearInterval(mapTimer);
}
};
// 更新服务区点数据的方法
const handleUpdateMapPoint = () => {
let allLayers: any = scene.value.getLayers();
if (allLayers && allLayers.length > 0) {
let obj: any = {};
allLayers.forEach((item: any) => {
if (item.name === "pointLayer") {
obj = item;
}
});
if (obj) {
obj.setData(defaultServerPartList);
}
}
};
// 营收热力的方法
const handleGetServerpartRevenue = async () => {
const revenueReq: any = {
calcType: 2,
pushProvinceCode: baseInfoObj.value.ProvinceCode || "340000",
curYear: moment().format("YYYY"),
compareYear: moment().subtract(1, "year").format("YYYY"),
StatisticsDate: moment().format("YYYY-MM-DD"),
StatisticsMonth: moment().format("YYYYMM"),
};
const revenueData: any = await handleGetMonthlySPINCAnalysis(revenueReq);
const revenueObj: any = {};
if (revenueData && revenueData.length > 0) {
revenueData.forEach((item: any) => {
revenueObj[item.ServerpartId] = item.RevenueINC.curYearData;
});
}
if (defaultServerPartList && defaultServerPartList.length > 0) {
nextTick(() => {
defaultServerPartList.forEach((item: any) => {
item.revenueData = revenueObj[item.SERVERPART_ID]
? revenueObj[item.SERVERPART_ID]
: "";
item.lng = item.SERVERPART_X;
item.lat = item.SERVERPART_Y;
});
handleUpdateMapPoint();
console.log("defaultServerPartList", defaultServerPartList);
let filteredData: any = [];
defaultServerPartList.forEach((item: any) => {
if (item.lng && item.lat && item.revenueData !== "") {
filteredData.push(item);
}
});
console.log("filteredData", filteredData);
const heatmapLayer = new HeatmapLayer({
zIndex: 11,
})
.source(defaultServerPartList, {
parser: {
type: "json",
x: "lng", // 指定经度字段
y: "lat", // 指定纬度字段
},
})
.size("revenueData", [0, 1]) // 根据值映射热力点大小
.shape("heatmap") // 指定热力图的形状
.style({
intensity: 5, // 控制强度
radius: 20, // 控制点半径
opacity: 0.8, // 图层透明度
rampColors: {
colors: ["#0e5a7e", "#63B8FF", "#FFF68F", "#FF6347", "#FF4500"], // 颜色梯度
positions: [0, 0.25, 0.5, 0.75, 1], // 对应颜色的位置
},
});
heatmapLayer.name = "heatmapLayer";
scene.value.addLayer(heatmapLayer);
});
}
};
// 车辆归属地
const handleGetCarComeForm = async () => {
const enterReq: any = {
serverPartId: currentServerPartDetail.value.SERVERPART_ID,
statisticsStartMonth: moment(moment().startOf("y")).format("YYYYMM"),
statisticsEndMonth: moment(moment()).format("YYYYMM"),
rankNum: 3,
};
const enterData: any = await handleGetProvinceVehicleTreeList(enterReq);
console.log("enterData", enterData);
let provinceListTooltip: any = [];
let provinceList: any = [];
if (enterData && enterData.length > 0) {
let children: any = [];
let obj: any = {};
enterData.forEach((item: any) => {
obj = JSON.parse(JSON.stringify(item));
if (item.children && item.children.length > 0) {
item.children.forEach((subItem: any, subIndex: number) => {
if (subIndex <= 4) {
provinceList.push(subItem);
children.push(subItem);
}
});
}
obj.children = children;
provinceListTooltip.push(obj);
});
}
nextTick(() => {
if (defaultServerPartList && defaultServerPartList.length > 0) {
defaultServerPartList.forEach((item: any) => {
if (
item.SERVERPART_ID.toString() ===
currentServerPartDetail.value.SERVERPART_ID.toString()
) {
item.provinceListTooltip = provinceListTooltip;
}
});
handleUpdateMapPoint();
}
});
let homeCarList: any = [];
if (provinceList && provinceList.length > 0) {
provinceList.forEach((item: any) => {
let list: any = [];
if (item.children && item.children.length > 0) {
item.children.forEach((subItem: any, subIndex: number) => {
if (subIndex <= 2) {
list.push(subItem);
}
});
}
item.children = list;
homeCarList.push(item);
});
}
let featuresList: any = [];
let enterPointList: any = [];
let cityCoordinate: any = detailText.cityCoordinate;
if (homeCarList && homeCarList.length > 0) {
homeCarList.forEach((item: any) => {
if (item.children && item.children.length > 0) {
item.children.forEach((subItem: any) => {
enterPointList.push({
label: subItem.ProvinceOrCityName + "市",
SERVERPART_X: cityCoordinate[subItem.ProvinceOrCityName + "市"]
? cityCoordinate[subItem.ProvinceOrCityName + "市"][0]
: [],
SERVERPART_Y: cityCoordinate[subItem.ProvinceOrCityName + "市"]
? cityCoordinate[subItem.ProvinceOrCityName + "市"][1]
: [],
});
featuresList.push({
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
cityCoordinate[subItem.ProvinceOrCityName + "市"]
? cityCoordinate[subItem.ProvinceOrCityName + "市"]
: [], // 起点
cityCoordinate[currentServerPartDetail.value.SERVERPART_NAME]
? cityCoordinate[
currentServerPartDetail.value.SERVERPART_NAME
]
: [], // 终点
],
},
properties: {
value: subItem.TotalCount, // 可以映射成动画效果
},
});
});
}
});
}
const enterLineData: any = {
type: "FeatureCollection",
features: featuresList,
};
const enterLine = new LineLayer({})
.source(enterLineData)
.size(2) // 设置线条宽度
.shape("line") // 线条类型
.color("value", ["#93cdf8", "#77c0f6"]) // 根据值映射颜色// ['#a1c4fd', '#2193b0', '#1565c0']
.style({
opacity: 0.8, // 设置透明度
lineType: "dash", // 虚线样式
dashArray: [5, 5], // 虚线间隔
})
.animate({
interval: 1, // 动画间隔
duration: 2, // 每条线条动画持续时间
trailLength: 0.5, // 轨迹长度
});
enterLine.name = "enterLine";
scene.value.addLayer(enterLine);
// 给车辆的出发点 也打上圆点图层
const enterPoint = new PointLayer({
zIndex: 9,
});
enterPoint.name = "enterCarPoint";
enterPoint.source(enterPointList, {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
enterPoint.shape("circle");
enterPoint.size(8);
enterPoint.color("#58b1f5");
scene.value.addLayer(enterPoint);
};
// 拿到经营业态
const handleGetBusinessFormat = async () => {
// await RobotDialogueBoxRef.value.handleGetBusinessTrade();
let formData: any = RightSearchBoxRef.value.form;
console.log("formData", formData);
const req: any = {
BusinessTrade: formData?.BUSINESS_TRADE.toString(),
ShowNormal: true,
PeriodState: 1,
DataType: 3,
};
const tradeData = await handleGetPeriodWarningList(req);
console.log("tradeData", tradeData);
// 拿到所有查询的业态所对应的服务区
const obj: any = {};
// 搜索的业态包含的服务区
const shopObj: any = {};
// 拿到门店的id
let shopIdObj: any = {};
if (tradeData && tradeData.length > 0) {
console.log("tradeData3232", tradeData);
tradeData.forEach((item: any) => {
if (item.children && item.children.length > 0) {
item.children.forEach((subItem: any) => {
if (subItem.children && subItem.children.length > 0) {
subItem.children.forEach((thirdItem: any) => {
if (obj[thirdItem.SERVERPART_ID]) {
const old: any = obj[thirdItem.SERVERPART_ID];
old.push(thirdItem.BUSINESS_TRADE);
obj[thirdItem.SERVERPART_ID] = old;
} else {
const list: any = [thirdItem.BUSINESS_TRADE];
obj[thirdItem.SERVERPART_ID] = list;
}
if (thirdItem.children && subItem.children.length > 0) {
let shopName: string = "";
let shopIdList: any = [];
thirdItem.children.forEach((fourthItem: any) => {
if (shopName) {
shopName += `, ${fourthItem.SERVERPARTSHOP_NAME} `;
} else {
shopName = `${fourthItem.SERVERPARTSHOP_NAME} `;
}
if (fourthItem?.SERVERPARTSHOP_ID) {
let list: any = fourthItem?.SERVERPARTSHOP_ID.split(",");
if (list && list.length > 0) {
list.forEach((item: any) => {
shopIdList.push(item);
});
}
}
});
shopObj[thirdItem.SERVERPART_ID] = shopName;
shopIdObj[thirdItem.SERVERPART_ID] = shopIdList;
}
});
}
});
}
});
}
let BusinessTradeIdsObj: any =
RightSearchBoxRef.value.selectBusinessTradeIdsObj;
nextTick(() => {
defaultServerPartList.forEach((item: any) => {
if (obj[item.SERVERPART_ID] && obj[item.SERVERPART_ID].length > 0) {
const newObj: any = JSON.parse(JSON.stringify(item));
let str: string = "";
const tradeList: any = obj[item.SERVERPART_ID];
tradeList.forEach((subItem: any) => {
if (str) {
str += `${BusinessTradeIdsObj[subItem]} `;
} else {
str = BusinessTradeIdsObj[subItem];
}
});
item.tradeType = str;
if (shopObj[item.SERVERPART_ID]) {
item.shopName = shopObj[item.SERVERPART_ID];
}
if (shopIdObj[item.SERVERPART_ID]) {
item.shopIdList = shopIdObj[item.SERVERPART_ID];
}
}
});
handleUpdateMapPoint();
});
console.log("defaultServerPartList", defaultServerPartList);
const tradeRes: any = [];
defaultServerPartList.forEach((item: any) => {
if (obj[item.SERVERPART_ID] && obj[item.SERVERPART_ID].length > 0) {
const newObj: any = JSON.parse(JSON.stringify(item));
let str: string = "";
const tradeList: any = obj[item.SERVERPART_ID];
tradeList.forEach((item: any) => {
if (str) {
str += `${BusinessTradeIdsObj[item]} `;
} else {
str = BusinessTradeIdsObj[item];
}
});
newObj.tradeType = str;
if (shopObj[item.SERVERPART_ID]) {
newObj.shopName = shopObj[item.SERVERPART_ID];
}
if (shopIdObj[item.SERVERPART_ID]) {
newObj.shopIdList = shopIdObj[item.SERVERPART_ID];
}
tradeRes.push(newObj);
}
});
console.log("tradeRes", tradeRes);
const BUSINESS_TRADELayer = new PointLayer({
zIndex: 10,
});
BUSINESS_TRADELayer.name = "BUSINESS_TRADELayer";
BUSINESS_TRADELayer.source(tradeRes, {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
BUSINESS_TRADELayer.shape("circle");
BUSINESS_TRADELayer.size(8);
BUSINESS_TRADELayer.color("#1890ff");
scene.value.addLayer(BUSINESS_TRADELayer);
};
// 预警类型
const handleWarningData = async () => {
console.log("currentServerPartDetail", currentServerPartDetail);
nextTick(() => {
if (currentServerPartDetail.value) {
RobotDialogueBoxRef.value.handleSelectWarning();
} else {
RobotDialogueBoxRef.value.handleSetWarningData();
}
});
};
// 对预警类型的地图进行操作
const handleWarningMap = async (warningData: any) => {
let waringObj: any = RobotDialogueBoxRef.value.descObjRef;
console.log("waringObj", waringObj);
let warningRes: any = [];
// 拿到所有查询的业态所对应的服务区
const obj: any = {};
// 拿到所有查询到的预警类型对应的门店
let shopIdObj: any = {};
console.log("warningData2", warningData);
if (warningData && warningData.length > 0) {
warningData.forEach((item: any) => {
if (obj[item.SERVERPART_ID] && obj[item.SERVERPART_ID].length > 0) {
const old: any = obj[item.SERVERPART_ID];
old.push(item);
} else {
obj[item.SERVERPART_ID] = [item];
}
if (
shopIdObj[item.SERVERPART_ID] &&
shopIdObj[item.SERVERPART_ID].length > 0
) {
const old: any = shopIdObj[item.SERVERPART_ID];
let list: any = item.SERVERPARTSHOP_ID.split(",");
if (list && list.length > 0) {
list.forEach((subItem: any) => {
old.push(subItem);
});
}
} else {
let res: any = [];
let list: any = item.SERVERPARTSHOP_ID.split(",");
if (list && list.length > 0) {
list.forEach((subItem: any) => {
res.push(subItem);
});
}
shopIdObj[item.SERVERPART_ID] = res;
}
});
}
nextTick(() => {
defaultServerPartList.forEach((item: any) => {
if (obj[item.SERVERPART_ID] && obj[item.SERVERPART_ID].length > 0) {
let str: string = "";
const tradeList: any = obj[item.SERVERPART_ID];
// tradeList 是一个服务区的全部预警数据 可能存在多个类型 文字输出时需要根据类型输出 所以要分类
let resList: any = [];
let typeList: any = [];
tradeList.forEach((item: any) => {
if (typeList.indexOf(item.WARNING_TYPE) === -1) {
typeList.push(item.WARNING_TYPE);
}
});
typeList.forEach((item: any) => {
let itemStr: string = "";
tradeList.forEach((subItem: any) => {
if (subItem.WARNING_TYPE === item) {
if (itemStr) {
itemStr += `${subItem.SERVERPARTSHOP_NAME}`;
} else {
itemStr = `${waringObj[subItem.WARNING_TYPE]}${subItem.SERVERPARTSHOP_NAME
} `;
}
}
});
if (str) {
str += itemStr + ";";
} else {
str = itemStr + ";";
}
});
if (
shopIdObj[item.SERVERPART_ID] &&
shopIdObj[item.SERVERPART_ID].length > 0
) {
item.warningShop = shopIdObj[item.SERVERPART_ID];
}
item.waringText = str;
}
});
handleUpdateMapPoint();
});
console.log("obj33222", obj);
console.log("defaultServerPartList333444", defaultServerPartList);
defaultServerPartList.forEach((item: any) => {
if (obj[item.SERVERPART_ID] && obj[item.SERVERPART_ID].length > 0) {
const newObj: any = JSON.parse(JSON.stringify(item));
let str: string = "";
const tradeList: any = obj[item.SERVERPART_ID];
// tradeList 是一个服务区的全部预警数据 可能存在多个类型 文字输出时需要根据类型输出 所以要分类
let resList: any = [];
let typeList: any = [];
tradeList.forEach((item: any) => {
if (typeList.indexOf(item.WARNING_TYPE) === -1) {
typeList.push(item.WARNING_TYPE);
}
});
typeList.forEach((item: any) => {
let itemStr: string = "";
tradeList.forEach((subItem: any) => {
if (subItem.WARNING_TYPE === item) {
if (itemStr) {
itemStr += `${subItem.SERVERPARTSHOP_NAME}; `;
} else {
itemStr = `${waringObj[subItem.WARNING_TYPE]}${subItem.SERVERPARTSHOP_NAME
} `;
}
}
});
if (str) {
str += itemStr;
} else {
str = itemStr;
}
});
if (
shopIdObj[item.SERVERPART_ID] &&
shopIdObj[item.SERVERPART_ID].length > 0
) {
newObj.warningShop = shopIdObj[item.SERVERPART_ID];
}
newObj.waringText = str;
warningRes.push(newObj);
}
});
console.log("warningRes", warningRes);
console.log("defaultServerPartList", defaultServerPartList);
const warningLayer = new PointLayer({
zIndex: 10,
});
warningLayer.name = "warningLayer";
warningLayer.source(warningRes, {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
warningLayer.shape("circle");
warningLayer.size(8);
warningLayer.color("#ff3a02");
scene.value.addLayer(warningLayer);
};
// 根据右侧的选择列表 来对地图进行操作 onlyChange 如果true的话 只改变值 不调用方法
const handleChangeMapShow = async (nowSelect: string, onlyChange: boolean) => {
// 清空没有值的图层
handleDeleteNoDefault(nowSelect);
console.log("nowSelect", nowSelect);
nowSelectId.value = nowSelect;
if (onlyChange) {
return;
}
// 有值 根据值来判断显示的内容
if (nowSelect) {
if (nowSelect.indexOf("1") !== -1) {
// 添加天气锚点
handleAddWeather();
}
if (nowSelect.indexOf("2") !== -1) {
// 实况车流
await handleGetRealTraffic();
}
if (nowSelect.indexOf("3") !== -1) {
const loadingInstance = ElLoading.service({
fullscreen: true,
background: "#00000080",
text: "数据加载中...",
});
// 营收热力
await handleGetServerpartRevenue();
loadingInstance.close();
}
if (nowSelect.indexOf("4") !== -1) {
const loadingInstance = ElLoading.service({
fullscreen: true,
background: "#00000080",
text: "数据加载中...",
});
// 车辆归属地
await handleGetCarComeForm();
loadingInstance.close();
}
if (nowSelect.indexOf("5") !== -1) {
// 经营业态
await handleGetBusinessFormat();
}
if (nowSelect.indexOf("6") !== -1) {
const loadingInstance = ElLoading.service({
fullscreen: true,
background: "#00000080",
text: "数据加载中...",
});
// 预警类型
await handleWarningData();
loadingInstance.close();
}
if (nowSelect.indexOf("7") !== -1) {
// 清空
nowSelectId.value = "";
handleDeleteNoDefault(nowSelectId.value);
}
if (nowSelect.indexOf("8") !== -1) {
isShowRealData.value = true;
// nextTick(async () => {
// if (baseInfoObj?.value.ShowRevenueGraphic) {
// // 拿到实时营收
// await RealBoxRef.value.handleGetRealMoney(
// baseInfoObj.value.ProvinceId
// );
// // 几个小框的数据
// await handleSmallBoxData();
// }
// });
nextTick(async () => {
// 服务区繁忙
handleServiceBusy();
// 服务区实时营收数据
handleGetRealServiceList();
});
}
if (nowSelect.indexOf("99") !== -1) {
handleCloseRightDetail();
// 标记出附近的服务区
handleNearServiceList();
}
}
};
// 服务区繁忙
const handleServiceBusy = async () => {
// 是否有显示服务区繁忙的
if (baseInfoObj?.value.ShowRevenueGraphic) {
let list: any = BusyRankingRef.value.busyList;
// if (list && list.length > 0) {
// } else {
// const loadingInstance = ElLoading.service({
// fullscreen: true,
// background: "#00000080",
// text: "数据加载中...",
// });
// list = await revenueRateRef.value.handleGetBusyRank();
// loadingInstance.close();
// }
console.log("listhandleServiceBusy", list);
let obj: any = {};
if (list && list.length > 0) {
list.forEach((item: any) => {
obj[item.SERVERPART_ID] = item.AVR_TICKET;
});
}
if (defaultServerPartList && defaultServerPartList.length > 0) {
defaultServerPartList.forEach((item: any) => {
if (obj[item.SERVERPART_ID] || obj[item.SERVERPART_ID] === 0) {
item.AVR_TICKET = obj[item.SERVERPART_ID];
}
});
}
console.log("defaultServerPartList", defaultServerPartList);
// 将进入搜索状态的服务区正常圆点 变回正常颜色
let current: any = handleGetThisLayer("pointLayer");
console.log("current", current);
current.setData(defaultServerPartList);
current.color("AVR_TICKET", (value: number) => {
return value >= 30
? "#E64218"
: value > 15 && value < 30
? "#EFE271"
: "#1BAAE6";
// return value >= 30
// ? "#f53232"
// : value > 15 && value < 30
// ? "#0fdb5c"
// : "#2876EB";
});
current.render();
}
};
// 服务区巡检的实际方法
const handleAreaInspection = async (i: number) => {
let list = [];
if (defaultServerPartList && defaultServerPartList.length > 0) {
let firstObj: any = {};
let otherList: any = [];
defaultServerPartList.forEach((item: any) => {
if (item.SERVERPART_ID === 416) {
firstObj = item;
} else {
otherList.push(item);
}
});
list = otherList;
list.unshift(firstObj);
}
if (i < list.length) {
// i 为当前执行到第几项的索引
currentServerPartDetail.value = list[i];
// 先给上一次的图层 添加清除
handleDeleteNoDefault("");
// 每次巡检前 把 悬浮框先给隐藏起来
hoverPoint.value.style.display = "none";
// 给当前索引的服务区 加上选中的效果
handleAddSelect(currentServerPartDetail.value);
console.log(i, currentServerPartDetail.value);
// 图层样式添加
await handleChangeMapShow("1,2,4", false);
// 拿到 经营数据 在营商家
let answerData: any =
await RobotDialogueBoxRef.value.handleInspectionQuestions(
`${currentServerPartDetail.value.SERVERPART_NAME}经营数据`
);
let merchantData: any =
await RobotDialogueBoxRef.value.handleInspectionQuestions(
`${currentServerPartDetail.value.SERVERPART_NAME}在营商家`
);
console.log("answerData3213123", answerData);
// 其他要显示的文字
let otherObj: any = {
businessText: answerData
.replace(/"/g, "'")
.replace(/{{(.*?)}}/g, (_: any, expression: any) => {
try {
// 使用 eval 执行模板字符串中的 JavaScript 表达式
// 注意eval 存在安全风险,实际使用中需小心。
return eval(expression.trim()); // 执行并返回结果
} catch (error) {
console.error("错误:", error);
return ""; // 出现错误时返回空字符串
}
}),
merchantText: merchantData
.replace(/"/g, "'")
.replace(/{{(.*?)}}/g, (_: any, expression: any) => {
try {
// 使用 eval 执行模板字符串中的 JavaScript 表达式
// 注意eval 存在安全风险,实际使用中需小心。
return eval(expression.trim()); // 执行并返回结果
} catch (error) {
console.error("错误:", error);
return ""; // 出现错误时返回空字符串
}
}),
};
nextTick(async () => {
currentServerPartDetail.value = defaultServerPartList[i];
let nowDetail: any = JSON.parse(JSON.stringify(defaultServerPartList[i]));
// 对话框样式内容添加
RobotDialogueBoxRef.value.handleInspectionDialogueBox(
nowDetail,
otherObj
);
});
} else {
RobotDialogueBoxRef.value.closeInspection();
}
// for (let i = 0; i < defaultServerPartList.length; i++) {
// const loadingInstance = ElLoading.service({
// fullscreen: true,
// background: "#00000080",
// text: "数据加载中...",
// });
// loadingInstance.close();
// }
};
// 隐藏悬浮框
const handleHiddenSuspended = () => {
hoverPoint.value.style.display = "none";
};
// 关闭右侧服务区详情
const handleCloseRightDetail = () => {
showRightDetail.value = false;
};
// 机器人是否显示的状态
const handleShowAi = (value: boolean) => {
isShowAi.value = value;
};
// 右侧详情是否显示
const handleShowDetail = (value: boolean) => {
isShowDetail.value = value;
};
// 判断是不是对话框 新增了右侧的查询项
const handleChangeRightFilterInDialogue = (id?: string) => {
RightSearchBoxRef.value.handleChangeFilterNoWatch(id);
};
// 请求服务区的实时数据 每个服务区上面加个div显示的那种
const handleGetRealServiceList = async () => {
const req: any = {
ProvinceCode: baseInfoObj.value.ProvinceCode,
};
const data = await handleGetTransactionDetailList(req);
console.log("handleGetRealServiceList", data);
realRevenueList = data;
let list: any = handleShowRevenuePoint(data);
console.log("listdadasd", list);
let bigIndex: number = list.length;
// 根据顺序 显示每组五个的锚点div 每10秒更新一次
// 定时器 ID用于清除定时器
console.log("bigIndex", bigIndex);
handleShowMapPoint(list[nowFifthIndex.value]);
nowFifthIndex.value++;
mapTimer = setInterval(() => {
if (bigIndex <= nowFifthIndex.value) {
nowFifthIndex.value = 0;
}
scene.value.removeAllMarkers();
handleShowMapPoint(list[nowFifthIndex.value]);
nowFifthIndex.value++;
}, 10000);
};
// 根据顺序 显示每组五个的锚点div 每10秒更新一次
const handleShowMapPoint = async (list: any) => {
console.log("list", list);
console.log("defaultServerPartList", defaultServerPartList);
let detailObj: any = {};
if (list && list.length > 0) {
list.forEach((item: any) => {
detailObj[item.Serverpart_ID] = item;
});
}
console.log("detailObj", detailObj);
defaultServerPartList.forEach((item: any) => {
if (detailObj[item.SERVERPART_ID]) {
let obj = detailObj[item.SERVERPART_ID];
item.realRevenueDetail = obj;
const el = document.createElement("div");
el.style.maxWidth = "20rem";
el.style.boxSizing = "border-box";
el.style.padding = "6px";
el.style.background = "rgba(56, 56, 56, 0.8)";
el.style.borderRadius = "8px";
el.style.color = "#fff";
el.style.fontSize = "1rem";
// 根据列表数据 写innerHTML的字符串
let listStr: string = "";
if (obj.TimeList && obj.TimeList.length > 0) {
if (obj.TimeList && obj.TimeList.length > 1) {
obj.TimeList = obj.TimeList.slice(0, 1);
}
obj.TimeList.forEach((subItem: any) => {
let smallStr: string = "";
if (subItem.sellList && subItem.sellList.length > 0) {
subItem.sellList.forEach((thirdItem: any) => {
if (smallStr) {
smallStr += `,${thirdItem.CommodityName}${thirdItem.SellCount}`;
} else {
smallStr = `${thirdItem.CommodityName}${thirdItem.SellCount}`;
}
});
}
let shop: string = `<div style="white-space: wrap;">${subItem.ServerpartShop_Name}${smallStr}</div>`;
listStr += shop;
});
}
el.innerHTML = `<div style="white-space: wrap;">${obj.Serverpart_Name}</div><div style="white-space: wrap;">实时交易金额:${obj.CurRevenueAmount}元</div>${listStr}`;
const marker = new Marker({ element: el }).setLnglat([
item.SERVERPART_X,
item.SERVERPART_Y,
] as any);
scene.value.addMarker(marker);
} else {
item.realRevenueDetail = undefined;
}
});
// return;
// defaultServerPartList.forEach((item: any) => {
// if (item.weatherModel) {
// if (item.weatherModel.DAY_WEATHER_PIC) {
// const el = document.createElement("div");
// el.style.width = "32px";
// el.style.height = "24px";
// el.style.paddingBottom = "4px";
// el.style.textAlign = "center";
// // 创建并插入 <img> 元素
// const img = document.createElement("img");
// img.src = item.weatherModel.DAY_WEATHER_PIC;
// img.style.width = "15px";
// img.style.height = "15px";
// img.style.borderRadius = "50%"; // 圆形图片(可选)
// // img.title = item.DAY_WEATHER
// el.appendChild(img);
// const marker = new Marker({ element: el }).setLnglat([
// item.SERVERPART_X,
// item.SERVERPART_Y,
// ] as any);
// if (currentServerPartDetail.value) {
// if (
// item.SERVERPART_ID === currentServerPartDetail.value.SERVERPART_ID
// ) {
// scene.value.addMarker(marker);
// }
// } else if (
// searchSelectServerPartId &&
// searchSelectServerPartId.length > 0
// ) {
// if (
// searchSelectServerPartId.indexOf(item.SERVERPART_ID.toString()) !==
// -1
// ) {
// scene.value.addMarker(marker);
// }
// } else {
// scene.value.addMarker(marker);
// }
// }
// }
// });
};
// 根据当前的有了的实时营收数组 按照五个 五个一组的顺序 在地图上进行标出div
const handleShowRevenuePoint = (list: any) => {
// nowFifthIndex
if (list && list.length > 0) {
let newList: any = JSON.parse(JSON.stringify(list));
console.log("newList", newList);
// 将数组分为每5个元素为一组
let paginated = [];
for (let i = 0; i < newList.length; i += 5) {
paginated.push(newList.slice(i, i + 5));
}
return paginated;
}
};
// 标记出附近的服务区
const handleNearServiceList = async () => {
handleCloseRightDetail();
console.log("fdsjfhds");
console.log("dsadas", currentServerPartDetail);
if (currentServerPartDetail.value) {
const req: any = {
PageIndex: 1,
PageSize: 100,
SearchParameter: {
SERVERPART_IDS: currentServerPartDetail.value.SERVERPART_ID,
},
};
const data = await handleGetGDNearServiceList(req);
let current: any = handleGetThisLayer("nearServiceList");
console.log("data3212", data);
let list: any = [];
if (data && data.length > 0) {
data.forEach((item: any) => {
if (item.children && item.children.length > 0) {
item.children.forEach((subItem: any) => {
// 判断是否同省 且 id有 说明是驿达的
if (subItem.HASPROVINCE) {
if (subItem.SERVERPART_ID) {
subItem.showType = 1;
} else {
subItem.showType = 2;
}
} else {
subItem.showType = 3;
}
list.push(subItem);
});
}
list.push(item);
});
}
// 删除原有的 添加新的
if (current) {
scene.value.removeLayer(current);
}
let nearServiceList = new PointLayer({
zIndex: 100,
});
nearServiceList.name = "nearServiceList";
nearServiceList.source(list, {
parser: {
type: "json",
x: "SERVERPART_X",
y: "SERVERPART_Y",
},
});
nearServiceList.shape("circle");
nearServiceList.size(8);
// nearServiceList.color("#F70000");
nearServiceList.color("showType", (value: number) => {
// showType
// 1 同省驿达 2 同省非驿达 3 外省
return value === 1 ? "#F5F6F7" : value === 2 ? "#fdff3d" : "#F70000";
// value === null
// ? "#fdff3d"
// : value > 0 && value < 1000
// ? "#F5F6F7"
// : "#F70000";
// value > 0 && value < 1000 ? "#F5F6F7" : "#fdff3d" : "#F70000";
});
nearServiceList.style({
opacity: 0.7, // 透明度
});
nearServiceList.on("mousemove", (ev: any) => {
const detail: any = ev.feature;
hoverPoint.value.style.top = `${ev.y + 5}px`;
hoverPoint.value.style.left = `${ev.x + 5}px`;
hoverPoint.value.style.display = "block";
hoverPoint.value.innerHTML = `<div>
<div>${detail?.SERVERPART_NAME || ""}</div>
<div>直线距离:${detail.SELECT_DISTANCE || ""}km</div>
<div>路线距离:${detail.REAL_DISTANCE || ""}km</div>
</div>`;
});
nearServiceList.on("mouseout", (ev: any) => {
hoverPoint.value.style.display = "none";
});
scene.value.addLayer(nearServiceList);
} else {
ElMessage({
message: "请先选择服务区!",
type: "warning",
});
}
};
</script>
<template>
<div id="map" class="mapBox">
<div class="RobotBox" v-if="baseInfoObj?.ShowAIQA">
<RobotDialogueBox ref="RobotDialogueBoxRef" @handleLightServerpart="handleLightServerpart"
@handleEnterySearch="handleEnterySearch" @handleWarningMap="handleWarningMap"
@handleAreaInspection="handleAreaInspection" @handleHiddenSuspended="handleHiddenSuspended"
@handleShowAi="handleShowAi" @handleChangeRightFilterInDialogue="handleChangeRightFilterInDialogue"
@handleDeleteNoDefault="handleDeleteNoDefault" :currentServerPartDetail="currentServerPartDetail"
:allServerPartIdList="allServerPartIdList" />
</div>
<div class="rightSearchBox" :style="{ right: showRightDetail ? 'calc(25% + 8px)' : '16px' }">
<RightSearchBox ref="RightSearchBoxRef" @handleChangeMapShow="handleChangeMapShow"
@handleDeleteSelect="handleDeleteSelect" @handleHiddenSuspended="handleHiddenSuspended"
@handleNearServiceList="handleNearServiceList" :currentServerPartDetail="currentServerPartDetail" />
</div>
<div class="serverpartDetail" :style="{ right: showRightDetail ? '0' : '-25%' }">
<!-- v-if="showRightDetail" -->
<RightDetail ref="RightDetailRef" :currentServerPartDetail="currentServerPartDetail"
@handleCloseRightDetail="handleCloseRightDetail" @handleShowDetail="handleShowDetail" />
</div>
<!-- 实时营收的box -->
<div class="realBox" v-show="isShowAi || isShowDetail
? false
: baseInfoObj?.ShowRevenueGraphic && isShowRealData
? true
: false
">
<!-- v-if="baseInfoObj?.ShowRevenueGraphic && isShowAi || isShowDetail" -->
<RealBox ref="RealBoxRef" :show="isShowAi || isShowDetail
? false
: baseInfoObj?.ShowRevenueGraphic && isShowRealData
? true
: false
" />
</div>
<!-- 片区图例 -->
<div class="areaListLegend" v-if="SPREGIONTYPECOLORList && SPREGIONTYPECOLORList.length > 0">
<div class="areaItem" v-for="(item, index) in SPREGIONTYPECOLORList" :key="index">
<span class="color" :style="{ background: item.value }"></span>
<span class="text">{{ item.label }}</span>
</div>
</div>
<!-- 区域营收占比 -->
<div class="revenueRate" v-show="isShowAi || isShowDetail
? false
: baseInfoObj?.ShowRevenueGraphic && isShowRealData
? true
: false
">
<RevenueRate ref="revenueRateRef" :SPREGIONTYPECOLOR="SPREGIONTYPECOLOR" :show="isShowAi || isShowDetail
? false
: baseInfoObj?.ShowRevenueGraphic && isShowRealData
? true
: false
" />
</div>
<!-- 消费金额趋势图 -->
<div class="BusyRanking" v-show="isShowAi || isShowDetail
? false
: baseInfoObj?.ShowRevenueGraphic && isShowRealData
? true
: false
">
<BusyRanking ref="BusyRankingRef" :show="isShowAi || isShowDetail
? false
: baseInfoObj?.ShowRevenueGraphic && isShowRealData
? true
: false
" @handleServiceBusy="handleServiceBusy" />
</div>
</div>
</template>