| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <template>
- <div class="farm-header">
- <div class="farm-header__info">
- <el-avatar class="farm-header__avatar" :size="46" :src="circleUrl" />
- <div class="farm-header__text">
- <div class="farm-header__name van-ellipsis">{{ farmName }}</div>
- <div class="farm-header__location van-ellipsis">{{ farmLocation }}</div>
- </div>
- </div>
- <div class="farm-header__more" @click="goAllGarden">
- <el-icon class="farm-header__more-icon">
- <Switch />
- </el-icon>
- <span>{{ t("agriFile.moreFarms") }}</span>
- </div>
- </div>
- </template>
- <script setup>
- import { onActivated, onMounted, ref } from "vue";
- import { useRouter } from "vue-router";
- import { useStore } from "vuex";
- import { Switch } from "@element-plus/icons-vue";
- import { useI18n } from "@/i18n";
- const { t } = useI18n();
- const router = useRouter();
- const store = useStore();
- const defaultAvatar = require("@/assets/img/common/logo.png");
- const farmName = ref("");
- const farmLocation = ref("");
- const circleUrl = ref(defaultAvatar);
- const applyFarmInfo = (farm = {}) => {
- farmName.value = farm.farm_name || farm.name || t("agriFile.farmName");
- farmLocation.value = farm.farm_address || farm.rawAddress || farm.city || t("agriFile.farmLocation");
- circleUrl.value = farm.cover || farm.image || farm.avatar || defaultAvatar;
- };
- const hasSelectedFarm = (farm) => {
- if (!farm || typeof farm !== "object") return false;
- return !!(farm.farm_id || farm.id || farm.farm_name || farm.name);
- };
- const resolveFarmPointWkt = (farm) => {
- if (farm.geom_wkt && /^POINT\s*\(/i.test(String(farm.geom_wkt).trim())) {
- return farm.geom_wkt;
- }
- if (farm.farm_location && /^POINT\s*\(/i.test(String(farm.farm_location).trim())) {
- return farm.farm_location;
- }
- return farm.geom_wkt || farm.wkt || "";
- };
- const normalizeFarm = (farm) => {
- const id = farm.farm_id ?? farm.id;
- return {
- ...farm,
- id,
- name: farm.farm_name || farm.name,
- wkt: resolveFarmPointWkt(farm),
- rawAddress: farm.farm_address || farm.city || "",
- };
- };
- const saveSelectedFarm = (farm) => {
- localStorage.setItem("selectedFarmId", farm.id);
- localStorage.setItem("selectedFarmName", farm.name || "");
- localStorage.setItem("selectedFarmPoint", farm.wkt || "");
- localStorage.setItem("selectedFarmData", JSON.stringify(farm));
- };
- function getMiniUserId() {
- return store.state.home.miniUserId || localStorage.getItem("MINI_USER_ID");
- }
- const loadFirstFarmAsSelected = async () => {
- const id = getMiniUserId();
- if (!id) {
- applyFarmInfo();
- return;
- }
- try {
- const res = await VE_API.questionnaire.getFarms({ id });
- const list = Array.isArray(res?.data) ? res.data : [];
- const first = list[0];
- if (!first) {
- applyFarmInfo();
- return;
- }
- const farm = normalizeFarm(first);
- saveSelectedFarm(farm);
- applyFarmInfo(farm);
- } catch {
- applyFarmInfo();
- }
- };
- const loadFarmInfo = async () => {
- try {
- const farm = JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
- if (hasSelectedFarm(farm)) {
- applyFarmInfo(farm);
- return;
- }
- await loadFirstFarmAsSelected();
- } catch {
- await loadFirstFarmAsSelected();
- }
- };
- const goAllGarden = () => {
- router.push("/all_garden");
- };
- onMounted(loadFarmInfo);
- onActivated(loadFarmInfo);
- defineExpose({ loadFarmInfo });
- </script>
- <style lang="scss" scoped>
- .farm-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 10px;
- .farm-header__info {
- display: flex;
- align-items: center;
- gap: 6px;
- min-width: 0;
- flex: 1;
- }
- .farm-header__text {
- min-width: 0;
- }
- .farm-header__name {
- font-size: 16px;
- font-weight: 500;
- }
- .farm-header__location {
- margin-top: 2px;
- color: rgba(0, 0, 0, 0.5);
- font-size: 12px;
- }
- .farm-header__more {
- display: flex;
- align-items: center;
- gap: 4px;
- flex-shrink: 0;
- padding: 6px 10px;
- border-radius: 16px;
- background: #fff;
- color: #2199f8;
- cursor: pointer;
- }
- }
- </style>
|