Pārlūkot izejas kodu

feat:对接编辑品种地块功能和时间轴接口对接

wangsisi 1 nedēļu atpakaļ
vecāks
revīzija
e99a3ff6f8

+ 2 - 2
src/App.vue

@@ -49,7 +49,7 @@
                 </template>
             </tabbar-item>
             <tabbar-item replace to="/agri_record">
-                <span>农事记录</span>
+                <span>农事规划</span>
                 <template #icon="props">
                     <img
                         :src="
@@ -60,7 +60,7 @@
                     />
                 </template>
             </tabbar-item>
-            <tabbar-item replace to="/agri_record">
+            <tabbar-item replace to="/home">
                 <span>有味溯源</span>
                 <template #icon="props">
                     <img

+ 5 - 0
src/api/modules/monitor.js

@@ -113,4 +113,9 @@ module.exports = {
         url: config.base_dev_url + "farm_subject/listRegionsBySubjectId",
         type: "get",
     },
+    //农情照片分页查询
+    getFarmImagePage: {
+        url: config.base_dev_url + "image/v2/farmImagePage",
+        type: "post",
+    },
 };

+ 13 - 3
src/components/pageComponents/ArchivesFarmTimeLine.vue

@@ -158,6 +158,16 @@ const props = defineProps({
         type: String,
         default: "agri_plan",
     },
+    // 区域ID
+    regionId: {
+        type: [Number, String],
+        default: null,
+    },
+    // 容器ID
+    containerId: {
+        type: [Number, String],
+        default: null,
+    },
 });
 
 const farmWorkType = {
@@ -325,7 +335,6 @@ const imgType = ref('');
 const imageList = ref([]);
 const currentImageData = ref({});
 const handleImageClick = (fw) => {
-    console.log(fw, "fw");
     if (fw.sourceType !== 7) {
         imgType.value = fw.sourceDataJson.resFilename?.[0]?.source || '';
         imageList.value = fw.sourceDataJson.resFilename || [];
@@ -555,9 +564,10 @@ const getFarmWorkPlan = () => {
 
     const params = {
         farmId: props.farmId,
+        regionId: props.regionId,
     }
     if (props.pageType === 'agri_record') {
-        params.containerId = props.containerId || 26;
+        params.containerId = props.containerId;
     }
 
     apiFunc(params)
@@ -788,7 +798,7 @@ watch(
 const handleStatusDetail = (fw) => {
     router.push({
         path: props.pageType === 'agri_plan' ? "/agricultural_detail" : "/status_detail",
-        query: { miniJson: JSON.stringify({ id: fw.id }) },
+        query: { farmId: props.farmId, regionId: props.regionId,date: fw.createTime.slice(0,10) },
     });
     // if (props.pageType === 'agri_record') {
     //     router.push({

+ 5 - 3
src/views/old_mini/agri_record/index.vue

@@ -30,15 +30,15 @@
                     {{ v.regionName }}
                 </div>
             </div>
-            <template v-if="true">
+            <!-- <template v-if="true">
                 <div class="lock-img" @click="handleLockClick">
                     <img src="@/assets/img/home/lock-blue.png" alt="" class="lock-img-item" />
                     <div class="lock-text">解锁某某某某某,解锁某某某某某</div>
                 </div>
                 <img class="example-img" src="@/assets/img/monitor/example.png" alt="">
-            </template>
+            </template> -->
             <div class="archives-time-line-content">
-                <archives-farm-time-line :farmId="farmIdData" pageType="agri_record"></archives-farm-time-line>
+                <archives-farm-time-line :farmId="farmIdData" :containerId="containerData" pageType="agri_record"></archives-farm-time-line>
             </div>
         </div>
     </div>
@@ -100,9 +100,11 @@ const getVarietyTabs = async () => {
 };
 
 const farmIdData= ref(null);
+const containerData = ref(null);
 const handleVarietyClick = (tab,index) => {
     activeVariety.value = index;
     farmIdData.value = tab.farmId;
+    containerData.value = tab.containerId;
 };
 
 const showFarmPopup = ref(false); // 农场领取成功弹窗

+ 23 - 8
src/views/old_mini/interactionList/map/drawRegionMap.js

@@ -159,10 +159,28 @@ class DrawRegionMap {
                         }),
                     }),
                 ];
-                // 面积文本(如:24亩),优先使用传入的 areaText
-                const textValue = areaText != null && areaText !== ""
-                    ? `${areaText}亩`
-                    : "";
+                // 面积文本显示规则:
+                // 1) 传空字符串:不显示
+                // 2) 传了值:优先显示传入值
+                // 3) 未传:按当前地块实时计算亩数
+                const isExplicitEmptyText = typeof areaText === "string" && areaText.trim() === "";
+                const hasProvidedAreaText = areaText !== undefined && areaText !== null;
+                let textValue = "";
+                if (!isExplicitEmptyText) {
+                    if (hasProvidedAreaText) {
+                        textValue = `${areaText}亩`;
+                    } else {
+                        try {
+                            let geom = geometry.clone();
+                            geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"));
+                            let areaItem = getArea(geom);
+                            areaItem = (areaItem + areaItem / 2) / 1000;
+                            textValue = `${Number(areaItem).toFixed(2)}亩`;
+                        } catch (_) {
+                            textValue = "";
+                        }
+                    }
+                }
                 if (textValue) {
                     styles.push(
                         new Style({
@@ -188,7 +206,7 @@ class DrawRegionMap {
     fitView() {
         let extent = this.kmap.polygonLayer.source.getExtent()
         // 地图自适应到区域可视范围
-        this.kmap.getView().fit(extent, { duration: 500, padding: [100, 100, 100, 100] });
+        this.kmap.getView().fit(extent, { duration: 500, padding: [10, 10, 10, 10] });
     }
 
     clearLayer() {
@@ -294,9 +312,6 @@ class DrawRegionMap {
                 // 单个区域解析失败时忽略
             }
         });
-
-        // 不在这里直接缩放,避免只按某一层适配视图;
-        // 由调用方在需要时统一调用 fitAllRegions 进行视图自适应
     }
 
     /**

+ 5 - 13
src/views/old_mini/monitor/index.vue

@@ -27,13 +27,13 @@
                     {{ v.regionName }}
                 </div>
             </div>
-            <template v-if="!hasReport">
+            <!-- <template v-if="!hasReport">
                 <div class="lock-img" @click="handleLockClick">
                     <img src="@/assets/img/home/lock-blue.png" alt="" class="lock-img-item" />
                     <div class="lock-text">解锁某某某某某,解锁某某某某某</div>
                 </div>
                 <img class="example-img" src="@/assets/img/monitor/example.png" alt="">
-            </template>
+            </template> -->
             <div class="archives-time-line-content">
                 <div class="report-box" v-if="hasReport">
                     <div class="box-content">
@@ -48,15 +48,12 @@
                     <img src="@/assets/img/monitor/report-icon.png" alt="" class="report-icon" />
                 </div>
                 <div class="time-line" :class="{ 'no-report': !hasReport }">
-                    <archives-farm-time-line :farmId="farmIdData"></archives-farm-time-line>
+                    <archives-farm-time-line :farmId="farmIdData" :regionId="regionData"></archives-farm-time-line>
                 </div>
             </div>
         </div>
     </div>
 
-    <tip-popup v-model:show="showFarmPopup" type="success" text="农场领取成功"
-        :overlay-style="{ 'backdrop-filter': 'blur(4px)' }" :closeOnClickOverlay="false" :zIndex="9999" />
-
     <!-- 勾选区域引导弹窗 -->
     <select-region-popup v-model:show="showSelectRegionPopup" :image="selectRegionImage" title="勾选 妃子笑 区域"
         sub-title="精准匹配农情信息,高效管理分区" @confirm="handleGoSelectRegion" @skip="handleSkipSelectRegion" />
@@ -73,7 +70,6 @@ import { useStore } from "vuex";
 import wx from "weixin-js-sdk";
 import weatherInfo from "@/components/weatherInfo.vue";
 import { useRouter, useRoute } from "vue-router";
-import tipPopup from "@/components/popup/tipPopup.vue";
 import selectRegionPopup from "@/components/popup/selectRegionPopup.vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import ArchivesFarmTimeLine from "@/components/pageComponents/ArchivesFarmTimeLine.vue";
@@ -105,9 +101,11 @@ const getVarietyTabs = async () => {
 };
 
 const farmIdData = ref(null);
+const regionData = ref(null);
 const handleVarietyClick = (tab, index) => {
     activeVariety.value = index;
     farmIdData.value = tab.farmId;
+    regionData.value = tab.regionId;
 };
 
 const date = ref(new Date());
@@ -180,12 +178,6 @@ const tabBarHeight = computed(() => store.state.home.tabBarHeight);
 const router = useRouter();
 const route = useRoute();
 
-const farmInfoRef = ref(null);
-
-function toFarmInfo() {
-    farmInfoRef.value.handleShow();
-}
-
 const handleLockClick = () => {
     wx.miniProgram.navigateTo({
         url: '/pages/subPages/phone_auth/index',

+ 18 - 1
src/views/old_mini/monitor/subPages/agriculturalDetail.vue

@@ -35,7 +35,7 @@
 
 <script setup>
 import { useRouter, useRoute } from "vue-router";
-import { ref } from "vue";
+import { ref, onMounted } from "vue";
 import customHeader from "@/components/customHeader.vue";
 import { showImagePreview } from 'vant';
 
@@ -83,6 +83,23 @@ const handlePhotoClick = (photo) => {
     });
 };
 
+onMounted(() => {
+    getFarmImagePage();
+});
+
+const getFarmImagePage = () => {
+    VE_API.monitor.getFarmImagePage({
+        // farmId: route.query.farmId,
+        // regionId: route.query.regionId,
+        farmId: 766,
+        regionId: 2,
+        // uploadDate: route.query.date,
+    }).then((res) => {
+        if (res.code === 0) {
+            photoList.value = res.data;
+        }
+    });
+};
 </script>
 
 <style lang="scss" scoped>

+ 117 - 114
src/views/old_mini/monitor/subPages/darwArea.vue

@@ -2,13 +2,8 @@
     <div class="edit-map">
         <custom-header :name="viewOnly ? '查看区域' : '勾选地块'"></custom-header>
         <div class="variety-tabs" v-if="varietyTabs.length > 0">
-            <div
-                v-for="(v, index) in varietyTabs"
-                :key="index"
-                class="variety-tab"
-                :class="{ 'variety-tab--active': activeVariety === index }"
-                @click="handleVarietyClick(v, index)"
-            >
+            <div v-for="(v, index) in varietyTabs" :key="index" class="variety-tab"
+                :class="{ 'variety-tab--active': activeVariety === index }" @click="handleVarietyClick(v, index)">
                 {{ v.regionName }}
             </div>
         </div>
@@ -19,29 +14,26 @@
                 <div class="footer-back" @click="goBack">
                     <img class="back-icon" src="@/assets/img/home/go-back.png" alt="" />
                 </div>
-                <div class="edit-map-footer-btn" v-if="!viewOnly">
-                <!-- <div class="edit-map-footer-btn confirm-btn-box" v-if="!viewOnly"> -->
-                    <div class="btn-reset" @click="resetPolygon">重置区域</div>
-                    <div class="btn-confirm" @click="confirm">确认</div>
-                    <!-- <div class="btn-confirm" @click="confirm">编辑区域</div> -->
+                <div class="edit-map-footer-btn" :class="{ 'confirm-btn-box': viewOnly }">
+                    <template v-if="!viewOnly">
+                        <div class="btn-reset" @click="resetPolygon">重置区域</div>
+                        <div class="btn-confirm" @click="confirmArea">确认</div>
+                    </template>
+                    <div v-else class="btn-confirm" @click="handleEditRegion">编辑区域</div>
                 </div>
             </div>
         </div>
-        <save-region-success-popup
-            v-if="!viewOnly"
-            v-model:show="showSuccessPopup"
+        <save-region-success-popup v-if="!viewOnly" v-model:show="showSuccessPopup"
             :title="`${activeVarietyName} 区域已保存成功`"
-            :has-next="varietyTabs.length > 0 && activeVariety < varietyTabs.length - 1"
-            @know="handleKnow"
-            @next="handleSelectNextVariety"
-        />
+            :has-next="varietyTabs.length > 0 && activeVariety < varietyTabs.length - 1" @know="handleKnow"
+            @next="handleSelectNextVariety" />
     </div>
 </template>
 
 <script setup>
 import customHeader from "@/components/customHeader.vue";
 import SaveRegionSuccessPopup from "@/components/popup/saveRegionSuccessPopup.vue";
-import { ref, computed, onMounted, onActivated, onDeactivated } from "vue";
+import { ref, computed, onMounted, onActivated, onDeactivated, nextTick } from "vue";
 import { useStore } from "vuex";
 import DrawRegionMap from "../../interactionList/map/drawRegionMap.js";
 import { useRouter, useRoute } from "vue-router";
@@ -57,64 +49,41 @@ const drawRegionMap = new DrawRegionMap();
 const showSuccessPopup = ref(false);
 // 是否从第一个品种开始的引导流程(需要全部品种都确认后再退出)
 const isGuidedFlow = ref(false);
+// 每个品种(tab)对应的地块数据草稿:key 为 tab index,value 为 { geomArr, geom }
+const regionsDraftByIndex = ref({});
+const submitting = ref(false);
 
 const type = ref(null);
 const varietyTabs = ref([]);
 const activeVariety = ref(0);
-const farmIdData = ref(null);
-const gardenId = ref(store.state.home.gardenId);
-
-const getVarietyTabs = async () => {
-    if (!gardenId.value) return;
-    try {
-        const res = await VE_API.monitor.listRegionsBySubjectId({
-            subjectId: gardenId.value,
-        });
-        varietyTabs.value = res.data || [];
-        if (varietyTabs.value.length > 0) {
-            handleVarietyClick(varietyTabs.value[0], 0);
-        }
-    } catch (error) {
-        console.error("获取主体分区列表失败:", error);
-    }
-};
+const regionGeom = ref(null);
 
 const handleVarietyClick = (tab, index) => {
     activeVariety.value = index;
-    farmIdData.value = tab.farmId;
+    regionGeom.value = tab.geom;
+
+    if (tab.geom?.length) {
+        drawRegionMap.kmap.polygonLayer.source.clear();
+        drawRegionMap.setAreaGeometry([tab.geom],true);
+    }
 };
 
 const activeVarietyName = computed(() => {
     const current = varietyTabs.value[activeVariety.value];
     return current?.regionName || "";
 });
-const viewOnly = computed(() => route.query.viewOnly === "1" || route.query.viewOnly === "true");
+const viewOnly = computed(() => route.query.type === "viewOnly");
 
 onMounted(() => {
     type.value = route.query.type;
     const point = route.query.mapCenter || "POINT (113.6142086995688 23.585836479509055)";
     const editable = !viewOnly.value;
-    const showPoint = !viewOnly.value;
-    drawRegionMap.initMap(point, mapContainer.value, editable, true, showPoint);
-
-    // 初始化品种 tabs
-    getVarietyTabs();
-
-    // 地图初始化之后(比如 initPreviewMap 里)
-    // const regions = [
-    //     {
-    //         geometry:
-    //             "MULTIPOLYGON(((113.61674040430906 23.586573370597367,113.61586610436014 23.585922976493354,113.61710291900188 23.58486741952544,113.61770000158238 23.585651090473736,113.61674040430906 23.586573370597367)))",
-    //         status: "unresolved", // 未解决(蓝色)
-    //     },
-    //     {
-    //         geometry:
-    //             "MULTIPOLYGON(((113.61516640298626 23.588441931082958,113.61445736699218 23.58799411906573,113.61572616841707 23.586954554834552,113.61642987338976 23.588180707433526,113.61516640298626 23.588441931082958)))",
-    //         status: "resolved", // 已解决(灰色)
-    //     },
-    // ];
-
-    // drawRegionMap.setStatusRegions(regions);
+    drawRegionMap.initMap(point, mapContainer.value, editable, true, true);
+    const regionData = route.query?.regionList || [];
+    if (regionData.length) {
+        varietyTabs.value = JSON.parse(regionData);
+        handleVarietyClick(varietyTabs.value[0], 0);
+    }
 });
 
 onActivated(() => {
@@ -132,40 +101,6 @@ onActivated(() => {
         drawRegionMap.initMap(point, mapContainer.value, true, true, true);
     }
 
-    // 先绘制地块
-    const polygonData = route.query.polygonData;
-    const rawRangeWkt = route.query.rangeWkt;
-    const rangeWkt = rawRangeWkt ? decodeURIComponent(rawRangeWkt) : null;
-
-    if (rangeWkt) {
-        let regions = [];
-        try {
-            const parsed = JSON.parse(rangeWkt);
-            if (parsed && Array.isArray(parsed.geometryArr)) {
-                regions = parsed.geometryArr.map((item) => ({
-                    geometry: item,
-                    status: "unresolved",
-                    updatedTime: route.query.updatedTime,
-                }));
-            } else if (typeof rangeWkt === "string" && rangeWkt.trim().length > 10) {
-                regions = [{ geometry: rangeWkt.trim(), status: "unresolved", updatedTime: route.query.updatedTime }];
-            }
-        } catch (_) {
-            if (typeof rangeWkt === "string" && rangeWkt.trim().length > 10) {
-                regions = [{ geometry: rangeWkt.trim(), status: "unresolved", updatedTime: route.query.updatedTime }];
-            }
-        }
-        if (regions.length) {
-            drawRegionMap.setStatusRegions(regions);
-            if (viewOnly.value && drawRegionMap.fitAllRegions) {
-                drawRegionMap.fitAllRegions();
-            }
-        }
-    }
-    if (!viewOnly.value && polygonData) {
-        drawRegionMap.setAreaGeometry(JSON.parse(polygonData)?.geometryArr);
-    }
-
     // 查看模式下已通过 fitAllRegions 适配;编辑模式再设置地图中心
     if (!viewOnly.value) {
         drawRegionMap.setMapPosition(convertPointToArray(point));
@@ -216,40 +151,81 @@ const resetPolygon = () => {
         });
 };
 
-const confirm = () => {
-    // const polygonData = drawRegionMap.getAreaGeometry();
-    // sessionStorage.setItem("drawRegionPolygonData", JSON.stringify(polygonData));
+const buildRegionsPayload = () => {
+    const regions = [];
+    varietyTabs.value.forEach((tab, index) => {
+        const draft = regionsDraftByIndex.value[index];
+        if (!draft?.geom) return;
+        regions.push({
+            regionId: tab.regionId,
+            typeId: tab.typeId,
+            regionName: tab.regionName,
+            geom: draft.geom,
+        });
+    });
+    return regions;
+};
+
+const submitRegions = async () => {
+    if (submitting.value) return;
+    const regions = buildRegionsPayload();
+    if (regions.length === 0) {
+        ElMessage.warning("请先勾画地块后再确认");
+        return;
+    }
+    submitting.value = true;
+    try {
+        const res = await VE_API.basic_farm.saveBasicFarmInfoByExpertV3({
+            id: route.query.subjectId,
+            expertMiniUserId: '81881',
+            regions,
+        });
+        if (res?.code === 0) {
+            return true;
+        }
+        ElMessage.error(res?.msg || "保存失败");
+        return false;
+    } catch (e) {
+        ElMessage.error("保存失败");
+        return false;
+    } finally {
+        submitting.value = false;
+    }
+};
+
+const confirmArea = async () => {
+    // 先把当前品种的地块保存到草稿
+    const polygonData = drawRegionMap.getAreaGeometry?.();
+    const geometryArr = polygonData?.geometryArr;
+    if (!Array.isArray(geometryArr) || geometryArr.length === 0) {
+        ElMessage.warning("请先勾画地块后再确认");
+        return;
+    }
+    // geom 后端一般期望 string;若勾画多个,则序列化为 JSON 数组
+    const geom = geometryArr.length === 1 ? geometryArr[0] : JSON.stringify(geometryArr);
+    regionsDraftByIndex.value[activeVariety.value] = { geomArr: geometryArr, geom };
 
-    // 如果当前是第一个品种,则开启完整引导流程:每次确认都弹成功提示,直到最后一个才退出
+    // 从第一个品种开始时,进入引导流程(确认后弹提示,支持“下一步”)
     if (activeVariety.value === 0) {
         isGuidedFlow.value = true;
-        showSuccessPopup.value = true;
-        return;
     }
 
-    // 已经在引导流程中(从第一个品种开始勾选),后续品种确认也只弹成功提示,不直接跳走
+    // 每次确认都提交接口(携带目前已确认过的所有品种 regions)
+    const ok = await submitRegions();
+    if (!ok) return;
+
+    // 引导流程:弹成功提示,由弹窗控制“下一步/完成”
     if (isGuidedFlow.value) {
         showSuccessPopup.value = true;
         return;
     }
 
-    // 非引导流程(例如直接编辑单个非第一个品种),确认后直接返回上一页
+    // 非引导流程:确认后返回上一页
     router.back();
 };
 
 const handleKnow = () => {
     showSuccessPopup.value = false;
-
-    const isLastVariety =
-        varietyTabs.value.length > 0 && activeVariety.value === varietyTabs.value.length - 1;
-
-    // 在引导流程中且还没到最后一个品种时,“我知道了”只关闭弹窗,不跳走
-    if (isGuidedFlow.value && !isLastVariety) {
-        return;
-    }
-
-    // 到达最后一个品种或本身就不是引导流程,才真正完成并返回
-    isGuidedFlow.value = false;
     router.back();
 };
 
@@ -274,6 +250,32 @@ const handleSelectNextVariety = () => {
         handleKnow();
     }
 };
+
+const handleEditRegion = () => {
+    // 从查看态切换到可勾画编辑态:移除查看标记并重建地图(editable=true)
+    const point = route.query.mapCenter || "POINT (113.6142086995688 23.585836479509055)";
+
+    const nextQuery = { ...route.query };
+    delete nextQuery.type;
+    delete nextQuery.viewOnly;
+    router.replace({ query: nextQuery });
+
+    nextTick(() => {
+        if (drawRegionMap.kmap) {
+            drawRegionMap.destroyMap();
+        }
+
+        drawRegionMap.initMap(point, mapContainer.value, true, true, true);
+
+        if (varietyTabs.value.length) {
+            drawRegionMap.setAreaGeometry([regionGeom.value],true);
+        }
+        // 切到编辑态后,统一自适应到所有区域,避免画面偏移
+        if (drawRegionMap.fitAllRegions) {
+            drawRegionMap.fitAllRegions();
+        }
+    });
+};
 </script>
 
 <style lang="scss" scoped>
@@ -362,7 +364,8 @@ const handleSelectNextVariety = () => {
                 background: #fff;
                 padding: 10px 12px 20px 12px;
                 box-sizing: border-box;
-                &.confirm-btn-box{
+
+                &.confirm-btn-box {
                     justify-content: center;
                 }
 

+ 43 - 20
src/views/old_mini/monitor/subPages/farmInfo.vue

@@ -27,8 +27,8 @@
                     <div class="info-row">
                         <span class="info-label">种植作物:</span>
                         <div class="info-value crop-tags">
-                            <span v-for="crop in farmInfo.cropList" :key="crop.id" class="crop-tag">
-                                {{ crop.name }}
+                            <span v-for="crop in farmInfo.regionList" :key="crop.regionId" class="crop-tag">
+                                {{ crop.regionName }}
                             </span>
                         </div>
                     </div>
@@ -61,9 +61,10 @@
                         <span class="info-label">农机设备:</span>
                         <div class="info-value device-value">
                             <div class="device-box">
-                                <div class="device-item" v-for="device in basicFarmInfo.machineryList" :key="device.code">
+                                <div class="device-item" v-for="device in basicFarmInfo.machineryList"
+                                    :key="device.code">
                                     <span class="device-name">{{ device.name }}</span>
-                                    <span class="device-count">{{ device.quantity || 0 }}{{ device.unit}}</span>
+                                    <span class="device-count">{{ device.quantity || 0 }}{{ device.unit }}</span>
                                 </div>
                             </div>
                         </div>
@@ -71,7 +72,8 @@
                     <div class="info-row info-row-column">
                         <span class="info-label">希望改善问题:</span>
                         <div class="info-value problem-tags">
-                            <span v-for="item in basicFarmInfo.improvementProblems" :key="item.code" class="problem-tag">
+                            <span v-for="item in basicFarmInfo.improvementProblems" :key="item.code"
+                                class="problem-tag">
                                 {{ item.name }}
                             </span>
                         </div>
@@ -83,11 +85,12 @@
 </template>
 
 <script setup>
-import { ref, onMounted, onBeforeUnmount, nextTick } from "vue";
+import { ref, onMounted, nextTick } from "vue";
 import customHeader from "@/components/customHeader.vue";
 import { useRouter, useRoute } from "vue-router";
 import DrawRegionMap from "@/views/old_mini/interactionList/map/drawRegionMap.js";
 import * as util from "@/common/ol_common.js";
+import { ElMessage } from "element-plus";
 import { useStore } from "vuex";
 
 const router = useRouter();
@@ -103,19 +106,23 @@ const initMap = () => {
 
     const info = farmInfo.value || {};
 
-    drawRegionMap.initMap(info.farmLocation, mapContainer.value, false, false, false);
+    drawRegionMap.initMap(info.farmLocation, mapContainer.value, false, true, false);
 
     // 回显农场区域,多边形 WKT 数组(有就画,没有就不画)
     let geometryArr = [];
-    if (Array.isArray(info.geometryArr) && info.geometryArr.length > 0) {
-        geometryArr = info.geometryArr;
-    } else if (Array.isArray(info.areaGeometryArr) && info.areaGeometryArr.length > 0) {
-        geometryArr = info.areaGeometryArr;
+
+    // 优先使用 regionList 里的 geom:有值才渲染
+    if (Array.isArray(info.regionList) && info.regionList.length > 0) {
+        info.regionList.forEach((item) => {
+            if (item?.geom) {
+                geometryArr.push(item?.geom)
+            }
+        });
     }
 
     if (geometryArr.length) {
         // 这里不做自适应缩放,保持以中心点为主,避免点位偏上
-        drawRegionMap.setAreaGeometry(geometryArr, false, info.areaText || "");
+        drawRegionMap.setAreaGeometry(Array.from(geometryArr), true);
     }
 
     // 在区域中心落一个点位(使用与勾画页相同的图标)
@@ -153,14 +160,14 @@ function fetchFarmSubjectDetail() {
 
 const basicFarmInfo = ref({});
 function fetchBasicFarmFormData() {
-    VE_API.basic_farm.fetchBasicFarmFormData({ subjectId: route.query.subjectId }).then(({ data,code }) => {
-        if(code === 0) {
+    VE_API.basic_farm.fetchBasicFarmFormData({ subjectId: route.query.subjectId }).then(({ data, code }) => {
+        if (code === 0) {
             basicFarmInfo.value = {
                 ...data,
-                soil:data.soilTypes.find(item => item.selected).name,
-                irrigation:data.irrigationMethods.filter(item => item.selected),
-                machineryList:data.machinery.filter(item => item.selected),
-                improvementProblems:data.improvementAreas.filter(item => item.selected),
+                soil: data.soilTypes.find(item => item.selected).name,
+                irrigation: data.irrigationMethods.filter(item => item.selected),
+                machineryList: data.machinery.filter(item => item.selected),
+                improvementProblems: data.improvementAreas.filter(item => item.selected),
             }
         }
     });
@@ -201,7 +208,21 @@ const handleEditFarmFacility = () => {
 
 // 点击编辑地块
 const handleEditMap = () => {
-    router.push("/draw_area");
+    const mapCenter = farmInfo.value.farmLocation || undefined;
+    if (farmInfo.value.regionList.length) {
+        // type=view 进入查看态;rangeWkt 用于回显多个地块
+        router.push({
+            path: "/draw_area",
+            query: {
+                type: "viewOnly",
+                subjectId: route.query.subjectId,
+                mapCenter,
+                regionList: farmInfo.value.regionList.length ? JSON.stringify(farmInfo.value.regionList) : null,
+            },
+        });
+    } else {
+        ElMessage.warning("暂无种植作物,无法编辑地块");
+    }
 };
 </script>
 
@@ -234,13 +255,15 @@ const handleEditMap = () => {
         border-radius: 8px;
         padding: 10px;
 
-        .map-wrap{
+        .map-wrap {
             position: relative;
+
             .map-area {
                 width: 100%;
                 height: 142px;
                 clip-path: inset(0px round 5px);
             }
+
             .map-text {
                 position: absolute;
                 right: 13px;