Browse Source

Merge branch 'agriculture-demo' of http://www.sysuimars.cn:3000/feiniao/feiniao-farm-h5 into agriculture-demo

lxf 5 days ago
parent
commit
a89791ece5

+ 43 - 35
src/views/old_mini/agri_file/index.vue

@@ -140,7 +140,7 @@
             v-model:show="showInspectSuccessPopup"
             v-model:show="showInspectSuccessPopup"
             type="executeSuccess"
             type="executeSuccess"
             text="您已上传成功"
             text="您已上传成功"
-            text2="请等待诊断报告生成"
+            text2="诊断报告已生成"
             buttonText="完成"
             buttonText="完成"
         />
         />
 
 
@@ -315,9 +315,9 @@ async function fetchCropQuestionAlbumPic() {
     }
     }
 }
 }
 
 
-function resolveAlbumPoint(data) {
-    const lng = Number(data?.longitude);
-    const lat = Number(data?.latitude);
+function resolveGroupPoint(group) {
+    const lng = Number(group?.longitude);
+    const lat = Number(group?.latitude);
     if (Number.isFinite(lng) && Number.isFinite(lat)) return [lng, lat];
     if (Number.isFinite(lng) && Number.isFinite(lat)) return [lng, lat];
     return readEntryFarmCoordinate() || DEFAULT_CENTER;
     return readEntryFarmCoordinate() || DEFAULT_CENTER;
 }
 }
@@ -334,43 +334,50 @@ function buildEmptyAlbum() {
     };
     };
 }
 }
 
 
-/** query_tmp_image:按分区名聚合;无分区名时归到用户品类,地图点用接口经纬度 */
+/** 组内展示名:优先分区名,否则用户品类 */
+function resolveGroupAlbumName(images, cropName) {
+    const zoneName = String(images.find((img) => img?.zone_name)?.zone_name || "").trim();
+    return zoneName || cropName || "";
+}
+
+/**
+ * query_tmp_image:data.groups 为按点位分组的二维结构
+ * groups[i].images[j] → cloud_url / zone_name;每组自带经纬度与 image_count
+ */
 function mapTmpImageAlbum(data) {
 function mapTmpImageAlbum(data) {
-    const images = Array.isArray(data?.images) ? data.images : [];
     const cropName = resolveSelectedCropName();
     const cropName = resolveSelectedCropName();
-    const [lng, lat] = resolveAlbumPoint(data);
-    const groups = new Map();
-    images.forEach((img) => {
-        if (!img?.cloud_url) return;
-        const name = String(img.zone_name || "").trim() || cropName || "";
-        if (!groups.has(name)) groups.set(name, []);
-        groups.get(name).push(img);
+    const rawGroups = Array.isArray(data?.groups) ? data.groups : [];
+    const albums = [];
+    const zones = [];
+
+    rawGroups.forEach((group, index) => {
+        const images = Array.isArray(group?.images)
+            ? group.images.filter((img) => img?.cloud_url)
+            : [];
+        if (!images.length) return;
+
+        const [lng, lat] = resolveGroupPoint(group);
+        const name = resolveGroupAlbumName(images, cropName);
+        const count = Number(group.image_count) || images.length;
+        const cover = images[0].cloud_url;
+        const id = `${images[0]?.farm_id || "album"}-${index}`;
+        const item = {
+            id,
+            groupIndex: index,
+            name,
+            count,
+            cover,
+            longitude: lng,
+            latitude: lat,
+        };
+        albums.push(item);
+        zones.push({ ...item, id: `album-point-${index}` });
     });
     });
-    const albums = [...groups.entries()].map(([name, list], index) => ({
-        id: `${list[0]?.farm_id || "album"}-${index}`,
-        name,
-        count: list.length,
-        cover: list[0].cloud_url,
-        longitude: lng,
-        latitude: lat,
-    }));
+
     if (!albums.length) {
     if (!albums.length) {
         return { albums: [buildEmptyAlbum()], zones: [] };
         return { albums: [buildEmptyAlbum()], zones: [] };
     }
     }
-    const total = albums.reduce((sum, item) => sum + item.count, 0);
-    return {
-        albums,
-        zones: [
-            {
-                id: "album-point",
-                name: albums.length === 1 ? albums[0].name : cropName,
-                count: total,
-                cover: albums[0].cover,
-                longitude: lng,
-                latitude: lat,
-            },
-        ],
-    };
+    return { albums, zones };
 }
 }
 
 
 let tmpAlbumTask = null;
 let tmpAlbumTask = null;
