lxf пре 2 дана
родитељ
комит
c3ac5eaf1b

+ 125 - 39
src/components/gardenList.vue

@@ -5,6 +5,7 @@
             :key="item.id"
             :key="item.id"
             class="garden-card"
             class="garden-card"
             :class="{ 'is-current': item.isCurrent }"
             :class="{ 'is-current': item.isCurrent }"
+            @click="handleSelectFarm(item)"
         >
         >
             <div class="garden-card-header">
             <div class="garden-card-header">
                 <div class="garden-main">
                 <div class="garden-main">
@@ -28,6 +29,7 @@
                     v-else
                     v-else
                     class="action-btn action-btn-default"
                     class="action-btn action-btn-default"
                     type="button"
                     type="button"
+                    @click.stop="handleSelectFarm(item)"
                 >
                 >
                     设为默认农场
                     设为默认农场
                 </div>
                 </div>
@@ -50,55 +52,139 @@
     </div>
     </div>
 
 
     <!-- 新增农场 -->
     <!-- 新增农场 -->
-    <div class="garden-btn fixed-btn">
+    <div class="garden-btn fixed-btn" @click="handleAddFarm">
         <span class="add-garden-btn-text">新增农场</span>
         <span class="add-garden-btn-text">新增农场</span>
     </div>
     </div>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref } from "vue";
+import { onActivated, ref, watch } from "vue";
+import { useRouter } from "vue-router";
 
 
-const gardenList = ref([
-    {
-        id: 1,
-        name: "从化荔博园合作社",
-        warningText: "干旱预警",
-        address: "广东省广州市从化区某某街道",
-        isCurrent: true,
-        stats: [
-            { title: "农事11", label: "某某风险", type: "danger" },
-            { title: "农事22", label: "标准农事", type: "danger" },
-            { title: "农事22", label: "标准防治", type: "safe" }
-        ]
-    },
-    {
-        id: 2,
-        name: "从化荔博园合作社",
-        warningText: "干旱预警",
-        address: "广东省广州市从化区某某街道",
-        isCurrent: false,
-        stats: [
-            { title: "农事11", label: "某某风险", type: "danger" },
-            { title: "农事22", label: "标准农事", type: "danger" },
-            { title: "农事22", label: "标准防治", type: "safe" }
-        ]
-    },
-    {
-        id: 3,
-        name: "从化荔博园合作社",
+const router = useRouter();
+
+const props = defineProps({
+    gardenId: {
+        type: [Number, String],
+        default: null
+    }
+});
+
+const emit = defineEmits(["selectGarden", "loaded"]);
+
+const gardenList = ref([]);
+
+function mapStats() {
+    // 这里先保留静态展示,后续可替换为接口字段映射
+    return [
+        { title: "农事11", label: "某某风险", type: "danger" },
+        { title: "农事22", label: "标准农事", type: "danger" },
+        { title: "农事22", label: "标准防治", type: "safe" }
+    ];
+}
+
+function saveSelectedFarm(farm) {
+    localStorage.setItem("selectedFarmId", farm.id);
+    localStorage.setItem("selectedFarmName", farm.name || "");
+    localStorage.setItem("selectedFarmPoint", farm.wkt || "");
+}
+
+function emitSelectedFarm(farm) {
+    emit("selectGarden", {
+        id: Number(farm.id),
+        name: farm.name || "",
+        wkt: farm.wkt || "",
+        defaultOption: !!farm.defaultOption
+    });
+}
+
+function markCurrentFarm(selectedId) {
+    gardenList.value = gardenList.value.map((farm) => ({
+        ...farm,
+        isCurrent: Number(farm.id) === Number(selectedId)
+    }));
+}
+
+function selectDefaultFarm(data) {
+    const defaultFarm = data.find((farm) => farm.defaultOption === true);
+    return defaultFarm || data[0];
+}
+
+function selectFarmFromList(data) {
+    console.log('props.gardenId', props.gardenId);
+    const targetId = props.gardenId || localStorage.getItem("selectedFarmId");
+    console.log('targetId', targetId);
+    const targetFarm = data.find((farm) => Number(farm.id) === Number(targetId));
+    return targetFarm || selectDefaultFarm(data);
+}
+
+function normalizeFarmList(data) {
+    return (data || []).map((farm) => ({
+        ...farm,
         warningText: "干旱预警",
         warningText: "干旱预警",
-        address: "广东省广州市从化区某某街道",
-        isCurrent: false,
-        stats: [
-            { title: "农事11", label: "某某风险", type: "danger" },
-            { title: "农事22", label: "标准农事", type: "danger" },
-            { title: "农事22", label: "标准防治", type: "safe" }
-        ]
+        address: farm.address || farm.city || "暂无地址",
+        stats: mapStats(),
+        isCurrent: false
+    }));
+}
+
+function getFarmList() {
+    VE_API.farm.listByUserId().then(({ data }) => {
+        const fullData = normalizeFarmList(data);
+        gardenList.value = fullData;
+        if (!fullData.length) {
+            emit("loaded", { hasFarm: false });
+            emit("selectGarden", { id: null, name: "", wkt: "", defaultOption: false });
+            return;
+        }
+
+        const selectedFarm = selectFarmFromList(fullData);
+        markCurrentFarm(selectedFarm.id);
+        saveSelectedFarm(selectedFarm);
+        emit("loaded", { hasFarm: true });
+        emitSelectedFarm(selectedFarm);
+    }).catch(() => {
+        gardenList.value = [];
+        emit("loaded", { hasFarm: false });
+    });
+}
+
+function handleSelectFarm(item) {
+    markCurrentFarm(item.id);
+    saveSelectedFarm(item);
+    emitSelectedFarm(item);
+}
+
+function handleAddFarm() {
+    router.push(`/create_farm?from=growth_report&isReload=true`);
+}
+
+watch(() => props.gardenId, (newGardenId) => {
+    if (!newGardenId || !gardenList.value.length) {
+        return;
+    }
+
+    // 父组件回传的是当前已选农场时,不再重复触发一次选择事件
+    const currentFarm = gardenList.value.find((farm) => farm.isCurrent);
+    if (currentFarm && Number(currentFarm.id) === Number(newGardenId)) {
+        return;
+    }
+
+    const targetFarm = gardenList.value.find((farm) => Number(farm.id) === Number(newGardenId));
+    if (!targetFarm) {
+        return;
     }
     }
-]);
 
 
-// 农场列表
+    handleSelectFarm(targetFarm);
+});
+
+onActivated(() => {
+    // getFarmList();
+});
 
 
+defineExpose({
+    refreshFarmList: getFarmList
+});
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>

