update
17
index.html
@ -1,11 +1,3 @@
|
||||
<!--
|
||||
* @Author: cclu 1106109051@qq.com
|
||||
* @Date: 2024-11-18 11:40:21
|
||||
* @LastEditors: cclu 1106109051@qq.com
|
||||
* @LastEditTime: 2024-11-21 10:44:39
|
||||
* @FilePath: \aiRobot\index.html
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
-->
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
@ -13,16 +5,17 @@
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>地图测试</title>
|
||||
<base href="/aiMap/">
|
||||
<base href="/"> <!-- 确保这里匹配你的部署路径 -->
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
|
||||
<style>
|
||||
*{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
</html>
|
||||
|
||||
7774
package-lock.json
generated
@ -12,6 +12,7 @@
|
||||
"@antv/l7": "^2.22.3",
|
||||
"@antv/l7-maps": "^2.22.3",
|
||||
"axios": "^1.7.7",
|
||||
"echarts": "^5.5.1",
|
||||
"element-plus": "^2.8.8",
|
||||
"moment": "^2.30.1",
|
||||
"pinia": "^2.2.6",
|
||||
|
||||
10
src/App.vue
@ -1,11 +1,3 @@
|
||||
<!--
|
||||
* @Author: cclu 1106109051@qq.com
|
||||
* @Date: 2024-11-19 17:27:17
|
||||
* @LastEditors: cclu 1106109051@qq.com
|
||||
* @LastEditTime: 2024-11-19 17:29:28
|
||||
* @FilePath: \aiMap\src\App.vue
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<router-view></router-view>
|
||||
@ -19,7 +11,7 @@ import { useRouter } from "vue-router";
|
||||
const router = useRouter();
|
||||
|
||||
onMounted(() => {
|
||||
router.push("/map");
|
||||
// router.push("/map/:id");
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
BIN
src/assets/ai/busyIcon.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/ai/defaultIcon.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/ai/proportion.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/ai/revenue.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/assets/ai/selectBusy.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/ai/whiteBack.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
src/assets/servicePart/ES.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/servicePart/accumulate.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/servicePart/area.png
Normal file
|
After Width: | Height: | Size: 469 B |
BIN
src/assets/servicePart/averageOrder.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
src/assets/servicePart/baby.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
src/assets/servicePart/badWater.png
Normal file
|
After Width: | Height: | Size: 486 B |
BIN
src/assets/servicePart/buildArea.png
Normal file
|
After Width: | Height: | Size: 305 B |
BIN
src/assets/servicePart/bus.png
Normal file
|
After Width: | Height: | Size: 456 B |
BIN
src/assets/servicePart/car.png
Normal file
|
After Width: | Height: | Size: 613 B |
BIN
src/assets/servicePart/carService.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/servicePart/charge.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/servicePart/chemicals.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/servicePart/crossFlow.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
src/assets/servicePart/customerRevenue.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
src/assets/servicePart/date.png
Normal file
|
After Width: | Height: | Size: 247 B |
BIN
src/assets/servicePart/descIcon.png
Normal file
|
After Width: | Height: | Size: 211 B |
BIN
src/assets/servicePart/enterCar.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
src/assets/servicePart/fixed.png
Normal file
|
After Width: | Height: | Size: 950 B |
BIN
src/assets/servicePart/food.png
Normal file
|
After Width: | Height: | Size: 601 B |
BIN
src/assets/servicePart/fun.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
src/assets/servicePart/funBg1.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
src/assets/servicePart/funBg2.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
src/assets/servicePart/funBg3.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
src/assets/servicePart/headerTop.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
src/assets/servicePart/hotal.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/servicePart/maintenance.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/servicePart/manWC.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/servicePart/managerUnit.png
Normal file
|
After Width: | Height: | Size: 542 B |
BIN
src/assets/servicePart/meetingContent.png
Normal file
|
After Width: | Height: | Size: 286 B |
BIN
src/assets/servicePart/minimart.png
Normal file
|
After Width: | Height: | Size: 551 B |
BIN
src/assets/servicePart/moneyBack.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/servicePart/operate.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/servicePart/orderBusiness.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
src/assets/servicePart/ownerSelf.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
src/assets/servicePart/pageIcon.png
Normal file
|
After Width: | Height: | Size: 259 B |
BIN
src/assets/servicePart/person.png
Normal file
|
After Width: | Height: | Size: 833 B |
BIN
src/assets/servicePart/proportion.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/servicePart/propryRight.png
Normal file
|
After Width: | Height: | Size: 332 B |
BIN
src/assets/servicePart/rage.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/assets/servicePart/revenceBack.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/assets/servicePart/revenceSome.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/servicePart/revenue.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/assets/servicePart/room.png
Normal file
|
After Width: | Height: | Size: 518 B |
BIN
src/assets/servicePart/serviceIcon.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/assets/servicePart/shop.png
Normal file
|
After Width: | Height: | Size: 559 B |
BIN
src/assets/servicePart/stopArea.png
Normal file
|
After Width: | Height: | Size: 753 B |
BIN
src/assets/servicePart/store.png
Normal file
|
After Width: | Height: | Size: 320 B |
BIN
src/assets/servicePart/thirdToilets.png
Normal file
|
After Width: | Height: | Size: 902 B |
BIN
src/assets/servicePart/tidalSpace.png
Normal file
|
After Width: | Height: | Size: 316 B |
BIN
src/assets/servicePart/trainCar.png
Normal file
|
After Width: | Height: | Size: 669 B |
BIN
src/assets/servicePart/treeTop.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
src/assets/servicePart/uploadStore.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
src/assets/servicePart/vehicleRefueling.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/servicePart/water.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/servicePart/waterBoiler.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/servicePart/womenWC.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
53
src/components/map/component/BusyRanking.less
Normal file
@ -0,0 +1,53 @@
|
||||
.BusyRankingContent{
|
||||
.pageTitle{
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
line-height: 26px;
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.busyList{
|
||||
width: 100%;
|
||||
height: 326px;
|
||||
margin-top: 12px;
|
||||
overflow-y: auto;
|
||||
.busyItem{
|
||||
width: 100%;
|
||||
margin-bottom: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
.left{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.indexBox{
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
line-height: 1.5rem;
|
||||
float: left;
|
||||
text-align: center;
|
||||
border: 2px solid #d56a40;
|
||||
color: #d56a40;
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
margin-right: 0.1rem;
|
||||
margin-top: 0.05rem;
|
||||
}
|
||||
.name{
|
||||
width: 120px;
|
||||
color: #fff;
|
||||
margin-left: 4px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.busyList::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
103
src/components/map/component/BusyRanking.vue
Normal file
@ -0,0 +1,103 @@
|
||||
<script setup lang="ts">
|
||||
import "./BusyRanking.less";
|
||||
import * as echarts from "echarts";
|
||||
import moment from "moment";
|
||||
import { onMounted, reactive, ref, watch } from "vue";
|
||||
import { handlegetServerConnec } from "../../newService";
|
||||
import { nextTick } from "process";
|
||||
|
||||
// 繁忙度排行
|
||||
let busyList = ref<any>([]);
|
||||
// 省份信息
|
||||
const baseInfoObj = ref<any>();
|
||||
|
||||
onMounted(async () => {});
|
||||
|
||||
// 获得繁忙度排行的数据
|
||||
const handleGetBusyRank = async () => {
|
||||
let saveData = localStorage.getItem("baseInfoObj");
|
||||
if (saveData) {
|
||||
baseInfoObj.value = JSON.parse(saveData);
|
||||
}
|
||||
const req: any = {
|
||||
action_type: "getCurHalfCollect",
|
||||
province_code: baseInfoObj.value.ProvinceId || "3544",
|
||||
};
|
||||
const data = await handlegetServerConnec(req);
|
||||
console.log("BusyRankingContent", data);
|
||||
let list: any = data.CollectionObject;
|
||||
busyList.value = list;
|
||||
|
||||
emit("handleServiceBusy");
|
||||
return list;
|
||||
};
|
||||
|
||||
// 传入的数据
|
||||
const props = defineProps<{
|
||||
show: any;
|
||||
}>();
|
||||
|
||||
watch(
|
||||
() => props.show,
|
||||
(newVal, oldVal) => {
|
||||
console.log("realboxnewVal", newVal);
|
||||
if (newVal) {
|
||||
handleGetBusyRank();
|
||||
}
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
|
||||
defineExpose({
|
||||
handleGetBusyRank: handleGetBusyRank,
|
||||
busyList: busyList,
|
||||
});
|
||||
// 传入的方法
|
||||
const emit = defineEmits<{
|
||||
(e: "handleServiceBusy"): void; // 高亮查到的图层
|
||||
}>();
|
||||
</script>
|
||||
<template>
|
||||
<div
|
||||
class="BusyRankingContent"
|
||||
id="BusyRankingContent"
|
||||
style="width: 100%; height: 100%"
|
||||
>
|
||||
<div class="pageTitle">服务区繁忙排行</div>
|
||||
|
||||
<div class="busyList">
|
||||
<div
|
||||
class="busyItem"
|
||||
v-for="(item, index) in busyList.slice(0, 10)"
|
||||
:key="index"
|
||||
>
|
||||
<div class="left">
|
||||
<div class="indexBox">{{ index + 1 }}</div>
|
||||
<div class="name">{{ item.SERVERPART_NAME || "-" }}</div>
|
||||
</div>
|
||||
<div
|
||||
class="right"
|
||||
:style="{
|
||||
color:
|
||||
item.AVR_TICKET >= 30
|
||||
? '#E64218'
|
||||
: item.AVR_TICKET >= 15 && item.AVR_TICKET < 30
|
||||
? '#EFE271'
|
||||
: '#1BAAE6',
|
||||
}"
|
||||
>
|
||||
<span style="display: inline-block; width: 50px; text-align: right">
|
||||
{{ item.AVR_TICKET ? item.AVR_TICKET + "%" : "-%" }}
|
||||
</span>
|
||||
{{
|
||||
item.AVR_TICKET >= 30
|
||||
? "繁忙"
|
||||
: item.AVR_TICKET >= 15 && item.AVR_TICKET < 30
|
||||
? "良好"
|
||||
: "空闲"
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -66,6 +66,12 @@ const duringInspection = ref<boolean>(false);
|
||||
const inspectionIndex = ref<number>(0);
|
||||
// 输入框的实例对象
|
||||
const inputRef = ref<any>();
|
||||
// 省份信息
|
||||
const baseInfoObj = ref<any>();
|
||||
let saveData = localStorage.getItem("baseInfoObj");
|
||||
if (saveData) {
|
||||
baseInfoObj.value = JSON.parse(saveData);
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
// 默认在初始显示的
|
||||
@ -79,6 +85,7 @@ const handleGetShowDailogBox = async () => {
|
||||
if (dialogueList && dialogueList.length > 0) {
|
||||
await nextTick(() => {
|
||||
showDialogBox.value = true;
|
||||
emit("handleShowAi", true);
|
||||
});
|
||||
inputRef.value?.focus();
|
||||
console.log("dialogueList", dialogueList);
|
||||
@ -101,6 +108,7 @@ const handleGetShowDailogBox = async () => {
|
||||
};
|
||||
dialogueList.push(obj);
|
||||
showDialogBox.value = true;
|
||||
emit("handleShowAi", true);
|
||||
setTimeout(() => {
|
||||
dialogueList[0].text = "猜你想了解:";
|
||||
dialogueList[0].isOver = true;
|
||||
@ -141,6 +149,7 @@ const handleCloseDialogbox = async () => {
|
||||
|
||||
// 关闭对话框
|
||||
showDialogBox.value = false;
|
||||
emit("handleShowAi", false);
|
||||
};
|
||||
// 添加对话内容的方法
|
||||
const handleAddDialogList = (text: string) => {
|
||||
@ -564,8 +573,8 @@ const handleGetReq = (configDetail: any, answer?: any) => {
|
||||
let realKey: any = newPARSING_RULES[key];
|
||||
if (realKey) {
|
||||
let currentUser: any = {
|
||||
ProvinceCode: "340000",
|
||||
pushProvinceCode: "340000",
|
||||
ProvinceCode: baseInfoObj.value.ProvinceCode || "340000",
|
||||
pushProvinceCode: baseInfoObj.value.ProvinceCode || "340000",
|
||||
};
|
||||
// formatType 0:数值 1:字段 2:取缓存 3:取年份 4: 取月份 5:取日期 6:取当年 7:取前一年 8: 取当年的月份 9:取当前的首月 10:自定义 11: 取选中的服务区里面的值
|
||||
// 当formatType 为10的时候 now 判断是不是要现在时间 true|false afterOrBefore 往当前时间前推还是后推 after|before count 前推或后推几个月 startOrEnd start|end dateType 显示格式 1 YYYY 2 YYYY-MM 3 YYYY-MM-DD 4 YYYYMM
|
||||
@ -732,19 +741,52 @@ const handleAnalyzeConfig = async (configDetail: any, answer: any) => {
|
||||
console.log("dsadsadasf", result);
|
||||
console.log("OUTPUT_FORMAT", OUTPUT_FORMAT);
|
||||
console.log("answer", answer);
|
||||
console.log("newRESPONSE_CONFIG", newRESPONSE_CONFIG);
|
||||
|
||||
let newResult: any;
|
||||
// 判断responseType 格式是否为 text 一般都为json
|
||||
if (OUTPUT_FORMAT.responseType === "text") {
|
||||
newResult = newRESPONSE_CONFIG
|
||||
.replace(/"/g, "'")
|
||||
.replace(/\{\{(.*?)\}\}/g, (_: any, key: any) => {
|
||||
.replace(/{{(.*?)}}/g, (_: any, expression: any) => {
|
||||
try {
|
||||
return eval(key.trim());
|
||||
} catch {
|
||||
return "";
|
||||
// 使用 eval 执行模板字符串中的 JavaScript 表达式
|
||||
// 注意:eval 存在安全风险,实际使用中需小心。
|
||||
return eval(expression.trim()); // 执行并返回结果
|
||||
} catch (error) {
|
||||
console.error("错误:", error);
|
||||
return ""; // 出现错误时返回空字符串
|
||||
}
|
||||
});
|
||||
|
||||
// newResult = newRESPONSE_CONFIG.replace(
|
||||
// /\{\{(.*?)\}\}/g,
|
||||
// (_: any, expression: any) => {
|
||||
// try {
|
||||
// // 创建一个安全的执行上下文
|
||||
// const func = new Function(
|
||||
// ...Object.keys({
|
||||
// moment: window.moment,
|
||||
// answer,
|
||||
// result,
|
||||
// formatNumber,
|
||||
// }),
|
||||
// `return (${expression});`
|
||||
// );
|
||||
// return func(
|
||||
// ...Object.values({
|
||||
// moment: window.moment,
|
||||
// answer,
|
||||
// result,
|
||||
// formatNumber,
|
||||
// })
|
||||
// );
|
||||
// } catch (e) {
|
||||
// console.error("模板解析错误:", expression, e);
|
||||
// return "";
|
||||
// }
|
||||
// }
|
||||
// );
|
||||
} else {
|
||||
if (OUTPUT_FORMAT.responseFormat === "object") {
|
||||
newResult = result;
|
||||
@ -957,7 +999,11 @@ const handleGetResFieldRes = (obj: any, config: any) => {
|
||||
str = obj[key];
|
||||
}
|
||||
}
|
||||
return str;
|
||||
if (str) {
|
||||
return str;
|
||||
} else {
|
||||
return "暂无数据";
|
||||
}
|
||||
};
|
||||
|
||||
// 给巡检添加自定义文字输出的方法
|
||||
@ -981,17 +1027,17 @@ const handleInspectionDialogueBox = async (detail: any, otherObj?: any) => {
|
||||
detail.tmwWeatherModel.DAY_AIR_TEMPERATURE
|
||||
}℃</span>`
|
||||
: "暂无天气数据"
|
||||
}</span><span class="style4">实时路况(${moment().format(
|
||||
"MM月DD日 HH时mm分"
|
||||
)}):<span class="style5">${
|
||||
}</span><span class="style4">实时路况:<span class="style5">${
|
||||
detail?.roadConditions
|
||||
? `${
|
||||
detail?.roadConditions?.EXPRESSWAY_NAME
|
||||
? detail?.roadConditions?.EXPRESSWAY_NAME + ":"
|
||||
: ""
|
||||
}${detail?.roadConditions?.evaluation.status_desc || ""}`
|
||||
}${
|
||||
detail?.roadConditions?.evaluation.status_desc || ""
|
||||
}(${moment().format("MM月DD日 HH时mm分")})`
|
||||
: "暂无实况车流数据"
|
||||
} </span></span><span class="style4">车辆归属地情况:${
|
||||
} </span></span><span class="style4">车辆归属:${
|
||||
detail?.provinceListTooltip && detail?.provinceListTooltip.length > 0
|
||||
? `${detail?.provinceListTooltip
|
||||
.map((item: any) => {
|
||||
@ -1010,9 +1056,13 @@ const handleInspectionDialogueBox = async (detail: any, otherObj?: any) => {
|
||||
)}%,Top3:${
|
||||
subItem.children && subItem.children.length > 0
|
||||
? subItem.children
|
||||
.map((thirdItem: any) => {
|
||||
.map((thirdItem: any, thirdIndex: number) => {
|
||||
return thirdItem.ProvinceOrCityName !== "其他"
|
||||
? `${thirdItem.ProvinceOrCityName}、`
|
||||
? `${thirdItem.ProvinceOrCityName}${
|
||||
thirdIndex + 1 !== subItem.children.length
|
||||
? "、"
|
||||
: ""
|
||||
}`
|
||||
: "";
|
||||
})
|
||||
.join("")
|
||||
@ -1029,7 +1079,7 @@ const handleInspectionDialogueBox = async (detail: any, otherObj?: any) => {
|
||||
otherObj
|
||||
? `${
|
||||
otherObj?.businessText
|
||||
? `<span class="style4">经营数据:${otherObj?.businessText}</span>`
|
||||
? `<span class="style4">经营数据:</span><span class="style4">${otherObj?.businessText}</span>`
|
||||
: ""
|
||||
}${
|
||||
otherObj?.merchantText
|
||||
@ -1242,7 +1292,7 @@ const handleScrollToBottom = () => {
|
||||
const handleInspectionQuestions = async (text: string) => {
|
||||
const req: any = {
|
||||
Sentence: text,
|
||||
ProvinceCode: "340000",
|
||||
ProvinceCode: baseInfoObj.value.ProvinceCode || "340000",
|
||||
DialogCode: thisQuestionId.value || "",
|
||||
};
|
||||
const data = await handleTranslateSentence(req);
|
||||
@ -1276,7 +1326,7 @@ const handleInspectionQuestions = async (text: string) => {
|
||||
const handleAnswerQuestions = async () => {
|
||||
const req: any = {
|
||||
Sentence: searchText.value,
|
||||
ProvinceCode: "340000",
|
||||
ProvinceCode: baseInfoObj.value.ProvinceCode || "340000",
|
||||
DialogCode: thisQuestionId.value || "",
|
||||
};
|
||||
// 需要在对话框中的效果就是 输入问题之后 出现问问题和回答的对话框之后 就删除对话框内容 但是接口搜索还是需要显示内容
|
||||
@ -1324,6 +1374,7 @@ const handleAnswerQuestions = async () => {
|
||||
const lastBox: any = allBoxes[allBoxes.length - 1];
|
||||
if (lastBox) {
|
||||
const lastContent = `<span class="style4">为您查找相关数据</span>`;
|
||||
// const lastContent = `<span class="style4">${data?.RevenueAnalysis}</span>`;
|
||||
isPrinting.value = true;
|
||||
await handlePrintWord(lastBox, lastContent);
|
||||
}
|
||||
@ -1361,7 +1412,8 @@ const handleAnswerQuestions = async () => {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handleLastUpdate("为您查找相关数据");
|
||||
// handleLastUpdate("为您查找相关数据");
|
||||
handleLastUpdate(data?.RevenueAnalysis.split("{")[0] || "");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -1679,16 +1731,51 @@ const handlePrintWord = async (
|
||||
|
||||
const typeCharacter = async () => {
|
||||
if (i < tempDiv.innerHTML.length && isPrinting.value) {
|
||||
// 1. 检测 handleWait()
|
||||
const handleWaitRegex = /handleWait\((.*?)\)/;
|
||||
const restContent = tempDiv.innerHTML.slice(i);
|
||||
const match = handleWaitRegex.exec(restContent);
|
||||
const waitMatch = handleWaitRegex.exec(restContent);
|
||||
|
||||
if (match && match.index === 0) {
|
||||
// 提取括号内的参数
|
||||
const param: string = match[1].trim().replace(/^["']|["']$/g, "");
|
||||
await handleWait(param); // 执行 handleWait 方法
|
||||
i += match[0].length; // 跳过 handleWait 字符串
|
||||
} else {
|
||||
if (waitMatch && waitMatch.index === 0) {
|
||||
const param: string = waitMatch[1].trim().replace(/^["']|["']$/g, "");
|
||||
await handleWait(param);
|
||||
i += waitMatch[0].length;
|
||||
}
|
||||
// 2. 检测 moment().startOf() 和 moment().format()
|
||||
else if (restContent.startsWith("moment().")) {
|
||||
const momentRegex = /(moment\(\)\.(startOf|format)\(.*?\))/;
|
||||
const momentMatch = momentRegex.exec(restContent);
|
||||
if (momentMatch) {
|
||||
const momentExpression = momentMatch[1]; // 提取整个表达式
|
||||
let parsedResult = "";
|
||||
|
||||
try {
|
||||
if (momentExpression.includes("startOf")) {
|
||||
const unit = momentExpression.match(
|
||||
/startOf\(['"](\w+)['"]\)/
|
||||
)?.[1];
|
||||
parsedResult = moment()
|
||||
.startOf(unit as any)
|
||||
.format("YYYY-MM-DD HH:mm:ss");
|
||||
} else if (momentExpression.includes("format")) {
|
||||
const formatString = momentExpression.match(
|
||||
/format\(['"](.*?)['"]\)/
|
||||
)?.[1];
|
||||
parsedResult = moment().format(formatString);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Moment 解析失败:", error);
|
||||
}
|
||||
|
||||
// 将解析的结果打印到屏幕
|
||||
const textNode = document.createTextNode(parsedResult);
|
||||
tagStack[tagStack.length - 1].appendChild(textNode);
|
||||
|
||||
i += momentMatch[0].length; // 跳过 moment 表达式
|
||||
}
|
||||
}
|
||||
// 3. 正常字符或标签处理
|
||||
else {
|
||||
const char = tempDiv.innerHTML.charAt(i);
|
||||
if (char === "<") {
|
||||
const tagEnd = tempDiv.innerHTML.indexOf(">", i);
|
||||
@ -1774,6 +1861,7 @@ const emit = defineEmits<{
|
||||
(e: "handleWarningMap", warningData: any): void; // 全部服务区圆点置灰
|
||||
(e: "handleAreaInspection", index: number): void; // 全部服务区圆点置灰
|
||||
(e: "handleHiddenSuspended"): void; // 隐藏掉悬浮框
|
||||
(e: "handleShowAi", value: boolean): void; // 将ai对话是否显示 跟主页说
|
||||
}>();
|
||||
|
||||
// 监听当前选择的服务区
|
||||
@ -1854,6 +1942,7 @@ const handleGetFieldEnum = async () => {
|
||||
// 经营业态的方法
|
||||
const handleGetBusinessTrade = async () => {
|
||||
showDialogBox.value = true;
|
||||
emit("handleShowAi", true);
|
||||
handleAddDialogList(
|
||||
`${props.currentServerPartDetail?.SERVERPART_NAME || ""}经营业态`
|
||||
);
|
||||
@ -1865,6 +1954,7 @@ const handleGetBusinessTrade = async () => {
|
||||
// 预警类型的方法
|
||||
const handleSetWarningData = async () => {
|
||||
showDialogBox.value = true;
|
||||
emit("handleShowAi", true);
|
||||
handleAddDialogList(
|
||||
`${props.currentServerPartDetail?.SERVERPART_NAME || ""}预警类型`
|
||||
);
|
||||
@ -2058,6 +2148,7 @@ defineExpose({
|
||||
closeInspection,
|
||||
duringInspection,
|
||||
handleInspectionQuestions,
|
||||
showDialogBox,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@ -6932,7 +6932,880 @@ const detailObj = {
|
||||
[118.103675, 33.532078]
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// -------------------------------------- 四川 ---------------------------------------------
|
||||
// 攀枝花西服务区 572
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 572
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[101.321663, 26.56686],
|
||||
[101.32289, 26.567027],
|
||||
[101.324348, 26.567193],
|
||||
[101.325325, 26.567221],
|
||||
[101.326334, 26.567207],
|
||||
[101.327637, 26.567013],
|
||||
[101.329403, 26.566624],
|
||||
[101.330521, 26.566389],
|
||||
[101.33187, 26.56618],
|
||||
[101.332941, 26.566083],
|
||||
[101.334399, 26.565972],
|
||||
[101.335997, 26.565861],
|
||||
[101.337735, 26.565736],
|
||||
[101.339007, 26.565639],
|
||||
[101.339845, 26.565542],
|
||||
[101.34121, 26.565181],
|
||||
[101.342498, 26.564751],
|
||||
[101.343879, 26.564099],
|
||||
[101.344918, 26.563405],
|
||||
[101.3465, 26.562475],
|
||||
[101.348285, 26.561462],
|
||||
[101.350736, 26.560352],
|
||||
[101.352675, 26.559714],
|
||||
[101.354894, 26.559145],
|
||||
[101.357671, 26.558784],
|
||||
[101.35961, 26.558742],
|
||||
[101.361767, 26.558839],
|
||||
[101.364047, 26.559159],
|
||||
[101.366064, 26.559575],
|
||||
[101.368872, 26.560429],
|
||||
[101.370393, 26.560762],
|
||||
[101.372627, 26.561109],
|
||||
[101.374551, 26.56122],
|
||||
[101.377048, 26.561261],
|
||||
[101.380074, 26.561261],
|
||||
[101.381563, 26.561275],
|
||||
[101.383813, 26.561247],
|
||||
[101.385349, 26.561109],
|
||||
[101.387102, 26.560651],
|
||||
[101.389196, 26.559957],
|
||||
[101.391942, 26.559069],
|
||||
[101.394052, 26.558375],
|
||||
[101.395495, 26.557959],
|
||||
[101.396938, 26.557737],
|
||||
[101.398676, 26.557691],
|
||||
[101.400522, 26.557955],
|
||||
[101.402182, 26.558286],
|
||||
[101.403742, 26.558497],
|
||||
[101.404705, 26.558477],
|
||||
[101.4064, 26.558331],
|
||||
[101.407352, 26.558242],
|
||||
[101.408677, 26.55824],
|
||||
[101.409697, 26.558385],
|
||||
[101.410748, 26.558653],
|
||||
[101.411638, 26.55899],
|
||||
[101.412714, 26.559607],
|
||||
[101.413457, 26.560188],
|
||||
[101.413868, 26.560586],
|
||||
[101.414355, 26.561083],
|
||||
[101.414843, 26.56171],
|
||||
[101.415398, 26.562399],
|
||||
[101.41701, 26.564259],
|
||||
[101.418113, 26.565628],
|
||||
[101.419207, 26.566914],
|
||||
[101.419865, 26.567938],
|
||||
[101.420464, 26.568917],
|
||||
[101.421037, 26.57008],
|
||||
[101.421669, 26.571319],
|
||||
[101.422148, 26.57229],
|
||||
[101.422593, 26.573131],
|
||||
[101.423183, 26.573942],
|
||||
[101.4242, 26.575109],
|
||||
[101.425079, 26.575957],
|
||||
[101.425657, 26.576781],
|
||||
[101.426124, 26.577912],
|
||||
[101.426467, 26.5793],
|
||||
[101.426935, 26.580751],
|
||||
[101.427526, 26.581808],
|
||||
[101.42846, 26.58268],
|
||||
[101.42923, 26.583221],
|
||||
[101.430027, 26.583578],
|
||||
[101.431058, 26.583971],
|
||||
[101.432088, 26.584168],
|
||||
[101.433903, 26.584376],
|
||||
[101.435813, 26.58434],
|
||||
[101.43716, 26.584155],
|
||||
[101.439106, 26.583515],
|
||||
[101.441682, 26.582567],
|
||||
[101.444913, 26.581257],
|
||||
[101.447438, 26.58049],
|
||||
[101.450367, 26.579993],
|
||||
[101.454609, 26.579541],
|
||||
[101.457538, 26.579767]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 攀枝花服务区 566
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 566
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[101.838188, 26.539117],
|
||||
[101.837804, 26.540172],
|
||||
[101.837695, 26.541522],
|
||||
[101.83753, 26.544834],
|
||||
[101.836899, 26.547631],
|
||||
[101.836488, 26.549177],
|
||||
[101.836872, 26.552292],
|
||||
[101.836707, 26.55396],
|
||||
[101.836159, 26.555653],
|
||||
[101.836022, 26.55715],
|
||||
[101.836687, 26.558404],
|
||||
[101.837288, 26.559244],
|
||||
[101.83795, 26.559878],
|
||||
[101.839074, 26.56109],
|
||||
[101.839983, 26.562151],
|
||||
[101.840538, 26.562757],
|
||||
[101.841369, 26.563404],
|
||||
[101.842709, 26.564148],
|
||||
[101.843815, 26.564689],
|
||||
[101.845314, 26.565381],
|
||||
[101.846266, 26.565853],
|
||||
[101.847464, 26.566415],
|
||||
[101.849059, 26.567141],
|
||||
[101.850203, 26.56765],
|
||||
[101.852455, 26.568737],
|
||||
[101.855128, 26.569988],
|
||||
[101.857279, 26.570974],
|
||||
[101.860317, 26.572419],
|
||||
[101.862467, 26.573414],
|
||||
[101.863683, 26.573992],
|
||||
[101.864914, 26.574496],
|
||||
[101.866355, 26.57494],
|
||||
[101.868585, 26.575457],
|
||||
[101.869996, 26.575646],
|
||||
[101.872991, 26.576095],
|
||||
[101.875261, 26.576332],
|
||||
[101.876159, 26.57635],
|
||||
[101.877905, 26.576318],
|
||||
[101.879836, 26.576173],
|
||||
[101.882024, 26.576004],
|
||||
[101.884401, 26.575847],
|
||||
[101.885724, 26.575944],
|
||||
[101.887031, 26.576241],
|
||||
[101.888476, 26.576929],
|
||||
[101.889395, 26.577545],
|
||||
[101.890853, 26.578499],
|
||||
[101.892123, 26.579164],
|
||||
[101.893176, 26.579393],
|
||||
[101.894567, 26.579429],
|
||||
[101.896809, 26.579453],
|
||||
[101.899024, 26.579514],
|
||||
[101.900779, 26.579538],
|
||||
[101.902238, 26.579574],
|
||||
[101.903183, 26.579695],
|
||||
[101.904196, 26.580033],
|
||||
[101.905114, 26.580504],
|
||||
[101.906059, 26.581205],
|
||||
[101.908108, 26.582678],
|
||||
[101.909445, 26.583548],
|
||||
[101.910742, 26.584091],
|
||||
[101.912754, 26.584786],
|
||||
[101.913902, 26.585499],
|
||||
[101.916873, 26.587926],
|
||||
[101.918399, 26.589146],
|
||||
[101.919749, 26.589931],
|
||||
[101.921343, 26.59051],
|
||||
[101.922396, 26.590873],
|
||||
[101.924071, 26.591464],
|
||||
[101.925394, 26.591887],
|
||||
[101.926523, 26.592455],
|
||||
[101.927425, 26.592911],
|
||||
[101.927785, 26.593186],
|
||||
[101.928046, 26.593395],
|
||||
[101.928332, 26.593685],
|
||||
[101.928824, 26.59428],
|
||||
[101.929332, 26.595032],
|
||||
[101.93054, 26.596924],
|
||||
[101.931107, 26.597808],
|
||||
[101.931641, 26.598488],
|
||||
[101.932349, 26.599079],
|
||||
[101.933038, 26.599487],
|
||||
[101.933646, 26.599707],
|
||||
[101.934167, 26.599815],
|
||||
[101.936345, 26.600205],
|
||||
[101.939256, 26.600609],
|
||||
[101.942183, 26.601122],
|
||||
[101.943435, 26.601608],
|
||||
[101.944423, 26.602256]
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
// 绕城东服务区 548
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 548
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[104.207318, 30.652912],
|
||||
[104.206976, 30.65134],
|
||||
[104.206777, 30.649962],
|
||||
[104.20664, 30.648667],
|
||||
[104.206435, 30.647431],
|
||||
[104.206298, 30.64596],
|
||||
[104.206093, 30.644724],
|
||||
[104.205888, 30.643488],
|
||||
[104.205682, 30.642134],
|
||||
[104.205545, 30.64078],
|
||||
[104.205409, 30.639485],
|
||||
[104.205272, 30.638014],
|
||||
[104.205203, 30.636424],
|
||||
[104.205272, 30.634953],
|
||||
[104.20534, 30.63354],
|
||||
[104.205477, 30.632127],
|
||||
[104.20554, 30.630456],
|
||||
[104.20557, 30.628902],
|
||||
[104.205659, 30.627297],
|
||||
[104.205733, 30.625821],
|
||||
[104.205733, 30.624267],
|
||||
[104.205808, 30.622519],
|
||||
[104.205883, 30.620771],
|
||||
[104.206019, 30.619056],
|
||||
[104.206104, 30.617325],
|
||||
[104.206011, 30.615648],
|
||||
[104.205826, 30.614051],
|
||||
[104.205362, 30.612294],
|
||||
[104.204434, 30.610617],
|
||||
[104.203228, 30.609179],
|
||||
[104.20165, 30.607821],
|
||||
[104.200258, 30.606703]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 金堂服务区 540
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 540
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[104.4148, 30.798356],
|
||||
[104.416509, 30.798419],
|
||||
[104.418155, 30.798773],
|
||||
[104.419697, 30.799126],
|
||||
[104.42124, 30.799656],
|
||||
[104.422782, 30.800098],
|
||||
[104.424531, 30.800539],
|
||||
[104.426485, 30.800716],
|
||||
[104.428439, 30.800804],
|
||||
[104.43029, 30.800893],
|
||||
[104.432038, 30.800716],
|
||||
[104.433889, 30.800628],
|
||||
[104.43574, 30.800363],
|
||||
[104.437694, 30.800009],
|
||||
[104.439442, 30.799568],
|
||||
[104.441499, 30.799303],
|
||||
[104.443284, 30.798945],
|
||||
[104.445196, 30.798646],
|
||||
[104.447134, 30.798177],
|
||||
[104.4488, 30.797801],
|
||||
[104.450365, 30.797234],
|
||||
[104.451849, 30.796527],
|
||||
[104.453497, 30.796102],
|
||||
[104.45498, 30.795677],
|
||||
[104.456463, 30.795465],
|
||||
[104.458028, 30.795253],
|
||||
[104.459594, 30.794969],
|
||||
[104.461324, 30.794757],
|
||||
[104.462807, 30.794757],
|
||||
[104.464455, 30.794616],
|
||||
[104.466021, 30.794403],
|
||||
[104.467421, 30.794262],
|
||||
[104.469234, 30.794049],
|
||||
[104.471047, 30.793979],
|
||||
[104.472695, 30.793908],
|
||||
[104.474508, 30.793908]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 中江服务区 544
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 544
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[104.665787, 30.936031],
|
||||
[104.664537, 30.934969],
|
||||
[104.663533, 30.933726],
|
||||
[104.662864, 30.932292],
|
||||
[104.662196, 30.930857],
|
||||
[104.661527, 30.929423],
|
||||
[104.660635, 30.92818],
|
||||
[104.65952, 30.92665],
|
||||
[104.65796, 30.925598],
|
||||
[104.656622, 30.924642],
|
||||
[104.654838, 30.923877],
|
||||
[104.652832, 30.922921],
|
||||
[104.651048, 30.922156],
|
||||
[104.649488, 30.921104],
|
||||
[104.647927, 30.919861],
|
||||
[104.647035, 30.918522],
|
||||
[104.645698, 30.917087],
|
||||
[104.645029, 30.915557],
|
||||
[104.64436, 30.914314],
|
||||
[104.643664, 30.913035],
|
||||
[104.642829, 30.911328],
|
||||
[104.642083, 30.909969],
|
||||
[104.641715, 30.908502],
|
||||
[104.6415, 30.907113],
|
||||
[104.6415, 30.905632],
|
||||
[104.641284, 30.903966],
|
||||
[104.641068, 30.902485],
|
||||
[104.640637, 30.901097],
|
||||
[104.639989, 30.899801],
|
||||
[104.639342, 30.898413],
|
||||
[104.638911, 30.896932],
|
||||
[104.638263, 30.89545],
|
||||
[104.6374, 30.894154],
|
||||
[104.636537, 30.892766],
|
||||
[104.635674, 30.891377],
|
||||
[104.634488, 30.890081],
|
||||
[104.633409, 30.888878],
|
||||
[104.631899, 30.887859],
|
||||
[104.63082, 30.886841],
|
||||
[104.629633, 30.885823]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 三台停车区 549
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 549
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[105.000827, 31.019017],
|
||||
[105.002769, 31.019506],
|
||||
[105.004597, 31.020289],
|
||||
[105.00631, 31.020876],
|
||||
[105.008137, 31.021659],
|
||||
[105.009737, 31.022638],
|
||||
[105.011564, 31.023617],
|
||||
[105.013163, 31.024596],
|
||||
[105.014762, 31.025575],
|
||||
[105.01659, 31.026749],
|
||||
[105.018417, 31.027728],
|
||||
[105.020131, 31.028707],
|
||||
[105.021615, 31.029686],
|
||||
[105.023557, 31.030273],
|
||||
[105.025499, 31.03086],
|
||||
[105.027098, 31.031447],
|
||||
[105.029268, 31.031447],
|
||||
[105.031324, 31.031741],
|
||||
[105.033152, 31.031545],
|
||||
[105.034793, 31.031364],
|
||||
[105.03634, 31.031045],
|
||||
[105.037913, 31.030849],
|
||||
[105.039628, 31.030531],
|
||||
[105.041742, 31.030174],
|
||||
[105.04391, 31.029881],
|
||||
[105.045736, 31.029783],
|
||||
[105.047675, 31.029783],
|
||||
[105.049729, 31.030369],
|
||||
[105.051669, 31.031152],
|
||||
[105.053266, 31.031934],
|
||||
[105.05532, 31.032716],
|
||||
[105.05726, 31.033498],
|
||||
[105.059428, 31.033694],
|
||||
[105.061596, 31.034085],
|
||||
[105.063421, 31.034965],
|
||||
[105.06479, 31.036138],
|
||||
[105.06616, 31.037311],
|
||||
[105.067757, 31.038582],
|
||||
[105.069697, 31.039071],
|
||||
[105.071408, 31.039755],
|
||||
[105.07312, 31.040342]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 盐亭服务区 541
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 541
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[105.353212, 31.134419],
|
||||
[105.355273, 31.134517],
|
||||
[105.35722, 31.134615],
|
||||
[105.359282, 31.134811],
|
||||
[105.361458, 31.135105],
|
||||
[105.363291, 31.1354],
|
||||
[105.365009, 31.135988],
|
||||
[105.366841, 31.136968],
|
||||
[105.36833, 31.13834],
|
||||
[105.369246, 31.139909],
|
||||
[105.370277, 31.141281],
|
||||
[105.371537, 31.14285],
|
||||
[105.373141, 31.14383],
|
||||
[105.374859, 31.144614],
|
||||
[105.376691, 31.145006],
|
||||
[105.378638, 31.145595],
|
||||
[105.3807, 31.145987],
|
||||
[105.382532, 31.146379],
|
||||
[105.384365, 31.146967],
|
||||
[105.386426, 31.147163],
|
||||
[105.388144, 31.147947],
|
||||
[105.389977, 31.148143],
|
||||
[105.391924, 31.149123],
|
||||
[105.393756, 31.150104],
|
||||
[105.395589, 31.151084],
|
||||
[105.397422, 31.152064],
|
||||
[105.39914, 31.152848],
|
||||
[105.401087, 31.153632],
|
||||
[105.403263, 31.154024],
|
||||
[105.405095, 31.154416],
|
||||
[105.407271, 31.154808],
|
||||
[105.409104, 31.155004],
|
||||
[105.411051, 31.155592],
|
||||
[105.413227, 31.155592],
|
||||
[105.415174, 31.156377],
|
||||
[105.41735, 31.156769],
|
||||
[105.419412, 31.157749],
|
||||
[105.421473, 31.158533]
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// -------------------------------------- 云南 ---------------------------------------------
|
||||
// 贺思停车区 1057
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 1057
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[97.634446, 23.882395],
|
||||
[97.636642, 23.882433],
|
||||
[97.638297, 23.882546],
|
||||
[97.639322, 23.882908],
|
||||
[97.64084, 23.883909],
|
||||
[97.641606, 23.884546],
|
||||
[97.642235, 23.885334],
|
||||
[97.643453, 23.886885],
|
||||
[97.644519, 23.88821],
|
||||
[97.64586, 23.890111],
|
||||
[97.646817, 23.891249],
|
||||
[97.64761, 23.892174],
|
||||
[97.648458, 23.892849],
|
||||
[97.649661, 23.893737],
|
||||
[97.651056, 23.894462],
|
||||
[97.652451, 23.895037],
|
||||
[97.656103, 23.895688],
|
||||
[97.660547, 23.896475],
|
||||
[97.663439, 23.896946],
|
||||
[97.665397, 23.897309],
|
||||
[97.667242, 23.897878],
|
||||
[97.669362, 23.898515],
|
||||
[97.67043, 23.898988],
|
||||
[97.671587, 23.899713],
|
||||
[97.673497, 23.900873],
|
||||
[97.674824, 23.90182],
|
||||
[97.676283, 23.903272],
|
||||
[97.678526, 23.906144],
|
||||
[97.680742, 23.909219],
|
||||
[97.682554, 23.911734],
|
||||
[97.684575, 23.914595],
|
||||
[97.685592, 23.915703],
|
||||
[97.687542, 23.917133],
|
||||
[97.689641, 23.918134],
|
||||
[97.693357, 23.919123],
|
||||
[97.695443, 23.919636],
|
||||
[97.701727, 23.921113],
|
||||
[97.70732, 23.922448],
|
||||
[97.712131, 23.924283],
|
||||
[97.715703, 23.926452],
|
||||
[97.717828, 23.928073],
|
||||
[97.720575, 23.930787],
|
||||
[97.723261, 23.933528],
|
||||
[97.725308, 23.935602],
|
||||
[97.728802, 23.93926],
|
||||
[97.730784, 23.941095],
|
||||
[97.732713, 23.942656],
|
||||
[97.73403, 23.943585],
|
||||
[97.736168, 23.944884],
|
||||
[97.739336, 23.946052],
|
||||
[97.74433, 23.947398],
|
||||
[97.747772, 23.948339],
|
||||
[97.751409, 23.949459],
|
||||
[97.755404, 23.950767],
|
||||
[97.760176, 23.953424],
|
||||
[97.762561, 23.954818],
|
||||
[97.764582, 23.955616],
|
||||
[97.768011, 23.956867],
|
||||
[97.769823, 23.957391],
|
||||
[97.772912, 23.95845],
|
||||
[97.77535, 23.959272],
|
||||
[97.778487, 23.960348],
|
||||
[97.78052, 23.960981],
|
||||
[97.781969, 23.961692],
|
||||
[97.782943, 23.962483],
|
||||
[97.783419, 23.962997],
|
||||
[97.784543, 23.964875],
|
||||
[97.786555, 23.968353],
|
||||
[97.787572, 23.970093],
|
||||
[97.788956, 23.971595],
|
||||
[97.790405, 23.973038],
|
||||
[97.791746, 23.974105],
|
||||
[97.794254, 23.974865],
|
||||
[97.795984, 23.97528],
|
||||
[97.797737, 23.975932],
|
||||
[97.799164, 23.976525],
|
||||
[97.799986, 23.977533],
|
||||
[97.800873, 23.978205],
|
||||
[97.801673, 23.979193],
|
||||
[97.802322, 23.980221],
|
||||
[97.803632, 23.983009],
|
||||
[97.80467, 23.985006],
|
||||
[97.80586, 23.987911],
|
||||
[97.806703, 23.990322],
|
||||
[97.807807, 23.992762],
|
||||
[97.808101, 23.99452]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 尚勇停车区 1168
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 1168
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[101.695032, 21.196238],
|
||||
[101.696126, 21.197242],
|
||||
[101.697613, 21.197991],
|
||||
[101.699459, 21.199011],
|
||||
[101.700484, 21.199712],
|
||||
[101.701407, 21.200891],
|
||||
[101.702381, 21.203218],
|
||||
[101.703116, 21.205305],
|
||||
[101.704022, 21.2076],
|
||||
[101.704125, 21.208858],
|
||||
[101.704398, 21.21128],
|
||||
[101.70462, 21.214674],
|
||||
[101.70527, 21.216825],
|
||||
[101.706056, 21.218928],
|
||||
[101.7065, 21.220474],
|
||||
[101.7065, 21.221414],
|
||||
[101.706056, 21.222832],
|
||||
[101.704672, 21.224648],
|
||||
[101.703763, 21.226042],
|
||||
[101.703695, 21.226902],
|
||||
[101.703883, 21.228336],
|
||||
[101.704823, 21.230312],
|
||||
[101.706019, 21.233387],
|
||||
[101.706822, 21.235346],
|
||||
[101.707609, 21.237146],
|
||||
[101.708378, 21.239106],
|
||||
[101.708839, 21.240349],
|
||||
[101.70901, 21.241416],
|
||||
[101.709181, 21.243216],
|
||||
[101.709267, 21.24551],
|
||||
[101.70942, 21.246848],
|
||||
[101.710344, 21.24865],
|
||||
[101.711438, 21.25045],
|
||||
[101.712515, 21.252282],
|
||||
[101.714053, 21.254444],
|
||||
[101.715574, 21.257184],
|
||||
[101.717044, 21.259462],
|
||||
[101.717745, 21.260864],
|
||||
[101.71795, 21.26174],
|
||||
[101.717523, 21.262918],
|
||||
[101.716788, 21.264001],
|
||||
[101.714529, 21.26617],
|
||||
[101.713298, 21.267062],
|
||||
[101.709145, 21.268272],
|
||||
[101.707949, 21.269403],
|
||||
[101.70718, 21.270964],
|
||||
[101.706308, 21.272302],
|
||||
[101.703898, 21.274325],
|
||||
[101.701727, 21.276061],
|
||||
[101.700167, 21.277254],
|
||||
[101.698373, 21.27891],
|
||||
[101.697604, 21.280152],
|
||||
[101.69733, 21.281665],
|
||||
[101.697484, 21.28278],
|
||||
[101.69827, 21.28579],
|
||||
[101.698665, 21.287847],
|
||||
[101.699608, 21.292123],
|
||||
[101.700444, 21.295588],
|
||||
[101.700855, 21.298425],
|
||||
[101.700658, 21.300008],
|
||||
[101.699817, 21.301908],
|
||||
[101.698386, 21.303808],
|
||||
[101.696794, 21.305474],
|
||||
[101.695345, 21.307241],
|
||||
[101.694791, 21.309124],
|
||||
[101.695095, 21.311207]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 恐龙山服务区 1179
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 1179
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[102.011307, 24.977835],
|
||||
[102.013158, 24.977688],
|
||||
[102.015195, 24.977604],
|
||||
[102.016699, 24.977646],
|
||||
[102.01781, 24.977918],
|
||||
[102.019059, 24.978632],
|
||||
[102.020772, 24.979429],
|
||||
[102.022253, 24.979953],
|
||||
[102.02378, 24.980247],
|
||||
[102.025423, 24.980394],
|
||||
[102.026857, 24.980289],
|
||||
[102.028246, 24.979974],
|
||||
[102.029704, 24.979513],
|
||||
[102.031162, 24.978988],
|
||||
[102.033314, 24.978275],
|
||||
[102.035072, 24.977939],
|
||||
[102.037363, 24.977604],
|
||||
[102.040024, 24.977184],
|
||||
[102.043912, 24.975716],
|
||||
[102.047522, 24.974457],
|
||||
[102.0509, 24.974017],
|
||||
[102.053098, 24.973492],
|
||||
[102.055135, 24.971856],
|
||||
[102.056176, 24.970682],
|
||||
[102.05849, 24.969402],
|
||||
[102.061938, 24.967996],
|
||||
[102.063954, 24.967112],
|
||||
[102.068027, 24.966588],
|
||||
[102.071428, 24.966126],
|
||||
[102.07358, 24.965979],
|
||||
[102.076496, 24.966944],
|
||||
[102.079042, 24.967763],
|
||||
[102.081309, 24.968266],
|
||||
[102.083299, 24.968056],
|
||||
[102.085194, 24.967322],
|
||||
[102.086628, 24.966588],
|
||||
[102.088965, 24.965476],
|
||||
[102.091835, 24.964238],
|
||||
[102.094241, 24.962812],
|
||||
[102.096231, 24.960882],
|
||||
[102.098175, 24.9587],
|
||||
[102.099425, 24.957339],
|
||||
[102.100906, 24.956563],
|
||||
[102.102942, 24.956206],
|
||||
[102.105094, 24.955828],
|
||||
[102.106344, 24.955619],
|
||||
[102.107639, 24.954884],
|
||||
[102.108449, 24.954129],
|
||||
[102.109082, 24.953028],
|
||||
[102.109665, 24.95156],
|
||||
[102.11048, 24.949363],
|
||||
[102.110966, 24.947757],
|
||||
[102.110266, 24.945761],
|
||||
[102.109216, 24.943675],
|
||||
[102.109116, 24.941861]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 读书铺服务区 1212
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 1212
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[102.501549, 24.940216],
|
||||
[102.502739, 24.939469],
|
||||
[102.503906, 24.93865],
|
||||
[102.505038, 24.937882],
|
||||
[102.506331, 24.937301],
|
||||
[102.508058, 24.937063],
|
||||
[102.510598, 24.937104],
|
||||
[102.512748, 24.936917],
|
||||
[102.515345, 24.936461],
|
||||
[102.517976, 24.936191],
|
||||
[102.519751, 24.936274],
|
||||
[102.522417, 24.936627],
|
||||
[102.526695, 24.937467],
|
||||
[102.531076, 24.938266],
|
||||
[102.533501, 24.938795],
|
||||
[102.535526, 24.939272],
|
||||
[102.537482, 24.94006],
|
||||
[102.540537, 24.941232],
|
||||
[102.543282, 24.942303],
|
||||
[102.545181, 24.943102],
|
||||
[102.546622, 24.944087],
|
||||
[102.548178, 24.945539],
|
||||
[102.549425, 24.947105],
|
||||
[102.550363, 24.948205],
|
||||
[102.551621, 24.949076],
|
||||
[102.553228, 24.94974],
|
||||
[102.556397, 24.950487],
|
||||
[102.559863, 24.951306],
|
||||
[102.562391, 24.952312],
|
||||
[102.565549, 24.954127],
|
||||
[102.568672, 24.955838],
|
||||
[102.571291, 24.957197],
|
||||
[102.57319, 24.957996],
|
||||
[102.575238, 24.958544],
|
||||
[102.577171, 24.958845],
|
||||
[102.578818, 24.959104],
|
||||
[102.580623, 24.959589],
|
||||
[102.581824, 24.96019],
|
||||
[102.58298, 24.96101],
|
||||
[102.585336, 24.963229],
|
||||
[102.587761, 24.965573],
|
||||
[102.589754, 24.967244],
|
||||
[102.592087, 24.968655],
|
||||
[102.594587, 24.96963]
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// -------------------------------------- 贵州 ---------------------------------------------
|
||||
// 长耳营服务区 228
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 228
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[105.142428, 25.489071],
|
||||
[105.143063, 25.486016],
|
||||
[105.14391, 25.483151],
|
||||
[105.142852, 25.480095],
|
||||
[105.141582, 25.477803],
|
||||
[105.141794, 25.475128],
|
||||
[105.143486, 25.472454],
|
||||
[105.144544, 25.470162],
|
||||
[105.144967, 25.467297],
|
||||
[105.146025, 25.46424],
|
||||
[105.147506, 25.461757],
|
||||
[105.14793, 25.45851],
|
||||
[105.148776, 25.455262],
|
||||
[105.150045, 25.452587],
|
||||
[105.149622, 25.449339],
|
||||
[105.150045, 25.446283],
|
||||
[105.150469, 25.443608],
|
||||
[105.150469, 25.440551],
|
||||
[105.150045, 25.437876],
|
||||
[105.148141, 25.43501],
|
||||
[105.146237, 25.432717],
|
||||
[105.143698, 25.430233],
|
||||
[105.141004, 25.428306],
|
||||
[105.137819, 25.426077],
|
||||
[105.134837, 25.423949],
|
||||
[105.131805, 25.421992],
|
||||
[105.129206, 25.419645],
|
||||
[105.127906, 25.417297],
|
||||
[105.12704, 25.414167],
|
||||
[105.12704, 25.411232],
|
||||
[105.125307, 25.408884],
|
||||
[105.121841, 25.406341],
|
||||
[105.117942, 25.403993],
|
||||
[105.115343, 25.401058],
|
||||
[105.111877, 25.399297],
|
||||
[105.108628, 25.396166],
|
||||
[105.107328, 25.393427],
|
||||
[105.107112, 25.389904],
|
||||
[105.107978, 25.386969],
|
||||
[105.108628, 25.383838],
|
||||
[105.109711, 25.38012],
|
||||
[105.110578, 25.376989],
|
||||
[105.110361, 25.37327],
|
||||
[105.109061, 25.370139],
|
||||
[105.107545, 25.366812]
|
||||
]
|
||||
}
|
||||
},
|
||||
// 天空之桥 232
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
SERVERPART_ID: 232
|
||||
},
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[107.112167, 25.840124],
|
||||
[107.108624, 25.83853],
|
||||
[107.105081, 25.837135],
|
||||
[107.101981, 25.835142],
|
||||
[107.098438, 25.83275],
|
||||
[107.095116, 25.830557],
|
||||
[107.093566, 25.826969],
|
||||
[107.092015, 25.823182],
|
||||
[107.091794, 25.819793],
|
||||
[107.091794, 25.816404],
|
||||
[107.092458, 25.813414],
|
||||
[107.093123, 25.810822],
|
||||
[107.09268, 25.807433],
|
||||
[107.091794, 25.804243],
|
||||
[107.091351, 25.801053],
|
||||
[107.091351, 25.797664],
|
||||
[107.090465, 25.794673],
|
||||
[107.088251, 25.791683],
|
||||
[107.086036, 25.78909],
|
||||
[107.082936, 25.786698],
|
||||
[107.07895, 25.786099],
|
||||
[107.075396, 25.784999],
|
||||
[107.071758, 25.784306],
|
||||
[107.06812, 25.783613],
|
||||
[107.063951, 25.782975],
|
||||
[107.060052, 25.78239],
|
||||
[107.056587, 25.781609],
|
||||
[107.052255, 25.780244],
|
||||
[107.047923, 25.779269],
|
||||
[107.045324, 25.777904],
|
||||
[107.043591, 25.775368],
|
||||
[107.042292, 25.773028],
|
||||
[107.040992, 25.770297],
|
||||
[107.038826, 25.767956],
|
||||
[107.03796, 25.764835],
|
||||
[107.037093, 25.7623],
|
||||
[107.035144, 25.759374],
|
||||
[107.033628, 25.757033],
|
||||
[107.032762, 25.753912],
|
||||
[107.033195, 25.75118],
|
||||
[107.033628, 25.747864],
|
||||
[107.031462, 25.744547],
|
||||
[107.027563, 25.742792],
|
||||
[107.023231, 25.741036]
|
||||
]
|
||||
}
|
||||
},
|
||||
]
|
||||
},
|
||||
// 城市道路名称数据
|
||||
@ -7667,7 +8540,95 @@ const detailObj = {
|
||||
"SERVERPART_NAME": "蟠龙山服务区",
|
||||
"SERVERPART_ID": 470,
|
||||
"SERVERPART_ADDRESS": "宿州市"
|
||||
}
|
||||
},
|
||||
{
|
||||
"EXPRESSWAY_NAME": "成都绕城高速",
|
||||
"SERVERPART_NAME": "绕城东服务区",
|
||||
"SERVERPART_ID": 548,
|
||||
"SERVERPART_ADDRESS": "成都市"
|
||||
},
|
||||
{
|
||||
"EXPRESSWAY_NAME": "成巴高速",
|
||||
"SERVERPART_NAME": "金堂服务区",
|
||||
"SERVERPART_ID": 540,
|
||||
"SERVERPART_ADDRESS": "巴中市"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "成巴高速",
|
||||
"SERVERPART_NAME": "中江服务区",
|
||||
"SERVERPART_ID": 544,
|
||||
"SERVERPART_ADDRESS": "德阳市"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "成渝环线高速",
|
||||
"SERVERPART_NAME": "三台停车区",
|
||||
"SERVERPART_ID": 549,
|
||||
"SERVERPART_ADDRESS": "绵阳市"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "成巴高速",
|
||||
"SERVERPART_NAME": "盐亭服务区",
|
||||
"SERVERPART_ID": 541,
|
||||
"SERVERPART_ADDRESS": "绵阳市"
|
||||
},
|
||||
{
|
||||
"EXPRESSWAY_NAME": "蓉丽高速",
|
||||
"SERVERPART_NAME": "攀枝花西服务区",
|
||||
"SERVERPART_ID": 572,
|
||||
"SERVERPART_ADDRESS": "攀枝花市"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "京昆高速",
|
||||
"SERVERPART_NAME": "攀枝花服务区",
|
||||
"SERVERPART_ID": 566,
|
||||
"SERVERPART_ADDRESS": "攀枝花市"
|
||||
},
|
||||
{
|
||||
"EXPRESSWAY_NAME": "瑞弄高速",
|
||||
"SERVERPART_NAME": "贺思停车区",
|
||||
"SERVERPART_ID": 1057,
|
||||
"SERVERPART_ADDRESS": "德宏傣族景颇族自治州"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "昆磨高速",
|
||||
"SERVERPART_NAME": "尚勇停车区",
|
||||
"SERVERPART_ID": 1168,
|
||||
"SERVERPART_ADDRESS": "西双版纳傣族自治州"
|
||||
},
|
||||
{
|
||||
"EXPRESSWAY_NAME": "纳兴高速",
|
||||
"SERVERPART_NAME": "纳兴高速",
|
||||
// 长耳营服务区
|
||||
"SERVERPART_ID": 228,
|
||||
"SERVERPART_ADDRESS": "黔西南布依族苗族自治州"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "余安高速",
|
||||
"SERVERPART_NAME": "余安高速",
|
||||
// 天空之桥
|
||||
"SERVERPART_ID": 232,
|
||||
"SERVERPART_ADDRESS": "黔南布依族苗族自治州"
|
||||
},
|
||||
|
||||
{
|
||||
"EXPRESSWAY_NAME": "杭瑞高速",
|
||||
"SERVERPART_NAME": "恐龙山服务区",
|
||||
"SERVERPART_ID": 1179,
|
||||
"SERVERPART_ADDRESS": "楚雄彝族自治州"
|
||||
},
|
||||
{
|
||||
"EXPRESSWAY_NAME": "杭瑞高速",
|
||||
"SERVERPART_NAME": "读书铺服务区",
|
||||
"SERVERPART_ID": 1212,
|
||||
"SERVERPART_ADDRESS": "昆明市"
|
||||
},
|
||||
|
||||
],
|
||||
cityCoordinate: {
|
||||
|
||||
@ -8470,7 +9431,7 @@ const detailObj = {
|
||||
"儋州市": [109.57, 19.52],
|
||||
"三沙市": [112.35, 16.83],
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
|
||||
export default detailObj
|
||||
88
src/components/map/component/realBox.less
Normal file
@ -0,0 +1,88 @@
|
||||
.realBoxContent{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
box-sizing: border-box;
|
||||
padding: 16px;
|
||||
border:1px solid #5F5F5F;
|
||||
border-radius: 8px;
|
||||
.leftBox{
|
||||
width: 25%;
|
||||
.realTime{
|
||||
color: #fff;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
.leftOther{
|
||||
margin-top: 4px;
|
||||
.label{
|
||||
color: #fff;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
.value{
|
||||
color: #d1ab61;
|
||||
font-size: 0.8rem;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
margin-right: 8px;
|
||||
text-align: right;
|
||||
transition: transform 0.3s ease-out;
|
||||
}
|
||||
.unit{
|
||||
color: #d1ab61;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.middleBox{
|
||||
width: 50%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
.realText{
|
||||
font-size: 2rem;
|
||||
color: #45aaf1;
|
||||
.unit{
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.yearRevenue{
|
||||
color: #fff;
|
||||
font-size: 0.8rem;
|
||||
margin-top: 2px;
|
||||
.value{
|
||||
color: #45aaf1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.rightBox{
|
||||
width: 25%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
.rightItem{
|
||||
.label{
|
||||
color: #fff;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
.value{
|
||||
color: #d1ab61;
|
||||
font-size: 0.8rem;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
margin-right: 8px;
|
||||
text-align: right;
|
||||
}
|
||||
.unit{
|
||||
color: #d1ab61;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
272
src/components/map/component/realBox.vue
Normal file
@ -0,0 +1,272 @@
|
||||
<script setup lang="ts">
|
||||
import "./realBox.less";
|
||||
import moment from "moment";
|
||||
import { nextTick, onMounted, reactive, ref, watch } from "vue";
|
||||
import { formatNumberData, formatNumberTo } from "../../../options/serveice";
|
||||
import { handlegetServerConnec } from "../../newService";
|
||||
|
||||
// 省份信息
|
||||
const baseInfoObj = ref<any>();
|
||||
|
||||
// 实时钱的数据对象
|
||||
let realMoney = reactive<any>({});
|
||||
// 定时器 ID,用于清除定时器
|
||||
let timer;
|
||||
// 时间变动的定时器
|
||||
const startTimer = () => {
|
||||
timer = setInterval(() => {
|
||||
realMoney.realTime = moment().format("YYYY-MM-DD HH:mm:ss"); // 每秒更新一次
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
// 拿到实时营收 和 年度的营收 并开启定时器
|
||||
const handleGetRealMoney = async (province_code: any) => {
|
||||
let req = {
|
||||
action_type: "getServerConnect",
|
||||
province_code: province_code,
|
||||
};
|
||||
if (!req.province_code) {
|
||||
return;
|
||||
}
|
||||
const data = await handlegetServerConnec(req);
|
||||
let obj = data.CurrentData[0];
|
||||
console.log("data321321", obj);
|
||||
|
||||
let yearReq = {
|
||||
action_type: "getYearRevenue",
|
||||
province_code: province_code,
|
||||
};
|
||||
if (!yearReq.province_code) {
|
||||
return;
|
||||
}
|
||||
const yearData = await handlegetServerConnec(yearReq);
|
||||
|
||||
obj = {
|
||||
...obj,
|
||||
YEAR_REVENUE: yearData.YEAR_REVENUE,
|
||||
};
|
||||
|
||||
nextTick(() => {
|
||||
// 实际时间
|
||||
realMoney.realTime = moment().format("YYYY-MM-DD HH:mm:ss");
|
||||
// 赋值完开始启动定时器
|
||||
startTimer();
|
||||
|
||||
updateValues(obj, true);
|
||||
|
||||
// 定时变值
|
||||
startChangeValue();
|
||||
|
||||
// 接口取的 实际需要动态变化的值
|
||||
// 实际营收
|
||||
// realMoney.TOTALPRICE = formatNumberTo(obj.TOTALPRICE);
|
||||
// // 人数
|
||||
// realMoney.TOTALTICKET = formatNumber(obj.TOTALTICKET);
|
||||
// // 已售商品
|
||||
// realMoney.CURSELLCOUNT = formatNumber(obj.CURSELLCOUNT);
|
||||
|
||||
// // 根据上面的值 算出来的数据
|
||||
// // 人均消费
|
||||
// realMoney.personAvg = formatNumberTo(obj.TOTALPRICE / obj.TOTALTICKET);
|
||||
// // 商品均价
|
||||
// realMoney.AvgPrice = formatNumberTo(obj.TOTALPRICE / obj.CURSELLCOUNT);
|
||||
// startChangeValue();
|
||||
});
|
||||
};
|
||||
|
||||
// 定时器 ID,用于清除定时器
|
||||
let valueTimer;
|
||||
// 其他数据的定时变动
|
||||
const startChangeValue = () => {
|
||||
valueTimer = setInterval(() => {
|
||||
updateValues(realMoney, false);
|
||||
}, 10000);
|
||||
};
|
||||
|
||||
const handleAnimateValue = (
|
||||
start: any,
|
||||
end: any,
|
||||
element: any,
|
||||
duration = 3000
|
||||
) => {
|
||||
start = Number(start);
|
||||
end = Number(end);
|
||||
|
||||
// 检查 element 是否为 null 或 undefined
|
||||
if (!element) {
|
||||
return;
|
||||
}
|
||||
|
||||
let startTime: number | null = null;
|
||||
|
||||
const step = (timestamp: number) => {
|
||||
if (!startTime) startTime = timestamp;
|
||||
const progress: number = Math.min((timestamp - startTime) / duration, 1);
|
||||
// 计算过渡的数字值,并格式化为两位小数
|
||||
const value = start + (end - start) * progress;
|
||||
// 判断是否有小数
|
||||
const isInteger = value % 1 === 0;
|
||||
// 更新 DOM 元素的文本内容
|
||||
if (isInteger) {
|
||||
element.textContent = formatNumberData(value);
|
||||
} else {
|
||||
element.textContent = formatNumberTo(value);
|
||||
}
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(step);
|
||||
}
|
||||
};
|
||||
requestAnimationFrame(step);
|
||||
};
|
||||
|
||||
const updateValues = (obj?: any, haveObj?: boolean) => {
|
||||
let newObj: any = {};
|
||||
if (haveObj) {
|
||||
newObj = obj;
|
||||
newObj.personAvg = obj.TOTALPRICE / obj.TOTALTICKET;
|
||||
newObj.AvgPrice = obj.TOTALPRICE / obj.CURSELLCOUNT;
|
||||
} else {
|
||||
let oldObj: any = JSON.parse(JSON.stringify(realMoney));
|
||||
let num_1: number = Math.floor(Math.random() * 14) + 1; //人
|
||||
let num_2: number = Math.floor(Math.random() * 21) + 1; //商品
|
||||
let num_3: number = Math.random() * 462 + 1; //钱
|
||||
newObj.TOTALTICKET = oldObj.TOTALTICKET + num_1;
|
||||
newObj.TOTALPRICE = oldObj.TOTALPRICE + num_3;
|
||||
newObj.YEAR_REVENUE = oldObj.YEAR_REVENUE + num_3;
|
||||
newObj.CURSELLCOUNT = oldObj.CURSELLCOUNT + num_2;
|
||||
newObj.personAvg =
|
||||
(oldObj.TOTALPRICE + num_3) / (oldObj.TOTALTICKET + num_1);
|
||||
newObj.AvgPrice =
|
||||
(oldObj.TOTALPRICE + num_3) / (oldObj.CURSELLCOUNT + num_2);
|
||||
}
|
||||
|
||||
// 动画更新
|
||||
// 人数
|
||||
const TOTALTICKETElement = document.querySelector(".TOTALTICKET");
|
||||
// 实际营收
|
||||
const TOTALPRICEElement = document.querySelector(" .TOTALPRICE");
|
||||
// 本年度累计营收额
|
||||
const YEAR_REVENUEElement = document.querySelector(".YEAR_REVENUE");
|
||||
// 人均消费
|
||||
const personAvgElement = document.querySelector(".personAvg");
|
||||
// 已售商品
|
||||
const CURSELLCOUNTElement = document.querySelector(".CURSELLCOUNT");
|
||||
// 商品均价
|
||||
const AvgPriceElement = document.querySelector(".AvgPrice");
|
||||
|
||||
handleAnimateValue(
|
||||
realMoney.TOTALTICKET || 0,
|
||||
newObj?.TOTALTICKET || 0,
|
||||
TOTALTICKETElement
|
||||
);
|
||||
handleAnimateValue(
|
||||
realMoney.TOTALPRICE || 0,
|
||||
newObj?.TOTALPRICE || 0,
|
||||
TOTALPRICEElement
|
||||
);
|
||||
handleAnimateValue(
|
||||
realMoney.YEAR_REVENUE || 0,
|
||||
newObj?.YEAR_REVENUE || 0,
|
||||
YEAR_REVENUEElement
|
||||
);
|
||||
handleAnimateValue(
|
||||
realMoney.CURSELLCOUNT || 0,
|
||||
newObj?.CURSELLCOUNT || 0,
|
||||
CURSELLCOUNTElement
|
||||
);
|
||||
|
||||
handleAnimateValue(
|
||||
realMoney.personAvg || 0,
|
||||
newObj.personAvg || 0,
|
||||
personAvgElement
|
||||
);
|
||||
handleAnimateValue(
|
||||
realMoney.AvgPrice || 0,
|
||||
newObj.AvgPrice || 0,
|
||||
AvgPriceElement
|
||||
);
|
||||
// 更新计算后的值
|
||||
// 人数
|
||||
realMoney.TOTALTICKET = newObj.TOTALTICKET;
|
||||
// 实际营收
|
||||
realMoney.TOTALPRICE = newObj.TOTALPRICE;
|
||||
// 年度总营收
|
||||
realMoney.YEAR_REVENUE = newObj.YEAR_REVENUE;
|
||||
// 人均消费
|
||||
realMoney.personAvg = newObj.personAvg;
|
||||
// 已售商品
|
||||
realMoney.CURSELLCOUNT = newObj.CURSELLCOUNT;
|
||||
// 商品均价
|
||||
realMoney.AvgPrice = newObj.AvgPrice;
|
||||
};
|
||||
|
||||
// 传入的数据
|
||||
const props = defineProps<{
|
||||
show: any;
|
||||
}>();
|
||||
|
||||
watch(
|
||||
() => props.show,
|
||||
(newVal, oldVal) => {
|
||||
console.log("realboxnewVal", newVal);
|
||||
if (newVal) {
|
||||
let saveData = localStorage.getItem("baseInfoObj");
|
||||
if (saveData) {
|
||||
baseInfoObj.value = JSON.parse(saveData);
|
||||
}
|
||||
handleGetRealMoney(baseInfoObj.value.ProvinceId);
|
||||
}
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
|
||||
defineExpose({
|
||||
handleGetRealMoney: handleGetRealMoney,
|
||||
});
|
||||
</script>
|
||||
<template>
|
||||
<div class="realBoxContent">
|
||||
<div class="leftBox">
|
||||
<div class="realTime">{{ realMoney.realTime || "-" }}</div>
|
||||
<div class="leftOther">
|
||||
<span class="label">服务司乘:</span>
|
||||
<span class="value TOTALTICKET">{{
|
||||
realMoney.TOTALTICKET || "-"
|
||||
}}</span>
|
||||
<span class="unit">人</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="middleBox">
|
||||
<div class="realText TOTALPRICE">
|
||||
{{ realMoney.TOTALPRICE || "-" }}<span class="unit">元</span>
|
||||
</div>
|
||||
<div class="yearRevenue">
|
||||
<span class="label">本年度累计营收额为:</span>
|
||||
<span class="value YEAR_REVENUE"
|
||||
>{{ realMoney.YEAR_REVENUE || "-" }}<span class="unit">元</span></span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rightBox">
|
||||
<div class="rightItem">
|
||||
<span class="label">人均消费:</span>
|
||||
<span class="value personAvg">{{ realMoney.personAvg || "-" }}</span>
|
||||
<span class="unit">元</span>
|
||||
</div>
|
||||
<div class="rightItem">
|
||||
<span class="label">已售商品:</span>
|
||||
<span class="value CURSELLCOUNT">{{
|
||||
realMoney.CURSELLCOUNT || "-"
|
||||
}}</span>
|
||||
<span class="unit">件</span>
|
||||
</div>
|
||||
<div class="rightItem">
|
||||
<span class="label">商品均价:</span>
|
||||
<span class="value AvgPrice">{{ realMoney.AvgPrice || "-" }}</span>
|
||||
<span class="unit">元</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
12
src/components/map/component/revenueRate.less
Normal file
@ -0,0 +1,12 @@
|
||||
.revenueRateMain{
|
||||
.pageTitle{
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
line-height: 26px;
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
124
src/components/map/component/revenueRate.vue
Normal file
@ -0,0 +1,124 @@
|
||||
<!-- 区域营收占比 -->
|
||||
<script setup lang="ts">
|
||||
import "./revenueRate.less";
|
||||
import * as echarts from "echarts";
|
||||
import { onMounted, ref, watch } from "vue";
|
||||
import { handlegetServerConnec } from "../../newService";
|
||||
|
||||
let myChart = ref<any>();
|
||||
// 省份信息
|
||||
const baseInfoObj = ref<any>();
|
||||
|
||||
onMounted(async () => {
|
||||
myChart.value = echarts.init(document.getElementById("revenueRateContent"));
|
||||
});
|
||||
|
||||
// 拿到数据
|
||||
const handleGetData = async () => {
|
||||
const req: any = {
|
||||
action_type: "GetCurrentAmountByRegion",
|
||||
province_code: baseInfoObj.value.ProvinceId || "3544",
|
||||
};
|
||||
const data = await handlegetServerConnec(req);
|
||||
console.log("revenueRateContent", data);
|
||||
console.log("props.SPREGIONTYPECOLOR", props.SPREGIONTYPECOLOR);
|
||||
let list: any = data.CurrentData;
|
||||
let res: any = [];
|
||||
if (list && list.length > 0) {
|
||||
let totalRevenue: number = 0;
|
||||
list.forEach((item: any) => {
|
||||
totalRevenue += item.TOTALPRICE;
|
||||
});
|
||||
list.forEach((item: any) => {
|
||||
res.push({
|
||||
value: Number(((item.TOTALPRICE / totalRevenue) * 100).toFixed(2)),
|
||||
name: item.TYPE_NAME,
|
||||
itemStyle: { color: props.SPREGIONTYPECOLOR[item.REGION_ID] },
|
||||
});
|
||||
});
|
||||
}
|
||||
console.log("res", res);
|
||||
|
||||
myChart.value.setOption({
|
||||
title: {
|
||||
// text: "区域营收占比",
|
||||
left: "center",
|
||||
textStyle: {
|
||||
color: "#fff", // 设置标题主文字颜色
|
||||
fontSize: 24, // 设置标题字体大小
|
||||
fontWeight: "bold", // 设置标题字体粗细
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
},
|
||||
legend: {
|
||||
orient: "vertical",
|
||||
right: 1,
|
||||
padding: [120, 0, 0, 0],
|
||||
textStyle: {
|
||||
color: "#ffffff", // 设置图例文字颜色
|
||||
fontSize: 14, // 设置字体大小
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "",
|
||||
type: "pie",
|
||||
radius: "50%",
|
||||
center: ["30%", "50%"],
|
||||
data: res,
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: "rgba(0, 0, 0, 0.5)",
|
||||
},
|
||||
},
|
||||
label: {
|
||||
show: true, // 显示标签
|
||||
position: "inside", // 将标签显示在饼图内部
|
||||
color: "#fff", // 设置字体颜色
|
||||
formatter: "{c}%", // 显示数值,即每个扇区的值
|
||||
},
|
||||
labelLine: false,
|
||||
},
|
||||
],
|
||||
});
|
||||
};
|
||||
|
||||
// 传入的数据
|
||||
const props = defineProps<{
|
||||
SPREGIONTYPECOLOR: any;
|
||||
show: any;
|
||||
}>();
|
||||
|
||||
watch(
|
||||
() => props.show,
|
||||
(newVal, oldVal) => {
|
||||
console.log("realboxnewVal", newVal);
|
||||
if (newVal) {
|
||||
let saveData = localStorage.getItem("baseInfoObj");
|
||||
if (saveData) {
|
||||
baseInfoObj.value = JSON.parse(saveData);
|
||||
}
|
||||
handleGetData();
|
||||
}
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
|
||||
defineExpose({
|
||||
handleGetData: handleGetData,
|
||||
});
|
||||
</script>
|
||||
<template>
|
||||
<div class="revenueRateMain">
|
||||
<div class="pageTitle">区域营收占比</div>
|
||||
<div
|
||||
class="revenueRateContent"
|
||||
id="revenueRateContent"
|
||||
style="width: 360px; height: 360px"
|
||||
></div>
|
||||
</div>
|
||||
</template>
|
||||
@ -1,6 +1,6 @@
|
||||
.rightDetailBox{
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
height: calc(100vh - 20px);
|
||||
.tabTop{
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
@ -24,9 +24,426 @@
|
||||
}
|
||||
}
|
||||
.detailContent{
|
||||
width: 100%;
|
||||
max-height: calc(100vh - 70px);
|
||||
box-sizing: border-box;
|
||||
padding: 0 16px 0 0;
|
||||
.projectBox{
|
||||
width: 100%;
|
||||
max-height: calc(100vh - 70px);
|
||||
.projectTab{
|
||||
width: 100%;
|
||||
margin-bottom: 16px;
|
||||
.el-radio-group{
|
||||
margin-bottom: 0!important;
|
||||
}
|
||||
}
|
||||
|
||||
.projectList{
|
||||
width: 100%;
|
||||
height: calc(100vh - 140px);
|
||||
overflow-y: auto;
|
||||
scrollbar-width: none;
|
||||
.projectItem{
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
padding: 16px;
|
||||
margin-bottom: 16px;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
.projectItemLeft{
|
||||
width: 88px;
|
||||
.leftBrandIcon{
|
||||
width: 100%;
|
||||
height: 88px;
|
||||
}
|
||||
}
|
||||
.projectItemRight{
|
||||
margin-left: 12px;
|
||||
width: calc(100% - 100px);
|
||||
.rightTitle{
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.typeLists{
|
||||
display: flex;
|
||||
margin-top: 4px;
|
||||
.typeItem{
|
||||
display: inline-block;
|
||||
padding: 1px 8px;
|
||||
border-radius: 2px;
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 22px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
.topRight{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
margin-top: 20px;
|
||||
.dailyItem{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.itemIcon{
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.itemLabel{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: rgba(0,0,0,0.45);
|
||||
}
|
||||
.itemValue{
|
||||
font-size: 18px;
|
||||
font-family: DINAlternate-Bold, DINAlternate;
|
||||
font-weight: bold;
|
||||
color: rgba(0,0,0,0.85);
|
||||
margin-left: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.selectProjectItem{
|
||||
background: linear-gradient(45deg, #c6e8fc 0%, #bac4ff 100%)!important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.detailServerPart{
|
||||
width: 100%;
|
||||
max-height: calc(100vh - 70px);
|
||||
overflow-y: auto;
|
||||
scrollbar-width: none;
|
||||
.serverPartImg{
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.serverImg{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.defaultImg{
|
||||
width: 250px;
|
||||
height: 250px;
|
||||
}
|
||||
}
|
||||
.serviceTypeTabs{
|
||||
width: 100%;
|
||||
height: 86px;
|
||||
background: #F7FAFF;
|
||||
border-radius: 4px;
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
.serviceTypeItem{
|
||||
width: 25%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
.itemIcon{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.itemText{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: rgba(0,0,0,0.65);
|
||||
line-height: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.detailList{
|
||||
margin-top: 16px;
|
||||
.detailItem{
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 8px;
|
||||
.detailItemLeft{
|
||||
width: 100px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.itemLeftIcon{
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
.itemLeftLabel{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
line-height: 22px;
|
||||
}
|
||||
}
|
||||
.detailItemRight{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
line-height: 22px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.areaList{
|
||||
width: 100%;
|
||||
.areaItem{
|
||||
.areaItemTop{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.itemTopIcon{
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.itemTitle{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Medium, PingFang SC;
|
||||
font-weight: 500;
|
||||
color: #fff;
|
||||
line-height: 22px;
|
||||
}
|
||||
.typeItem{
|
||||
font-size: 12px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 18px;
|
||||
padding: 0 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.itemList{
|
||||
margin-top: 12px;
|
||||
.contentItem{
|
||||
width: 33.3%;
|
||||
display: inline-block;
|
||||
margin-bottom: 20px;
|
||||
.contentItemBox{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
.contentItemIcon{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
.contentItemText{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
line-height: 18px;
|
||||
.number{
|
||||
font-size: 12px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
line-height: 18px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.noContentItemBox{
|
||||
opacity: 0.4!important;
|
||||
.contentItemText{
|
||||
text-decoration: line-through!important;
|
||||
color: #f3f3f3!important;
|
||||
.number{
|
||||
color: #f3f3f3!important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
.detailTop{
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
padding-top: 16px;
|
||||
display: flex;
|
||||
.backIconBox{
|
||||
width: 25px;
|
||||
.backIcon{
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.currentItem{
|
||||
width: calc(100% - 40px);
|
||||
margin-left: 15px;
|
||||
box-sizing: border-box;
|
||||
border-radius: 8px;
|
||||
background: linear-gradient(45deg, #F7FCFF 0%, #F8F9FF 100%);
|
||||
padding: 16px;
|
||||
margin-bottom: 16px;
|
||||
display: flex;
|
||||
.projectItemLeft{
|
||||
width: 88px;
|
||||
.leftBrandIcon{
|
||||
width: 100%;
|
||||
height: 88px;
|
||||
}
|
||||
}
|
||||
.projectItemRight{
|
||||
margin-left: 12px;
|
||||
width: calc(100% - 100px);
|
||||
.rightTitle{
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.typeLists{
|
||||
display: flex;
|
||||
margin-top: 4px;
|
||||
.typeItem{
|
||||
display: inline-block;
|
||||
padding: 1px 8px;
|
||||
border-radius: 2px;
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 22px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
.topRight{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
margin-top: 20px;
|
||||
.dailyItem{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.itemIcon{
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.itemLabel{
|
||||
font-size: 14px;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: rgba(0,0,0,0.45);
|
||||
}
|
||||
.itemValue{
|
||||
font-size: 18px;
|
||||
font-family: DINAlternate-Bold, DINAlternate;
|
||||
font-weight: bold;
|
||||
color: rgba(0,0,0,0.85);
|
||||
margin-left: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.loadingBox{
|
||||
.el-loading-mask{
|
||||
background-color: transparent!important;
|
||||
}
|
||||
}
|
||||
|
||||
.rightDetailPrintWordBox{
|
||||
width: 100%;
|
||||
max-height: calc(100vh - 200px);
|
||||
overflow-y: auto;
|
||||
scrollbar-width: none;
|
||||
color: #fff;
|
||||
.title{
|
||||
display: block;
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
line-height: 24px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
}
|
||||
.div{
|
||||
display: block;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.bigDiv{
|
||||
display: block;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.style1{
|
||||
display: inline-block;
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
color: #1A5D2B;
|
||||
line-height: 22px;
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
background: #E1F3E6;
|
||||
padding: 2px 8px;
|
||||
border-radius: 2px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.style2{
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
color: #2F6DFF;
|
||||
line-height: 22px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
cursor: pointer;
|
||||
}
|
||||
.style3{
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
color: #FE7628;
|
||||
line-height: 22px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
}
|
||||
.style4{
|
||||
font-family: DINAlternate, DINAlternate;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
color: #2f66c5;
|
||||
line-height: 28px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
}
|
||||
.style5{
|
||||
font-family: PingFangSC, PingFang SC;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
color: #788395;
|
||||
line-height: 22px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
}
|
||||
}
|
||||
|
||||
.el-tabs{
|
||||
box-sizing: border-box;
|
||||
padding-top: 8px;
|
||||
|
||||
@ -15,6 +15,9 @@ import selectEarlyWarning from "@/assets/ai/selectEarlyWarning.png";
|
||||
import selectComeForm from "@/assets/ai/selectComeForm.png";
|
||||
import selectBusinessTrade from "@/assets/ai/selectBusinessTrade.png";
|
||||
import selectDeleteIcon from "@/assets/ai/selectDeleteIcon.png";
|
||||
import busyIcon from "@/assets/ai/busyIcon.png";
|
||||
import selectBusy from "@/assets/ai/selectBusy.png";
|
||||
|
||||
import { nextTick } from "process";
|
||||
import { getFieldEnumTree } from "../service";
|
||||
import { ElMessage } from "element-plus";
|
||||
@ -41,6 +44,7 @@ const filterList: any = reactive<any>([
|
||||
src: weaearlyWarningther,
|
||||
selectScr: selectEarlyWarning,
|
||||
},
|
||||
{ label: "即时指挥", value: "8", src: busyIcon, selectScr: selectBusy },
|
||||
{ label: "清空", value: "7", src: deleteIcon, selectScr: selectDeleteIcon },
|
||||
]);
|
||||
// 显示筛选列表的查询表单
|
||||
@ -55,6 +59,12 @@ let businessTradeList = reactive([]);
|
||||
let selectBusinessTradeList = reactive<any>([]);
|
||||
// 经营业态的对象枚举
|
||||
let selectBusinessTradeIdsObj = ref<any>();
|
||||
// 省份信息
|
||||
const baseInfoObj = ref<any>();
|
||||
let saveData = localStorage.getItem("baseInfoObj");
|
||||
if (saveData) {
|
||||
baseInfoObj.value = JSON.parse(saveData);
|
||||
}
|
||||
|
||||
// 点击展开筛选图标的方法
|
||||
const showFilterList = () => {
|
||||
|
||||
21863
src/components/map/component/yunanLine.js
Normal file
@ -30,10 +30,73 @@
|
||||
|
||||
.serverpartDetail{
|
||||
width: 25%;
|
||||
height: calc(100vh - 20px);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
|
||||
.realBox{
|
||||
width: 45%;
|
||||
height: 100px;
|
||||
position: absolute;
|
||||
top: 16px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.revenueRate{
|
||||
width: 400px;
|
||||
height: 400px;
|
||||
border:1px solid #5F5F5F;
|
||||
position: absolute;
|
||||
bottom: 16px;
|
||||
left: 16px;
|
||||
z-index: 10;
|
||||
border-radius: 8px;
|
||||
box-sizing: border-box;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.BusyRanking{
|
||||
width: 400px;
|
||||
height: 400px;
|
||||
border:1px solid #5F5F5F;
|
||||
position: absolute;
|
||||
bottom: 16px;
|
||||
right: 16px;
|
||||
z-index: 10;
|
||||
border-radius: 8px;
|
||||
box-sizing: border-box;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.areaList{
|
||||
box-sizing: border-box;
|
||||
padding: 16px;
|
||||
border:1px solid #5F5F5F;
|
||||
border-radius: 8px;
|
||||
z-index: 10;
|
||||
position: absolute;
|
||||
bottom: 16px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
.areaItem{
|
||||
margin-right: 16px;
|
||||
.color{
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 50%;
|
||||
margin-right: 8px;
|
||||
display: inline-block;
|
||||
}
|
||||
.text{
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,18 +2,23 @@
|
||||
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 { onMounted, reactive, ref } from "vue";
|
||||
import { onMounted, reactive, ref, watch } from "vue";
|
||||
import {
|
||||
getFieldEnumTree,
|
||||
getFieldGetFieEnumList,
|
||||
handleGetBaiDuTrafficInfo,
|
||||
handleGetDecryptString,
|
||||
handleGetMapConfigByProvinceCode,
|
||||
handleGetMonthlySPINCAnalysis,
|
||||
handleGetPeriodWarningList,
|
||||
handleGetProvinceVehicleTreeList,
|
||||
handleGetServerpartList,
|
||||
} from "./service";
|
||||
import { handlegetServerConnec } from "../newService";
|
||||
import { ElLoading, ElMessage } from "element-plus";
|
||||
// @ts-ignore
|
||||
import RobotDialogueBox from "./component/RobotDialogueBox.vue";
|
||||
@ -23,14 +28,49 @@ import RightSearchBox from "./component/RightSearchBox.vue";
|
||||
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 { nextTick } from "process";
|
||||
import moment from "moment";
|
||||
import { log } from "console";
|
||||
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>();
|
||||
// 对话框的实例
|
||||
@ -39,6 +79,12 @@ const RobotDialogueBoxRef = ref();
|
||||
const RightSearchBoxRef = ref();
|
||||
// 右侧详情抽屉
|
||||
const RightDetailRef = ref();
|
||||
// 顶部实时数据的组件
|
||||
const RealBoxRef = ref();
|
||||
// 营收区域的组件实例
|
||||
const revenueRateRef = ref();
|
||||
// 繁忙度排名的实例
|
||||
const BusyRankingRef = ref();
|
||||
// 悬浮框实例
|
||||
const hoverPoint = ref<any>();
|
||||
// 所有服务区的数据
|
||||
@ -57,14 +103,55 @@ let nowSelectId = ref<string>("");
|
||||
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>([]);
|
||||
|
||||
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: [117.455467, 31.856928],
|
||||
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",
|
||||
@ -74,11 +161,6 @@ onMounted(async () => {
|
||||
}),
|
||||
});
|
||||
|
||||
const loadingInstance = ElLoading.service({
|
||||
fullscreen: true,
|
||||
background: "#00000080",
|
||||
text: "数据加载中...",
|
||||
});
|
||||
// 请求枚举
|
||||
await handleGetEnumeration();
|
||||
console.log("ServerpartTypeObj", ServerpartTypeObj);
|
||||
@ -91,14 +173,30 @@ onMounted(async () => {
|
||||
handleGetAnHuiBoundary();
|
||||
|
||||
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 list: any = anhuiLine;
|
||||
// 边界线数据
|
||||
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",
|
||||
@ -111,22 +209,50 @@ const handleGetAnHuiBoundary = () => {
|
||||
// 请求拿到所有服务区数据
|
||||
const handleGetAllService = async () => {
|
||||
const req: any = {
|
||||
Province_Code: "340000",
|
||||
Province_Code: baseInfoObj.value.ProvinceCode || "340000",
|
||||
ShowWeather: true, // 显示天气
|
||||
};
|
||||
const data = await handleGetServerpartList(req);
|
||||
console.log("data", data);
|
||||
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 !== 89 && item.SPREGIONTYPE_ID) {
|
||||
res.push(item);
|
||||
allId.push(item.SERVERPART_ID.toString());
|
||||
if (item.SPREGIONTYPE_ID) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
});
|
||||
defaultServerPartList = res;
|
||||
allServerPartIdList = allId;
|
||||
console.log("SPREGIONTYPECOLORLIST", SPREGIONTYPECOLORLIST);
|
||||
|
||||
SPREGIONTYPECOLORList = SPREGIONTYPECOLORLIST;
|
||||
SPREGIONTYPECOLOR.value = SPREGIONTYPETYPEObj;
|
||||
}
|
||||
return data;
|
||||
};
|
||||
@ -153,20 +279,21 @@ const handleAllServiceMarkedPoint = async () => {
|
||||
});
|
||||
pointLayer.shape("circle");
|
||||
pointLayer.size(8);
|
||||
pointLayer.color("SPREGIONTYPE_ID", (value) => {
|
||||
return Number(value || 0) === 65 ||
|
||||
Number(value || 0) === 45 ||
|
||||
Number(value || 0) === 47
|
||||
? "#34B6B7"
|
||||
: "#CEF8D6";
|
||||
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;
|
||||
hoverPoint.value.style.top = `${ev.y}px`;
|
||||
hoverPoint.value.style.left = `${ev.x}px`;
|
||||
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 || ""}${
|
||||
@ -287,6 +414,19 @@ const handleAllServiceMarkedPoint = async () => {
|
||||
</div>`
|
||||
: ""
|
||||
}
|
||||
${
|
||||
// 服务区繁忙程度
|
||||
nowSelectId.value && nowSelectId.value.indexOf("8") !== -1
|
||||
? `<div>对客销售:${
|
||||
detail.AVR_TICKET > 30
|
||||
? "繁忙"
|
||||
: detail.AVR_TICKET > 15 && detail.AVR_TICKET < 30
|
||||
? "良好"
|
||||
: "空闲"
|
||||
}
|
||||
</div>`
|
||||
: ""
|
||||
}
|
||||
|
||||
</div>`;
|
||||
});
|
||||
@ -314,7 +454,7 @@ const handleAllServiceMarkedPoint = async () => {
|
||||
const handleClickPointLayer = async (detail: any) => {
|
||||
// 给当前选中的服务区存储值
|
||||
currentServerPartDetail.value = detail;
|
||||
// 地图上出现选中服务区的效果
|
||||
// 地图上出现选中服务区的效果
|
||||
handleAddSelect(detail);
|
||||
// 先清空现有的全部图层
|
||||
handleDeleteNoDefault("");
|
||||
@ -322,8 +462,9 @@ const handleClickPointLayer = async (detail: any) => {
|
||||
let nowSelect: string = RightSearchBoxRef.value.selectFilterList;
|
||||
await handleChangeMapShow(nowSelect);
|
||||
// 右侧的详情抽屉
|
||||
// showRightDetail.value = true;
|
||||
|
||||
showRightDetail.value = true;
|
||||
// 用户判断实时数据的右侧详情是否显示的判断
|
||||
isShowDetail.value = true;
|
||||
// // 对话框上方是否选中了
|
||||
// let selectTab: any = RobotDialogueBoxRef.value.selectTab;
|
||||
// RobotDialogueBoxRef.value.handleClickTab(selectTab);
|
||||
@ -331,6 +472,18 @@ const handleClickPointLayer = async (detail: any) => {
|
||||
|
||||
// 给服务区圆点加上选中效果
|
||||
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) {
|
||||
@ -353,6 +506,11 @@ const handleAddSelect = (detail: any) => {
|
||||
},
|
||||
});
|
||||
scene.value.addLayer(lightPointLayer);
|
||||
|
||||
if (isWarning) {
|
||||
console.log("detailisWarning", detail);
|
||||
RightDetailRef.value.handleScrollProjectList(detail.warningShop);
|
||||
}
|
||||
};
|
||||
|
||||
// 点击垃圾桶 清除选中效果
|
||||
@ -377,12 +535,13 @@ const handleChangeToDefault = () => {
|
||||
});
|
||||
// 将进入搜索状态的服务区正常圆点 变回正常颜色
|
||||
let current: any = handleGetThisLayer("pointLayer");
|
||||
current.color("SPREGIONTYPE_ID", (value: number) => {
|
||||
return Number(value || 0) === 65 ||
|
||||
Number(value || 0) === 45 ||
|
||||
Number(value || 0) === 47
|
||||
? "#34B6B7"
|
||||
: "#CEF8D6";
|
||||
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();
|
||||
};
|
||||
@ -490,7 +649,6 @@ const handleSelectedServerpart = (id: any) => {
|
||||
const handleGetThisLayer = (name: string) => {
|
||||
let res: any;
|
||||
let allLayers: any = scene.value.getLayers();
|
||||
console.log("allLayers", allLayers);
|
||||
if (allLayers && allLayers.length > 0) {
|
||||
allLayers.forEach((item: any) => {
|
||||
if (item.name === name) {
|
||||
@ -663,7 +821,6 @@ const hanleGetRealTrafficData = async (id: any) => {
|
||||
onceRoadList.features = list;
|
||||
|
||||
let allLayers: any = scene.value.getLayers();
|
||||
console.log("allLayers", allLayers);
|
||||
|
||||
let haveList: any = allLayers.filter(
|
||||
(item: any) => item.name === "lineLayerOnce"
|
||||
@ -760,7 +917,6 @@ const handleGetRealTraffic = async () => {
|
||||
// 传入名字清除图层
|
||||
const handleDeleteLayer = (name: string) => {
|
||||
let allLayers: any = scene.value.getLayers();
|
||||
console.log("allLayers", allLayers);
|
||||
if (allLayers && allLayers.length > 0) {
|
||||
allLayers.forEach((item: any) => {
|
||||
if (item.name === name) {
|
||||
@ -792,6 +948,9 @@ const handleDeleteNoDefault = (nowSelect: string) => {
|
||||
if (nowSelect.indexOf("6") === -1) {
|
||||
handleDeleteLayer("warningLayer");
|
||||
}
|
||||
if (nowSelect.indexOf("8") === -1) {
|
||||
isShowRealData.value = false;
|
||||
}
|
||||
} else {
|
||||
console.log("22222", defaultServerPartList);
|
||||
scene.value.removeAllMarkers();
|
||||
@ -801,6 +960,14 @@ const handleDeleteNoDefault = (nowSelect: string) => {
|
||||
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();
|
||||
}
|
||||
};
|
||||
|
||||
@ -824,7 +991,7 @@ const handleUpdateMapPoint = () => {
|
||||
const handleGetServerpartRevenue = async () => {
|
||||
const revenueReq: any = {
|
||||
calcType: 2,
|
||||
pushProvinceCode: 340000,
|
||||
pushProvinceCode: baseInfoObj.value.ProvinceCode || "340000",
|
||||
curYear: moment().format("YYYY"),
|
||||
compareYear: moment().subtract(1, "year").format("YYYY"),
|
||||
StatisticsDate: moment().format("YYYY-MM-DD"),
|
||||
@ -1340,6 +1507,75 @@ const handleChangeMapShow = async (nowSelect: string) => {
|
||||
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();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 服务区繁忙
|
||||
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();
|
||||
}
|
||||
};
|
||||
|
||||
@ -1370,8 +1606,30 @@ const handleAreaInspection = async (i: number) => {
|
||||
|
||||
// 其他要显示的文字
|
||||
let otherObj: any = {
|
||||
businessText: answerData,
|
||||
merchantText: merchantData,
|
||||
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 () => {
|
||||
@ -1407,11 +1665,21 @@ const handleHiddenSuspended = () => {
|
||||
const handleCloseRightDetail = () => {
|
||||
showRightDetail.value = false;
|
||||
};
|
||||
|
||||
// 机器人是否显示的状态
|
||||
const handleShowAi = (value: boolean) => {
|
||||
isShowAi.value = value;
|
||||
};
|
||||
|
||||
// 右侧详情是否显示
|
||||
const handleShowDetail = (value: boolean) => {
|
||||
isShowDetail.value = value;
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="map" class="mapBox">
|
||||
<div class="RobotBox">
|
||||
<div class="RobotBox" v-if="baseInfoObj?.ShowAIQA">
|
||||
<RobotDialogueBox
|
||||
ref="RobotDialogueBoxRef"
|
||||
@handleLightServerpart="handleLightServerpart"
|
||||
@ -1419,6 +1687,7 @@ const handleCloseRightDetail = () => {
|
||||
@handleWarningMap="handleWarningMap"
|
||||
@handleAreaInspection="handleAreaInspection"
|
||||
@handleHiddenSuspended="handleHiddenSuspended"
|
||||
@handleShowAi="handleShowAi"
|
||||
:currentServerPartDetail="currentServerPartDetail"
|
||||
:allServerPartIdList="allServerPartIdList"
|
||||
/>
|
||||
@ -1436,11 +1705,103 @@ const handleCloseRightDetail = () => {
|
||||
:currentServerPartDetail="currentServerPartDetail"
|
||||
/>
|
||||
</div>
|
||||
<div class="serverpartDetail" v-if="showRightDetail">
|
||||
<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="areaList"
|
||||
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>
|
||||
|
||||
@ -143,5 +143,58 @@ export async function handleGetBrandReceivables(params: any) {
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data;
|
||||
}
|
||||
|
||||
export async function handleGetPeriodWarningListPOST(params: any) {
|
||||
const data: any = await request.post('/BusinessProject/GetPeriodWarningList', params)
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data.List;
|
||||
}
|
||||
|
||||
|
||||
export async function handleGetBusinessDate(params: any) {
|
||||
const data: any = await request.get('/Revenue/GetBusinessDate', params)
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data;
|
||||
}
|
||||
|
||||
|
||||
export async function handleGetAnnualSplit(params: any) {
|
||||
const data: any = await request.get('/BusinessProject/GetAnnualSplit', params)
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data.List;
|
||||
}
|
||||
|
||||
export async function handleGetServerpartInfo(params: any) {
|
||||
const data: any = await requestCode.get('/BaseInfo/GetServerpartInfo', params)
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data;
|
||||
}
|
||||
|
||||
|
||||
// 解密
|
||||
export async function handleGetDecryptString(params: any) {
|
||||
const data: any = await requestCode.get('/Common/GetDecryptString', params)
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data;
|
||||
}
|
||||
|
||||
// 数据多一点的解密
|
||||
export async function handleGetMapConfigByProvinceCode(params: any) {
|
||||
const data: any = await requestCode.get('/Analysis/GetMapConfigByProvinceCode', params)
|
||||
if (data.Result_Code !== 100) {
|
||||
return data
|
||||
}
|
||||
return data.Result_Data;
|
||||
}
|
||||
6
src/components/newService.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import request from "../request/newRequest";
|
||||
|
||||
export async function handlegetServerConnec(params: any) {
|
||||
const data: any = await request.get('', params)
|
||||
return data
|
||||
}
|
||||
@ -20,9 +20,41 @@ export const formatNumber = (num: number) => {
|
||||
}
|
||||
}
|
||||
|
||||
export const formatNumberData = (value: number): string => {
|
||||
if (isNaN(value)) return ""; // 如果输入值不是数字,返回空字符串
|
||||
// 判断是否有小数
|
||||
const isInteger = value % 1 === 0;
|
||||
// 添加千分号
|
||||
let formattedValue = value.toLocaleString('en-US');
|
||||
// 如果有小数,保留两位小数
|
||||
if (!isInteger) {
|
||||
formattedValue = parseFloat(value.toFixed(2)).toLocaleString('en-US');
|
||||
}
|
||||
return formattedValue;
|
||||
};
|
||||
|
||||
// 把可能是带千分号的数字 变为数字
|
||||
export const parseThousandSeparatedNumber = (str: string) => {
|
||||
if (!str) return 0; // 如果字符串为空,返回0
|
||||
const cleaned = str.replace(/,/g, ""); // 移除千分号
|
||||
return parseFloat(cleaned); // 转换为数字
|
||||
};
|
||||
if (!str) return 0; // 如果字符串为空,返回0
|
||||
const cleaned = str.replace(/,/g, ""); // 移除千分号
|
||||
return parseFloat(cleaned); // 转换为数字
|
||||
};
|
||||
|
||||
// 截取小数点2位 输出带千分号的
|
||||
export const formatNumberTo = (num: number) => {
|
||||
// 判断是否是数字
|
||||
if (isNaN(num) || num === 0) {
|
||||
return "0.00";
|
||||
}
|
||||
|
||||
// 限制小数点后最多两位
|
||||
let number: any = num.toFixed(2);
|
||||
|
||||
// 添加千分位
|
||||
const [integer, decimal] = number.split('.');
|
||||
|
||||
const formattedInteger = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ','); // 添加千分位
|
||||
|
||||
// 返回带千分位和保留两位小数的数字
|
||||
return `${formattedInteger}.${decimal}`;
|
||||
}
|
||||
80
src/request/newRequest.ts
Normal file
@ -0,0 +1,80 @@
|
||||
|
||||
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
|
||||
import { notification } from 'antd';
|
||||
import Cookies from 'js-cookie';
|
||||
import moment from 'moment';
|
||||
|
||||
// 定义 HTTP 状态码及其描述
|
||||
const codeMessage: Record<number, string> = {
|
||||
200: '服务器成功返回请求的数据。',
|
||||
201: '新建或修改数据成功。',
|
||||
202: '一个请求已经进入后台排队(异步任务)。',
|
||||
204: '删除数据成功。',
|
||||
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
|
||||
401: '用户没有权限(令牌、用户名、密码错误)。',
|
||||
403: '用户得到授权,但是访问是被禁止的。',
|
||||
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
|
||||
406: '请求的格式不可得。',
|
||||
410: '请求的资源被永久删除,且不会再得到的。',
|
||||
422: '当创建一个对象时,发生一个验证错误。',
|
||||
500: '服务器发生错误,请检查服务器。',
|
||||
502: '网关错误。',
|
||||
503: '服务不可用,服务器暂时过载或维护。',
|
||||
504: '网关超时。',
|
||||
};
|
||||
|
||||
// 错误处理
|
||||
const errorHandler = (error: any): any => {
|
||||
const { response } = error;
|
||||
if (response && response.status) {
|
||||
const errorText = codeMessage[response.status] || response.statusText;
|
||||
const { status, url } = response;
|
||||
notification.error({
|
||||
message: `请求错误 ${status}: ${url}`,
|
||||
description: errorText,
|
||||
});
|
||||
} else {
|
||||
notification.error({
|
||||
description: '您的网络异常,无法连接到服务器。',
|
||||
message: '网络异常',
|
||||
});
|
||||
}
|
||||
return Promise.reject(error);
|
||||
};
|
||||
|
||||
// 创建 axios 实例
|
||||
const instance = axios.create({
|
||||
baseURL: 'http://cloud.eshangtech.com/MobileServicePlatform/Handler/handler_ajax.ashx', // 默认请求前缀
|
||||
timeout: 60000, // 请求超时时间
|
||||
headers: {
|
||||
'Content-Type': 'text/plain',
|
||||
},
|
||||
});
|
||||
|
||||
// 请求拦截器
|
||||
instance.interceptors.request.use(
|
||||
(config: any) => {
|
||||
return config;
|
||||
},
|
||||
errorHandler
|
||||
);
|
||||
|
||||
// 响应拦截器
|
||||
instance.interceptors.response.use(
|
||||
(response: AxiosResponse) => {
|
||||
// 每次响应,设置一个 tmp 的 Cookie
|
||||
Cookies.set('tmp', moment().format());
|
||||
return response.data; // 统一返回 data
|
||||
},
|
||||
errorHandler
|
||||
);
|
||||
|
||||
// 封装的请求方法
|
||||
const request = {
|
||||
get: (url: string, params?: any) => instance.get(url, { params }),
|
||||
post: (url: string, data?: any) => instance.post(url, data),
|
||||
put: (url: string, data?: any) => instance.put(url, data),
|
||||
delete: (url: string, params?: any) => instance.delete(url, { params }),
|
||||
};
|
||||
|
||||
export default request;
|
||||
@ -1,15 +1,22 @@
|
||||
import { createRouter, createWebHistory } from 'vue-router';
|
||||
import { createRouter, createWebHashHistory } from 'vue-router';
|
||||
import Map from '@/components/map/index.vue'; // 你的 Map 组件
|
||||
|
||||
const routes = [
|
||||
{ path: '/', redirect: '/map' },
|
||||
{ path: '/map', name: 'map', component: () => import('@/components/map/index.vue') }
|
||||
// { path: '/', name: 'Home', component: Home },
|
||||
// { path: '/about', name: 'About', component: () => import('../components/About.vue') },
|
||||
// {
|
||||
// path: '/:id',
|
||||
// name: 'home',
|
||||
// component: Map,
|
||||
// },
|
||||
{
|
||||
path: '/map/:id',
|
||||
name: 'map',
|
||||
component: Map
|
||||
},
|
||||
];
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
history: createWebHashHistory('/aiMap/'),
|
||||
routes,
|
||||
});
|
||||
|
||||
export default router;
|
||||
export default router;
|
||||
|
||||
@ -1 +1 @@
|
||||
{"root":["./src/main.ts","./src/shims-vue.d.ts","./src/vite-env.d.ts","./src/components/service.ts","./src/components/map/service.ts","./src/options/serveice.ts","./src/request/request.ts","./src/request/requestcode.ts","./src/request/requestconfig.ts","./src/router/index.ts","./src/stores/counter.ts","./src/app.vue","./src/components/robot.vue","./src/components/map/index.vue","./src/components/map/component/robotdialoguebox.vue","./src/components/map/component/rightdetail.vue","./src/components/map/component/rightsearchbox.vue"],"version":"5.6.3"}
|
||||
{"root":["./src/main.ts","./src/shims-vue.d.ts","./src/vite-env.d.ts","./src/components/newservice.ts","./src/components/service.ts","./src/components/map/service.ts","./src/options/serveice.ts","./src/request/newrequest.ts","./src/request/request.ts","./src/request/requestcode.ts","./src/request/requestconfig.ts","./src/router/index.ts","./src/stores/counter.ts","./src/app.vue","./src/components/robot.vue","./src/components/map/index.vue","./src/components/map/component/busyranking.vue","./src/components/map/component/robotdialoguebox.vue","./src/components/map/component/realbox.vue","./src/components/map/component/revenuerate.vue","./src/components/map/component/rightdetail.vue","./src/components/map/component/rightsearchbox.vue"],"version":"5.6.3"}
|
||||
@ -1,11 +1,4 @@
|
||||
/*
|
||||
* @Author: cclu 1106109051@qq.com
|
||||
* @Date: 2024-11-18 11:40:21
|
||||
* @LastEditors: cclu 1106109051@qq.com
|
||||
* @LastEditTime: 2024-11-21 10:43:14
|
||||
* @FilePath: \aiRobot\vite.config.ts
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
|
||||
import { defineConfig } from 'vite';
|
||||
import vue from '@vitejs/plugin-vue';
|
||||
import path from 'path';
|
||||
@ -14,11 +7,11 @@ export default defineConfig({
|
||||
plugins: [
|
||||
vue(),
|
||||
],
|
||||
base: '/aiMap',
|
||||
base: '/aiMap/', // 确保这里设置为你的子路径
|
||||
build: {
|
||||
outDir: 'dist', // 打包输出目录
|
||||
assetsDir: 'assets', // 静态资源目录
|
||||
rollupOptions: {
|
||||
rollupOptions: {
|
||||
input: '/index.html', // 指定入口文件
|
||||
},
|
||||
},
|
||||
|
||||