@@ -912,6 +919,7 @@ const goAlbumDetail = (item) => {
         query: {
         query: {
             id: item?.id,
             id: item?.id,
             name: item?.name || "",
             name: item?.name || "",
+            groupIndex: item?.groupIndex != null ? String(item.groupIndex) : "",
             noImage: item?.count ? "false" : "true",
             noImage: item?.count ? "false" : "true",
         },
         },
     });
     });

+ 37 - 14
src/views/old_mini/agri_file/pages/albumMap.vue

@@ -148,20 +148,43 @@ const loadAlbumLayers = async () => {
             const res = await VE_API.questionnaire.queryTmpImage({ tel });
             const res = await VE_API.questionnaire.queryTmpImage({ tel });
             const payload = Array.isArray(res) ? res[0] : res;
             const payload = Array.isArray(res) ? res[0] : res;
             if (Number(payload?.code) === 200 && payload.data) {
             if (Number(payload?.code) === 200 && payload.data) {
-                const images = Array.isArray(payload.data.images) ? payload.data.images : [];
-                const lng = Number(payload.data.longitude);
-                const lat = Number(payload.data.latitude);
-                if (Number.isFinite(lng) && Number.isFinite(lat)) center = [lng, lat];
-                const cover = images.find((item) => item?.cloud_url)?.cloud_url || "";
-                if (images.length && cover) {
-                    photos = [
-                        {
-                            count: images.length,
-                            cover,
-                            longitude: center[0],
-                            latitude: center[1],
-                        },
-                    ];
+                const groups = Array.isArray(payload.data.groups) ? payload.data.groups : [];
+                if (groups.length) {
+                    photos = groups
+                        .map((group) => {
+                            const images = Array.isArray(group?.images)
+                                ? group.images.filter((item) => item?.cloud_url)
+                                : [];
+                            if (!images.length) return null;
+                            const lng = Number(group.longitude);
+                            const lat = Number(group.latitude);
+                            if (!Number.isFinite(lng) || !Number.isFinite(lat)) return null;
+                            return {
+                                count: Number(group.image_count) || images.length,
+                                cover: images[0].cloud_url,
+                                longitude: lng,
+                                latitude: lat,
+                            };
+                        })
+                        .filter(Boolean);
+                    if (photos[0]) center = [photos[0].longitude, photos[0].latitude];
+                } else {
+                    // 兼容旧结构
+                    const images = Array.isArray(payload.data.images) ? payload.data.images : [];
+                    const lng = Number(payload.data.longitude);
+                    const lat = Number(payload.data.latitude);
+                    if (Number.isFinite(lng) && Number.isFinite(lat)) center = [lng, lat];
+                    const cover = images.find((item) => item?.cloud_url)?.cloud_url || "";
+                    if (images.length && cover) {
+                        photos = [
+                            {
+                                count: images.length,
+                                cover,
+                                longitude: center[0],
+                                latitude: center[1],
+                            },
+                        ];
+                    }
                 }
                 }
             }
             }
         } catch {
         } catch {

+ 1 - 1
src/views/old_mini/agri_file/pages/growthTrack.vue

@@ -102,7 +102,7 @@
         </div>
         </div>
 
 
         <album-upload-popup v-model:show="showUploadPopup" @confirm="handleUploadConfirm" />
         <album-upload-popup v-model:show="showUploadPopup" @confirm="handleUploadConfirm" />
-        <tip-popup v-model:show="showSuccessPopup" type="executeSuccess" text="您已上传成功" text2="诊断报告已生成" hideBtn>
+        <tip-popup v-model:show="showSuccessPopup" type="executeSuccess" text="您已上传成功" text2="请等待诊断报告生成" hideBtn>
             <template #footer>
             <template #footer>
                 <div class="bottom-btn-container">
                 <div class="bottom-btn-container">
                     <div class="bottom-btn primary-btn" @click="handleComplete">完成</div>
                     <div class="bottom-btn primary-btn" @click="handleComplete">完成</div>

+ 27 - 6
src/views/old_mini/agri_file/pages/regionAlbums.vue

@@ -116,6 +116,23 @@ function belongsToAlbum(img, albumName, cropName) {
     return name === albumName;
     return name === albumName;
 }
 }
 
 