+ 42 - 196
src/components/weatherInfo.vue

@@ -90,20 +90,16 @@
                 </el-select>
                 </el-select>
             </div>
             </div>
         </div>
         </div>
-        <!-- 农场信息 -->
-        <farm-info-popup ref="myFarmInfoRef" :showEditBtn="false" :showBtn="true" :farmId="farmId"
-            @success="onFarmBasicInfoSaved"></farm-info-popup>
     </div>
     </div>
 
 
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, onActivated, computed, watch, onMounted } from "vue";
+import { ref, onActivated, computed } from "vue";
 import weatherChart from "./weatherChart.vue";
 import weatherChart from "./weatherChart.vue";
 import { useRouter } from "vue-router";
 import { useRouter } from "vue-router";
 import { useStore } from "vuex";
 import { useStore } from "vuex";
-import { Search } from '@element-plus/icons-vue'
-import farmInfoPopup from "@/views/old_mini/home/components/farmInfoPopup.vue";
+import { Search } from '@element-plus/icons-vue';
 import { convertPointToArray } from "@/utils/index";
 import { convertPointToArray } from "@/utils/index";
 const store = useStore();
 const store = useStore();
 
 
@@ -118,36 +114,6 @@ const props = defineProps({
     }
     }
 });
 });
 
 
-// 定义emit事件
-const emit = defineEmits(['weatherExpanded', 'changeGarden', 'changeGardenTab']);
-const router = useRouter();
-const handleCommand = ({ id, name }) => {
-    farmName.value = name;
-    farmId.value = id;
-    // 更新默认农场标识
-    const selectedFarm = farmList.value.find(farm => farm.id === id);
-    isDefaultFarm.value = selectedFarm ? selectedFarm.defaultOption || false : false;
-    // 保存用户选择的农场到 localStorage
-    localStorage.setItem('selectedFarmId', id);
-    localStorage.setItem('selectedFarmName', name);
-    localStorage.setItem('selectedFarmPoint', selectedFarm.wkt);
-    getLocationName();
-    getWeatherData();
-    emit('changeGarden', { id, name });
-};
-
-const isExpanded = ref(false);
-const toggleExpand = () => {
-    isExpanded.value = !isExpanded.value;
-    emit('weatherExpanded', isExpanded.value);
-};
-
-const farmId = ref(null);
-const farmName = ref("");
-const farmList = ref([]);
-const hasFarm = ref(false)
-const activeGarden = ref('current');
-const isDefaultFarm = ref(false); // 添加默认农场标识
 const regionVal = ref('');
 const regionVal = ref('');
 const typeVal = ref('');
 const typeVal = ref('');
 const searchFarm = ref('');
 const searchFarm = ref('');
