3 Commit-ok 484928aa47 ... f494ebc7a6

Szerző SHA1 Üzenet Dátum
  wangsisi f494ebc7a6 Merge branch 'farmer' of http://www.sysuimars.cn:3000/feiniao/feiniao-farm-h5 into farmer 3 napja
  wangsisi 5f509dd35c feat:修改按钮显示条件 3 napja
  wangsisi f64f078958 feat:修改图片显示不正确和添加查看区域按钮 3 napja

+ 4 - 3
src/components/album_compoents/albumCarouselItem.vue

@@ -27,10 +27,10 @@
                                 </div>
                             </div>
                             <div>
-                                <div class="app-mask-top-right">
+                                <!-- <div class="app-mask-top-right">
                                     <div class="app-phenology">当前处于 {{ imgData?.phenologyName }}</div>
                                     <div class="app-uploader">上传人:{{ imgData?.sourceDataJson?.userName }}</div>
-                                </div>
+                                </div> -->
                                 <!-- 底部中间/右侧:天气信息和位置 -->
                                 <div class="app-mask-bottom">
                                     <div class="app-weather-info">
@@ -460,7 +460,8 @@ const formatMonthDay = (dateStr) => {
             width: calc(100vw - 48px);
             min-width: calc(100vw - 48px);
             // min-width: 312px;
-            height: 255px;
+            // height: 255px;
+            max-height: 90vh;
             object-fit: cover;
             position: relative;
             overflow: hidden;

+ 20 - 4
src/components/pageComponents/ArchivesFarmTimeLine.vue

@@ -69,13 +69,13 @@
                                         </div>
                                     </div>
                                     <div class="card-right"
-                                        v-if="fw.sourceDataJson && fw.sourceDataJson.resFilename && fw.sourceDataJson.resFilename.length > 0 || fw.sourceType === 7"
+                                        v-if="fw.sourceDataJson && fw.sourceDataJson.resFilename && fw.sourceDataJson.resFilename.length > 0"
                                         @click.stop="handleImageClick(fw)">
                                         <img v-if="fw.sourceType === 7"
                                             :src="base_img_url2 + fw.sourceDataJson?.executeImageUrls?.[0]" alt="" />
                                         <img v-else :src="base_img_url2 + fw.sourceDataJson?.resFilename?.[0]?.filename"
                                             alt="" />
-                                        <div class="num" v-if="fw?.sourceDataJson?.imageIds || fw.sourceType === 7">
+                                        <div class="num" v-if="fw?.sourceDataJson?.imageIds">
                                             {{ fw?.sourceDataJson?.imageIds?.length ||
                                                 fw?.sourceDataJson?.executeImageUrls?.length || 0 }}
                                         </div>
@@ -233,6 +233,23 @@ const getCurrentSeason = () => {
 };
 
 // 安全解析时间到时间戳(ms)
+/** 解析 sourceData JSON,避免大整数(如雪花 ID)被 JSON.parse 精度丢失(>2^53 会变成 500 结尾等) */
+const parseSourceDataSafe = (str) => {
+    if (!str) return null;
+    try {
+        const fixed = str.replace(/"imageIds"\s*:\s*\[([^\]]*)\]/g, (_, arr) => {
+            const quoted = arr.split(",").map((s) => {
+                const t = s.trim().replace(/^["']|["']$/g, "");
+                return /^\d+$/.test(t) ? `"${t}"` : s.trim();
+            }).join(",");
+            return `"imageIds":[${quoted}]`;
+        });
+        return JSON.parse(fixed);
+    } catch {
+        return null;
+    }
+};
+
 const safeParseDate = (val) => {
     if (!val) return NaN;
     if (val instanceof Date) return val.getTime();
@@ -570,8 +587,7 @@ const getFarmWorkPlan = () => {
                                         const farmWorkArrangeList = Array.isArray(r.broadcastList || r.interactionFarmWorkList)
                                             ? await Promise.all(
                                                 (r.broadcastList || r.interactionFarmWorkList).map(async (fw) => {
-                                                    let sourceDataJson =
-                                                        fw.sourceData && JSON.parse(fw.sourceData);
+                                                    const sourceDataJson = parseSourceDataSafe(fw.sourceData);
                                                     // 如果有 imageIds,获取图片 URL
                                                     if (
                                                         sourceDataJson &&

+ 2 - 2
src/views/old_mini/home/components/knowledgeCard.vue

@@ -12,9 +12,9 @@
                     实战操作
                 </div> -->
             </div>
-            <div class="more-text" @click="handleMoreClick">
+            <!-- <div class="more-text" @click="handleMoreClick">
                 更多<el-icon class="more-icon"><ArrowRight /></el-icon>
-            </div>
+            </div> -->
         </div>
         <div class="knowledge-content focus-content" v-if="activeKnowledgeId === 8">
             <div

+ 44 - 15
src/views/old_mini/interactionList/drawRegion.vue

@@ -1,14 +1,14 @@
 <template>
     <div class="edit-map">
-        <custom-header name="勾画区域"></custom-header>
+        <custom-header :name="viewOnly ? '查看区域' : '勾画区域'"></custom-header>
         <div class="edit-map-content">
-            <div class="edit-map-tip">操作提示:拖动圆点,即可调整地块边界</div>
+            <div class="edit-map-tip" v-if="!viewOnly">操作提示:拖动圆点,即可调整地块边界</div>
             <div class="map-container" ref="mapContainer"></div>
             <div class="edit-map-footer">
                 <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">
+                <div class="edit-map-footer-btn" v-if="!viewOnly">
                     <div class="btn-delete" @click="deletePolygon">删除地块</div>
                     <div class="btn-cancel" @click="goBack">取消</div>
                     <div class="btn-confirm" @click="confirm">确认</div>
@@ -20,7 +20,7 @@
 
 <script setup>
 import customHeader from "@/components/customHeader.vue";
-import { ref, onMounted, onActivated, onDeactivated } from "vue";
+import { ref, computed, onMounted, onActivated, onDeactivated } from "vue";
 import DrawRegionMap from "./map/drawRegionMap.js";
 import { useRouter, useRoute } from "vue-router";
 import { convertPointToArray } from "@/utils/index";
@@ -32,11 +32,14 @@ const mapContainer = ref(null);
 const drawRegionMap = new DrawRegionMap();
 
 const type = ref(null);
+const viewOnly = computed(() => route.query.viewOnly === "1" || route.query.viewOnly === "true");
 
 onMounted(() => {
     type.value = route.query.type;
     const point = route.query.mapCenter || "POINT (113.6142086995688 23.585836479509055)";
-    drawRegionMap.initMap(point, mapContainer.value);
+    const editable = !viewOnly.value;
+    const showPoint = !viewOnly.value;
+    drawRegionMap.initMap(point, mapContainer.value, editable, true, showPoint);
 
     // 地图初始化之后(比如 initPreviewMap 里)
     // const regions = [
@@ -58,24 +61,50 @@ onMounted(() => {
 onActivated(() => {
     const point = route.query.mapCenter || "POINT (113.6142086995688 23.585836479509055)";
 
+    // 从编辑态进入仅查看时,需重新初始化为不可编辑
+    if (viewOnly.value && drawRegionMap.kmap && drawRegionMap.editable) {
+        drawRegionMap.destroyMap();
+        drawRegionMap.initMap(point, mapContainer.value, false, true, false);
+    }
+
     // 先绘制地块
     const polygonData = route.query.polygonData;
+    const rawRangeWkt = route.query.rangeWkt;
+    const rangeWkt = rawRangeWkt ? decodeURIComponent(rawRangeWkt) : null;
 
-    const rangeWkt = route.query.rangeWkt;
     if (rangeWkt) {
-        const regions = JSON.parse(rangeWkt)?.geometryArr.map(item => ({
-            geometry: item,
-            status: "unresolved",
-            updatedTime: route.query.updatedTime,
-        }));
-        drawRegionMap.setStatusRegions(regions);
+        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 (polygonData) {
+    if (!viewOnly.value && polygonData) {
         drawRegionMap.setAreaGeometry(JSON.parse(polygonData)?.geometryArr);
     }
 
-    // 再设置地图中心位置,确保视图在 mapCenter
-    drawRegionMap.setMapPosition(convertPointToArray(point));
+    // 查看模式下已通过 fitAllRegions 适配;编辑模式再设置地图中心
+    if (!viewOnly.value) {
+        drawRegionMap.setMapPosition(convertPointToArray(point));
+    }
 });
 
 onDeactivated(() => {

+ 7 - 0
src/views/old_mini/interactionList/index.vue

@@ -98,6 +98,9 @@
                     <div class="draw-region-btn" v-if="item.interactionTypeId != 1 && item.questionStatus === 3"
                         @click="handleDrawRegion(item)">
                         编辑发生区域</div>
+                    <div class="draw-region-btn" v-if="item.rangeWkt && item.questionStatus !== 3"
+                        @click="handleViewRegion(item)">
+                        查看发生区域</div>
                 </div>
 
                 <!-- 输入框 -->
@@ -585,6 +588,10 @@ const toggleExpand = (item) => {
     item.expanded = !item.expanded;
 };
 
+const handleViewRegion = (item) => {
+    router.push(`/draw_region?viewOnly=1&rangeWkt=${encodeURIComponent(item.rangeWkt)}&updatedTime=${item.updatedTime.slice(0, 10)}`);
+}
+
 const handleDrawRegion = (item) => {
     if (sessionStorage.getItem("drawRegionInteractionId") != item.id) {
         sessionStorage.removeItem("drawRegionPolygonData");

+ 11 - 0
src/views/old_mini/interactionList/map/drawRegionMap.js

@@ -201,6 +201,17 @@ class DrawRegionMap {
         }
     }
 
+    /**
+     * 销毁地图实例(用于从编辑态切换到仅查看时重新初始化)
+     */
+    destroyMap() {
+        this.clearLayer();
+        if (this.kmap && typeof this.kmap.destroy === "function") {
+            this.kmap.destroy();
+        }
+        this.kmap = null;
+    }
+
     getAreaGeometry() {
         const features = this.kmap.getLayerFeatures()
         let geometryArr = []