소스 검색

feat:修改相册页面图片

wangsisi 2 주 전
부모
커밋
4bc8b1c45d

+ 5 - 0
src/components/popup/restorePlantingPopup.vue

@@ -240,6 +240,11 @@ const applyQuestionData = (data) => {
     phenologyImage.value = pic || DEFAULT_PHENOLOGY_IMAGE;
     phenologyGuideImage.value = guidePic || "";
 
+    // 存一张物候配图,农情相册地图/卡片复用
+    if (pic) {
+        localStorage.setItem("CROP_QUESTION_PIC_URL", pic);
+    }
+
     // 有时间题先展示问题一,否则直接问题二
     questionType.value = timeQuestion ? "time" : "phenology";
     phenologyAnswer.value = "";

+ 78 - 9
src/views/old_mini/agri_file/index.vue

@@ -171,6 +171,7 @@ import proxyAuthPopup from "@/components/popup/proxyAuthPopup.vue";
 import phenologyUpdatePopup from "@/components/popup/phenologyUpdatePopup.vue";
 import PhenologyTrackTimelineItem from "@/components/pageComponents/PhenologyTrackTimelineItem.vue";
 import wx from "weixin-js-sdk";
+import { base_img_url2 } from "@/api/config";
 
 const { t } = useI18n();
 const store = useStore();
@@ -186,6 +187,8 @@ const onPhenologyReached = () => {
 const DIAGNOSIS_GUIDE_STORAGE_KEY = "AGRI_FILE_DIAGNOSIS_REPORT_GUIDE";
 const ENTRY_FARM_DATA_KEY = "ENTRY_FARM_DATA";
 const CROP_ARCHIVE_KEY = "CROP_ARCHIVE_RECORDS";
+/** crop_question 返回的物候配图,相册只展示这一张 */
+const CROP_QUESTION_PIC_KEY = "CROP_QUESTION_PIC_URL";
 const guideVisible = ref(false);
 
 const defaultCover = require("@/assets/img/home/banner.png");
@@ -245,12 +248,17 @@ function readEntryFarmData() {
     }
 }
 
+/** 用户录入时选择的作物品类名 */
+function resolveSelectedCropName() {
+    return readEntryFarmData()?.crop || "";
+}
+
 function buildZoneList(coordinate = readEntryFarmCoordinate() || DEFAULT_CENTER) {
     return [
         {
             id: 1,
             name: "",
-            count: 2,
+            count: 1,
             cover: defaultCover,
             longitude: Number(coordinate[0]),
             latitude: Number(coordinate[1]),
@@ -261,9 +269,66 @@ function buildZoneList(coordinate = readEntryFarmCoordinate() || DEFAULT_CENTER)
 const zoneList = ref(buildZoneList());
 
 const albumList = ref([
-    { id: 1, name: "", count: 125, cover: defaultCover },
+    { id: 1, name: "", count: 1, cover: defaultCover },
 ]);
 
+function resolveCropQuestionImageUrl(path) {
+    if (!path) return "";
+    if (/^https?:\/\//i.test(path)) return path;
+    return base_img_url2 + String(path).replace(/^\//, "");
+}
+
+function readStoredCropQuestionPic() {
+    return localStorage.getItem(CROP_QUESTION_PIC_KEY) || "";
+}
+
+/** 相册地图气泡 + 下方卡片:只用 crop_question 的一张图,数量固定 1;名称用用户品类 */
+function applyCropQuestionAlbumCover(coverUrl) {
+    const cover = coverUrl || readStoredCropQuestionPic() || defaultCover;
+    const cropName = resolveSelectedCropName();
+    zoneList.value = zoneList.value.map((item) => ({
+        ...item,
+        name: cropName || item.name,
+        cover,
+        count: 1,
+    }));
+    albumList.value = albumList.value.map((item) => ({
+        ...item,
+        name: cropName || item.name,
+        cover,
+        count: 1,
+    }));
+}
+
+/** 拉取 crop_question 配图并缓存 */
+async function fetchCropQuestionAlbumPic() {
+    const entry = readEntryFarmData();
+    const crop = entry?.crop;
+    const code = entry?.cropCode;
+    if (!crop || !code) {
+        applyCropQuestionAlbumCover();
+        return;
+    }
+    try {
+        const res = await VE_API.questionnaire.phenologyProblem({
+            crop_type: crop,
+            phenophase_code: String(code),
+            code: String(code),
+        });
+        if (res?.code !== 200 || !res.data) {
+            applyCropQuestionAlbumCover();
+            return;
+        }
+        const url = resolveCropQuestionImageUrl(
+            res.data.phenophase_pic_url || res.data.interact_pic_url
+        );
+        if (url) localStorage.setItem(CROP_QUESTION_PIC_KEY, url);
+        applyCropQuestionAlbumCover(url);
+    } catch {
+        applyCropQuestionAlbumCover();
+    }
+}
+
 const reportCover = require("@/assets/img/common/sd-1.jpg");
 const reportList = ref([
     { id: 1, title: "", desc: "", date: "", cover: reportCover },
@@ -370,10 +435,13 @@ const bindZoneOverlays = () => {
 
 const syncZoneFromEntry = () => {
     const coordinate = readEntryFarmCoordinate() || getFarmCenter();
-    const zoneName = zoneList.value[0]?.name || "";
+    const cropName = resolveSelectedCropName() || zoneList.value[0]?.name || "";
+    const cover = readStoredCropQuestionPic() || zoneList.value[0]?.cover || defaultCover;
     zoneList.value = buildZoneList(coordinate).map((item) => ({
         ...item,
-        name: zoneName,
+        name: cropName,
+        cover,
+        count: 1,
     }));
 };
 
@@ -389,15 +457,15 @@ const initAlbumMap = async () => {
         albumList.value = [];
         return;
     }
+    applyCropQuestionAlbumCover();
     bindZoneOverlays();
     fileMap.kmap?.map?.updateSize?.();
 };
 
 const fillMockLabels = () => {
-    const zoneName = t("agriFile.zoneLabel", { n: 1 });
-    const albumName = t("agriFile.zoneOne");
-    zoneList.value = zoneList.value.map((item) => ({ ...item, name: zoneName }));
-    albumList.value = albumList.value.map((item) => ({ ...item, name: albumName }));
+    const cropName = resolveSelectedCropName();
+    zoneList.value = zoneList.value.map((item) => ({ ...item, name: cropName }));
+    albumList.value = albumList.value.map((item) => ({ ...item, name: cropName }));
     reportList.value = reportList.value.map((item) => ({
         ...item,
         title: t("agriFile.reportTitle"),
@@ -409,7 +477,7 @@ const fillMockLabels = () => {
         ...MOCK_CROP_ARCHIVE.map((item) => ({
             id: item.id,
             date: item.date,
-            zone_name: albumName,
+            zone_name: cropName,
             content: t(item.contentKey),
         })),
     ];
@@ -485,6 +553,7 @@ async function loadPatrolContent() {
     // 先长势跟踪,后异常态势
     await fetchPatrolGrowthInteract();
     await fetchPatrolAbnormalInteract();
+    await fetchCropQuestionAlbumPic();
 }
 
 const goAddZone = (type) => {

+ 10 - 2
src/views/old_mini/agri_file/pages/albumMap.vue

@@ -34,6 +34,8 @@ const fileMap = new FileMap();
 const defaultCover = require("@/assets/img/home/banner.png");
 const DEFAULT_MAP_LOCATION = "POINT(113.6142086995688 23.585836479509055)";
 const ENTRY_FARM_DATA_KEY = "ENTRY_FARM_DATA";
+/** 与农情档案相册页共用:crop_question 配图 */
+const CROP_QUESTION_PIC_KEY = "CROP_QUESTION_PIC_URL";
 
 const userLocation = ref(
     store.state.home.miniUserLocation ||
@@ -48,6 +50,10 @@ const MOCK_PHOTOS = [
     { id: 1, dlng: 0, dlat: 0 },
 ];
 
+function readAlbumCover() {
+    return localStorage.getItem(CROP_QUESTION_PIC_KEY) || defaultCover;
+}
+
 function squarePolygonWkt(lng, lat, delta = 0.0014) {
     const ring = [
         [lng - delta, lat + delta * 0.7],
@@ -149,9 +155,11 @@ const loadAlbumLayers = () => {
         longitude: lng + item.dlng,
         latitude: lat + item.dlat,
     }));
+    // 与外面农情相册一致:crop_question 图 + 数量 1
+    const cover = readAlbumCover();
     const photos = MOCK_PHOTOS.map((item) => ({
-        count: 2,
-        cover: defaultCover,
+        count: 1,
+        cover,
         longitude: lng + item.dlng,
         latitude: lat + item.dlat,
     }));

+ 39 - 43
src/views/old_mini/agri_file/pages/regionAlbums.vue

@@ -76,10 +76,9 @@ const { t } = useI18n();
 const route = useRoute();
 const router = useRouter();
 
-/** 临时默认参数,后续改成正式接口后可只走 query */
-const TEMP_ORGAN_ID = "101532";
-const TEMP_AREA_ID = "90178";
-const TEMP_DATE = "2026-08-19";
+/** 与外面农情相册一致:只用 crop_question 缓存的一张图 */
+const CROP_QUESTION_PIC_KEY = "CROP_QUESTION_PIC_URL";
+const ENTRY_FARM_DATA_KEY = "ENTRY_FARM_DATA";
 
 const loading = ref(false);
 const imageList = ref([]);
@@ -88,13 +87,23 @@ const previewImages = ref([]);
 const previewIndex = ref(0);
 const showUploadPopup = ref(false);
 
+function readEntryCropName() {
+    try {
+        const data = JSON.parse(localStorage.getItem(ENTRY_FARM_DATA_KEY) || "null");
+        return data?.crop || "";
+    } catch {
+        return "";
+    }
+}
+
+function readCropQuestionPic() {
+    return localStorage.getItem(CROP_QUESTION_PIC_KEY) || "";
+}
+
 const regionName = computed(
-    () => route.query.regionName || route.query.name || t("agriFile.zoneOne")
+    () => route.query.regionName || route.query.name || readEntryCropName() || t("agriFile.zoneOne")
 );
 
-const organId = computed(() => route.query.organId || TEMP_ORGAN_ID);
-const areaId = computed(() => route.query.areaId || TEMP_AREA_ID);
-const queryDate = computed(() => route.query.date || TEMP_DATE);
 const forceEmpty = computed(
     () => route.query.noImage === "true" || route.query.noImage === true
 );
@@ -128,13 +137,16 @@ const formatDateLabel = (dateStr) => {
 };
 
 const getImageUrl = (item) => {
-    if (!item?.filename) return "";
+    if (!item?.filename && !item?.url) return "";
+    if (item.url) return item.url;
     if (/^https?:\/\//i.test(item.filename)) return item.filename;
     return `${base_img_url2}${item.filename}${resize_300 || ""}`;
 };
 
 const getFullImageUrl = (item) => {
-    if (!item?.filename) return "";
+    if (!item?.filename && !item?.fullUrl && !item?.url) return "";
+    if (item.fullUrl) return item.fullUrl;
+    if (item.url && /^https?:\/\//i.test(item.url)) return item.url;
     if (/^https?:\/\//i.test(item.filename)) return item.filename;
     return `${base_img_url2}${item.filename}`;
 };
@@ -164,23 +176,7 @@ const isEmpty = computed(
     () => forceEmpty.value || (!loading.value && !imageList.value.length)
 );
 
-const normalizeList = (raw) => {
-    const list = Array.isArray(raw)
-        ? raw
-        : Array.isArray(raw?.list)
-            ? raw.list
-            : Array.isArray(raw?.records)
-                ? raw.records
-                : [];
-    return list
-        .map((item) => ({
-            ...item,
-            url: getImageUrl(item),
-            fullUrl: getFullImageUrl(item),
-        }))
-        .filter((item) => item.url);
-};
-
+/** 仅展示外面缓存的那一张 crop_question 配图 */
 const fetchAlbumImages = async () => {
     if (forceEmpty.value) {
         imageList.value = [];
@@ -189,24 +185,24 @@ const fetchAlbumImages = async () => {
     }
     loading.value = true;
     try {
-        // TODO: 临时接口,后续替换正式相册接口
-        const res = await VE_API.monitor.getRegionAlbumImages({
-            organId: organId.value,
-            areaId: areaId.value,
-            date: queryDate.value,
-            limit: 100,
-            page: 1,
-        });
-        const ok = res?.code === 200 || res?.code === 0 || res?.code === 1 || res?.success;
-        if (ok) {
-            imageList.value = normalizeList(res.data);
-        } else {
+        const cover = readCropQuestionPic();
+        if (!cover) {
             imageList.value = [];
-            if (res?.msg) ElMessage.error(res.msg);
+            return;
         }
-    } catch {
-        imageList.value = [];
-        ElMessage.error("获取相册失败,请稍后再试");
+        const today = new Date();
+        const uploadDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`;
+        imageList.value = [
+            {
+                id: "crop-question-cover",
+                filename: cover,
+                uploadDate,
+                url: cover,
+                fullUrl: cover,
+                growText: "",
+                watermarkMsg: "",
+            },
+        ];
     } finally {
         loading.value = false;
     }

+ 16 - 1
src/views/old_mini/work_detail/index.vue

@@ -13,7 +13,7 @@
             <div class="content-status" :class="{'done-status': statusVal === 'completed'}">
                 <div class="status-l">
                     <div class="status-title">
-                        <span class="status-title-text">08.18 {{ farmData.fw_name }}</span>
+                        <span class="status-title-text">{{ displayExecuteDate }} {{ farmData.fw_name }}</span>
                         <div class="status-title-tags">
                             <span
                                 v-if="farmData.isNormal"
@@ -296,6 +296,17 @@ const miniJson = ref(null);
 const farmData = ref({});
 /** 列表页带入的 agronomy_detail 缓存 */
 const WORK_AGRONOMY_DETAIL_KEY = "WORK_AGRONOMY_DETAIL";
+/** 与列表页标题日期一致:MM/DD */
+const displayExecuteDate = ref("");
+
+function formatExecuteDateLabel(workTime) {
+    if (!workTime) return "";
+    // 列表已格式化为 MM/DD
+    if (/^\d{2}\/\d{2}$/.test(String(workTime).trim())) return String(workTime).trim();
+    const d = new Date(workTime);
+    if (Number.isNaN(d.getTime())) return "";
+    return `${String(d.getMonth() + 1).padStart(2, "0")}/${String(d.getDate()).padStart(2, "0")}`;
+}
 
 function readWorkAgronomyPayload() {
     try {
@@ -378,7 +389,11 @@ function applyAgronomyDetailPayload(payload) {
         isWeather: payload.isWeather ?? isWeather,
         isHighRisk: payload.isHighRisk ?? isWeather,
         cornerTip: payload.cornerTip || "",
+        work_time: payload.work_time || "",
     };
+    displayExecuteDate.value = formatExecuteDateLabel(
+        payload.executeDate || payload.work_time
+    );
 
     // 有方案分组:默认选第 0 个
     if (tabs.length > 0) {

+ 1 - 0
src/views/old_mini/work_execute/index.vue

@@ -329,6 +329,7 @@ const handleViewDetail = (item) => {
                 agronomy_detail: item.agronomy_detail,
                 work_id: item.id,
                 work_time: item.workTime || item.executeDate,
+                executeDate: item.executeDate,
                 work_type: item.workType,
                 work_status: item.workStatus,
                 status: item.status,