@@ -163,157 +129,61 @@ const typeOptions = ref([{
     value: '1'
     value: '1'
 }]);
 }]);
 
 
-// 根据传入的gardenId设置农场(先刷新列表再设置)
-async function setFarmByGardenId(gardenIdValue) {
-    if (!gardenIdValue) {
-        return false;
-    }
+// 定义emit事件
+const emit = defineEmits(['weatherExpanded', 'changeGarden', 'changeGardenTab']);
+const router = useRouter();
 
 
-    // 先刷新农场列表,确保数据是最新的
-    return new Promise((resolve) => {
-        VE_API.farm.listByUserId().then(({ data }) => {
-            // const fullData = data.filter(item => item.userType === 2);
-            const fullData = data;
-            farmList.value = fullData || [];
-            if (fullData && fullData.length > 0) {
-                hasFarm.value = true;
-                const targetFarm = fullData.find(farm => farm.id == gardenIdValue);
-                if (targetFarm) {
-                    farmName.value = targetFarm.name;
-                    farmId.value = Number(gardenIdValue);
-                    isDefaultFarm.value = targetFarm.defaultOption || false;
-                    // 保存到 localStorage
-                    localStorage.setItem('selectedFarmId', farmId.value);
-                    localStorage.setItem('selectedFarmName', farmName.value);
-                    localStorage.setItem('selectedFarmPoint', targetFarm.wkt);
-
-                    getLocationName();
-                    getWeatherData();
-                    emit('changeGarden', { id: farmId.value, name: farmName.value });
-                    resolve(true);
-                } else {
-                    resolve(false);
-                }
-            } else {
-                farmList.value = [];
-                hasFarm.value = false;
-                getLocationName();
-                getWeatherData();
-                resolve(false);
-            }
-        }).catch(() => {
-            resolve(false);
-        });
-    });
-}
+const isExpanded = ref(false);
+const toggleExpand = () => {
+    isExpanded.value = !isExpanded.value;
+    emit('weatherExpanded', isExpanded.value);
+};
 
 
-// 获取农场列表
-function getFarmList() {
-    // 如果传入了 gardenId,优先使用 setFarmByGardenId(它会刷新列表并设置)
-    if (props.gardenId) {
-        setFarmByGardenId(props.gardenId).then((setSuccess) => {
-            // 如果设置失败,使用已获取的列表数据执行默认逻辑(避免重复请求)
-            if (!setSuccess && farmList.value && farmList.value.length > 0) {
-                selectFarmFromList(farmList.value);
-            } else if (!setSuccess) {
-                // 如果列表为空,再次获取列表
-                getFarmListWithoutGardenId();
-            }
-        });
-        return;
-    }
+const farmId = ref(null);
+const farmName = ref("");
+const hasFarm = ref(false)
+const activeGarden = ref('current');
 
 
-    // 如果没有传入 gardenId,执行正常逻辑
-    getFarmListWithoutGardenId();
+function initSelectedFarm() {
+    const savedFarmId = localStorage.getItem("selectedFarmId");
+    const savedFarmName = localStorage.getItem("selectedFarmName");
+    farmId.value = savedFarmId ? Number(savedFarmId) : null;
+    farmName.value = savedFarmName || "";
+    hasFarm.value = !!farmId.value;
 }
 }
 
 