+/** 从 groups 二维结构取出目标组图片;优先 groupIndex,否则按分区名过滤 */
+function pickGroupImages(payload, { groupIndex, albumName, cropName }) {
+    const groups = Array.isArray(payload?.data?.groups) ? payload.data.groups : [];
+    if (groups.length) {
+        const idx = groupIndex === "" || groupIndex == null ? NaN : Number(groupIndex);
+        if (Number.isInteger(idx) && idx >= 0 && idx < groups.length) {
+            return Array.isArray(groups[idx]?.images) ? groups[idx].images : [];
+        }
+        return groups.flatMap((g) => (Array.isArray(g?.images) ? g.images : [])).filter((img) =>
+            belongsToAlbum(img, albumName, cropName)
+        );
+    }
+    // 兼容旧结构 data.images
+    const images = Array.isArray(payload?.data?.images) ? payload.data.images : [];
+    return images.filter((img) => belongsToAlbum(img, albumName, cropName));
+}
+
 const regionName = computed(
 const regionName = computed(
     () => route.query.regionName || route.query.name || readEntryCropName() || t("agriFile.zoneOne")
     () => route.query.regionName || route.query.name || readEntryCropName() || t("agriFile.zoneOne")
 );
 );
@@ -192,7 +209,7 @@ const isEmpty = computed(
     () => forceEmpty.value || (!loading.value && !imageList.value.length)
     () => forceEmpty.value || (!loading.value && !imageList.value.length)
 );
 );
 
 
-/** 与农情档案相册页同一接口:query_tmp_image */
+/** 与农情档案相册页同一接口:query_tmp_image(data.groups 二维结构) */
 const fetchAlbumImages = async () => {
 const fetchAlbumImages = async () => {
     if (forceEmpty.value) {
     if (forceEmpty.value) {
         imageList.value = [];
         imageList.value = [];
@@ -208,14 +225,18 @@ const fetchAlbumImages = async () => {
         }
         }
         const res = await VE_API.questionnaire.queryTmpImage({ tel });
         const res = await VE_API.questionnaire.queryTmpImage({ tel });
         const payload = Array.isArray(res) ? res[0] : res;
         const payload = Array.isArray(res) ? res[0] : res;
-        const images =
-            Number(payload?.code) === 200 && Array.isArray(payload?.data?.images)
-                ? payload.data.images
-                : [];
         const cropName = readEntryCropName();
         const cropName = readEntryCropName();
         const albumName = String(route.query.name || route.query.regionName || "").trim();
         const albumName = String(route.query.name || route.query.regionName || "").trim();
+        const images =
+            Number(payload?.code) === 200
+                ? pickGroupImages(payload, {
+                      groupIndex: route.query.groupIndex,
+                      albumName,
+                      cropName,
+                  })
+                : [];
         imageList.value = images
         imageList.value = images
-            .filter((img) => img?.cloud_url && belongsToAlbum(img, albumName, cropName))
+            .filter((img) => img?.cloud_url)
             .map((img) => ({
             .map((img) => ({
                 id: img.id,
                 id: img.id,
                 filename: img.cloud_url,
                 filename: img.cloud_url,