|
@@ -45,11 +45,11 @@
|
|
|
<div class="warning-alarm yes-events" v-show="activeBaseTab === '预警分布'">
|
|
<div class="warning-alarm yes-events" v-show="activeBaseTab === '预警分布'">
|
|
|
<alarm-list></alarm-list>
|
|
<alarm-list></alarm-list>
|
|
|
</div>
|
|
</div>
|
|
|
- <div v-show="activeBaseTab !== '农服管理'" class="time-wrap yes-events">
|
|
|
|
|
|
|
+ <div v-show="activeBaseTab !== '农服管理' && activeBaseTab !== '农场分布'" class="time-wrap yes-events">
|
|
|
<time-line></time-line>
|
|
<time-line></time-line>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="action-legend" v-if="activeBaseTab !== '农场分布' && activeBaseTab !== '农服管理'">
|
|
|
|
|
|
|
+ <div class="action-legend" v-if="activeBaseTab !== '农服管理'">
|
|
|
<el-tree
|
|
<el-tree
|
|
|
ref="treeRef"
|
|
ref="treeRef"
|
|
|
class="yes-events"
|
|
class="yes-events"
|
|
@@ -78,7 +78,7 @@
|
|
|
<!-- <farmInfoGroup></farmInfoGroup> -->
|
|
<!-- <farmInfoGroup></farmInfoGroup> -->
|
|
|
</div>
|
|
</div>
|
|
|
<div v-if="panelType === 1" class="warning-r right yes-events">
|
|
<div v-if="panelType === 1" class="warning-r right yes-events">
|
|
|
- <farmInfoGroup></farmInfoGroup>
|
|
|
|
|
|
|
+ <farmInfoGroup :farmList="farmList"></farmInfoGroup>
|
|
|
</div>
|
|
</div>
|
|
|
<div v-if="panelType === 2" class="warning-r right yes-events">
|
|
<div v-if="panelType === 2" class="warning-r right yes-events">
|
|
|
<service-list></service-list>
|
|
<service-list></service-list>
|
|
@@ -173,12 +173,6 @@ const defaultProps = {
|
|
|
label: "name",
|
|
label: "name",
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-import lz from "@/assets/images/map/type/荔枝.png";
|
|
|
|
|
-import ly from "@/assets/images/map/type/龙眼.png";
|
|
|
|
|
-import sd from "@/assets/images/map/type/水稻.png";
|
|
|
|
|
-import xm from "@/assets/images/map/type/小麦.png";
|
|
|
|
|
-import bc from "@/assets/images/map/type/小麦.png";
|
|
|
|
|
-import lb from "@/assets/images/map/type/小麦.png";
|
|
|
|
|
// 冷链冷库、加工厂图标(与图例保持一致)
|
|
// 冷链冷库、加工厂图标(与图例保持一致)
|
|
|
import coldChainIcon from "@/assets/images/common/legend-icon-1.png";
|
|
import coldChainIcon from "@/assets/images/common/legend-icon-1.png";
|
|
|
import factoryIcon from "@/assets/images/common/legend-icon-2.png";
|
|
import factoryIcon from "@/assets/images/common/legend-icon-2.png";
|
|
@@ -410,6 +404,11 @@ const getCommonMapData = async (firstCategory) => {
|
|
|
distributionLayer.initData(phenologyData, 'phenologyName');
|
|
distributionLayer.initData(phenologyData, 'phenologyName');
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (activeBaseTab.value === "农场分布") {
|
|
|
|
|
+ const lastLevelIds = lastLevelNodes.map((n) => n.originalId);
|
|
|
|
|
+ await fetchFarmList(lastLevelIds);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
const lastLevelIds = lastLevelNodes.map((n) => n.id);
|
|
const lastLevelIds = lastLevelNodes.map((n) => n.id);
|
|
|
// 并发请求所有数据
|
|
// 并发请求所有数据
|
|
|
const promises = lastLevelIds.map((id) => getDistributionData(id));
|
|
const promises = lastLevelIds.map((id) => getDistributionData(id));
|
|
@@ -477,6 +476,10 @@ const handleTabClick = (item) => {
|
|
|
|
|
|
|
|
switch (item) {
|
|
switch (item) {
|
|
|
case "作物分布":
|
|
case "作物分布":
|
|
|
|
|
+ // 禁用农场分布点击处理
|
|
|
|
|
+ if (distributionLayer) {
|
|
|
|
|
+ distributionLayer.setFarmClickEnabled(false);
|
|
|
|
|
+ }
|
|
|
// 恢复原始数据
|
|
// 恢复原始数据
|
|
|
if (originalTreeData.value.length > 0) {
|
|
if (originalTreeData.value.length > 0) {
|
|
|
treeActionData.value = JSON.parse(JSON.stringify(originalTreeData.value));
|
|
treeActionData.value = JSON.parse(JSON.stringify(originalTreeData.value));
|
|
@@ -485,6 +488,10 @@ const handleTabClick = (item) => {
|
|
|
handleDistributionLayer();
|
|
handleDistributionLayer();
|
|
|
break;
|
|
break;
|
|
|
case "物候期分布":
|
|
case "物候期分布":
|
|
|
|
|
+ // 禁用农场分布点击处理
|
|
|
|
|
+ if (distributionLayer) {
|
|
|
|
|
+ distributionLayer.setFarmClickEnabled(false);
|
|
|
|
|
+ }
|
|
|
// 先恢复原始数据,再修改第二级 children 的 items 字段为 phenologies
|
|
// 先恢复原始数据,再修改第二级 children 的 items 字段为 phenologies
|
|
|
if (originalTreeData.value.length > 0) {
|
|
if (originalTreeData.value.length > 0) {
|
|
|
treeActionData.value = JSON.parse(JSON.stringify(originalTreeData.value));
|
|
treeActionData.value = JSON.parse(JSON.stringify(originalTreeData.value));
|
|
@@ -516,6 +523,10 @@ const handleTabClick = (item) => {
|
|
|
handlePhenologyLayer();
|
|
handlePhenologyLayer();
|
|
|
break;
|
|
break;
|
|
|
case "预警分布":
|
|
case "预警分布":
|
|
|
|
|
+ // 禁用农场分布点击处理
|
|
|
|
|
+ if (distributionLayer) {
|
|
|
|
|
+ distributionLayer.setFarmClickEnabled(false);
|
|
|
|
|
+ }
|
|
|
handleAlarmTreeDefault()
|
|
handleAlarmTreeDefault()
|
|
|
handleAlarmLayer();
|
|
handleAlarmLayer();
|
|
|
// 通知预警列表组件默认选中第一个(因子)项
|
|
// 通知预警列表组件默认选中第一个(因子)项
|
|
@@ -523,7 +534,39 @@ const handleTabClick = (item) => {
|
|
|
break;
|
|
break;
|
|
|
case "农场分布":
|
|
case "农场分布":
|
|
|
panelType.value = 1;
|
|
panelType.value = 1;
|
|
|
- fetchFarmList();
|
|
|
|
|
|
|
+ // 启用农场分布点击处理
|
|
|
|
|
+ if (distributionLayer) {
|
|
|
|
|
+ distributionLayer.setFarmClickEnabled(true);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 先恢复原始数据,再修改第二级 children 的 items 字段为 phenologies
|
|
|
|
|
+ if (originalTreeData.value.length > 0) {
|
|
|
|
|
+ treeActionData.value = JSON.parse(JSON.stringify(originalTreeData.value));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 修改第二级 children 的 items 字段为 phenologies,不修改其他项
|
|
|
|
|
+ treeActionData.value = treeActionData.value.map((firstLevel) => {
|
|
|
|
|
+ if (firstLevel.items && Array.isArray(firstLevel.items)) {
|
|
|
|
|
+ return {
|
|
|
|
|
+ ...firstLevel,
|
|
|
|
|
+ items: firstLevel.items.map((secondLevel) => {
|
|
|
|
|
+ // 如果第二级有 phenologies 字段,将其设置为 items
|
|
|
|
|
+ if (secondLevel.phenologies) {
|
|
|
|
|
+ secondLevel.phenologies.forEach((phenology) => {
|
|
|
|
|
+ phenology.originalId = phenology.id;
|
|
|
|
|
+ phenology.id = 'phenology_' + phenology.id;
|
|
|
|
|
+ });
|
|
|
|
|
+ return {
|
|
|
|
|
+ ...secondLevel,
|
|
|
|
|
+ items: secondLevel.phenologies,
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+ return secondLevel;
|
|
|
|
|
+ }),
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+ return firstLevel;
|
|
|
|
|
+ });
|
|
|
|
|
+ handlePhenologyTreeDefault();
|
|
|
|
|
+ handlePhenologyLayer();
|
|
|
|
|
|
|
|
// // 设施图层测试数据
|
|
// // 设施图层测试数据
|
|
|
// const facilityData = [
|
|
// const facilityData = [
|
|
@@ -544,6 +587,10 @@ const handleTabClick = (item) => {
|
|
|
// distributionLayer.initFacilityData(facilityData);
|
|
// distributionLayer.initFacilityData(facilityData);
|
|
|
break;
|
|
break;
|
|
|
case "农服管理":
|
|
case "农服管理":
|
|
|
|
|
+ // 禁用农场分布点击处理
|
|
|
|
|
+ if (distributionLayer) {
|
|
|
|
|
+ distributionLayer.setFarmClickEnabled(false);
|
|
|
|
|
+ }
|
|
|
panelType.value = 2;
|
|
panelType.value = 2;
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
@@ -656,8 +703,15 @@ const props1 = {
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const fetchFarmList = () => {
|
|
|
|
|
- VE_API.warning.fetchFarmList().then(res => {
|
|
|
|
|
|
|
+const farmList = ref([]);
|
|
|
|
|
+const fetchFarmList = (phenologyIds) => {
|
|
|
|
|
+ const params = {
|
|
|
|
|
+ year: currentYear.value,
|
|
|
|
|
+ quarter: currentQuarter.value,
|
|
|
|
|
+ phenologyIds: phenologyIds || [],
|
|
|
|
|
+ };
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
|
+ VE_API.warning.fetchFarmList(params).then(res => {
|
|
|
if (res.code === 0 && res.data && res.data.length > 0) {
|
|
if (res.code === 0 && res.data && res.data.length > 0) {
|
|
|
// 将接口数据转换为地图需要的格式
|
|
// 将接口数据转换为地图需要的格式
|
|
|
const cropData = res.data.map((item) => {
|
|
const cropData = res.data.map((item) => {
|
|
@@ -676,13 +730,18 @@ const fetchFarmList = () => {
|
|
|
|
|
|
|
|
// 渲染作物数据到地图
|
|
// 渲染作物数据到地图
|
|
|
distributionLayer.initData(cropData, 'label');
|
|
distributionLayer.initData(cropData, 'label');
|
|
|
|
|
+ farmList.value = cropData;
|
|
|
|
|
+ resolve(cropData);
|
|
|
} else {
|
|
} else {
|
|
|
// 接口返回空数据时,清空地图
|
|
// 接口返回空数据时,清空地图
|
|
|
distributionLayer.initData([]);
|
|
distributionLayer.initData([]);
|
|
|
|
|
+ resolve([]);
|
|
|
}
|
|
}
|
|
|
- }).catch((error) => {
|
|
|
|
|
- // 错误时也清空地图
|
|
|
|
|
- distributionLayer.initData([]);
|
|
|
|
|
|
|
+ }).catch((error) => {
|
|
|
|
|
+ // 错误时也清空地图
|
|
|
|
|
+ distributionLayer.initData([]);
|
|
|
|
|
+ reject(error);
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -790,7 +849,7 @@ const getTreeChecks = async (nodeData, data) => {
|
|
|
let finalCheckedNodes = checkedNodes;
|
|
let finalCheckedNodes = checkedNodes;
|
|
|
|
|
|
|
|
// 物候期分布:限制"二级只能选一个,三级不限个数"
|
|
// 物候期分布:限制"二级只能选一个,三级不限个数"
|
|
|
- if ((activeBaseTab.value === "物候期分布" || activeBaseTab.value === "预警分布") && treeRef.value) {
|
|
|
|
|
|
|
+ if ((activeBaseTab.value === "物候期分布" || activeBaseTab.value === "预警分布" || activeBaseTab.value === "农场分布") && treeRef.value) {
|
|
|
const tree = treeRef.value;
|
|
const tree = treeRef.value;
|
|
|
const { level, secondId } = getNodeLevelInfo(nodeData.id);
|
|
const { level, secondId } = getNodeLevelInfo(nodeData.id);
|
|
|
|
|
|
|
@@ -833,7 +892,7 @@ const getTreeChecks = async (nodeData, data) => {
|
|
|
|
|
|
|
|
// 任意 tab 下,最终都用当前选中的节点驱动地图渲染
|
|
// 任意 tab 下,最终都用当前选中的节点驱动地图渲染
|
|
|
// 提取最后一级节点的 id 到数组(没有子节点的叶子节点)
|
|
// 提取最后一级节点的 id 到数组(没有子节点的叶子节点)
|
|
|
- const field = activeBaseTab.value === "物候期分布" ? "originalId" : "id";
|
|
|
|
|
|
|
+ const field = (activeBaseTab.value === "物候期分布" || activeBaseTab.value === "农场分布") ? "originalId" : "id";
|
|
|
const lastLevelIds = finalCheckedNodes
|
|
const lastLevelIds = finalCheckedNodes
|
|
|
.filter((n) => (!n.items || n.items.length === 0) && (!n.children || n.children.length === 0))
|
|
.filter((n) => (!n.items || n.items.length === 0) && (!n.children || n.children.length === 0))
|
|
|
.map((n) => n[field]);
|
|
.map((n) => n[field]);
|
|
@@ -846,6 +905,10 @@ const getTreeChecks = async (nodeData, data) => {
|
|
|
distributionLayer.initData(phenologyData, 'phenologyName');
|
|
distributionLayer.initData(phenologyData, 'phenologyName');
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (activeBaseTab.value === "农场分布") {
|
|
|
|
|
+ await fetchFarmList(lastLevelIds);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
// 并发请求所有数据,等待所有 Promise 完成
|
|
// 并发请求所有数据,等待所有 Promise 完成
|
|
|
const promises = lastLevelIds.map((id) => {
|
|
const promises = lastLevelIds.map((id) => {
|
|
|
const node = finalCheckedNodes.find((n) => n.id === id);
|
|
const node = finalCheckedNodes.find((n) => n.id === id);
|