-// 从列表中选择农场(使用已有列表数据)
-function selectFarmFromList(data) {
-    // 使用 localStorage 中保存的农场选择
-    const savedFarmId = localStorage.getItem('selectedFarmId');
-    const savedFarmName = localStorage.getItem('selectedFarmName');
-    if (savedFarmId && savedFarmName) {
-        // 检查保存的农场是否还在当前列表中(名称以接口列表为准,避免改名后仍显示 localStorage 旧值)
-        const savedFarm = data.find(farm => farm.id == savedFarmId);
-        if (savedFarm) {
-            farmName.value = savedFarm.name;
-            farmId.value = Number(savedFarmId);
-            isDefaultFarm.value = savedFarm.defaultOption || false;
-            localStorage.setItem('selectedFarmPoint', savedFarm.wkt);
-            localStorage.setItem('selectedFarmName', savedFarm.name);
-        } else {
-            // 如果保存的农场不在列表中,按优先级选择
-            selectDefaultFarm(data);
-        }
-    } else {
-        // 如果没有保存的选择,按优先级选择
-        selectDefaultFarm(data);
-    }
-    getLocationName();
-    getWeatherData();
-    emit('changeGarden', { id: farmId.value, name: farmName.value });
-}
+onActivated(() => {
+    // initSelectedFarm();
+    // getLocationName();
+    // getWeatherData();
+});
 
 
-// 获取农场列表(不处理传入的gardenId)
-function getFarmListWithoutGardenId() {
-    VE_API.farm.listByUserId().then(({ data }) => {
-        // const fullData = data.filter(item => item.userType === 2);
-        const fullData = data;
-        farmList.value = fullData || [];
-        if (fullData && fullData.length > 0) {
-            hasFarm.value = true;
-            selectFarmFromList(fullData);
-        } else {
-            farmList.value = [];
-            hasFarm.value = false;
-            getLocationName();
-            getWeatherData();
-        }
-    })
+function setGardenLoaded(hasFarmData) {
+    hasFarm.value = !!hasFarmData;
+    if (!hasFarm.value) {
+        farmId.value = null;
+        farmName.value = "";
+    }
 }
 }
 
 
-// 监听父组件传入的gardenId变化
-watch(() => props.gardenId, (newGardenId) => {
-    if (newGardenId) {
-        // 直接调用 setFarmByGardenId,它会刷新列表并设置
-        setFarmByGardenId(newGardenId);
-    }
-}, { immediate: false });
-
-// 选择默认农场的逻辑
-function selectDefaultFarm(data) {
-    // 首先查找 defaultOption 为 true 的农场
-    const defaultFarm = data.find(farm => farm.defaultOption === true);
-
-    if (defaultFarm) {
-        // 如果有默认农场,选择它
-        farmName.value = defaultFarm.name;
-        farmId.value = defaultFarm.id;
-        isDefaultFarm.value = true;
-        localStorage.setItem('selectedFarmPoint', defaultFarm.wkt);
-    } else {
-        // 如果没有默认农场,选择第一个
-        farmName.value = data[0].name;
-        farmId.value = data[0].id;
-        isDefaultFarm.value = data[0].defaultOption || false;
-        localStorage.setItem('selectedFarmPoint', data[0].wkt);
+function setSelectedGarden(payload) {
+    if (!payload?.id) {
+        setGardenLoaded(false);
+        return;
     }
     }
 
 
-    // 保存到 localStorage
-    localStorage.setItem('selectedFarmId', farmId.value);
-    localStorage.setItem('selectedFarmName', farmName.value);
-    localStorage.setItem('selectedFarmPoint', data[0].wkt);
+    hasFarm.value = true;
+    farmId.value = Number(payload.id);
+    farmName.value = payload.name || "";
     getLocationName();
     getLocationName();
     getWeatherData();
     getWeatherData();
+    emit('changeGarden', { id: farmId.value, name: farmName.value });
 }
 }
 
 
-onActivated(() => {
-    getFarmList();
-});
-
-// 暴露刷新方法供父组件调用
+// 暴露方法供父页面(如长势报告)同步农场列表状态
 defineExpose({
 defineExpose({
-    refreshFarmList: getFarmList,
+    setGardenLoaded,
+    setSelectedGarden,
     toggleExpand
     toggleExpand
 });
 });
 
 
@@ -337,34 +207,10 @@ function getLocationName() {
     });
     });
 }
 }
 
 
-const myFarmInfoRef = ref(null);
-
-/** 弹窗内修改农场名称等成功后,同步头部展示与下拉列表、本地缓存 */
-function onFarmBasicInfoSaved(payload) {
-    if (!payload?.id || payload.name == null) {
-        return;
-    }
-    const savedId = Number(payload.id);
-    const idx = farmList.value.findIndex((f) => f.id == savedId);
-    if (idx !== -1) {
-        farmList.value[idx] = { ...farmList.value[idx], name: payload.name };
-    }
-    if (farmId.value == savedId) {
-        farmName.value = payload.name;
-        localStorage.setItem('selectedFarmName', payload.name);
-        emit('changeGarden', { id: farmId.value, name: farmName.value });
-    }
-}
-
 const handleGardenClick = (type) => {
 const handleGardenClick = (type) => {
     activeGarden.value = type;
     activeGarden.value = type;
     emit("changeGardenTab", type);
     emit("changeGardenTab", type);
 };
 };
-
-const handleFarmInfo = () => {
-    // myFarmInfoRef.value.handleShow();
-    router.push(`/farm_info?subjectId=${farmId.value}`);
-}
 const handleAddFarm = () => {
 const handleAddFarm = () => {
     router.push(`/create_farm?from=${props.from}&isReload=true`);
     router.push(`/create_farm?from=${props.from}&isReload=true`);
 }
 }

+ 24 - 3
src/views/old_mini/growth_report/index.vue

@@ -5,7 +5,7 @@
         <!-- 组件:天气 -->
         <!-- 组件:天气 -->
         <div class="weather-info-wrap">
         <div class="weather-info-wrap">
             <weather-info ref="weatherInfoRef" from="growth_report" class="weather-info"
             <weather-info ref="weatherInfoRef" from="growth_report" class="weather-info"
-                @weatherExpanded="weatherExpanded" @changeGarden="changeGarden" @changeGardenTab="changeGardenTab"  :isGarden="true">
+                @weatherExpanded="weatherExpanded" @changeGarden="changeGarden" @changeGardenTab="changeGardenTab">
                 </weather-info>
                 </weather-info>
                 
                 
             <!-- 邀请关注 -->
             <!-- 邀请关注 -->
@@ -16,9 +16,17 @@
                 </div>
                 </div>
             </div>
             </div>
         </div>
         </div>
-        <div class="garden-list-wrap" v-show="activeGardenTab === 'list'">
-            <garden-list></garden-list>
+
+        <!-- 农场列表 -->
+        <div v-show="activeGardenTab === 'list'">
+            <garden-list
+                ref="gardenListRef"
+                :garden-id="selectedGardenId"
+                @loaded="handleGardenLoaded"
+                @selectGarden="handleGardenSelected"
+            />
         </div>
         </div>
+
         <div class="report-content-wrap" v-if="hasReport && activeGardenTab === 'current'" v-loading="loading"
         <div class="report-content-wrap" v-if="hasReport && activeGardenTab === 'current'" v-loading="loading"
             element-loading-background="rgba(0, 0, 0, 0.1)">
             element-loading-background="rgba(0, 0, 0, 0.1)">
             <!-- <div class="history-risk-report-btn" @click="handleHistoryRiskReportClick">
             <!-- <div class="history-risk-report-btn" @click="handleHistoryRiskReportClick">
@@ -228,10 +236,22 @@ const handleMaskClick = () => {
 };
 };
 
 
 const currentFarmName = ref('');
 const currentFarmName = ref('');
+const selectedGardenId = ref(null);
+const gardenListRef = ref(null);
 const activeGardenTab = ref('current');
 const activeGardenTab = ref('current');
 const changeGardenTab = (tab) => {
 const changeGardenTab = (tab) => {
     activeGardenTab.value = tab;
     activeGardenTab.value = tab;
 }
 }
+
+const handleGardenLoaded = ({ hasFarm }) => {
+    weatherInfoRef.value?.setGardenLoaded?.(hasFarm);
+};
+
+const handleGardenSelected = (garden) => {
+    selectedGardenId.value = garden?.id ?? null;
+    weatherInfoRef.value?.setSelectedGarden?.(garden);
+};
+
 // 切换农场时,更新报告数据
 // 切换农场时,更新报告数据
 const changeGarden = async ({ id, name }) => {
 const changeGarden = async ({ id, name }) => {
     if (!id) return;
     if (!id) return;
@@ -253,6 +273,7 @@ const changeGarden = async ({ id, name }) => {
 
 
 onActivated(() => {
 onActivated(() => {
     window.scrollTo(0, 0);
     window.scrollTo(0, 0);
+    gardenListRef.value?.refreshFarmList?.();
 
 
     // 如果路由中带有 miniJson,并且其中有 showBind,则展示绑定成功弹窗
     // 如果路由中带有 miniJson,并且其中有 showBind,则展示绑定成功弹窗
     const { miniJson } = route.query || {};
     const { miniJson } = route.query || {};

+ 1 - 1
src/views/old_mini/home/subPages/prescriptionPage.vue

@@ -253,7 +253,7 @@ async function submit() {
                     router.go(-1);
                     router.go(-1);
                 } else {
                 } else {
                     localStorage.setItem("selectedFarmId", res.data[0]?.subjectId);
                     localStorage.setItem("selectedFarmId", res.data[0]?.subjectId);
-                    localStorage.setItem("selectedFarmName", res.data.name);
+                    localStorage.setItem("selectedFarmName", res.data[0]?.name);
                     router.replace('/growth_report');
                     router.replace('/growth_report');
                 }
                 }
                 ElMessage.success('创建成功');
                 ElMessage.success('创建成功');