Forráskód Böngészése

feat:修改农事规划页面和时间轴组件

wangsisi 5 napja
szülő
commit
aae186f5da
43 módosított fájl, 1970 hozzáadás és 13204 törlés
  1. 0 1
      agriculture
  2. 1731 0
      src/components/pageComponents/ArchivesFarmTimeLine copy.vue
  3. 101 574
      src/components/pageComponents/ArchivesFarmTimeLine.vue
  4. 0 180
      src/router/globalRoutes.js
  5. 131 254
      src/views/old_mini/agri_record/index.vue
  6. 3 3
      src/views/old_mini/agri_services/index.vue
  7. 1 1
      src/views/old_mini/farm_manage/components/demandHall.vue
  8. 2 2
      src/views/old_mini/home/index copy.vue
  9. 0 4
      src/views/old_mini/home/index.vue
  10. 0 365
      src/views/old_mini/mine/index.vue
  11. 0 122
      src/views/old_mini/mine/pages/authentication.vue
  12. 0 155
      src/views/old_mini/mine/pages/farm.vue
  13. 0 1419
      src/views/old_mini/mine/pages/farmRecords.vue
  14. 0 208
      src/views/old_mini/mine/pages/message.vue
  15. 0 149
      src/views/old_mini/mine/pages/messageList.vue
  16. 0 101
      src/views/old_mini/mine/pages/projectManager.vue
  17. 0 451
      src/views/old_mini/mine/pages/register.vue
  18. 0 159
      src/views/old_mini/mine/pages/serviceDetail.vue
  19. 0 140
      src/views/old_mini/mine/pages/serviceRecords.vue
  20. 0 638
      src/views/old_mini/mine/pages/teamManage.vue
  21. 0 237
      src/views/old_mini/mine/pages/userInfo.vue
  22. 1 1
      src/views/old_mini/monitor/index.vue
  23. 0 340
      src/views/old_mini/plan/components/addGroup.vue
  24. 0 1302
      src/views/old_mini/plan/components/modifyPlan.vue
  25. 0 437
      src/views/old_mini/plan/components/myPrescription.vue
  26. 0 86
      src/views/old_mini/plan/editPlan.vue
  27. 0 104
      src/views/old_mini/plan/farmCard.vue
  28. 0 276
      src/views/old_mini/plan/index copy.vue
  29. 0 480
      src/views/old_mini/plan/index.vue
  30. 0 415
      src/views/old_mini/task_condition/components/calendar.vue
  31. 0 738
      src/views/old_mini/task_condition/components/interact.vue
  32. 0 155
      src/views/old_mini/task_condition/components/remindCustomer.vue
  33. 0 699
      src/views/old_mini/task_condition/components/reviewPopup.vue
  34. 0 758
      src/views/old_mini/task_condition/components/task.vue
  35. 0 203
      src/views/old_mini/task_condition/components/uploadExecute.vue
  36. 0 69
      src/views/old_mini/task_condition/index.vue
  37. 0 73
      src/views/old_mini/user/components/addPopup.vue
  38. 0 691
      src/views/old_mini/user/farmDetails.vue
  39. 0 448
      src/views/old_mini/user/index.vue
  40. 0 300
      src/views/old_mini/user/manage.vue
  41. 0 197
      src/views/old_mini/user/subPages/cropRecord.vue
  42. 0 124
      src/views/old_mini/user/subPages/farmList.vue
  43. 0 145
      src/views/old_mini/user/subPages/serviceList.vue

+ 0 - 1
agriculture

@@ -1 +0,0 @@
-农户和农资版本

+ 1731 - 0
src/components/pageComponents/ArchivesFarmTimeLine copy.vue

@@ -0,0 +1,1731 @@
+<template>
+    <div class="timeline-container" ref="timelineContainerRef">
+        <div class="timeline-list" ref="timelineListRef">
+            <empty v-if="isEmpty" image="https://birdseye-img.sysuimars.com/birdseye-look-mini/custom-empty-image.png"
+                image-size="80" description="暂无数据" class="empty-state" />
+            <template v-else>
+                <!-- <div class="timeline-middle-line"></div>
+                <div v-for="(t, tIdx) in phenologyStartDates" :key="`term-${uniqueTimestamp}-${tIdx}`"
+                    class="timeline-term" :style="getTermStyle(t, tIdx)">
+                    <span class="term-name">{{ formatDate(t.startDate) }}</span>
+                </div> -->
+                <div v-for="(p, idx) in phenologyList" :key="`phenology-${uniqueTimestamp}-${idx}`"
+                    class="phenology-bar">
+                    <div class="phenology-title" :class="{
+                        'phenology-title--wide': showPhenologyName && !phenologyNeedsTwoLabelColumns(p),
+                        'phenology-red': !shouldShowBlue(p),
+                        'phenology-blue': shouldShowBlue(p),
+                    }" v-if="shouldShowPhenologyBarTitle(idx)">
+                        {{ p.phenologyName }}
+                    </div>
+                    <div v-for="(r, rIdx) in Array.isArray(p.reproductiveList) ? p.reproductiveList : []"
+                        :key="`reproductive-${uniqueTimestamp}-${idx}-${rIdx}`" class="reproductive-item">
+                        <div class="arranges" :class="{ 'arranges-min': !showPhenologyName }">
+                            <div v-for="(fw, aIdx) in Array.isArray(r.farmWorkArrangeList) ? r.farmWorkArrangeList : []"
+                                :key="`arrange-${uniqueTimestamp}-${idx}-${rIdx}-${aIdx}`" class="arrange-card" :class="[
+                                    getArrangeStatusClass(fw),
+                                    {
+                                        'last-card':
+                                            aIdx === r.farmWorkArrangeList.length - 1 &&
+                                            rIdx !== r.farmWorkArrangeList.length - 1,
+                                    },
+                                    // 按单张农事展示日期置灰:晚于今天为 future-card;无日期时回退物候期规则
+                                    { 'future-card': shouldGrayFarmWorkCard(fw, p) },
+                                ]" @click="handleRowClick(fw)">
+                                <div class="card-content">
+                                    <div class="card-left"
+                                        @click.stop="handleStatusDetail(fw)"
+                                        :style="{ width: fw.sourceDataJson && fw.sourceDataJson.resFilename ? 'calc(100% - 45px)' : '100%' }"
+                                        v-if="pageType === 'agri_plan'">
+                                        <div class="left-info">
+                                            <div class="left-date">{{ formatDate(fw.createTime) }}</div>
+                                            <div class="status-tag">{{ archiveTypeObj[fw.archiveType] }}</div>
+                                            <div class="text">
+                                                <span class="van-ellipsis">{{ fw.title }}</span>
+                                            </div>
+                                        </div>
+                                        <div class="title-text van-ellipsis">{{ fw.description }}</div>
+                                        <!-- <div class="title-text van-ellipsis"
+                                            v-if="!shouldGrayFarmWorkCard(fw, p) && fw.sourceType != 4">{{ fw.content }}
+                                        </div>
+                                        <div v-else class="title-text van-ellipsis">点击查看区域</div> -->
+                                    </div>
+                                    <div class="card-left agri-record-card" v-else>
+                                        <div class="left-info">
+                                            <div class="left-date">{{ formatDate(fw.recommendDate) }}</div>
+                                            <div class="text van-ellipsis" @click.stop="handleStatusDetail(fw)">
+                                                <span class="text-name">{{ fw.farmWorkName }}</span>
+                                                <el-icon class="text-icon">
+                                                    <ArrowRight />
+                                                </el-icon>
+                                            </div>
+                                        </div>
+                                        <div class="title-wrap van-ellipsis"
+                                            v-if="fw.flowStatus != null && fw.flowStatus != 0 && fw.flowStatus != -2">
+                                            <div class="title-text">{{ handleTagType(fw.flowStatus,
+                                                fw.executeEvidenceAuditStatus) }}</div>
+                                        </div>
+                                    </div>
+                                    <div class="card-right"
+                                        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?.sourceDataJson?.imageIds?.length ||
+                                                fw?.sourceDataJson?.executeImageUrls?.length || 0 }}
+                                        </div>
+                                    </div>
+                                    <div class="status-right" v-if="fw.archiveType === 2">待校准</div>
+                                </div>
+                            </div>
+                        </div>
+                        <template v-if="showPhenologyName">
+                            <template v-if="r.name === p.phenologyName">
+                                <template v-if="!shouldShowPhenologyBarTitle(idx)">
+                                    <div class="phenology-name" :class="{
+                                        single: showPhenologyName && !phenologyNeedsTwoLabelColumns(p),
+                                        'phenology-red': !shouldShowBlueLeft(p, r),
+                                        'text-blue': shouldShowBlueLeft(p, r),
+                                    }"
+                                        :style="p.phenologyName === getNextPhenologyName(idx, rIdx) ? 'padding: 6px 0;' : ''">
+                                        {{ p.phenologyName }}
+                                    </div>
+                                </template>
+                            </template>
+                            <template v-else>
+                                <template v-if="p.phenologyName === getNextPhenologyName(idx, rIdx)">
+                                    <div class="phenology-name"
+                                        :class="{ 'text-red': !shouldShowBlueLeft(p, r), 'text-blue': shouldShowBlueLeft(p, r) }">
+                                        {{ r.name }}
+                                    </div>
+                                </template>
+                                <template v-else>
+                                    <div class="phenology-name"
+                                        :class="{ 'text-red': !shouldShowBlueLeft(p, r), 'text-blue': shouldShowBlueLeft(p, r) }">
+                                        {{ r.name }}
+                                    </div>
+                                    <div class="phenology-name mr" :class="{
+                                        'phenology-red': !shouldShowBlueLeft(p, r),
+                                        'phenology-blue': shouldShowBlueLeft(p, r),
+                                    }">
+                                        {{ p.phenologyName }}
+                                    </div>
+                                </template>
+                            </template>
+                        </template>
+                    </div>
+                </div>
+            </template>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { ref, nextTick, watch, onMounted, onUnmounted, onActivated, onDeactivated, computed } from "vue";
+import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router";
+import { ElMessage } from "element-plus";
+import { Empty, showImagePreview } from "vant";
+import { base_img_url2 } from "@/api/config";
+
+const router = useRouter();
+const route = useRoute();
+
+const props = defineProps({
+    // 农场 ID,用于请求农事规划数据
+    farmId: {
+        type: [String, Number],
+        default: null,
+    },
+    // 年份
+    year: {
+        type: [Number, String],
+        default: new Date().getFullYear(),
+    },
+    // 是否是标准农事
+    isStandard: {
+        type: Boolean,
+        default: false,
+    },
+    // 方案ID
+    schemeId: {
+        type: [Number, String],
+        default: null,
+    },
+    // 类型:agri_record / agri_plan
+    pageType: {
+        type: String,
+        default: "agri_plan",
+    },
+    // 区域ID
+    regionId: {
+        type: [Number, String],
+        default: null,
+    },
+    // 容器ID
+    containerId: {
+        type: [Number, String],
+        default: null,
+    },
+    // 类型ID
+    typeId: {
+        type: [Number, String],
+        default: null,
+    },
+    // 问题分区ID
+    problemZoneId: {
+        type: [Number, String],
+        default: null,
+    },
+});
+
+const emits = defineEmits(["row-click", "card-click"]);
+
+const solarTerms = ref([]);
+const phenologyList = ref([]);
+// 从物候期列表中提取起始时间,用于时间轴显示
+const phenologyStartDates = computed(() => {
+    if (!phenologyList.value || phenologyList.value.length === 0) {
+        return [];
+    }
+    // 从每个物候期中提取起始时间,并去重排序
+    const startDatesMap = new Map();
+    phenologyList.value.forEach((phenology) => {
+        if (phenology.startDate) {
+            const dateKey = phenology.startDate;
+            // 如果该日期还没有添加过,或者需要更新信息
+            if (!startDatesMap.has(dateKey)) {
+                startDatesMap.set(dateKey, {
+                    startDate: phenology.startDate,
+                    id: phenology.id || `phenology-${dateKey}`,
+                });
+            }
+        }
+    });
+    // 转换为数组并按时间排序
+    const result = Array.from(startDatesMap.values()).sort((a, b) => {
+        const timeA = safeParseDate(a.startDate);
+        const timeB = safeParseDate(b.startDate);
+        if (isNaN(timeA) || isNaN(timeB)) return 0;
+        return timeA - timeB;
+    });
+    return result;
+});
+const timelineContainerRef = ref(null);
+const timelineListRef = ref(null);
+const getTimelineScrollKey = () =>
+    `timelineScrollTop:${props.pageType}:${props.farmId ?? "none"}:${props.regionId ?? "none"}:${props.containerId ?? "none"}:${route.path}`;
+
+const saveTimelineScrollTop = () => {
+    if (!timelineContainerRef.value) return;
+    const scrollTop = timelineContainerRef.value.scrollTop || 0;
+    sessionStorage.setItem(getTimelineScrollKey(), scrollTop.toString());
+};
+
+const restoreTimelineScrollTop = () => {
+    if (!timelineContainerRef.value) return false;
+    const savedScrollTop = sessionStorage.getItem(getTimelineScrollKey());
+    if (savedScrollTop == null) return false;
+    const scrollTop = Number(savedScrollTop);
+    if (Number.isNaN(scrollTop)) return false;
+    const maxScrollTop = Math.max(
+        0,
+        (timelineContainerRef.value.scrollHeight || 0) - (timelineContainerRef.value.clientHeight || 0)
+    );
+    timelineContainerRef.value.scrollTop = Math.min(scrollTop, maxScrollTop);
+    return true;
+};
+const restoreTimelineScrollTopWithRetry = (retryCount = 4) => {
+    const restored = restoreTimelineScrollTop();
+    if (restored || retryCount <= 0) return restored;
+    setTimeout(() => {
+        restoreTimelineScrollTopWithRetry(retryCount - 1);
+    }, 60);
+    return false;
+};
+// 标记是否为首次加载
+const isInitialLoad = ref(true);
+// 存储timeline-list的实际渲染高度
+const timelineListHeight = ref(0);
+// 生成唯一的时间戳,用于确保key的唯一性
+const uniqueTimestamp = ref(Date.now());
+// ResizeObserver 实例,用于监听高度变化
+let resizeObserver = null;
+// 标记是否为空数据
+const isEmpty = ref(false);
+// 标记是否正在请求数据,防止重复请求
+const isRequesting = ref(false);
+// 记录上一次请求作用域,避免相同参数重复请求
+const lastRequestedFarmId = ref(null);
+
+const farmWorkPlanScopeKey = () =>
+    JSON.stringify([
+        props.pageType ?? null,
+        props.farmId ?? null,
+        props.regionId ?? null,
+        props.problemZoneId ?? null,
+        props.year ?? null,
+        props.containerId ?? null,
+    ]);
+
+const resetTimelineData = () => {
+    solarTerms.value = [];
+    phenologyList.value = [];
+};
+
+const setEmptyTimelineData = () => {
+    resetTimelineData();
+    isEmpty.value = true;
+};
+
+// 获取当前季节
+const getCurrentSeason = () => {
+    const month = new Date().getMonth() + 1; // 1-12
+    if (month >= 1 && month <= 5) {
+        return "spring"; // 春季:3-5月
+    } else if (month >= 6 && month <= 8) {
+        return "summer"; // 夏季:6-8月
+    } else if (month >= 9 && month <= 10) {
+        return "autumn"; // 秋季:9-10月
+    } else {
+        return "winter"; // 冬季:11-2月
+    }
+};
+
+// 安全解析时间到时间戳(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();
+    if (typeof val === "number") return val;
+    if (typeof val === "string") {
+        // 兼容 "YYYY-MM-DD HH:mm:ss" -> Safari
+        const s = val.replace(/-/g, "/").replace("T", " ");
+        const d = new Date(s);
+        return isNaN(d.getTime()) ? NaN : d.getTime();
+    }
+    return NaN;
+};
+
+const batchValidateData = ref({});
+const allTrue = ref(false);
+const invalidIds = ref([]);
+const invalidArr = ref([]);
+// 验证农事卡片药肥报价信息是否完整
+const batchValidatePesticideFertilizerQuotes = (ids, items) => {
+    if (props.isStandard) {
+        return;
+    }
+    VE_API.monitor
+        .batchValidatePesticideFertilizerQuotes({ ids, schemeId: props.schemeId })
+        .then(({ data, code }) => {
+            if (code === 0) {
+                batchValidateData.value = data || {};
+                allTrue.value = Object.values(data).every((value) => value === true);
+                invalidIds.value = Object.keys(data).filter((key) => data[key] !== true);
+
+                // 清空之前的arrangeIds
+                invalidArr.value = [];
+                // 遍历items,判断farmWorkId是否在invalidIds中,如果对应上了就把item.id push进去
+                items.forEach((item) => {
+                    // 判断item.farmWorkId是否在invalidIds数组中(需要转换为字符串进行比较)
+                    const farmWorkIdStr = String(item.farmWorkId);
+                    if (invalidIds.value.includes(farmWorkIdStr)) {
+                        invalidArr.value.push({
+                            arrangeId: item.id,
+                            farmWorkId: item.farmWorkId,
+                        });
+                    }
+                });
+            }
+        })
+        .catch(() => { });
+};
+
+// 获取图片 URL 列表
+const fetchImageUrls = async (params) => {
+    try {
+        const res = await VE_API.ali.getTreeImageList(params);
+        if (res.code === 0 && Array.isArray(res.data)) {
+            return res.data.map((item) => {
+                if (item.filename) {
+                    return {
+                        ...item,
+                        cloudFilename: item.filename, // 兼容组件
+                    };
+                }
+                return null;
+            }).filter(item => item !== null);
+        }
+        return [];
+    } catch (error) {
+        console.error("获取图片列表失败:", error);
+        return [];
+    }
+};
+
+// 与 albumCarouselItem.getPhotoSrc 一致:拼 CDN 前缀;无水印预览用 Vant ImagePreview
+const resolveFarmWorkImagePath = (photo) => {
+    if (photo == null) return "";
+    if (typeof photo === "string") return photo;
+    return photo.cloudFilename || photo.filename || "";
+};
+
+const buildFarmWorkPreviewUrls = (fw) => {
+    const sd = fw?.sourceDataJson;
+    if (!sd) return [];
+    const toFullUrl = (path) => {
+        if (!path) return "";
+        if (/^https?:\/\//i.test(path)) return path;
+        return base_img_url2 + path;
+    };
+    if (fw.sourceType === 7) {
+        const arr = sd.executeImageUrls || [];
+        return arr.map((p) => toFullUrl(resolveFarmWorkImagePath(p))).filter(Boolean);
+    }
+    const arr = sd.resFilename || [];
+    return arr.map((p) => toFullUrl(resolveFarmWorkImagePath(p))).filter(Boolean);
+};
+
+const handleImageClick = (fw) => {
+    const images = buildFarmWorkPreviewUrls(fw);
+    if (!images.length) return;
+    showImagePreview({
+        images,
+        startPosition: 0,
+        closeable: true,
+        showIndex: true,
+    });
+};
+
+// 顶部物候标题:相邻两段 phenologyName 相同时只显示一次(保留第一段)
+const shouldShowPhenologyBarTitle = (idx) => {
+    const list = phenologyList.value;
+    if (!list?.length || idx < 0 || idx >= list.length) return false;
+    if (idx === 0) return true;
+    return list[idx]?.phenologyName !== list[idx - 1]?.phenologyName;
+};
+
+// 是否存在与物候期不同的生育期行(需要左右两列竖条);否则物候条占满单列宽度即可
+const phenologyNeedsTwoLabelColumns = (p) => {
+    const list = Array.isArray(p?.reproductiveList) ? p.reproductiveList : [];
+    if (!list.length) return false;
+    return list.some((r) => r.name !== p.phenologyName);
+};
+
+// 获取下一个reproductive-item的phenologyName
+const getNextPhenologyName = (currentPhenologyIdx, currentReproductiveIdx) => {
+    const currentPhenology = phenologyList.value[currentPhenologyIdx];
+    if (!currentPhenology || !Array.isArray(currentPhenology.reproductiveList)) {
+        return null;
+    }
+
+    // 如果当前reproductive-item不是最后一个,获取同一个物候期的下一个
+    if (currentReproductiveIdx < currentPhenology.reproductiveList.length - 1) {
+        const nextReproductive = currentPhenology.reproductiveList[currentReproductiveIdx + 1];
+        return nextReproductive?.phenologyName || null;
+    }
+
+    // 如果当前reproductive-item是最后一个,获取下一个物候期的第一个reproductive-item
+    if (currentPhenologyIdx < phenologyList.value.length - 1) {
+        const nextPhenology = phenologyList.value[currentPhenologyIdx + 1];
+        if (
+            nextPhenology &&
+            Array.isArray(nextPhenology.reproductiveList) &&
+            nextPhenology.reproductiveList.length > 0
+        ) {
+            const firstReproductive = nextPhenology.reproductiveList[0];
+            return firstReproductive?.phenologyName || null;
+        }
+    }
+
+    return null;
+};
+
+// 计算物候期需要的实际高度(基于农事数量)
+const getPhenologyRequiredHeight = (item) => {
+    // 统计该物候期内的农事数量
+    let farmWorkCount = 0;
+
+    if (Array.isArray(item.reproductiveList)) {
+        item.reproductiveList.forEach((reproductive) => {
+            if (Array.isArray(reproductive.farmWorkArrangeList)) {
+                farmWorkCount += reproductive.farmWorkArrangeList.length;
+            }
+        });
+    }
+
+    // 如果没有农事,给一个最小高度
+    if (farmWorkCount === 0) {
+        return 50; // 最小50px
+    }
+
+    // 每个农事卡片的高度(根据实际内容,卡片高度可能因内容而异)
+    // 卡片包含:padding(8px*2) + header(约25px) + content margin(4px+2px) + content(约25-30px) = 约72-77px
+    // 考虑到内容可能换行,实际高度可能更高,设置为120px更安全,避免卡片重叠
+    const farmWorkCardHeight = 120; // 卡片高度估算,确保能容纳内容且不重叠
+    // 卡片之间的间距(与CSS中的gap保持一致)
+    const cardGap = 12;
+
+    // 计算总高度:卡片数量 * 卡片高度 + (卡片数量 - 1) * 间距
+    // 如果有多个卡片,需要加上它们之间的间距
+    const totalHeight = farmWorkCount * farmWorkCardHeight + (farmWorkCount > 1 ? (farmWorkCount - 1) * cardGap : 0);
+
+    // 返回精确的总高度,只保留最小高度限制,不添加额外余量
+    return Math.max(totalHeight, 50); // 最小50px,精确匹配农事卡片高度
+};
+
+// 计算所有物候期的累积位置和总高度
+const calculatePhenologyPositions = () => {
+    let currentTop = 10; // 起始位置,留出顶部间距
+    const positions = new Map();
+
+    // 按progress排序物候期,确保按时间顺序排列
+    const sortedPhenologyList = [...phenologyList.value].sort((a, b) => {
+        const aProgress = Math.min(Number(a?.progress) || 0, Number(a?.progress2) || 0);
+        const bProgress = Math.min(Number(b?.progress) || 0, Number(b?.progress2) || 0);
+        return aProgress - bProgress;
+    });
+
+    sortedPhenologyList.forEach((phenology) => {
+        const height = getPhenologyRequiredHeight(phenology);
+        // 使用与数据生成时相同的ID生成逻辑
+        const itemId =
+            phenology.id ?? phenology.phenologyId ?? phenology.name ?? `${phenology.progress}-${phenology.progress2}`;
+        positions.set(itemId, {
+            top: currentTop,
+            height: height,
+        });
+        currentTop += height; // 紧挨着下一个物候期,不留间距
+    });
+
+    return {
+        positions,
+        totalHeight: currentTop, // 总高度 = 最后一个物候期的底部位置,不添加额外间距
+    };
+};
+
+// 计算所有农事的总高度(基于物候期紧挨排列)
+const calculateTotalHeightByFarmWorks = () => {
+    const { totalHeight } = calculatePhenologyPositions();
+
+    // 如果有物候期数据,直接使用计算出的总高度
+    // totalHeight 已经包含了从 10 开始的起始位置和所有物候期的高度
+    if (totalHeight > 10) {
+        // 确保总高度至少能容纳所有物候期起始时间(每个至少50px)
+        const baseHeight = (phenologyStartDates.value?.length || 0) * 50;
+        // 返回物候期总高度和基础高度的较大值,确保物候期起始时间能正常显示
+        return Math.max(totalHeight, baseHeight);
+    }
+
+    // 如果没有物候期数据,返回基础高度
+    const baseHeight = (phenologyStartDates.value?.length || 0) * 50;
+    return baseHeight || 100; // 至少返回100px,避免为0
+};
+
+const getTermStyle = (t, index) => {
+    // 优先使用实际测量的timeline-list高度,如果没有测量到则使用计算值作为后备
+    const totalHeight = timelineListHeight.value > 0 ? timelineListHeight.value : calculateTotalHeightByFarmWorks();
+    // 获取物候期起始时间总数(使用新数组)
+    const termCount = phenologyStartDates.value?.length || 1;
+
+    // 等分高度:总高度 / 物候期起始时间数量
+    const termHeight = totalHeight / termCount;
+
+    // 计算top位置:索引 * 每个物候期起始时间的高度
+    const top = index * termHeight;
+
+    return {
+        position: "absolute",
+        top: `${top}px`,
+        left: 0,
+        width: "35px",
+        height: `${termHeight}px`, // 高度等分,使用实际测量的高度
+        display: "flex",
+        alignItems: "center",
+    };
+};
+
+// 点击季节 → 滚动到对应节气(立春/立夏/立秋/立冬)
+const handleSeasonClick = (seasonValue) => {
+    const mapping = {
+        spring: "立春",
+        summer: "立夏",
+        autumn: "立秋",
+        winter: "立冬",
+    };
+    const targetName = mapping[seasonValue];
+    if (!targetName) return;
+
+    // 查找对应的节气
+    const targetIndex = solarTerms.value.findIndex((t) => (t?.displayName || "") === targetName);
+    if (targetIndex === -1) return;
+
+    // 计算目标节气的top位置
+    const totalHeight = timelineListHeight.value > 0 ? timelineListHeight.value : calculateTotalHeightByFarmWorks();
+    const termCount = solarTerms.value?.length || 1;
+    const termHeight = totalHeight / termCount;
+    const targetTop = targetIndex * termHeight;
+
+    // 滚动到目标位置
+    const wrap = timelineContainerRef.value;
+    if (!wrap) return;
+    const viewH = wrap.clientHeight || 0;
+    const maxScroll = Math.max(0, wrap.scrollHeight - viewH);
+    // 将目标位置稍微靠上(使用 0.1 视口高度做偏移)
+    let scrollTop = Math.max(0, targetTop - viewH * 0.1);
+    if (scrollTop > maxScroll) scrollTop = maxScroll;
+    wrap.scrollTo({ top: scrollTop, behavior: "smooth" });
+};
+
+
+const archiveTypeObj = {
+    1: "管理信息",
+    2: "物候进程",
+    3: "物候进程",
+    4: "异常发现",
+    5: "气象风险",
+    6: "农事进度",
+};
+
+/**
+    MANAGEMENT_INFO(1, "管理信息"),
+    EXPECTED_PHENOLOGY_PROGRESS(2, "预计物候进程"),
+    PHENOLOGY_PROGRESS(3, "物候进程"),
+    ABNORMAL_DISCOVERY(4, "异常发现"),
+    WEATHER_RISK(5, "气象风险"),
+    FARM_WORK_PROGRESS(6, "农事进度");
+ * 农事状态样式映射
+ * @param fw 农事
+ * @returns 农事状态样式
+ */
+// 农事状态样式映射
+const getArrangeStatusClass = (fw) => {
+    const t = props.pageType === 'agri_record' ? fw?.flowStatus : fw?.archiveType;
+    if (props.pageType === 'agri_record') {
+        if (t == null || t == 0 || t == -2) return "status-default";
+        const status = getAuditStatusPriority(fw.executeEvidenceAuditStatus);
+        // 农事记录:内容仍用 status-warning 的红字/红标签,外边框与箭头改为灰色
+        if (t == -1) return "status-warning status-warning-agri-record";
+        if (t == 3 || status === 2 || status === 0) return "status-warning-bg";
+        if (t == 5) return "status-normal";
+        return "status-act";
+    } else {
+        if (t == 1) return "status-green-info";
+        if (t == 4 && fw.sourceDataJson?.abnormalType === '病虫') return "status-warning";
+        if (t == 4 && fw.sourceDataJson?.abnormalType !== '病虫') return "status-complete";
+        if (t == 5) return "status-orange";
+        if (t == 6) return "status-green-farm";
+        return "status-normal";
+    }
+};
+
+const handleRowClick = (item) => {
+    // 跳转前记录当前滚动位置
+    saveTimelineScrollTop();
+    emits("row-click", item);
+};
+
+// 获取农事规划数据
+const getFarmWorkPlan = () => {
+    resetTimelineData();
+    if (!props.farmId) return;
+    const scopeKey = farmWorkPlanScopeKey();
+    if (isRequesting.value || lastRequestedFarmId.value === scopeKey) return;
+    isRequesting.value = true;
+    lastRequestedFarmId.value = scopeKey;
+    // 更新时间戳,确保key变化,触发DOM重新渲染
+    uniqueTimestamp.value = Date.now();
+    // 重置测量高度,等待重新测量
+    timelineListHeight.value = 0;
+    // 重置空数据状态
+    isEmpty.value = false;
+    let savedScrollTop = 0;
+    if (!isInitialLoad.value && timelineContainerRef.value) {
+        savedScrollTop = timelineContainerRef.value.scrollTop || 0;
+    }
+
+    const apiFunc = props.pageType === "agri_record" ? VE_API.monitor.getFarmWorkPlan : VE_API.monitor.getArchivesList;
+
+    const params = {
+        farmId: props.farmId,
+        regionId: props.regionId,
+        problemZoneId: props.problemZoneId,
+        year: props.year,
+    };
+    if (props.pageType === "agri_record") {
+        params.containerId = props.containerId;
+    }
+
+    apiFunc(params)
+        .then(async ({ data, code }) => {
+            if (code === 0) {
+                const list = Array.isArray(data?.solarTermsList) ? data.solarTermsList : [];
+                const filtered = list
+                    .filter((t) => t && t.type === 1)
+                    .map((t) => ({
+                        id:
+                            t.id ??
+                            t.solarTermsId ??
+                            t.termId ??
+                            `${t.name || t.solarTermsName || t.termName || "term"}-${t.createDate || ""}`,
+                        displayName: t.name || t.solarTermsName || t.termName || "节气",
+                        createDate: t.createDate || null,
+                        progress: Number(t.progress) || 0,
+                    }));
+                solarTerms.value = filtered;
+                // 物候期数据
+                const processedPhenologyList = Array.isArray(data?.phenologyList)
+                    ? await Promise.all(
+                        data.phenologyList.map(async (it) => {
+                            const reproductiveList = Array.isArray(it.reproductiveList)
+                                ? await Promise.all(
+                                    it.reproductiveList.map(async (r) => {
+                                        const farmWorkArrangeList = Array.isArray(r.archiveList || r.interactionFarmWorkList)
+                                            ? await Promise.all(
+                                                (r.archiveList || r.interactionFarmWorkList).map(async (fw) => {
+                                                    const sourceDataJson = parseSourceDataSafe(fw.data);
+                                                    // 如果有 imageIds,获取图片 URL
+                                                    if (
+                                                        sourceDataJson &&
+                                                        sourceDataJson.imageIds &&
+                                                        Array.isArray(sourceDataJson.imageIds) &&
+                                                        sourceDataJson.imageIds.length > 0
+                                                    ) {
+                                                        const resFilenameList = await fetchImageUrls(
+                                                            {
+                                                                imageIds: sourceDataJson.imageIds,
+                                                                page: 1,
+                                                                limit: 100,
+                                                            }
+                                                        );
+                                                        sourceDataJson.resFilename = resFilenameList;
+                                                    }
+                                                    return {
+                                                        ...fw,
+                                                        phenologyName: r.phenologyName,
+                                                        sourceDataJson,
+                                                        containerSpaceTimeId: it.containerSpaceTimeId,
+                                                    };
+                                                })
+                                            )
+                                            : [];
+                                        return {
+                                            ...r,
+                                            farmWorkArrangeList,
+                                        };
+                                    })
+                                )
+                                : [];
+                            return {
+                                id: it.id ?? it.phenologyId ?? it.name ?? `${it.progress}-${it.progress2}`,
+                                progress: Number(it.progress) || 0, // 起点 %
+                                progress2: Number(it.progress2) || 0, // 终点 %
+                                phenologyName: it.phenologyName,
+                                startDate: it.startDate,
+                                startTimeMs: safeParseDate(
+                                    it.startDate || it.beginDate || it.startTime || it.start || it.start_at
+                                ),
+                                reproductiveList,
+                            };
+                        })
+                    )
+                    : [];
+                phenologyList.value = processedPhenologyList;
+                // 使用多次 nextTick 和 requestAnimationFrame 确保DOM完全渲染
+                nextTick(() => {
+                    requestAnimationFrame(() => {
+                        nextTick(() => {
+                            requestAnimationFrame(() => {
+                                // 测量timeline-list的实际渲染高度
+                                if (timelineListRef.value) {
+                                    const height =
+                                        timelineListRef.value.offsetHeight || timelineListRef.value.clientHeight;
+                                    if (height > 0) {
+                                        timelineListHeight.value = height;
+                                    }
+                                }
+
+                                const hasRestoredScrollTop = restoreTimelineScrollTopWithRetry();
+                                if (isInitialLoad.value) {
+                                    if (hasRestoredScrollTop) {
+                                        isInitialLoad.value = false;
+                                    } else {
+                                        // 如果测量失败,延迟一下再尝试滚动
+                                        setTimeout(() => {
+                                            if (timelineListRef.value) {
+                                                const height =
+                                                    timelineListRef.value.offsetHeight ||
+                                                    timelineListRef.value.clientHeight;
+                                                if (height > 0) {
+                                                    timelineListHeight.value = height;
+                                                }
+                                            }
+                                            if (!restoreTimelineScrollTopWithRetry()) {
+                                                const currentSeason = getCurrentSeason();
+                                                handleSeasonClick(currentSeason);
+                                            }
+                                            isInitialLoad.value = false;
+                                        }, 200);
+                                    }
+                                } else {
+                                    if (!hasRestoredScrollTop && timelineContainerRef.value && savedScrollTop > 0) {
+                                        timelineContainerRef.value.scrollTop = savedScrollTop;
+                                    }
+                                }
+                            });
+                        });
+                    });
+                });
+
+                const farmWorks = phenologyList.value.flatMap((phenology) =>
+                    (Array.isArray(phenology?.reproductiveList) ? phenology.reproductiveList : []).flatMap((reproductive) =>
+                        Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : []
+                    )
+                );
+                const quoteValidationFarmWorks = farmWorks.filter(
+                    (farmWork) => farmWork?.farmWorkId && farmWork?.isFollow !== 0
+                );
+                const farmWorkIds = quoteValidationFarmWorks.map((farmWork) => farmWork.farmWorkId);
+
+                // 调用验证方法,传入所有ids
+                if (farmWorkIds.length > 0) {
+                    batchValidatePesticideFertilizerQuotes(farmWorkIds, quoteValidationFarmWorks);
+                }
+
+                // 判断是否为空数据:没有节气或没有物候期数据
+                if (solarTerms.value.length === 0 || phenologyList.value.length === 0) {
+                    isEmpty.value = true;
+                } else {
+                    isEmpty.value = false;
+                }
+            } else {
+                // 接口返回错误码,显示暂无数据
+                setEmptyTimelineData();
+            }
+        })
+        .catch((error) => {
+            console.error("获取农事规划数据失败:", error);
+            ElMessage.error("获取农事规划数据失败");
+            // 接口报错,显示暂无数据
+            setEmptyTimelineData();
+        })
+        .finally(() => {
+            // 请求完成,重置请求标志
+            isRequesting.value = false;
+        });
+};
+
+const updateFarmWorkPlan = () => {
+    resetTimelineData();
+    isEmpty.value = false;
+    getFarmWorkPlan();
+};
+
+const showPhenologyName = computed(() => {
+    return !props.problemZoneId;
+});
+
+watch(
+    () => [props.farmId, props.regionId, props.year, props.problemZoneId, props.pageType, props.containerId],
+    (val, oldVal) => {
+        if (!props.farmId) return;
+        const changed =
+            !oldVal ||
+            val.some((item, index) => item !== oldVal[index]);
+        if (changed) {
+            lastRequestedFarmId.value = null;
+        }
+        isInitialLoad.value = true;
+        updateFarmWorkPlan();
+    },
+    { immediate: true }
+);
+
+const handleStatusDetail = (fw) => {
+    // 跳转前记录当前滚动位置
+    saveTimelineScrollTop();
+    emits('card-click');
+    console.log(fw);
+    if (props.pageType === 'agri_plan') {
+        if (fw?.archiveType === 2) {
+            // router.push(`/interaction_list?farmId=${farmIdData.value}&regionId=${popupData.value.regionId}&interactionTypeId=${popupData.value.interactionTypeId}`);
+        }else if(fw?.archiveType === 6){
+            router.push({
+                path: "/work_detail",
+                query: {
+                    miniJson: JSON.stringify({
+                        paramsPage: JSON.stringify({
+                            farmId: 98570,
+                            farmWorkLibId: '832268348690534411',
+                            recordId: "832268363366404096",
+                            reproductiveId: 149,
+                            typeId: props.typeId
+                        }),
+                    }),
+                },
+            });
+        }else{
+            router.push({
+                path: "/agricultural_detail",
+                query: {
+                    id: fw?.id,
+                    title: archiveTypeObj[fw?.archiveType],
+                    content: fw?.description,
+                },
+            });
+        }
+    } else {
+        router.push({
+            path: "/work_detail",
+            query: {
+                miniJson: JSON.stringify({
+                    paramsPage: JSON.stringify({
+                        farmId: props.farmId,
+                        farmWorkLibId: fw?.farmWorkLibId,
+                        recordId: fw?.farmWorkRecordId,
+                        reproductiveId: fw?.reproductiveId,
+                        typeId: props.typeId
+                    }),
+                }),
+            },
+        });
+    }
+};
+
+// 格式化日期为 MM-DD 格式
+const formatDate = (dateStr) => {
+    if (!dateStr) return "--";
+    const date = new Date(dateStr);
+    if (Number.isNaN(date.getTime())) return dateStr;
+    const m = `${date.getMonth() + 1}`.padStart(2, "0");
+    const d = `${date.getDate()}`.padStart(2, "0");
+    return `${m}-${d}`;
+};
+
+// 格式化日期为 YYYY-MM-DD 格式(用于接口调用)
+const formatDateForAPI = (dateStr) => {
+    if (!dateStr) return null;
+    const date = new Date(dateStr);
+    if (Number.isNaN(date.getTime())) return null;
+    const y = date.getFullYear();
+    const m = `${date.getMonth() + 1}`.padStart(2, "0");
+    const d = `${date.getDate()}`.padStart(2, "0");
+    return `${y}-${m}-${d}`;
+};
+
+// 获取下一个即将到来的节气(当前节气)的 progress
+const getNextTermProgress = () => {
+    if (!solarTerms.value || solarTerms.value.length === 0) return Infinity;
+
+    const now = new Date();
+    now.setHours(0, 0, 0, 0);
+
+    let nextTermProgress = Infinity;
+
+    // 找到当前日期之后的下一个节气(当前节气)
+    solarTerms.value.forEach((term) => {
+        const termDate = safeParseDate(term.createDate);
+        if (!isNaN(termDate)) {
+            const termDateObj = new Date(termDate);
+            termDateObj.setHours(0, 0, 0, 0);
+            // 找到大于等于当前日期的第一个节气
+            if (termDateObj >= now) {
+                const termProgress = Number(term.progress) || 0;
+                if (termProgress < nextTermProgress) {
+                    nextTermProgress = termProgress;
+                }
+            }
+        }
+    });
+
+    // 如果没有找到未来的节气,说明所有节气都已过,返回 Infinity(所有物候期都显示蓝色)
+    return nextTermProgress === Infinity ? Infinity : nextTermProgress;
+};
+
+// 根据物候期的 progress 判断它所属节气的 progress
+const getPhenologyTermProgress = (phenologyProgress) => {
+    if (!solarTerms.value || solarTerms.value.length === 0) return -1;
+
+    const progress = Number(phenologyProgress) || 0;
+
+    // 找到物候期所属的节气(progress 最接近且小于等于的节气)
+    let matchedTermProgress = -1;
+    solarTerms.value.forEach((term) => {
+        const termProgress = Number(term.progress) || 0;
+        if (progress >= termProgress && termProgress > matchedTermProgress) {
+            matchedTermProgress = termProgress;
+        }
+    });
+
+    // 如果物候期的 progress 小于所有节气,返回第一个节气的 progress
+    if (matchedTermProgress === -1 && solarTerms.value.length > 0) {
+        const firstTermProgress = Number(solarTerms.value[0].progress) || 0;
+        return firstTermProgress;
+    }
+
+    return matchedTermProgress;
+};
+
+const handleTagType = (tagType, executeEvidenceAuditStatus) => {
+    if (tagType == 0) return "待触发";
+    if (tagType == -1) return "已过期";
+    if (tagType == -2) return "已过期";
+    if (tagType == 3) {
+        const status = getAuditStatusPriority(executeEvidenceAuditStatus);
+        if (status === 2) {
+            return "审核失败";
+        }
+        return "待认证"
+    }
+    if (tagType == 5) {
+        const status = getAuditStatusPriority(executeEvidenceAuditStatus);
+        if (status === 2) {
+            return "审核失败";
+        }
+        if (status === 0) {
+            return "审核中";
+        }
+        return "已认证";
+    }
+    return "待触发"
+}
+
+// 审核状态优先级:2 > 0 > 1
+const getAuditStatusPriority = (auditStatusList) => {
+    if (!Array.isArray(auditStatusList) || !auditStatusList.length) return 1;
+    const normalized = auditStatusList.map((x) => Number(x)).filter((x) => [0, 1, 2].includes(x));
+    if (!normalized.length) return 1;
+    if (normalized.includes(0)) return 0;
+    if (normalized.includes(2)) return 2;
+    return 1;
+};
+
+// 右侧农事卡片展示用日期(与模板 left-date 一致:规划 createTime、记录 recommendDate)
+const getFarmWorkTimelineDateMs = (fw) => {
+    const primary = props.pageType === "agri_plan" ? fw?.createTime : fw?.recommendDate ?? fw?.createTime;
+    let ms = safeParseDate(primary);
+    if (Number.isNaN(ms) || ms <= 0) {
+        ms = safeParseDate(props.pageType === "agri_plan" ? fw?.recommendDate : fw?.createTime);
+    }
+    return ms;
+};
+
+const isFarmWorkDateOnOrBeforeToday = (ms) => {
+    if (Number.isNaN(ms) || ms <= 0) return false;
+    const today = new Date();
+    today.setHours(0, 0, 0, 0);
+    const d = new Date(ms);
+    d.setHours(0, 0, 0, 0);
+    return d.getTime() <= today.getTime();
+};
+
+// 单张卡片:有有效展示日期且晚于今天 → 未来农事,右侧应置灰(与 left-date 同一套字段)
+const isFarmWorkTimelineStrictlyFuture = (fw) => {
+    const ms = getFarmWorkTimelineDateMs(fw);
+    if (Number.isNaN(ms) || ms <= 0) return false;
+    return !isFarmWorkDateOnOrBeforeToday(ms);
+};
+
+// 右侧 arrange-card:未来日期置灰;解析不到日期时回退物候期节气/待认证规则(与旧版整段逻辑一致)
+// 无农事展示日期时的置灰回退:仅用节气/物候期 + 待认证(不含「任一行农事≤今天」),避免右侧卡片被外层标题连带误判
+const isPhenologyActiveWithoutFarmWorkDates = (phenology) =>
+    agriRecordHasPendingAuthInPhenology(phenology) || shouldShowBlueBase(phenology);
+
+const shouldGrayFarmWorkCard = (fw, phenology) => {
+    if (isFarmWorkTimelineStrictlyFuture(fw)) return true;
+    const ms = getFarmWorkTimelineDateMs(fw);
+    if (!Number.isNaN(ms) && ms > 0) {
+        return false;
+    }
+    return !isPhenologyActiveWithoutFarmWorkDates(phenology);
+};
+
+// 某一生育期行下是否存在「农事时间 ≤ 今天」的卡片(与右侧 left-date 字段一致)
+const reproductiveHasFarmWorkOnOrBeforeToday = (reproductive) => {
+    const fws = Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : [];
+    for (const fw of fws) {
+        if (isFarmWorkDateOnOrBeforeToday(getFarmWorkTimelineDateMs(fw))) {
+            return true;
+        }
+    }
+    return false;
+};
+
+// 物候期内是否至少有一行生育期因「农事≤今天」而高亮(用于最外层物候期标题与内层对齐)
+const phenologyHasFarmWorkOnOrBeforeToday = (phenology) => {
+    const reproductives = Array.isArray(phenology?.reproductiveList) ? phenology.reproductiveList : [];
+    return reproductives.some((r) => reproductiveHasFarmWorkOnOrBeforeToday(r));
+};
+
+// 该生育期下:存在农事且「凡有有效展示日期的卡片」全部严格晚于今天 → 左侧本行不因节气规则变蓝(与右侧 future-card 一致)
+const reproductiveAllDatedFarmWorksStrictlyFuture = (reproductive) => {
+    const fws = Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : [];
+    if (fws.length === 0) return false;
+    const dated = fws.filter((fw) => {
+        const ms = getFarmWorkTimelineDateMs(fw);
+        return !Number.isNaN(ms) && ms > 0;
+    });
+    if (dated.length === 0) return false;
+    return dated.every((fw) => isFarmWorkTimelineStrictlyFuture(fw));
+};
+
+// 物候期内:至少有一条农事带有效日期,且全部带有效日期的农事均为「严格未来」(无一 ≤ 今天)→ 最外层标题不因节气单独变蓝
+const phenologyAllDatedFarmWorksStrictlyFuture = (phenology) => {
+    const reproductives = Array.isArray(phenology?.reproductiveList) ? phenology.reproductiveList : [];
+    let anyDated = false;
+    for (const r of reproductives) {
+        const fws = Array.isArray(r?.farmWorkArrangeList) ? r.farmWorkArrangeList : [];
+        for (const fw of fws) {
+            const ms = getFarmWorkTimelineDateMs(fw);
+            if (Number.isNaN(ms) || ms <= 0) continue;
+            anyDated = true;
+            if (isFarmWorkDateOnOrBeforeToday(ms)) return false;
+        }
+    }
+    return anyDated;
+};
+
+// 仅农事记录页(agri_record):该物候期内存在待认证农事时,左侧最外层物候期与各生育期/物候期文案均高亮为蓝;农事规划(agri_plan)不生效
+const agriRecordHasPendingAuthInPhenology = (phenology) => {
+    if (props.pageType !== "agri_record") return false;
+    return (Array.isArray(phenology?.reproductiveList) ? phenology.reproductiveList : []).some((reproductive) =>
+        (Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : []).some((fw) => {
+            const s = fw?.flowStatus;
+            return s === 3 || s === "3";
+        })
+    );
+};
+
+// 单行生育期下是否有待认证农事(仅农事记录页)
+const reproductiveHasPendingAuthFarmWork = (reproductive) => {
+    if (props.pageType !== "agri_record") return false;
+    return (Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : []).some((fw) => {
+        const s = fw?.flowStatus;
+        return s === 3 || s === "3";
+    });
+};
+
+// 物候期底色/节气规则(不含「农事卡片日期」「待认证」扩展)
+const shouldShowBlueBase = (phenology) => {
+    // 优先使用物候期真实日期判断:未来日期不应显示蓝色
+    const phenologyTimeMs =
+        Number(phenology?.startTimeMs) ||
+        safeParseDate(phenology?.startDate || phenology?.beginDate || phenology?.startTime || phenology?.start || phenology?.start_at);
+    if (!Number.isNaN(phenologyTimeMs) && phenologyTimeMs > 0) {
+        const today = new Date();
+        today.setHours(0, 0, 0, 0);
+        return phenologyTimeMs <= today.getTime();
+    }
+
+    // 日期缺失时,回退到 progress 规则(兼容老数据)
+    // 获取下一个即将到来的节气(当前节气)的 progress
+    const nextTermProgress = getNextTermProgress();
+
+    // 如果所有节气都已过(nextTermProgress === Infinity),所有物候期都显示蓝色
+    if (nextTermProgress === Infinity) {
+        return true;
+    }
+
+    // 根据物候期的 progress 判断它属于哪个节气
+    const phenologyProgress = Math.min(Number(phenology?.progress) || 0, Number(phenology?.progress2) || 0);
+    const phenologyTermProgress = getPhenologyTermProgress(phenologyProgress);
+
+    // 找到下一个节气的完整信息,用于判断物候期是否属于当前节气
+    let nextTerm = null;
+    solarTerms.value.forEach((term) => {
+        const termProgress = Number(term.progress) || 0;
+        if (termProgress === nextTermProgress) {
+            nextTerm = term;
+        }
+    });
+
+    // 如果物候期所属的节气的 progress < 下一个节气的 progress,显示蓝色
+    // 如果物候期所属的节气的 progress === 下一个节气的 progress,也显示蓝色(当前节气)
+    // 也就是说,只有属于当前节气或之前节气的物候期才显示蓝色
+    if (phenologyTermProgress === -1) {
+        return false;
+    }
+
+    // 如果物候期正好属于下一个节气,需要判断它的 progress 是否在下一个节气的范围内
+    if (phenologyTermProgress === nextTermProgress && nextTerm) {
+        // 如果物候期的 progress 小于等于下一个节气的 progress,说明它属于当前节气,显示蓝色
+        return phenologyProgress <= nextTermProgress;
+    }
+
+    // 如果物候期所属的节气的 progress < 下一个节气的 progress,显示蓝色
+    return phenologyTermProgress < nextTermProgress;
+};
+
+// 最外层物候期标题:与内层生育期对齐——任一生育行因农事≤今天变蓝;农事记录下有待认证则整段标题也蓝;否则按节气规则(右侧卡片仍按单卡日期置灰)
+const shouldShowBlue = (phenology) => {
+    if (phenologyHasFarmWorkOnOrBeforeToday(phenology)) return true;
+    if (agriRecordHasPendingAuthInPhenology(phenology)) return true;
+    if (phenologyAllDatedFarmWorksStrictlyFuture(phenology)) return false;
+    return shouldShowBlueBase(phenology);
+};
+
+// 左侧生育期/物候期文案:
+// 1) 本行有农事<=今天:蓝;
+// 2) 本行全部有效日期农事均为未来且本行无待认证:灰(与右侧 future-card 一致);
+// 3) 农事记录下物候期内有待认证:蓝;
+// 4) 其余走节气/日期底色规则。
+const shouldShowBlueLeft = (phenology, reproductive) => {
+    if (reproductiveHasFarmWorkOnOrBeforeToday(reproductive)) return true;
+    if (reproductiveAllDatedFarmWorksStrictlyFuture(reproductive) && !reproductiveHasPendingAuthFarmWork(reproductive)) {
+        return false;
+    }
+    if (agriRecordHasPendingAuthInPhenology(phenology)) return true;
+    return shouldShowBlueBase(phenology);
+};
+
+defineExpose({
+    updateFarmWorkPlan,
+});
+
+// 使用 ResizeObserver 监听高度变化,确保在DOM完全渲染后获取准确高度
+const setupResizeObserver = () => {
+    if (!timelineListRef.value || typeof ResizeObserver === "undefined") {
+        return;
+    }
+
+    // 如果已经存在观察者,先断开
+    if (resizeObserver) {
+        resizeObserver.disconnect();
+    }
+
+    // 创建新的观察者
+    resizeObserver = new ResizeObserver((entries) => {
+        for (const entry of entries) {
+            const height = entry.contentRect.height;
+            if (height > 0 && height !== timelineListHeight.value) {
+                timelineListHeight.value = height;
+            }
+        }
+    });
+
+    // 开始观察
+    resizeObserver.observe(timelineListRef.value);
+};
+
+// 组件挂载后设置 ResizeObserver
+onMounted(() => {
+    nextTick(() => {
+        requestAnimationFrame(() => {
+            setupResizeObserver();
+            restoreTimelineScrollTopWithRetry();
+        });
+    });
+});
+
+// 组件卸载前清理 ResizeObserver
+onUnmounted(() => {
+    saveTimelineScrollTop();
+    if (resizeObserver) {
+        resizeObserver.disconnect();
+        resizeObserver = null;
+    }
+});
+
+onActivated(() => {
+    nextTick(() => {
+        requestAnimationFrame(() => {
+            restoreTimelineScrollTopWithRetry();
+        });
+    });
+});
+
+onDeactivated(() => {
+    saveTimelineScrollTop();
+});
+
+onBeforeRouteLeave(() => {
+    saveTimelineScrollTop();
+});
+
+// 在数据更新后重新设置 ResizeObserver
+watch(
+    () => phenologyList.value.length,
+    () => {
+        nextTick(() => {
+            requestAnimationFrame(() => {
+                setupResizeObserver();
+            });
+        });
+    }
+);
+</script>
+
+<style scoped lang="scss">
+@mixin arrange-card-status($color, $title-color: null, $title-bg: null, $text-color: null) {
+    border-color: $color;
+
+    .card-content {
+        @if $text-color !=null {
+            color: $text-color;
+        }
+    }
+
+    .card-left {
+        .left-info {
+            .left-date {
+                color: $color;
+                border-color: $color;
+            }
+            .status-tag {
+                background: $color;
+            }
+        }
+
+        .title-text {
+            @if $title-color !=null {
+                color: $title-color;
+            }
+
+            @if $title-bg !=null {
+                background: $title-bg;
+            }
+        }
+    }
+
+    &::before {
+        border-right-color: $color;
+    }
+}
+
+.timeline-container {
+    height: 100%;
+    overflow: auto;
+    position: relative;
+    box-sizing: border-box;
+
+    .timeline-list {
+        position: relative;
+    }
+
+    .timeline-middle-line {
+        position: absolute;
+        left: 13px;
+        /* 位于节气文字列中间(列宽约30px) */
+        top: 0;
+        bottom: 0;
+        width: 2px;
+        background: #e8e8e8;
+        z-index: 1;
+    }
+
+    .phenology-bar {
+        align-items: stretch;
+        justify-content: center;
+        box-sizing: border-box;
+        position: relative;
+
+        .phenology-title {
+            width: 18px;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            height: auto;
+            color: #fff;
+            font-size: 12px;
+            position: absolute;
+            z-index: 10;
+            text-align: center;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            writing-mode: vertical-rl;
+            text-orientation: upright;
+            letter-spacing: 3px;
+            word-break: break-all;
+
+            &.phenology-blue {
+                background: #2199f8;
+            }
+
+            &.phenology-red {
+                background: #f1f1f1;
+                color: #808080;
+            }
+
+            &.phenology-title--wide {
+                width: 39px;
+            }
+        }
+
+        .reproductive-item {
+            font-size: 12px;
+            text-align: center;
+            word-break: break-all;
+            writing-mode: vertical-rl;
+            text-orientation: upright;
+            letter-spacing: 3px;
+            width: 100%;
+            line-height: 23px;
+            color: inherit;
+            position: relative;
+
+            .phenology-name {
+                width: 18px;
+                line-height: 16px;
+                height: 100%;
+                color: #fff;
+                padding: 4px 0;
+                font-size: 12px;
+                box-sizing: border-box;
+                writing-mode: vertical-rl;
+                text-orientation: upright;
+
+                &.mr {
+                    margin-right: 3px;
+                }
+
+                &.single {
+                    width: 39px;
+                    line-height: 39px;
+
+                    &.text-blue,
+                    &.text-red {
+                        line-height: 16px;
+                    }
+                }
+
+                &.phenology-blue {
+                    background: #2199f8;
+                }
+
+                &.phenology-red {
+                    background: #f1f1f1;
+                    color: #808080;
+                }
+
+                &.text-blue {
+                    background: rgba(33, 153, 248, 0.15);
+                    color: #2199f8;
+                    border: 1px solid #2199f8;
+                    line-height: 16px;
+                    box-sizing: border-box;
+                }
+
+                &.text-red {
+                    background: rgba(128, 128, 128, 0.15);
+                    color: #808080;
+                    border: 1px solid rgba(128, 128, 128, 0.35);
+                    line-height: 16px;
+                    box-sizing: border-box;
+                }
+            }
+
+            .arranges {
+                display: flex;
+                max-width: calc(100vw - 88px);
+                min-width: calc(100vw - 83px);
+                gap: 5px;
+                letter-spacing: 0px;
+
+                &.arranges-min {
+                    max-width: calc(100vw - 58px);
+                }
+
+                // min-height: 90px;
+                .arrange-card {
+                    width: 95%;
+                    border: 0.5px solid #2199f8;
+                    border-radius: 8px;
+                    background: #fff;
+                    box-sizing: border-box;
+                    position: relative;
+                    padding: 8px 15px 8px 10px;
+                    writing-mode: horizontal-tb;
+                    margin-bottom: 10px;
+
+                    // &.last-card {
+                    //     margin-bottom: 0;
+                    // }
+                    .card-content {
+                        color: #242424;
+                        display: flex;
+                        justify-content: space-between;
+                        align-items: center;
+                        font-size: 14px;
+
+                        .card-left {
+                            width: calc(100% - 45px);
+
+                            .left-info {
+                                display: flex;
+                                align-items: center;
+                                gap: 6px;
+
+                                .left-date {
+                                    color: #2199f8;
+                                    border: 1px solid #2199f8;
+                                    border-radius: 2px;
+                                    font-size: 12px;
+                                    width: 36px;
+                                    height: 20px;
+                                    line-height: 20px;
+                                }
+
+                                .status-tag {
+                                    font-size: 12px;
+                                    background: #47B881;
+                                    color: #fff;
+                                    width: 63px;
+                                    border-radius: 2px;
+                                }
+
+                                .text {
+                                    display: flex;
+                                    align-items: center;
+                                    gap: 2px;
+                                    width: calc(100% - 115px);
+                                }
+                            }
+
+                            .title-text {
+                                margin-top: 5px;
+                                width: fit-content;
+                                max-width: 100%;
+                                text-align: left;
+                                color: #2199F8;
+                                padding: 0 6px;
+                                border-radius: 2px;
+                                font-size: 12px;
+                                box-sizing: border-box;
+                                background: rgba(33, 153, 248, 0.1);
+                            }
+
+                            &.agri-record-card {
+                                .text{
+                                    width: 100%;
+                                }
+                                .title-wrap {
+                                    display: flex;
+                                    align-items: flex-end;
+                                    gap: 6px;
+
+                                    .expert-info {
+                                        display: flex;
+                                        align-items: center;
+                                        gap: 2px;
+                                        font-size: 12px;
+                                        color: #B7B7B7;
+                                    }
+
+                                    .blue-tag {
+                                        color: #2199F8;
+                                        background: rgba(33, 153, 248, 0.1);
+                                    }
+                                }
+                            }
+                        }
+
+                        .card-right {
+                            display: flex;
+                            align-items: center;
+                            position: relative;
+
+                            img {
+                                width: 45px;
+                                height: 45px;
+                                border-radius: 4px;
+                                object-fit: cover;
+                            }
+
+                            .num {
+                                position: absolute;
+                                width: 18px;
+                                height: 18px;
+                                box-sizing: border-box;
+                                top: -4px;
+                                right: -6px;
+                                background: #BFBFBF;
+                                color: #fff;
+                                font-size: 12px;
+                                border-radius: 50%;
+                                display: flex;
+                                align-items: center;
+                                justify-content: center;
+                            }
+                        }
+
+                        .status-right {
+                            position: absolute;
+                            right: 0;
+                            top: 0;
+                            font-size: 12px;
+                            color: #fff;
+                            background: #2199F8;
+                            border-radius: 2px;
+                            padding: 0 5px;
+                        }
+                    }
+
+                    &::before {
+                        content: "";
+                        position: absolute;
+                        left: -5px;
+                        top: 50%;
+                        transform: translateY(-50%);
+                        width: 0;
+                        height: 0;
+                        border-top: 5px solid transparent;
+                        border-bottom: 5px solid transparent;
+                        border-right: 5px solid #2199f8;
+                    }
+                }
+
+                .arrange-card.normal-style {
+                    opacity: 0.3;
+                }
+
+                // .arrange-card.status-normal {
+                //     border-color: #2199f8;
+
+                //     &::before {
+                //         border-right-color: #2199f8;
+                //     }
+                // }
+
+                .arrange-card.status-normal {
+                    @include arrange-card-status(#2199f8, #2199f8, rgba(33, 153, 248, 0.1));
+                }
+
+                .arrange-card.status-warning {
+                    @include arrange-card-status(#FF4E4E, #FF4E4E, rgba(255, 78, 78, 0.1));
+                }
+
+                .arrange-card.status-warning.status-warning-agri-record {
+                    border-color: #bbbbbb;
+
+                    .card-left {
+                        .left-info {
+                            .left-date {
+                                color: #bbbbbb;
+                                border-color: #bbbbbb;
+                            }
+                        }
+
+                        .text-name,
+                        .text-icon {
+                            color: #bbbbbb;
+                        }
+                    }
+
+                    &::before {
+                        border-right-color: #bbbbbb;
+                    }
+                }
+
+                .arrange-card.status-complete {
+                    @include arrange-card-status(#FF943D, #FF943D, rgba(255, 149, 61, 0.1));
+                }
+
+                .arrange-card.status-green-info {
+                    @include arrange-card-status(#47B881, #fff, rgba(71, 184, 129, 0.1));
+                }
+
+                .arrange-card.status-orange {
+                    @include arrange-card-status(#FFB129, #FFB129, rgba(253, 181, 55, 0.1));
+                }
+
+                .arrange-card.status-green-farm {
+                    @include arrange-card-status(#5BB349, #5BB349, rgba(91, 179, 73, 0.1));
+                }
+
+                .arrange-card.status-act {
+                    @include arrange-card-status(#FF953D, #fff, #FF953D);
+                }
+
+                .arrange-card.status-default {
+                    @include arrange-card-status(#BBBBBB, #fff, #BBBBBB);
+
+                    .card-left {
+                        .left-info {
+
+                            .text-name,
+                            .text-icon {
+                                color: #BBBBBB;
+                            }
+                        }
+                    }
+                }
+
+                // 未来节气对应的农事卡片:跟随左侧物候期的“未开始”灰色样式
+                .arrange-card.future-card {
+                    @include arrange-card-status(#e4e4e4, null, null, rgba(36, 36, 36, 0.5));
+
+                    .card-left {
+                        .left-info {
+                            .left-date {
+                                color: #CACACA;
+                            }
+                        }
+                    }
+                }
+
+                .arrange-card.status-warning-bg {
+                    @include arrange-card-status(#FF943D, #fff, #FF943D, #000);
+                }
+            }
+        }
+    }
+
+    .reproductive-item+.reproductive-item {
+        margin-top: 4px;
+        padding-top: 0;
+    }
+
+    .phenology-bar+.phenology-bar {
+        margin-top: 4px;
+        padding-top: 0;
+    }
+
+    .timeline-term {
+        position: absolute;
+        width: 34px;
+        display: flex;
+        align-items: flex-start;
+        flex-direction: column;
+        z-index: 2;
+        /* 置于中线之上 */
+        color: rgba(174, 174, 174, 0.6);
+
+        .term-name {
+            display: inline-block;
+            width: 100%;
+            min-height: 20px;
+            line-height: 26px;
+            background: #fff;
+            font-size: 12px;
+        }
+    }
+
+    .empty-state {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        min-height: 200px;
+        width: 100%;
+    }
+}
+</style>

+ 101 - 574
src/components/pageComponents/ArchivesFarmTimeLine.vue

@@ -4,15 +4,9 @@
             <empty v-if="isEmpty" image="https://birdseye-img.sysuimars.com/birdseye-look-mini/custom-empty-image.png"
                 image-size="80" description="暂无数据" class="empty-state" />
             <template v-else>
-                <!-- <div class="timeline-middle-line"></div>
-                <div v-for="(t, tIdx) in phenologyStartDates" :key="`term-${uniqueTimestamp}-${tIdx}`"
-                    class="timeline-term" :style="getTermStyle(t, tIdx)">
-                    <span class="term-name">{{ formatDate(t.startDate) }}</span>
-                </div> -->
                 <div v-for="(p, idx) in phenologyList" :key="`phenology-${uniqueTimestamp}-${idx}`"
                     class="phenology-bar">
                     <div class="phenology-title" :class="{
-                        'phenology-title--wide': showPhenologyName && !phenologyNeedsTwoLabelColumns(p),
                         'phenology-red': !shouldShowBlue(p),
                         'phenology-blue': shouldShowBlue(p),
                     }" v-if="shouldShowPhenologyBarTitle(idx)">
@@ -20,7 +14,7 @@
                     </div>
                     <div v-for="(r, rIdx) in Array.isArray(p.reproductiveList) ? p.reproductiveList : []"
                         :key="`reproductive-${uniqueTimestamp}-${idx}-${rIdx}`" class="reproductive-item">
-                        <div class="arranges" :class="{ 'arranges-min': !showPhenologyName }">
+                        <div class="arranges">
                             <div v-for="(fw, aIdx) in Array.isArray(r.farmWorkArrangeList) ? r.farmWorkArrangeList : []"
                                 :key="`arrange-${uniqueTimestamp}-${idx}-${rIdx}-${aIdx}`" class="arrange-card" :class="[
                                     getArrangeStatusClass(fw),
@@ -33,88 +27,34 @@
                                     { 'future-card': shouldGrayFarmWorkCard(fw, p) },
                                 ]" @click="handleRowClick(fw)">
                                 <div class="card-content">
-                                    <div class="card-left"
-                                        @click.stop="handleStatusDetail(fw)"
-                                        :style="{ width: fw.sourceDataJson && fw.sourceDataJson.resFilename ? 'calc(100% - 45px)' : '100%' }"
-                                        v-if="pageType === 'agri_plan'">
+                                    <div class="card-left" @click.stop="handleStatusDetail(fw)" style="width: 100%">
                                         <div class="left-info">
                                             <div class="left-date">{{ formatDate(fw.createTime) }}</div>
-                                            <div class="status-tag">{{ archiveTypeObj[fw.archiveType] }}</div>
                                             <div class="text">
                                                 <span class="van-ellipsis">{{ fw.title }}</span>
+                                                <el-icon><ArrowRight /></el-icon>
                                             </div>
                                         </div>
-                                        <div class="title-text van-ellipsis">{{ fw.description }}</div>
-                                        <!-- <div class="title-text van-ellipsis"
-                                            v-if="!shouldGrayFarmWorkCard(fw, p) && fw.sourceType != 4">{{ fw.content }}
-                                        </div>
-                                        <div v-else class="title-text van-ellipsis">点击查看区域</div> -->
-                                    </div>
-                                    <div class="card-left agri-record-card" v-else>
-                                        <div class="left-info">
-                                            <div class="left-date">{{ formatDate(fw.recommendDate) }}</div>
-                                            <div class="text van-ellipsis" @click.stop="handleStatusDetail(fw)">
-                                                <span class="text-name">{{ fw.farmWorkName }}</span>
-                                                <el-icon class="text-icon">
-                                                    <ArrowRight />
-                                                </el-icon>
+                                        <div class="farm-info" v-if="fw.archiveType === 5">
+                                            <div class="info-left">
+                                                <div>04/18 出现某某胁迫几级</div>
+                                                <div>04/20 出现某某胁迫等级升级</div>
                                             </div>
+                                            <div class="info-right">病虫害是否出现?</div>
                                         </div>
-                                        <div class="title-wrap van-ellipsis"
-                                            v-if="fw.flowStatus != null && fw.flowStatus != 0 && fw.flowStatus != -2">
-                                            <div class="title-text">{{ handleTagType(fw.flowStatus,
-                                                fw.executeEvidenceAuditStatus) }}</div>
-                                        </div>
-                                    </div>
-                                    <div class="card-right"
-                                        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?.sourceDataJson?.imageIds?.length ||
-                                                fw?.sourceDataJson?.executeImageUrls?.length || 0 }}
-                                        </div>
+                                        <div class="title-text van-ellipsis">{{ fw.description }}</div>
                                     </div>
-                                    <div class="status-right" v-if="fw.archiveType === 2">待校准</div>
+                                    <div class="status-right" v-if="fw.archiveType === 2">待执行</div>
                                 </div>
                             </div>
                         </div>
-                        <template v-if="showPhenologyName">
-                            <template v-if="r.name === p.phenologyName">
-                                <template v-if="!shouldShowPhenologyBarTitle(idx)">
-                                    <div class="phenology-name" :class="{
-                                        single: showPhenologyName && !phenologyNeedsTwoLabelColumns(p),
-                                        'phenology-red': !shouldShowBlueLeft(p, r),
-                                        'text-blue': shouldShowBlueLeft(p, r),
-                                    }"
-                                        :style="p.phenologyName === getNextPhenologyName(idx, rIdx) ? 'padding: 6px 0;' : ''">
-                                        {{ p.phenologyName }}
-                                    </div>
-                                </template>
-                            </template>
-                            <template v-else>
-                                <template v-if="p.phenologyName === getNextPhenologyName(idx, rIdx)">
-                                    <div class="phenology-name"
-                                        :class="{ 'text-red': !shouldShowBlueLeft(p, r), 'text-blue': shouldShowBlueLeft(p, r) }">
-                                        {{ r.name }}
-                                    </div>
-                                </template>
-                                <template v-else>
-                                    <div class="phenology-name"
-                                        :class="{ 'text-red': !shouldShowBlueLeft(p, r), 'text-blue': shouldShowBlueLeft(p, r) }">
-                                        {{ r.name }}
-                                    </div>
-                                    <div class="phenology-name mr" :class="{
-                                        'phenology-red': !shouldShowBlueLeft(p, r),
-                                        'phenology-blue': shouldShowBlueLeft(p, r),
-                                    }">
-                                        {{ p.phenologyName }}
-                                    </div>
-                                </template>
-                            </template>
+                        <template v-if="!shouldShowPhenologyBarTitle(idx)">
+                            <div class="phenology-name" :class="{
+                                'phenology-red': !shouldShowBlueLeft(p, r),
+                                'text-blue': shouldShowBlueLeft(p, r),
+                            }">
+                                {{ p.phenologyName }}
+                            </div>
                         </template>
                     </div>
                 </div>
@@ -127,8 +67,7 @@
 import { ref, nextTick, watch, onMounted, onUnmounted, onActivated, onDeactivated, computed } from "vue";
 import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router";
 import { ElMessage } from "element-plus";
-import { Empty, showImagePreview } from "vant";
-import { base_img_url2 } from "@/api/config";
+import { Empty } from "vant";
 
 const router = useRouter();
 const route = useRoute();
@@ -144,41 +83,16 @@ const props = defineProps({
         type: [Number, String],
         default: new Date().getFullYear(),
     },
-    // 是否是标准农事
-    isStandard: {
-        type: Boolean,
-        default: false,
-    },
-    // 方案ID
-    schemeId: {
-        type: [Number, String],
-        default: null,
-    },
-    // 类型:agri_record / agri_plan
-    pageType: {
-        type: String,
-        default: "agri_plan",
-    },
     // 区域ID
     regionId: {
         type: [Number, String],
         default: null,
     },
-    // 容器ID
-    containerId: {
-        type: [Number, String],
-        default: null,
-    },
     // 类型ID
     typeId: {
         type: [Number, String],
         default: null,
     },
-    // 问题分区ID
-    problemZoneId: {
-        type: [Number, String],
-        default: null,
-    },
 });
 
 const emits = defineEmits(["row-click", "card-click"]);
@@ -216,7 +130,7 @@ const phenologyStartDates = computed(() => {
 const timelineContainerRef = ref(null);
 const timelineListRef = ref(null);
 const getTimelineScrollKey = () =>
-    `timelineScrollTop:${props.pageType}:${props.farmId ?? "none"}:${props.regionId ?? "none"}:${props.containerId ?? "none"}:${route.path}`;
+    `timelineScrollTop:${props.farmId ?? "none"}:${props.regionId ?? "none"}:${route.path}`;
 
 const saveTimelineScrollTop = () => {
     if (!timelineContainerRef.value) return;
@@ -262,12 +176,9 @@ const lastRequestedFarmId = ref(null);
 
 const farmWorkPlanScopeKey = () =>
     JSON.stringify([
-        props.pageType ?? null,
         props.farmId ?? null,
         props.regionId ?? null,
-        props.problemZoneId ?? null,
         props.year ?? null,
-        props.containerId ?? null,
     ]);
 
 const resetTimelineData = () => {
@@ -325,97 +236,6 @@ const safeParseDate = (val) => {
     return NaN;
 };
 
-const batchValidateData = ref({});
-const allTrue = ref(false);
-const invalidIds = ref([]);
-const invalidArr = ref([]);
-// 验证农事卡片药肥报价信息是否完整
-const batchValidatePesticideFertilizerQuotes = (ids, items) => {
-    if (props.isStandard) {
-        return;
-    }
-    VE_API.monitor
-        .batchValidatePesticideFertilizerQuotes({ ids, schemeId: props.schemeId })
-        .then(({ data, code }) => {
-            if (code === 0) {
-                batchValidateData.value = data || {};
-                allTrue.value = Object.values(data).every((value) => value === true);
-                invalidIds.value = Object.keys(data).filter((key) => data[key] !== true);
-
-                // 清空之前的arrangeIds
-                invalidArr.value = [];
-                // 遍历items,判断farmWorkId是否在invalidIds中,如果对应上了就把item.id push进去
-                items.forEach((item) => {
-                    // 判断item.farmWorkId是否在invalidIds数组中(需要转换为字符串进行比较)
-                    const farmWorkIdStr = String(item.farmWorkId);
-                    if (invalidIds.value.includes(farmWorkIdStr)) {
-                        invalidArr.value.push({
-                            arrangeId: item.id,
-                            farmWorkId: item.farmWorkId,
-                        });
-                    }
-                });
-            }
-        })
-        .catch(() => { });
-};
-
-// 获取图片 URL 列表
-const fetchImageUrls = async (params) => {
-    try {
-        const res = await VE_API.ali.getTreeImageList(params);
-        if (res.code === 0 && Array.isArray(res.data)) {
-            return res.data.map((item) => {
-                if (item.filename) {
-                    return {
-                        ...item,
-                        cloudFilename: item.filename, // 兼容组件
-                    };
-                }
-                return null;
-            }).filter(item => item !== null);
-        }
-        return [];
-    } catch (error) {
-        console.error("获取图片列表失败:", error);
-        return [];
-    }
-};
-
-// 与 albumCarouselItem.getPhotoSrc 一致:拼 CDN 前缀;无水印预览用 Vant ImagePreview
-const resolveFarmWorkImagePath = (photo) => {
-    if (photo == null) return "";
-    if (typeof photo === "string") return photo;
-    return photo.cloudFilename || photo.filename || "";
-};
-
-const buildFarmWorkPreviewUrls = (fw) => {
-    const sd = fw?.sourceDataJson;
-    if (!sd) return [];
-    const toFullUrl = (path) => {
-        if (!path) return "";
-        if (/^https?:\/\//i.test(path)) return path;
-        return base_img_url2 + path;
-    };
-    if (fw.sourceType === 7) {
-        const arr = sd.executeImageUrls || [];
-        return arr.map((p) => toFullUrl(resolveFarmWorkImagePath(p))).filter(Boolean);
-    }
-    const arr = sd.resFilename || [];
-    return arr.map((p) => toFullUrl(resolveFarmWorkImagePath(p))).filter(Boolean);
-};
-
-const handleImageClick = (fw) => {
-    const images = buildFarmWorkPreviewUrls(fw);
-    if (!images.length) return;
-    showImagePreview({
-        images,
-        startPosition: 0,
-        closeable: true,
-        showIndex: true,
-    });
-};
-
 // 顶部物候标题:相邻两段 phenologyName 相同时只显示一次(保留第一段)
 const shouldShowPhenologyBarTitle = (idx) => {
     const list = phenologyList.value;
@@ -424,42 +244,6 @@ const shouldShowPhenologyBarTitle = (idx) => {
     return list[idx]?.phenologyName !== list[idx - 1]?.phenologyName;
 };
 
-// 是否存在与物候期不同的生育期行(需要左右两列竖条);否则物候条占满单列宽度即可
-const phenologyNeedsTwoLabelColumns = (p) => {
-    const list = Array.isArray(p?.reproductiveList) ? p.reproductiveList : [];
-    if (!list.length) return false;
-    return list.some((r) => r.name !== p.phenologyName);
-};
-
-// 获取下一个reproductive-item的phenologyName
-const getNextPhenologyName = (currentPhenologyIdx, currentReproductiveIdx) => {
-    const currentPhenology = phenologyList.value[currentPhenologyIdx];
-    if (!currentPhenology || !Array.isArray(currentPhenology.reproductiveList)) {
-        return null;
-    }
-
-    // 如果当前reproductive-item不是最后一个,获取同一个物候期的下一个
-    if (currentReproductiveIdx < currentPhenology.reproductiveList.length - 1) {
-        const nextReproductive = currentPhenology.reproductiveList[currentReproductiveIdx + 1];
-        return nextReproductive?.phenologyName || null;
-    }
-
-    // 如果当前reproductive-item是最后一个,获取下一个物候期的第一个reproductive-item
-    if (currentPhenologyIdx < phenologyList.value.length - 1) {
-        const nextPhenology = phenologyList.value[currentPhenologyIdx + 1];
-        if (
-            nextPhenology &&
-            Array.isArray(nextPhenology.reproductiveList) &&
-            nextPhenology.reproductiveList.length > 0
-        ) {
-            const firstReproductive = nextPhenology.reproductiveList[0];
-            return firstReproductive?.phenologyName || null;
-        }
-    }
-
-    return null;
-};
-
 // 计算物候期需要的实际高度(基于农事数量)
 const getPhenologyRequiredHeight = (item) => {
     // 统计该物候期内的农事数量
@@ -619,23 +403,12 @@ const archiveTypeObj = {
  */
 // 农事状态样式映射
 const getArrangeStatusClass = (fw) => {
-    const t = props.pageType === 'agri_record' ? fw?.flowStatus : fw?.archiveType;
-    if (props.pageType === 'agri_record') {
-        if (t == null || t == 0 || t == -2) return "status-default";
-        const status = getAuditStatusPriority(fw.executeEvidenceAuditStatus);
-        // 农事记录:内容仍用 status-warning 的红字/红标签,外边框与箭头改为灰色
-        if (t == -1) return "status-warning status-warning-agri-record";
-        if (t == 3 || status === 2 || status === 0) return "status-warning-bg";
-        if (t == 5) return "status-normal";
-        return "status-act";
-    } else {
-        if (t == 1) return "status-green-info";
-        if (t == 4 && fw.sourceDataJson?.abnormalType === '病虫') return "status-warning";
-        if (t == 4 && fw.sourceDataJson?.abnormalType !== '病虫') return "status-complete";
-        if (t == 5) return "status-orange";
-        if (t == 6) return "status-green-farm";
-        return "status-normal";
-    }
+    const t = fw?.archiveType;
+    if (t == 1) return "status-green-info";
+    if (t == 4 && fw.sourceDataJson?.abnormalType === '病虫') return "status-warning";
+    if (t == 5) return "status-orange";
+    if (t == 6) return "status-normal-farm";
+    return "status-normal";
 };
 
 const handleRowClick = (item) => {
@@ -663,18 +436,13 @@ const getFarmWorkPlan = () => {
         savedScrollTop = timelineContainerRef.value.scrollTop || 0;
     }
 
-    const apiFunc = props.pageType === "agri_record" ? VE_API.monitor.getFarmWorkPlan : VE_API.monitor.getArchivesList;
+    const apiFunc = VE_API.monitor.getArchivesList;
 
     const params = {
         farmId: props.farmId,
         regionId: props.regionId,
-        problemZoneId: props.problemZoneId,
         year: props.year,
     };
-    if (props.pageType === "agri_record") {
-        params.containerId = props.containerId;
-    }
-
     apiFunc(params)
         .then(async ({ data, code }) => {
             if (code === 0) {
@@ -703,22 +471,6 @@ const getFarmWorkPlan = () => {
                                             ? await Promise.all(
                                                 (r.archiveList || r.interactionFarmWorkList).map(async (fw) => {
                                                     const sourceDataJson = parseSourceDataSafe(fw.data);
-                                                    // 如果有 imageIds,获取图片 URL
-                                                    if (
-                                                        sourceDataJson &&
-                                                        sourceDataJson.imageIds &&
-                                                        Array.isArray(sourceDataJson.imageIds) &&
-                                                        sourceDataJson.imageIds.length > 0
-                                                    ) {
-                                                        const resFilenameList = await fetchImageUrls(
-                                                            {
-                                                                imageIds: sourceDataJson.imageIds,
-                                                                page: 1,
-                                                                limit: 100,
-                                                            }
-                                                        );
-                                                        sourceDataJson.resFilename = resFilenameList;
-                                                    }
                                                     return {
                                                         ...fw,
                                                         phenologyName: r.phenologyName,
@@ -796,21 +548,6 @@ const getFarmWorkPlan = () => {
                     });
                 });
 
-                const farmWorks = phenologyList.value.flatMap((phenology) =>
-                    (Array.isArray(phenology?.reproductiveList) ? phenology.reproductiveList : []).flatMap((reproductive) =>
-                        Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : []
-                    )
-                );
-                const quoteValidationFarmWorks = farmWorks.filter(
-                    (farmWork) => farmWork?.farmWorkId && farmWork?.isFollow !== 0
-                );
-                const farmWorkIds = quoteValidationFarmWorks.map((farmWork) => farmWork.farmWorkId);
-
-                // 调用验证方法,传入所有ids
-                if (farmWorkIds.length > 0) {
-                    batchValidatePesticideFertilizerQuotes(farmWorkIds, quoteValidationFarmWorks);
-                }
-
                 // 判断是否为空数据:没有节气或没有物候期数据
                 if (solarTerms.value.length === 0 || phenologyList.value.length === 0) {
                     isEmpty.value = true;
@@ -840,12 +577,8 @@ const updateFarmWorkPlan = () => {
     getFarmWorkPlan();
 };
 
-const showPhenologyName = computed(() => {
-    return !props.problemZoneId;
-});
-
 watch(
-    () => [props.farmId, props.regionId, props.year, props.problemZoneId, props.pageType, props.containerId],
+    () => [props.farmId, props.regionId, props.year],
     (val, oldVal) => {
         if (!props.farmId) return;
         const changed =
@@ -865,49 +598,32 @@ const handleStatusDetail = (fw) => {
     saveTimelineScrollTop();
     emits('card-click');
     console.log(fw);
-    if (props.pageType === 'agri_plan') {
-        if (fw?.archiveType === 2) {
-            // router.push(`/interaction_list?farmId=${farmIdData.value}&regionId=${popupData.value.regionId}&interactionTypeId=${popupData.value.interactionTypeId}`);
-        }else if(fw?.archiveType === 6){
-            router.push({
-                path: "/work_detail",
-                query: {
-                    miniJson: JSON.stringify({
-                        paramsPage: JSON.stringify({
-                            farmId: 98570,
-                            farmWorkLibId: '832268348690534411',
-                            recordId: "832268363366404096",
-                            reproductiveId: 149,
-                            typeId: props.typeId
-                        }),
-                    }),
-                },
-            });
-        }else{
-            router.push({
-                path: "/agricultural_detail",
-                query: {
-                    id: fw?.id,
-                    title: archiveTypeObj[fw?.archiveType],
-                    content: fw?.description,
-                },
-            });
-        }
-    } else {
+    if (fw?.archiveType === 2) {
+        // router.push(`/interaction_list?farmId=${farmIdData.value}&regionId=${popupData.value.regionId}&interactionTypeId=${popupData.value.interactionTypeId}`);
+    } else if (fw?.archiveType === 6) {
         router.push({
             path: "/work_detail",
             query: {
                 miniJson: JSON.stringify({
                     paramsPage: JSON.stringify({
-                        farmId: props.farmId,
-                        farmWorkLibId: fw?.farmWorkLibId,
-                        recordId: fw?.farmWorkRecordId,
-                        reproductiveId: fw?.reproductiveId,
+                        farmId: 98570,
+                        farmWorkLibId: '832268348690534411',
+                        recordId: "832268363366404096",
+                        reproductiveId: 149,
                         typeId: props.typeId
                     }),
                 }),
             },
         });
+    } else {
+        router.push({
+            path: "/agricultural_detail",
+            query: {
+                id: fw?.id,
+                title: archiveTypeObj[fw?.archiveType],
+                content: fw?.description,
+            },
+        });
     }
 };
 
@@ -985,46 +701,12 @@ const getPhenologyTermProgress = (phenologyProgress) => {
     return matchedTermProgress;
 };
 
-const handleTagType = (tagType, executeEvidenceAuditStatus) => {
-    if (tagType == 0) return "待触发";
-    if (tagType == -1) return "已过期";
-    if (tagType == -2) return "已过期";
-    if (tagType == 3) {
-        const status = getAuditStatusPriority(executeEvidenceAuditStatus);
-        if (status === 2) {
-            return "审核失败";
-        }
-        return "待认证"
-    }
-    if (tagType == 5) {
-        const status = getAuditStatusPriority(executeEvidenceAuditStatus);
-        if (status === 2) {
-            return "审核失败";
-        }
-        if (status === 0) {
-            return "审核中";
-        }
-        return "已认证";
-    }
-    return "待触发"
-}
-
-// 审核状态优先级:2 > 0 > 1
-const getAuditStatusPriority = (auditStatusList) => {
-    if (!Array.isArray(auditStatusList) || !auditStatusList.length) return 1;
-    const normalized = auditStatusList.map((x) => Number(x)).filter((x) => [0, 1, 2].includes(x));
-    if (!normalized.length) return 1;
-    if (normalized.includes(0)) return 0;
-    if (normalized.includes(2)) return 2;
-    return 1;
-};
-
-// 右侧农事卡片展示用日期(与模板 left-date 一致:规划 createTime、记录 recommendDate)
+// 右侧农事卡片展示用日期(与模板 left-date 一致:createTime)
 const getFarmWorkTimelineDateMs = (fw) => {
-    const primary = props.pageType === "agri_plan" ? fw?.createTime : fw?.recommendDate ?? fw?.createTime;
+    const primary = fw?.createTime;
     let ms = safeParseDate(primary);
     if (Number.isNaN(ms) || ms <= 0) {
-        ms = safeParseDate(props.pageType === "agri_plan" ? fw?.recommendDate : fw?.createTime);
+        ms = safeParseDate(fw?.recommendDate);
     }
     return ms;
 };
@@ -1048,7 +730,7 @@ const isFarmWorkTimelineStrictlyFuture = (fw) => {
 // 右侧 arrange-card:未来日期置灰;解析不到日期时回退物候期节气/待认证规则(与旧版整段逻辑一致)
 // 无农事展示日期时的置灰回退:仅用节气/物候期 + 待认证(不含「任一行农事≤今天」),避免右侧卡片被外层标题连带误判
 const isPhenologyActiveWithoutFarmWorkDates = (phenology) =>
-    agriRecordHasPendingAuthInPhenology(phenology) || shouldShowBlueBase(phenology);
+    shouldShowBlueBase(phenology);
 
 const shouldGrayFarmWorkCard = (fw, phenology) => {
     if (isFarmWorkTimelineStrictlyFuture(fw)) return true;
@@ -1104,26 +786,6 @@ const phenologyAllDatedFarmWorksStrictlyFuture = (phenology) => {
     return anyDated;
 };
 
-// 仅农事记录页(agri_record):该物候期内存在待认证农事时,左侧最外层物候期与各生育期/物候期文案均高亮为蓝;农事规划(agri_plan)不生效
-const agriRecordHasPendingAuthInPhenology = (phenology) => {
-    if (props.pageType !== "agri_record") return false;
-    return (Array.isArray(phenology?.reproductiveList) ? phenology.reproductiveList : []).some((reproductive) =>
-        (Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : []).some((fw) => {
-            const s = fw?.flowStatus;
-            return s === 3 || s === "3";
-        })
-    );
-};
-
-// 单行生育期下是否有待认证农事(仅农事记录页)
-const reproductiveHasPendingAuthFarmWork = (reproductive) => {
-    if (props.pageType !== "agri_record") return false;
-    return (Array.isArray(reproductive?.farmWorkArrangeList) ? reproductive.farmWorkArrangeList : []).some((fw) => {
-        const s = fw?.flowStatus;
-        return s === 3 || s === "3";
-    });
-};
-
 // 物候期底色/节气规则(不含「农事卡片日期」「待认证」扩展)
 const shouldShowBlueBase = (phenology) => {
     // 优先使用物候期真实日期判断:未来日期不应显示蓝色
@@ -1175,25 +837,22 @@ const shouldShowBlueBase = (phenology) => {
     return phenologyTermProgress < nextTermProgress;
 };
 
-// 最外层物候期标题:与内层生育期对齐——任一生育行因农事≤今天变蓝;农事记录下有待认证则整段标题也蓝;否则按节气规则(右侧卡片仍按单卡日期置灰)
+// 最外层物候期标题:与内层生育期对齐——任一生育行因农事≤今天变蓝;否则按节气规则(右侧卡片仍按单卡日期置灰)
 const shouldShowBlue = (phenology) => {
     if (phenologyHasFarmWorkOnOrBeforeToday(phenology)) return true;
-    if (agriRecordHasPendingAuthInPhenology(phenology)) return true;
     if (phenologyAllDatedFarmWorksStrictlyFuture(phenology)) return false;
     return shouldShowBlueBase(phenology);
 };
 
 // 左侧生育期/物候期文案:
 // 1) 本行有农事<=今天:蓝;
-// 2) 本行全部有效日期农事均为未来且本行无待认证:灰(与右侧 future-card 一致);
-// 3) 农事记录下物候期内有待认证:蓝;
-// 4) 其余走节气/日期底色规则。
+// 2) 本行全部有效日期农事均为未来:灰(与右侧 future-card 一致);
+// 3) 其余走节气/日期底色规则。
 const shouldShowBlueLeft = (phenology, reproductive) => {
     if (reproductiveHasFarmWorkOnOrBeforeToday(reproductive)) return true;
-    if (reproductiveAllDatedFarmWorksStrictlyFuture(reproductive) && !reproductiveHasPendingAuthFarmWork(reproductive)) {
+    if (reproductiveAllDatedFarmWorksStrictlyFuture(reproductive)) {
         return false;
     }
-    if (agriRecordHasPendingAuthInPhenology(phenology)) return true;
     return shouldShowBlueBase(phenology);
 };
 
@@ -1275,8 +934,11 @@ watch(
 </script>
 
 <style scoped lang="scss">
-@mixin arrange-card-status($color, $title-color: null, $title-bg: null, $text-color: null) {
+@mixin arrange-card-status($color, $content-color: null,$border-color: null, $content-bg: null, $text-color: null) {
     border-color: $color;
+    @if $content-bg !=null {
+        background: $content-bg;
+    }
 
     .card-content {
         @if $text-color !=null {
@@ -1287,21 +949,26 @@ watch(
     .card-left {
         .left-info {
             .left-date {
-                color: $color;
-                border-color: $color;
+                color: $text-color;
+                border-color: $text-color;
             }
-            .status-tag {
-                background: $color;
+
+            .text {
+                color: $text-color;
             }
         }
 
         .title-text {
-            @if $title-color !=null {
-                color: $title-color;
+            @if $color !=null {
+                color: $color;
             }
 
-            @if $title-bg !=null {
-                background: $title-bg;
+            @if $content-color !=null {
+                background: $content-color;
+            }
+
+            @if $border-color !=null {
+                border-color: $border-color;
             }
         }
     }
@@ -1366,9 +1033,6 @@ watch(
                 color: #808080;
             }
 
-            &.phenology-title--wide {
-                width: 39px;
-            }
         }
 
         .reproductive-item {
@@ -1394,19 +1058,6 @@ watch(
                 writing-mode: vertical-rl;
                 text-orientation: upright;
 
-                &.mr {
-                    margin-right: 3px;
-                }
-
-                &.single {
-                    width: 39px;
-                    line-height: 39px;
-
-                    &.text-blue,
-                    &.text-red {
-                        line-height: 16px;
-                    }
-                }
 
                 &.phenology-blue {
                     background: #2199f8;
@@ -1436,16 +1087,11 @@ watch(
 
             .arranges {
                 display: flex;
-                max-width: calc(100vw - 88px);
-                min-width: calc(100vw - 83px);
+                max-width: calc(100vw - 63px);
+                min-width: calc(100vw - 58px);
                 gap: 5px;
                 letter-spacing: 0px;
 
-                &.arranges-min {
-                    max-width: calc(100vw - 58px);
-                }
-
-                // min-height: 90px;
                 .arrange-card {
                     width: 95%;
                     border: 0.5px solid #2199f8;
@@ -1456,10 +1102,6 @@ watch(
                     padding: 8px 15px 8px 10px;
                     writing-mode: horizontal-tb;
                     margin-bottom: 10px;
-
-                    // &.last-card {
-                    //     margin-bottom: 0;
-                    // }
                     .card-content {
                         color: #242424;
                         display: flex;
@@ -1468,7 +1110,7 @@ watch(
                         font-size: 14px;
 
                         .card-left {
-                            width: calc(100% - 45px);
+                            width: 100%;
 
                             .left-info {
                                 display: flex;
@@ -1476,8 +1118,8 @@ watch(
                                 gap: 6px;
 
                                 .left-date {
-                                    color: #2199f8;
-                                    border: 1px solid #2199f8;
+                                    color: rgba(0, 0, 0, 0.4);
+                                    border: 0.5px solid rgba(0, 0, 0, 0.4);
                                     border-radius: 2px;
                                     font-size: 12px;
                                     width: 36px;
@@ -1485,18 +1127,11 @@ watch(
                                     line-height: 20px;
                                 }
 
-                                .status-tag {
-                                    font-size: 12px;
-                                    background: #47B881;
-                                    color: #fff;
-                                    width: 63px;
-                                    border-radius: 2px;
-                                }
-
                                 .text {
                                     display: flex;
                                     align-items: center;
                                     gap: 2px;
+                                    color: rgba(0, 0, 0, 0.4);
                                     width: calc(100% - 115px);
                                 }
                             }
@@ -1506,65 +1141,35 @@ watch(
                                 width: fit-content;
                                 max-width: 100%;
                                 text-align: left;
-                                color: #2199F8;
+                                color: rgba(0, 0, 0, 0.4);
                                 padding: 0 6px;
                                 border-radius: 2px;
                                 font-size: 12px;
                                 box-sizing: border-box;
-                                background: rgba(33, 153, 248, 0.1);
-                            }
-
-                            &.agri-record-card {
-                                .text{
-                                    width: 100%;
-                                }
-                                .title-wrap {
-                                    display: flex;
-                                    align-items: flex-end;
-                                    gap: 6px;
-
-                                    .expert-info {
-                                        display: flex;
-                                        align-items: center;
-                                        gap: 2px;
-                                        font-size: 12px;
-                                        color: #B7B7B7;
-                                    }
-
-                                    .blue-tag {
-                                        color: #2199F8;
-                                        background: rgba(33, 153, 248, 0.1);
-                                    }
-                                }
+                                border: 0.5px solid rgba(0, 0, 0, 0.4);
                             }
-                        }
-
-                        .card-right {
-                            display: flex;
-                            align-items: center;
-                            position: relative;
-
-                            img {
-                                width: 45px;
-                                height: 45px;
-                                border-radius: 4px;
-                                object-fit: cover;
-                            }
-
-                            .num {
-                                position: absolute;
-                                width: 18px;
-                                height: 18px;
-                                box-sizing: border-box;
-                                top: -4px;
-                                right: -6px;
-                                background: #BFBFBF;
-                                color: #fff;
+                            .farm-info {
                                 font-size: 12px;
-                                border-radius: 50%;
+                                color: #626262;
+                                background: #F7F7F7;
+                                padding: 5px;
+                                border-radius: 5px;
                                 display: flex;
                                 align-items: center;
-                                justify-content: center;
+                                justify-content: space-between;
+                                text-align: left;
+                                margin-top: 6px;
+                                // .info-left {
+                                //     display: flex;
+                                //     align-items: center;
+                                //     gap: 5px;
+                                // }
+                                .info-right {
+                                    background: #FF953D;
+                                    border-radius: 2px;
+                                    padding: 1px 5px;
+                                    color: #fff;
+                                }
                             }
                         }
 
@@ -1598,76 +1203,20 @@ watch(
                     opacity: 0.3;
                 }
 
-                // .arrange-card.status-normal {
-                //     border-color: #2199f8;
-
-                //     &::before {
-                //         border-right-color: #2199f8;
-                //     }
-                // }
-
                 .arrange-card.status-normal {
-                    @include arrange-card-status(#2199f8, #2199f8, rgba(33, 153, 248, 0.1));
-                }
-
-                .arrange-card.status-warning {
-                    @include arrange-card-status(#FF4E4E, #FF4E4E, rgba(255, 78, 78, 0.1));
-                }
-
-                .arrange-card.status-warning.status-warning-agri-record {
-                    border-color: #bbbbbb;
-
-                    .card-left {
-                        .left-info {
-                            .left-date {
-                                color: #bbbbbb;
-                                border-color: #bbbbbb;
-                            }
-                        }
-
-                        .text-name,
-                        .text-icon {
-                            color: #bbbbbb;
-                        }
-                    }
-
-                    &::before {
-                        border-right-color: #bbbbbb;
-                    }
-                }
-
-                .arrange-card.status-complete {
-                    @include arrange-card-status(#FF943D, #FF943D, rgba(255, 149, 61, 0.1));
+                    @include arrange-card-status(#2199F8, null, #2199F8, null,#000);
                 }
 
                 .arrange-card.status-green-info {
-                    @include arrange-card-status(#47B881, #fff, rgba(71, 184, 129, 0.1));
+                    @include arrange-card-status(#4ABF32, #ECFFE8, rgba(74, 191, 50, 0.5),rgba(28, 169, 0, 0.1),rgba(0, 0, 0, 0.4));
                 }
 
                 .arrange-card.status-orange {
-                    @include arrange-card-status(#FFB129, #FFB129, rgba(253, 181, 55, 0.1));
-                }
-
-                .arrange-card.status-green-farm {
-                    @include arrange-card-status(#5BB349, #5BB349, rgba(91, 179, 73, 0.1));
+                    @include arrange-card-status(#FF953D, null, #FF953D, #fff, #000);
                 }
-
-                .arrange-card.status-act {
-                    @include arrange-card-status(#FF953D, #fff, #FF953D);
-                }
-
-                .arrange-card.status-default {
-                    @include arrange-card-status(#BBBBBB, #fff, #BBBBBB);
-
-                    .card-left {
-                        .left-info {
-
-                            .text-name,
-                            .text-icon {
-                                color: #BBBBBB;
-                            }
-                        }
-                    }
+                
+                .arrange-card.status-normal-farm {
+                    @include arrange-card-status(#2199F8, #E9F5FF, #2199F8, rgba(33, 153, 248, 0.1),rgba(0, 0, 0, 0.4));
                 }
 
                 // 未来节气对应的农事卡片:跟随左侧物候期的“未开始”灰色样式
@@ -1683,9 +1232,6 @@ watch(
                     }
                 }
 
-                .arrange-card.status-warning-bg {
-                    @include arrange-card-status(#FF943D, #fff, #FF943D, #000);
-                }
             }
         }
     }
@@ -1700,25 +1246,6 @@ watch(
         padding-top: 0;
     }
 
-    .timeline-term {
-        position: absolute;
-        width: 34px;
-        display: flex;
-        align-items: flex-start;
-        flex-direction: column;
-        z-index: 2;
-        /* 置于中线之上 */
-        color: rgba(174, 174, 174, 0.6);
-
-        .term-name {
-            display: inline-block;
-            width: 100%;
-            min-height: 20px;
-            line-height: 26px;
-            background: #fff;
-            font-size: 12px;
-        }
-    }
 
     .empty-state {
         display: flex;

+ 0 - 180
src/router/globalRoutes.js

@@ -24,19 +24,6 @@ export default [
         meta: { showTabbar: true, keepAlive: true },
         component: () => import("@/views/old_mini/monitor/index.vue"),
     },
-    //个人中心
-    {
-        path: "/mine",
-        name: "Mine",
-        meta: { showTabbar: true,keepAlive: true },
-        component: () => import("@/views/old_mini/mine/index.vue"),
-    },
-    // 我的消息
-    {
-        path: "/message",
-        name: "Message",
-        component: () => import("@/views/old_mini/mine/pages/message.vue"),
-    },
     // 创建农场
     {
         path: "/create_farm",
@@ -51,13 +38,6 @@ export default [
         meta: { showTabbar: true, keepAlive: true },
         component: () => import("@/views/old_mini/agri_record/index.vue"),
     },
-    // 认证身份
-    {
-        path: "/authentication",
-        name: "Authentication",
-        component: () => import("@/views/old_mini/mine/pages/authentication.vue"),
-        meta: { keepAlive: true },
-    },
     // 编辑地图
     {
         path: "/edit_map",
@@ -83,18 +63,6 @@ export default [
         name: "ExpertList",
         component: () => import("@/views/old_mini/home/subPages/expertList.vue"),
     },
-    // 我的农场
-    {
-        path: "/my_farm",
-        name: "MyFarm",
-        component: () => import("@/views/old_mini/mine/pages/farm.vue"),
-    },
-    // 消息列表
-    {
-        path: "/message_list",
-        name: "MessageList",
-        component: () => import("@/views/old_mini/mine/pages/messageList.vue"),
-    },
     // 识别结果
     {
         path: "/recognize",
@@ -121,52 +89,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/modify_work/index.vue"),
     },
-    // 待执行completedWork.vue
-    {
-        path: "/completed_work",
-        name: "CompletedWork",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/modify_work/completedWork.vue"),
-    },
-    // 农事详情
-    {
-        path: "/detail_work",
-        name: "DetailWork",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/modify_work/detailWork.vue"),
-    },
-    // 团队管理
-    {
-        path: "/team_manage",
-        name: "TeamManage",
-        component: () => import("@/views/old_mini/mine/pages/teamManage.vue"),
-    },
-    // 农事记录
-    {
-        path: "/farm_records",
-        name: "FarmRecords",
-        component: () => import("@/views/old_mini/mine/pages/farmRecords.vue"),
-    },
-    // 农资农服-农情需求
-    {
-        path: "/task_condition",
-        name: "TaskCondition",
-        meta: { showTabbar: true, keepAlive: true },
-        component: () => import("@/views/old_mini/task_condition/index.vue"),
-    },
-    // 用户管理
-    {
-        path: "/user",
-        name: "User",
-        meta: { showTabbar: true, keepAlive: true },
-        component: () => import("@/views/old_mini/user/index.vue"),
-    },
-    // 用户管理详情
-    {
-        path: "/user_manage",
-        name: "UserManage",
-        component: () => import("@/views/old_mini/user/manage.vue"),
-    },
     // 农资农服
     {
         path: "/agri_services",
@@ -174,13 +96,6 @@ export default [
         meta: { showTabbar: true, keepAlive: true },
         component: () => import("@/views/old_mini/agri_services/index.vue"),
     },
-    // 专家-农事方案
-    {
-        path: "/expert_prescription",
-        name: "ExpertPrescription",
-        meta: { showTabbar: true, keepAlive: true },
-        component: () => import("@/views/old_mini/plan/components/myPrescription.vue"),
-    },
     // 农场报告
     {
         path: "/farm_report",
@@ -212,13 +127,6 @@ export default [
         name: "ServicesIndex",
         component: () => import("@/views/old_mini/agri_work/servicesIndex.vue"),
     },
-    // 农事成效
-    {
-        path: "/review_work",
-        name: "ReviewWork",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/modify_work/reviewWork.vue"),
-    },
     // 新增农事
     {
         path: "/add_work",
@@ -272,27 +180,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/home/subPages/expertDetail.vue"),
     },
-    //项目管理员
-    {
-        path: "/project_manager",
-        name: "ProjectManager",
-        component: () => import("@/views/old_mini/mine/pages/projectManager.vue"),
-    },
-    //注册页面
-    {
-        path: "/register",
-        name: "Register",
-        meta: {
-            keepAlive: true,
-        },
-        component: () => import("@/views/old_mini/mine/pages/register.vue"),
-    },
-    //个人信息填写页面
-    {
-        path: "/user_info",
-        name: "UserInfo",
-        component: () => import("@/views/old_mini/mine/pages/userInfo.vue"),
-    },
     // 农事规划
     {
         path: "/plan",
@@ -312,25 +199,12 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/monitor/subPages/agriculturalDetail.vue"),
     },
-    // 农事方案
-    {
-        path: "/agricultural_plan",
-        name: "AgriculturalPlan",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/plan/index.vue"),
-    },
     // 农事管理
     {
         path: "/agri_services_manage",
         name: "AgriServicesManage",
         component: () => import("@/views/old_mini/agri_services/index.vue"),
     },
-    // 农场卡片
-    {
-        path: "/farm_card",
-        name: "FarmCard",
-        component: () => import("@/views/old_mini/plan/farmCard.vue"),
-    },
     // 相册识别
     {
         path: "/album_recognize",
@@ -338,42 +212,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/album_recognize/index.vue"),
     },
-    // 服务记录
-    {
-        path: "/service_records",
-        name: "ServiceRecords",
-        component: () => import("@/views/old_mini/mine/pages/serviceRecords.vue"),
-    },
-    // 服务详情
-    {
-        path: "/service_detail",
-        name: "ServiceDetail",
-        component: () => import("@/views/old_mini/mine/pages/serviceDetail.vue"),
-    },
-    // 农场详情
-    {
-        path: "/farm_details",
-        name: "FarmDetails",
-        component: () => import("@/views/old_mini/user/farmDetails.vue"),
-    },
-    // 农情档案
-    {
-        path: "/crop_record",
-        name: "CropRecord",
-        component: () => import("@/views/old_mini/user/subPages/cropRecord.vue"),
-    },
-    // 编辑农事方案
-    {
-        path: "/edit_plan",
-        name: "EditPlan",
-        component: () => import("@/views/old_mini/plan/editPlan.vue"),
-    },
-    // 编辑农事方案
-    {
-        path: "/modify_plan",
-        name: "ModifyPlan",
-        component: () => import("@/views/old_mini/plan/components/modifyPlan.vue"),
-    },
     // 编辑农事方案
     {
         path: "/modify",
@@ -381,18 +219,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/modify_work/modify.vue"),
     },
-    // 农场列表
-    {
-        path: "/farm_list",
-        name: "FarmList",
-        component: () => import("@/views/old_mini/user/subPages/farmList.vue"),
-    },
-    // 农事服务列表
-    {
-        path: "/service_list",
-        name: "ServiceList",
-        component: () => import("@/views/old_mini/user/subPages/serviceList.vue"),
-    },
     // 处方页面
     {
         path: "/prescription",
@@ -400,12 +226,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/home/subPages/prescriptionPage.vue"),
     },
-    // 提醒客户
-    {
-        path: "/remind_customer",
-        name: "RemindCustomer",
-        component: () => import("@/views/old_mini/task_condition/components/remindCustomer.vue"),
-    },
     // 知识库
     {
         path: "/knowledge_list",

+ 131 - 254
src/views/old_mini/agri_record/index.vue

@@ -13,98 +13,49 @@
                 @selectGarden="handleGardenSelected" />
         </div>
         <!-- 作物档案 -->
-        <div class="archives-time-line" :class="{ 'no-top': !varietyTabs.length && !gardenId }" v-show="activeGardenTab === 'current'">
-            <div class="archives-time-line-header">
-                <div class="line-title" @click="handleFarmInfoClick">农事记录</div>
-                <div class="header-right">
-                    <div class="add-variety-btn" v-if="varietyTabs.length > 0" @click="handleAddVariety">
-                        <span>分区管理</span>
+        <div class="archives-time-line" v-show="activeGardenTab === 'current'">
+            <div class="trend-monitor-list">
+                <div class="trend-monitor-card" v-for="(item, index) in trendMonitorMockList" :key="index">
+                    <div class="card-header">
+                        <div class="header-left">
+                            <span class="title">{{ item.title }}</span>
+                            <span class="level-tag">{{ item.level }}</span>
+                        </div>
+                        <div class="status-tag">{{ item.status }}</div>
                     </div>
-                    <el-date-picker
-                        style="width: 100px"
-                        v-model="date"
-                        type="year"
-                        placeholder="全部日期"
-                        :editable="false"
-                        :disabled-date="disabledYearDate"
-                    />
-                </div>
-            </div>
-            <!-- 品种选择 -->
-            <div class="variety-tabs" v-if="varietyTabs.length > 0">
-                <div v-for="(v, index) in varietyTabs" :key="index" class="variety-tab"
-                    :class="{ 'variety-tab--active': activeVariety === index }" @click="handleVarietyClick(v, index)">
-                    {{ v.regionName || v.problemZoneTypeName }}
-                </div>
-            </div>
-            <template v-if="!varietyTabs.length">
-                <div class="lock-img" @click="handleLockClick">
-                    <img src="@/assets/img/home/lock-blue.png" alt="" class="lock-img-item" />
-                    <div class="lock-text">
-                        专属数字农场,种好卖好
-                        <div>点击解锁一键溯源增产</div>
+                    <div class="card-row">
+                        <div class="reason-text">{{ item.reason }}</div>
+                        <div class="question-tag">{{ item.question }}</div>
+                    </div>
+                    <div class="record-list">
+                        <div class="record-item" v-for="(record, recordIndex) in item.records" :key="recordIndex">
+                            {{ record }}
+                        </div>
                     </div>
-
-                    <div class="lock-btn">点击解锁</div>
                 </div>
-                <img class="example-img" src="@/assets/img/monitor/example.png" alt="">
-            </template>
+            </div>
             <div class="archives-time-line-content">
-                <archives-farm-time-line :year="date.getFullYear()" :farmId="farmIdData" :problemZoneId="currentVariety?.problemZoneTypeId" :regionId="regionData" :containerId="containerData"
-                    pageType="agri_record" :typeId="currentVariety?.typeId" @card-click="handleCardClick"></archives-farm-time-line>
+                <archives-farm-time-line :year="2026" :farmId="98570" :regionId="235997"
+                    @card-click="handleCardClick"></archives-farm-time-line>
             </div>
         </div>
     </div>
-
-    <!-- 勾选区域引导弹窗 -->
-    <select-region-popup v-model:show="showSelectRegionPopup" :title="titlePopup" @confirm="handleGoSelectRegion"
-        @skip="handleSkipSelectRegion" />
-
-    <agri-execute-popup v-if="!showSelectRegionPopup" ref="agriExecutePopupRef" />
-
-    <start-interact-popup ref="startInteractPopupRef" />
 </template>
 
 <script setup>
 import customHeader from "@/components/customHeader.vue";
-import { ref, computed, onActivated, onDeactivated, onMounted } from "vue";
+import { ref, computed, onActivated, onMounted } from "vue";
 import { useStore } from "vuex";
-import wx from "weixin-js-sdk";
 import weatherInfo from "@/components/weatherInfo.vue";
-import { useRouter, useRoute } from "vue-router";
-import { ElMessage, ElMessageBox } from "element-plus";
+import { useRoute } from "vue-router";
 import ArchivesFarmTimeLine from "@/components/pageComponents/ArchivesFarmTimeLine.vue";
-import selectRegionPopup from "@/components/popup/selectRegionPopup.vue";
-import agriExecutePopup from "@/components/popup/agriExecutePopup.vue";
-import startInteractPopup from "@/components/popup/startInteractPopup.vue";
 import gardenList from "@/components/gardenList.vue";
 
-const agriExecutePopupRef = ref(null);
-const startInteractPopupRef = ref(null);
-
-const handleFarmInfoClick = () => {
-    // const query = {
-    //     askInfo: { title: "农场认领", content: "是否分享该链接给好友" },
-    //     shareText: "邀您参与农情互动,获取专家精准指导",
-    //     targetUrl: `home`,
-    //     paramsPage: JSON.stringify({isFarmer:true}),
-    //     imageUrl: 'https://birdseye-img.sysuimars.com/birdseye-look-mini/share-lz-bg.png',
-    // };
-    // wx.miniProgram.navigateTo({
-    //     url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
-    // });
-}
-
-const handleAddVariety = () => {
-    // router.push("/interaction?addVariety=true&subjectId=" + gardenId.value);
-    router.push(`/draw_area?subjectId=${gardenId.value}&type=viewOnly`);
-};
-
 // 品种选择(作物档案内)- 根据主体ID动态获取分区列表
 const varietyTabs = ref([]);
 const activeVariety = ref(0);
 
-const getVarietyTabs = async (isShowPopup = true) => {
+const getVarietyTabs = async () => {
     if (!gardenId.value) {
         return;
     }
@@ -115,74 +66,56 @@ const getVarietyTabs = async (isShowPopup = true) => {
         const res = await VE_API.basic_farm.fetchProblemZoneList({
             subjectId: gardenId.value,
         });
-        if(res.data && res.data.regionList && res.data.problemZones){
+        if (res.data && res.data.regionList && res.data.problemZones) {
             varietyTabs.value = res.data.regionList.concat(res.data.problemZones)
         }
         if (varietyTabs.value.length > 0) {
             handleVarietyClick(varietyTabs.value[activeVariety.value || 0], activeVariety.value || 0)
-            if (isShowPopup && !showSelectRegionPopup.value && agriExecutePopupRef.value) {
-                agriExecutePopupRef.value.showPopup(varietyTabs.value[activeVariety.value || 0].farmId);
-            }
         }
     } catch (error) {
         console.error("获取主体分区列表失败:", error);
     }
 };
 
-const farmIdData = ref(null);
-const containerData = ref(null);
-const regionData = ref(null);
-const titlePopup = ref("");
-const currentVariety = ref({});
-const showSelectRegionPopup = ref(false);
 const handleVarietyClick = (tab, index) => {
     activeVariety.value = index;
-    if(tab.regionId){
-        farmIdData.value = tab.farmId;
-        containerData.value = tab.containerId;
-        regionData.value = tab.regionId;
-    } else {
-        regionData.value = null;
-    }
-    currentVariety.value = tab;
     if (tab.lastViewTime == null && tab.regionId) {
-        titlePopup.value = `勾选 ${tab.regionName} 区域`;
-        showSelectRegionPopup.value = true;
         VE_API.basic_farm.updateLastViewTime({
             regionId: tab.regionId,
-        }).then(() => {
-            getVarietyTabs(false);
         });
     }
 };
 
-const handleSkipSelectRegion = () => {
-    showSelectRegionPopup.value = false;
-};
-
-const handleGoSelectRegion = () => {
-    showSelectRegionPopup.value = false;
-    router.push({
-        path: "/draw_area",
-        query: {
-            subjectId: gardenId.value,
-            varietyId: currentVariety.value.typeId,
-        },
-    });
-};
-
-const showFarmPopup = ref(false); // 农场领取成功弹窗
-const date = ref(new Date());
-const disabledYearDate = (time) => {
-    const year = time.getFullYear();
-    const currentYear = new Date().getFullYear();
-    return year !== currentYear && year !== currentYear - 1;
-};
-
 const defaultGardenId = ref(null);
 const selectedGardenId = ref(null);
 const gardenListRef = ref(null);
 const activeGardenTab = ref('current');
+const trendMonitorMockList = ref([
+    {
+        title: "病虫害态势监控",
+        level: "二级",
+        status: "待记录",
+        reason: "互动原因互动原因",
+        question: "互动问题互动问题互动问题",
+        records: ["真菌类", "真菌类", "真菌类"],
+    },
+    {
+        title: "长势异常态势跟踪",
+        level: "二级",
+        status: "待记录",
+        reason: "互动原因互动原因",
+        question: "互动问题互动问题互动问题",
+        records: ["长势异常一", "长势异常二", "长势异常"],
+    },
+    {
+        title: "物候跟踪记录",
+        level: "二级",
+        status: "待记录",
+        reason: "互动原因互动原因",
+        question: "互动问题互动问题互动问题",
+        records: ["04/16(某某分区)", "04/19(某某分区)", "04/20(某某分区)"],
+    },
+]);
 const changeGardenTab = (tab) => {
     activeGardenTab.value = tab;
 };
@@ -197,7 +130,6 @@ const handleGardenSelected = (garden) => {
 };
 
 const isHeaderShow = ref(false);
-const isDefaultFarm = ref(false);
 const weatherInfoRef = ref(null);
 
 onActivated(() => {
@@ -205,8 +137,6 @@ onActivated(() => {
     if (route.query.isHeaderShow) {
         isHeaderShow.value = true;
         defaultGardenId.value = route.query.farmId;
-        // 统一转换为布尔值
-        isDefaultFarm.value = route.query.defaultFarm === "true" || route.query.defaultFarm === true;
     }
     const savedFarmId = localStorage.getItem("selectedFarmId");
     selectedGardenId.value = savedFarmId ? Number(savedFarmId) : null;
@@ -215,36 +145,8 @@ onActivated(() => {
 
 const store = useStore();
 const tabBarHeight = computed(() => store.state.home.tabBarHeight);
-const router = useRouter();
 const route = useRoute();
 
-const userInfo = localStorage.getItem("localUserInfo");
-const userInfoObj = userInfo ? JSON.parse(userInfo) : {};
-
-const handleLockClick = () => {
-    if (gardenId.value) {
-        router.push("/interaction?subjectId=" + localStorage.getItem("selectedFarmId"));
-        return;
-    }
-    if (userInfoObj?.tel) {
-        router.push(`/create_farm?from=growth_report&isReload=true`);
-        return;
-    }
-    wx.miniProgram.navigateTo({
-        url: '/pages/subPages/phone_auth/index',
-    });
-}
-
-// 播报相关事件
-const isSpeaking = ref(false);
-const speechSynthesis = window.speechSynthesis;
-
-// 组件卸载时停止语音播放
-onDeactivated(() => {
-    showFarmPopup.value = false;
-    regionData.value = null;
-});
-
 const isExpanded = ref(false);
 const weatherExpanded = (isExpandedValue) => {
     isExpanded.value = isExpandedValue;
@@ -268,7 +170,7 @@ onMounted(() => {
 
 const changeGarden = ({ id }) => {
     gardenId.value = id;
-    if(sessionStorage.getItem('activeVariety')){
+    if (sessionStorage.getItem('activeVariety')) {
         activeVariety.value = Number(sessionStorage.getItem('activeVariety'));
         sessionStorage.removeItem('activeVariety');
     } else {
@@ -277,8 +179,6 @@ const changeGarden = ({ id }) => {
     // 更新 store 中的状态
     store.commit("home/SET_GARDEN_ID", id);
     getVarietyTabs();
-
-    startInteractPopupRef.value.getPhenologyInitOrConfirmStatus();
 };
 
 const handleCardClick = () => {
@@ -303,49 +203,6 @@ const handleCardClick = () => {
         z-index: 11;
     }
 
-    .lock-img {
-        position: fixed;
-        z-index: 10;
-        top: 50%;
-        left: 50%;
-        transform: translate(-50%, -20%);
-        width: 100%;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        flex-direction: column;
-        gap: 16px;
-
-        .lock-img-item {
-            width: 57px;
-        }
-
-        .lock-text {
-            font-size: 14px;
-            color: #000;
-            padding: 5px 64px;
-            line-height: 21px;
-            background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, #FFFFFF 50%, rgba(255, 255, 255, 0) 100%);
-        }
-
-        .lock-btn {
-            width: 140px;
-            height: 40px;
-            line-height: 40px;
-            text-align: center;
-            background: linear-gradient(180deg, #76C3FF 0%, #2199F8 100%);
-            border-radius: 25px;
-            color: #fff;
-            font-size: 16px;
-        }
-    }
-
-    .example-img {
-        width: 100%;
-        height: 100%;
-        object-fit: inherit;
-    }
-
     .weather-info {
         width: calc(100% - 20px);
         position: absolute;
@@ -354,86 +211,106 @@ const handleCardClick = () => {
         z-index: 12;
     }
 
-    .archives-time-line {
-        position: relative;
-        height: calc(100% - 90px);
-        padding: 12px;
+    .trend-monitor-list {
         display: flex;
         flex-direction: column;
-        min-height: 0;
-        padding-top: 150px;
-        &.no-top {
-            padding-top: 96px;
-        }
+        gap: 12px;
+        background: #fff;
+        border: 1px solid #2199F8;
+        border-radius: 8px;
+        padding: 10px;
 
-        .archives-time-line-header {
-            flex-shrink: 0;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
+        .trend-monitor-card {
+            border: 0.5px solid rgba(33, 153, 248, 0.5);
+            border-radius: 4px;
+            padding: 6px 8px;
+            position: relative;
 
-            .line-title {
-                position: relative;
-                padding-left: 14px;
-                font-size: 16px;
 
-                &::before {
-                    content: "";
-                    position: absolute;
-                    left: 5px;
-                    top: 50%;
-                    transform: translateY(-50%);
-                    width: 4px;
-                    height: 15px;
-                    background: #2199f8;
-                    border-radius: 20px;
-                }
-            }
-            .header-right {
+            .card-header {
                 display: flex;
                 align-items: center;
-                gap: 12px;
+                margin-bottom: 6px;
 
-                .add-variety-btn {
+                .header-left {
                     display: flex;
                     align-items: center;
-                    gap: 3px;
-                    padding: 4px 10px;
-                    border: 1px solid #2199F8;
-                    border-radius: 2px;
-                    color: #2199F8;
-                    background: rgba(33, 153, 248, 0.1);
+                    gap: 5px;
+
+                    .title {
+                        font-size: 16px;
+                    }
+
+                    .level-tag {
+                        padding: 1px 8px;
+                        border-radius: 2px;
+                        background: rgba(255, 78, 78, 0.1);
+                        color: #FF4E4E;
+                        font-size: 12px;
+                    }
+                }
+
+                .status-tag {
+                    background: #FF953D;
+                    color: #ffffff;
+                    font-size: 12px;
+                    border-radius: 0 4px 0 4px;
+                    padding: 2px 5px;
+                    position: absolute;
+                    top: 0;
+                    right: 0;
                 }
             }
-        }
 
-        .variety-tabs {
-            display: grid;
-            grid-template-columns: repeat(4, 1fr);
-            gap: 8px;
-            margin: 10px 0;
-
-            .variety-tab {
-                box-sizing: border-box;
-                padding: 4px;
-                border-radius: 2px;
-                color: #767676;
-                background: #fff;
+            .card-row {
+                background: #F7F7F7;
+                border-radius: 5px;
+                padding: 5px;
                 display: flex;
                 align-items: center;
-                justify-content: center;
-                text-align: center;
-                word-break: break-word;
-                overflow-wrap: anywhere;
+                justify-content: space-between;
+                margin-bottom: 6px;
+                font-size: 12px;
+                color: #626262;
+
+                .question-tag {
+                    background: #2b9af6;
+                    color: #ffffff;
+                    border-radius: 2px;
+                    padding: 2px 6px;
+                }
             }
 
-            .variety-tab--active {
-                background: #2199F8;
-                color: #ffffff;
+            .record-list {
+                display: flex;
+                gap: 6px;
+
+                .record-item {
+                    border: 1px solid #2199F8;
+                    border-radius: 2px;
+                    color: #2199F8;
+                    text-align: center;
+                    font-size: 12px;
+                    padding: 0 5px;
+                }
             }
         }
+    }
+
+    .archives-time-line {
+        position: relative;
+        height: calc(100% - 160px);
+        padding: 12px;
+        display: flex;
+        flex-direction: column;
+        min-height: 0;
+        padding-top: 150px;
+        overflow-y: auto;
+        -webkit-overflow-scrolling: touch;
+
         .archives-time-line-content {
-            flex: 1;
+            margin-top: 10px;
+            flex: none;
             min-height: 0;
             background: #fff;
             border-radius: 8px;

+ 3 - 3
src/views/old_mini/agri_services/index.vue

@@ -9,9 +9,9 @@
                 <services-hall ref="servicesHallRef" :active="active" />
             </tab>
         </tabs>
-        <div v-else class="farm-dynamics-container">
+        <!-- <div v-else class="farm-dynamics-container">
             <farm-dynamics ref="farmDynamicsRef" :type="type" />
-        </div>
+        </div> -->
     </div>
 </template>
 
@@ -21,7 +21,7 @@ import { useRoute } from "vue-router";
 import { useStore } from "vuex";
 import { Tab, Tabs } from "vant";
 import servicesHall from "./components/servicesHall.vue";
-import farmDynamics from "./components/farmDynamics.vue";
+// import farmDynamics from "./components/farmDynamics.vue";
 import customHeader from "@/components/customHeader.vue";
 
 const route = useRoute();

+ 1 - 1
src/views/old_mini/farm_manage/components/demandHall.vue

@@ -98,7 +98,7 @@ import { FloatingPanel } from "vant";
 import { computed, nextTick, onActivated, onDeactivated, onMounted, ref } from "vue";
 import { useStore } from "vuex";
 import IndexMap from "../map/index";
-import taskItem from "@/components/taskItem.vue";
+// import taskItem from "@/components/taskItem.vue";
 import priceSheetPopup from "@/components/popup/priceSheetPopup.vue";
 import { useRouter } from "vue-router";
 import LocationSearch from "@/components/pageComponents/LocationSearch.vue";

+ 2 - 2
src/views/old_mini/home/index copy.vue

@@ -43,7 +43,7 @@
                 </div>
             </div>
         </div>
-        <AgriculturalDynamics />
+        <!-- <AgriculturalDynamics /> -->
     </div>
     <!-- 创建农场弹窗 -->
     <tip-popup
@@ -60,7 +60,7 @@
 import { ref, computed, onActivated } from "vue";
 import { useStore } from "vuex";
 import weatherInfo from "@/components/weatherInfo.vue";
-import AgriculturalDynamics from "./components/AgriculturalDynamics.vue";
+// import AgriculturalDynamics from "./components/AgriculturalDynamics.vue";
 import { useRouter, useRoute } from "vue-router";
 import wx from "weixin-js-sdk";
 import problemReminder from "./components/problemReminder.vue";

+ 0 - 4
src/views/old_mini/home/index.vue

@@ -51,9 +51,6 @@
         <knowledge-card />
         <!-- <template v-if="userType == 2">
         </template> -->
-        <!-- <template v-else>
-            <AgriculturalDynamics />
-        </template> -->
     </div>
     <tip-popup v-model:show="showTipPopup" type="warning" text="请设置" highlightText="种植方案" buttonText="去设置"
         @confirm="handleBtn" :closeOnClickOverlay="false" :zIndex="9999" />
@@ -83,7 +80,6 @@
 import { ref, computed, onActivated, onMounted } from "vue";
 import { useStore } from "vuex";
 import weatherInfo from "@/components/weatherInfo.vue";
-import AgriculturalDynamics from "./components/AgriculturalDynamics.vue";
 import { useRouter, useRoute } from "vue-router";
 import wx from "weixin-js-sdk";
 import tipPopup from "@/components/popup/tipPopup.vue";

+ 0 - 365
src/views/old_mini/mine/index.vue

@@ -1,365 +0,0 @@
-<template>
-    <div class="mine-index">
-        <div class="mine-header">
-            <div class="user-info-box" @click="handleUserInfoClick">
-                <el-avatar class="avatar" :size="54" :src="userInfo?.icon" />
-                <div class="user-info">
-                    <div class="user-name">
-                        <span v-if="curRole === 0">{{ userInfo?.nickname }}</span>
-                        <span v-else>{{ userInfo?.name }}</span>
-                        <span class="score" v-if="curRole !== 0">5.0分</span>
-                    </div>
-                    <div class="user-day">这是您使用飞鸟管家的第{{ daysSinceCreation }}天</div>
-                </div>
-            </div>
-            <div class="code-icon" v-if="curRole === 1">
-                <img src="@/assets/img/mine/code-icon.png" alt="" />
-            </div>
-            <!-- <div class="switch-role-btn" v-if="roles && roles.length > 1" @click="changeToggle">
-                <span>切换身份</span>
-                <el-icon><Switch /></el-icon>
-            </div> -->
-        </div>
-        <div class="mine-content">
-            <div class="garden-info" v-if="curRole !== 0">
-                <div class="item" v-for="(item, index) in gardenInfoItems" :key="index">
-                    <span class="num">{{ item.num }}</span>
-                    <span>{{ item.label }}</span>
-                </div>
-            </div>
-            <!-- <div class="grid-group">
-                <div class="grid-item" v-for="(item, index) in gridItems" :key="index" @click="handleGridClick(item)">
-                    <div class="grid-title">
-                        <span>{{ item.title }}</span>
-                        <el-icon><ArrowRight /></el-icon>
-                    </div>
-                    <span class="grid-desc">{{ item.desc }}</span>
-                </div>
-            </div> -->
-            <div class="cell-group">
-                <div class="cell-item" v-for="(item, index) in cellItems" :key="index" @click="handleCellClick(item)">
-                    <span class="item-title">{{ item.title }}</span>
-                    <el-icon class="item-arrow"><ArrowRight /></el-icon>
-                </div>
-            </div>
-        </div>
-        <!-- 角色切换 -->
-        <action-sheet :style="{ bottom: 50 + 'px' }" v-model:show="show" :actions="actions" @select="onSelect" />
-    </div>
-</template>
-<script setup>
-import { onActivated, ref, computed, onMounted } from "vue";
-import { useRouter } from "vue-router";
-import { useStore } from "vuex";
-import wx from "weixin-js-sdk";
-import { ActionSheet } from "vant";
-import { SET_USER_CUR_ROLE } from "@/store/modules/app/type";
-const store = useStore();
-const router = useRouter();
-
-// 0: 农户, 1: 专家, 2:农资农服
-const curRole = ref(Number(localStorage.getItem("SET_USER_CUR_ROLE")));
-const roles = ref(JSON.parse(store.state.app.roles));
-const userInfo = JSON.parse(localStorage.getItem("localUserInfo") || "{}");
-
-// 计算从创建时间到现在经过的天数
-const daysSinceCreation = computed(() => {
-    if (!userInfo?.createTime) {
-        return 0;
-    }
-    try {
-        // 将创建时间字符串转换为日期对象
-        const createDate = new Date(userInfo.createTime);
-        // 获取当前日期
-        const currentDate = new Date();
-        // 将两个日期都设置为当天的 00:00:00,只比较日期部分
-        const createDateOnly = new Date(createDate.getFullYear(), createDate.getMonth(), createDate.getDate());
-        const currentDateOnly = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
-        // 计算日期差(毫秒)
-        const timeDiff = currentDateOnly.getTime() - createDateOnly.getTime();
-        // 转换为天数
-        const days = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
-        // 加1,因为创建当天算作第1天
-        return days + 1;
-    } catch (error) {
-        console.error("计算天数失败:", error);
-        return 0;
-    }
-});
-
-// const roles = ref([0,1,2,3])
-const actions = ref([]);
-
-// 网格项数据
-const gridItems = ref([]);
-
-const objects = [
-    { name: "农户", id: 0, text: "NH" },
-    { name: "农资", id: 2, text: "NZ" },
-];
-
-onMounted(() => {
-    // 仅保留 objects 中存在的角色
-    actions.value = objects.filter((obj) => roles.value && roles.value.includes(obj.id));
-});
-
-const show = ref(false);
-// 切换身份角色
-const onSelect = async (item) => {
-    show.value = false;
-
-    store.dispatch(`app/${SET_USER_CUR_ROLE}`, item.id);
-    localStorage.setItem("SET_USER_CUR_ROLE", item.id);
-
-    // 保存到 session
-    try {
-        await VE_API.mine.saveSessionStore({
-            val: item.id,
-            key: "cur_role",
-        });
-    } catch (error) {
-        console.error("保存角色到 session 失败:", error);
-    }
-    window.location.reload();
-};
-
-onActivated(() => {
-    gridItems.value = [
-        {
-            title: "我的主页",
-            desc: "查看农场列表",
-            path: "/my_farm",
-        },
-        {
-            title: "我的消息",
-            desc: "查看未读信息",
-            path: "/message",
-        },
-        {
-            title: "信息化档案",
-            desc: "查看历史农事",
-            path: "/archives",
-        },
-    ];
-});
-
-// 单元格项数据 - 根据角色动态显示
-const cellItems = computed(() => {
-    let list  = [
-        {
-            title: "系统提醒",
-            path: "/message",
-        },
-        {
-            title: "种植方案",
-            path: "/plan?pageType=plant",
-        },
-        {
-            title: "服务记录",
-            path: "/service_records",
-        },
-        {
-            title: "报价维护",
-            path: "/offer_price",
-        },
-        {
-            title: "服务维护",
-            path: "/service_manage",
-        },
-        {
-            title: "团队管理",
-            path: "/team_manage",
-        },
-    ]
-    if(curRole.value === 0) {
-        list.unshift({
-            title: "认证身份",
-            path: "/authentication",
-        });
-        // list.unshift({
-        //     title: "认证农资",
-        //     path: "/register?identity=NZ",
-        // });
-    }
-    return list;
-});
-
-// 花园信息项数据
-const gardenInfoItems = ref([
-    { num: "--", label: "服务次数" },
-    { num: "--", label: "累计客户" },
-    { num: "--", label: "服务果园" },
-]);
-
-onActivated(() => {
-    if (curRole.value !== 0) {
-        getStatistics();
-    }
-});
-
-const getStatistics = () => {
-    VE_API.z_agricultural_store.statistics().then(({ data }) => {
-        gardenInfoItems.value[0].num = data.serviceCount || "--";
-        gardenInfoItems.value[1].num = data.customerCount || "--";
-        gardenInfoItems.value[2].num = data.serviceFarmCount || "--";
-    });
-};
-
-// 处理网格项点击
-const handleGridClick = (item) => {
-    if (item.path) {
-        router.push(item.path);
-    }
-};
-
-// 处理单元格项点击
-const handleCellClick = (item) => {
-    if (item.path) {
-        if (item.path === "/logout") {
-            // 退出登录逻辑
-            console.log("退出登录");
-            // 这里可以添加退出登录的具体逻辑
-        } else {
-            router.push(item.path);
-        }
-    }
-};
-
-const changeToggle = () => {
-    show.value = true;
-};
-
-const handleUserInfoClick = () => {
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/user_info/index?route_path=/mine`,
-    });
-};
-</script>
-<style lang="scss" scoped>
-.mine-index {
-    width: 100%;
-    height: 100vh;
-    box-sizing: border-box;
-    padding: 20px 16px;
-    background: url("@/assets/img/mine/mine-bg.png") no-repeat center center / 100% 100%;
-    .mine-header {
-        width: 100%;
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        .user-info-box {
-            display: flex;
-            align-items: center;
-            .avatar {
-                border: 1px solid #fff;
-                margin-right: 12px;
-            }
-            .user-info {
-                font-size: 20px;
-                .user-name {
-                    font-weight: 500;
-                    display: flex;
-                    align-items: center;
-                    .score {
-                        font-size: 14px;
-                        color: #2199f8;
-                        margin-left: 6px;
-                        font-weight: 500;
-                    }
-                }
-                .user-day {
-                    font-size: 12px;
-                    color: rgba(0, 0, 0, 0.5);
-                }
-            }
-        }
-        .code-icon {
-            width: 21px;
-            height: 21px;
-            img {
-                width: 100%;
-                height: 100%;
-            }
-        }
-        .switch-role-btn {
-            margin-right: -16px;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            padding: 5px 10px 6px 12px;
-            color: #fff;
-            background: #2199f8;
-            border-radius: 25px 0 0 25px;
-            gap: 5px;
-            font-size: 13px;
-        }
-    }
-    .mine-content {
-        margin-top: 20px;
-        .garden-info {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            border-radius: 8px;
-            padding: 6px 0;
-            background-color: rgba(255, 255, 255, 0.5);
-            margin-bottom: 10px;
-            .item {
-                display: flex;
-                flex: 1;
-                flex-direction: column;
-                align-items: center;
-                justify-content: center;
-                color: #999999;
-                font-size: 13px;
-                .num {
-                    font-size: 16px;
-                    color: #000;
-                    margin-bottom: 2px;
-                }
-            }
-        }
-        .grid-group {
-            display: flex;
-            align-items: center;
-            .grid-item {
-                background-color: #fff;
-                border-radius: 14px;
-                padding: 10px 0 10px 10px;
-                color: #000;
-                font-size: 16px;
-                flex: 1;
-                .grid-title {
-                    display: flex;
-                    align-items: center;
-                    font-weight: 500;
-                    margin-bottom: 6px;
-                    span {
-                        margin-right: 1px;
-                    }
-                }
-                .grid-desc {
-                    font-size: 12px;
-                    color: rgba(0, 0, 0, 0.2);
-                }
-            }
-            .grid-item + .grid-item {
-                margin-left: 10px;
-            }
-        }
-        .cell-group {
-            .cell-item {
-                margin-top: 10px;
-                background-color: #fff;
-                border-radius: 14px;
-                padding: 13px 10px;
-                display: flex;
-                align-items: center;
-                justify-content: space-between;
-                color: #000;
-                font-size: 16px;
-            }
-        }
-    }
-}
-</style>

+ 0 - 122
src/views/old_mini/mine/pages/authentication.vue

@@ -1,122 +0,0 @@
-<template>
-    <div class="authentication-page">
-        <custom-header name="认证身份"></custom-header>
-        <div class="content">
-            <span class="text">请选择您要认证的身份</span>
-            <div class="card-group">
-                <div
-                    :class="['card-item', { active: active === index }]"
-                    v-for="(item, index) in list"
-                    :key="index"
-                    @click="handleActive(item, index)"
-                >
-                    <div class="info">
-                        <div class="name">{{ item.name }}</div>
-                        <span>{{ item.desc }}</span>
-                    </div>
-                    <img :src="require(`@/assets/img/mine/${item.icon}-icon.png`)" alt="" />
-                </div>
-            </div>
-            <div class="button" @click="handleOk">选好了</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import {ref} from 'vue'
-import { useRouter } from "vue-router";
-const router = useRouter();
-
-const list = [
-    {
-        name:"专家",
-        desc:"根据表型触发农事,确认农事处方",
-        icon:"figure",
-        identity:"EXPERT",
-        role:3
-    },
-    {
-        name:"农资农服",
-        desc:"巡飞地形,收集农情测报",
-        icon:"drone",
-        identity:"NZ",
-        role:2
-    },
-]
-    // {
-    //     name:"农服",
-    //     desc:"接单执行,服务农户",
-    //     icon:"shield",
-    //     identity:"NF",
-    //     role:1
-    // }
-
-const active = ref(0)
-const handleActive = (item,index) =>{
-    active.value = index
-}
-
-const handleOk = () =>{
-    // router.push(`/register?identity=${list[active.value].identity}&role=${list[active.value].role}`)
-    router.push(`/register??identity=NZ`)
-}
-</script>
-
-<style lang="scss" scoped>
-.authentication-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f5f7fb;
-    .content {
-        height: calc(100% - 40px);
-        padding: 60px 30px;
-        box-sizing: border-box;
-        .text {
-            font-size: 18px;
-        }
-        .card-group {
-            margin-top: 26px;
-            .card-item {
-                background: #fff;
-                display: flex;
-                align-items: center;
-                justify-content: space-between;
-                padding: 27px 20px;
-                border-radius: 2px;
-                border: 1px solid transparent;
-                &.active {
-                    background: rgba(33, 153, 248, 0.1);
-                    border: 1px solid #2199f8;
-                }
-                .info {
-                    .name {
-                        font-size: 18px;
-                        font-weight: bold;
-                        margin-bottom: 2px;
-                    }
-                    span {
-                        color: rgba(0, 0, 0, 0.2);
-                    }
-                }
-                img {
-                    width: 42px;
-                }
-            }
-
-            .card-item + .card-item {
-                margin-top: 20px;
-            }
-        }
-        .button {
-            color: #fff;
-            border-radius: 2px;
-            background: #2199f8;
-            text-align: center;
-            font-size: 16px;
-            padding: 8px 0;
-            margin-top: 50px;
-        }
-    }
-}
-</style>

+ 0 - 155
src/views/old_mini/mine/pages/farm.vue

@@ -1,155 +0,0 @@
-<template>
-    <div class="farm-page">
-        <custom-header name="我的农场"></custom-header>
-        <div class="farm-list">
-            <div class="list-item" v-for="item in farmList" :key="item.id" @click="handleItemClick(item)">
-                <div class="item-info">
-                    <div class="item-top">
-                        <img class="left-img" src="@/assets/img/home/farm.png" alt="" />
-                        <div class="left-content">
-                            <div class="content-title">
-                                <div class="title-left">
-                                    <span class="title-text van-ellipsis">{{ item.name }}</span>
-                                    <div class="content-tag" v-if="item.defaultOption">默认</div>
-                                    <div class="content-text" v-else @click.stop="handleSetDefault(item)">设为默认</div>
-                                </div>
-                                <div class="item-btn">查看详情</div>
-                            </div>
-                            <div class="content-desc">
-                                <div>服务作物:{{ item.speciesName }}</div>
-                                <div>农场位置:{{ item.address }}</div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { ref, onMounted } from "vue";
-import { ElMessageBox } from "element-plus";
-import { useRouter } from "vue-router";
-const router = useRouter();
-const farmList = ref([]);
-onMounted(() => {
-    getFarmList();
-});
-
-const handleSetDefault = async ({id}) => {
-    ElMessageBox.confirm('确定将该农场设为默认农场吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-    }).then(async () => {
-        const { code } = await VE_API.farm.updateFarm({
-            farmId: id,
-            defaultFarm: 1,
-        });  
-        if(code === 0){
-            getFarmList();
-        }
-    }).catch(() => {});
-};
-
-const getFarmList = async () => {
-    const { data } = await VE_API.farm.userFarmSelectOption();
-    farmList.value = data || [];
-};
-
-const handleItemClick = (item) => {
-    router.push({
-        path: '/monitor',
-        query: {
-            farmId: item.id,
-            defaultFarm: item.defaultOption,
-            isHeaderShow: true,
-        },
-    });
-};
-</script>
-
-<style scoped lang="scss">
-.farm-page {
-    width: 100%;
-    height: 100vh;
-    .farm-list {
-        width: 100%;
-        height: calc(100% - 40px);
-        background-color: #f7f7f7;
-        padding: 12px;
-        box-sizing: border-box;
-        overflow: auto;
-        .list-item {
-            background-color: #fff;
-            border-radius: 10px;
-            padding: 10px;
-            display: flex;
-            width: 100%;
-            box-sizing: border-box;
-            .item-info {
-                width: 100%;
-                .item-top {
-                    width: 100%;
-                    display: flex;
-                    align-items: center;
-                    gap: 12px;
-                    .left-img {
-                        width: 68px;
-                        height: 68px;
-                        border-radius: 8px;
-                    }
-                    .left-content {
-                        width: calc(100% - 68px - 12px);
-                        .content-title {
-                            display: flex;
-                            align-items: center;
-                            justify-content: space-between;
-                            margin-bottom: 4px;
-                            font-size: 16px;
-                            font-weight: 500;
-                            .title-left{
-                                display: flex;
-                                align-items: center;
-                                gap: 10px;
-                                width: calc(100% - 62px);
-                                .title-text{
-                                    max-width: calc(100% - 60px);
-                                }
-                                .content-tag {
-                                    background-color: #2199f8;
-                                    color: #fff;
-                                    padding: 2px 8px;
-                                    border-radius: 15px;
-                                    font-size: 12px;
-                                    font-weight: 400;
-                                }
-                                .content-text {
-                                    font-size: 12px;
-                                    color: #2199f8;
-                                    font-weight: 400;
-                                }
-                            }
-                        }
-                        .item-btn {
-                            color: #a8a8a8;
-                            font-size: 14px;
-                            font-weight: 400;
-                        }
-                        .content-desc {
-                            font-size: 12px;
-                            color: #999999;
-                            line-height: 18px;
-                        }
-                    }
-                }
-            }
-        }
-        .list-item + .list-item {
-            margin-top: 12px;
-        }
-    }
-}
-</style>

+ 0 - 1419
src/views/old_mini/mine/pages/farmRecords.vue

@@ -1,1419 +0,0 @@
-<template>
-    <div class="farm-records-page">
-        <custom-header name="农事记录"></custom-header>
-        <div class="record-task">
-            <div class="task-top">
-                <div class="record-filter">
-                    <el-select v-model="farmVal" class="farm-select">
-                        <el-option
-                            v-for="item in farmOptions"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                        />
-                    </el-select>
-                    <el-input v-model="input" :prefix-icon="Search" placeholder="搜索农事" class="farm-search" />
-                </div>
-                <div class="select-box">
-                    <div class="select-item">
-                        <el-select v-model="typeVal" placeholder="时间排序">
-                            <el-option
-                                v-for="item in typeOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
-                        </el-select>
-                    </div>
-                    <div class="select-item">
-                        <el-select v-model="regionVal" placeholder="已复核">
-                            <el-option
-                                v-for="item in regionOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
-                        </el-select>
-                    </div>
-                    <div class="select-item">
-                        <el-select v-model="levelVal" placeholder="筛选">
-                            <el-option
-                                v-for="item in levelOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
-                        </el-select>
-                    </div>
-                </div>
-            </div>
-            <div class="task-content">
-                <div class="plan-menu">
-                    <el-anchor :container="containerRef" direction="vertical" type="default" @click="handleClick">
-                        <el-menu :default-active="defaultActive" class="el-menu-vertical-demo">
-                            <el-sub-menu v-for="(menu, index) in menuData" :key="index" :index="String(menu.id)">
-                                <template #title>
-                                    <img class="menu-icon" :src="require(`@/assets/img/gallery/icon-${index}.png`)" />
-                                    <span class="menu-text">{{ menu.title }}</span>
-                                </template>
-                                <el-menu-item
-                                    v-for="item in menu.children"
-                                    :key="item.id"
-                                    :index="`${menu.id}-${item.id}`"
-                                >
-                                    <el-anchor-link :href="item.href" :title="item.title" />
-                                </el-menu-item>
-                            </el-sub-menu>
-                        </el-menu>
-                    </el-anchor>
-                </div>
-                <div class="expert-content" ref="containerRef">
-                    <div v-for="(section, index) in contentData" :key="index" class="content-section">
-                        <div class="section-id" :id="section.targetId"></div>
-                        <record-item :record-item-data="section" :onlyRecipeName="true" class="recipe-item">
-                            <template #title>
-                                <div class="box-title">
-                                    <div class="title-l">
-                                        {{ section.title }}
-                                        <span class="parent-text">{{ section.parentTitle || "秋梢期" }}</span>
-                                    </div>
-                                    <div class="title-r">
-                                        <span class="r-dot"></span>
-                                        2区
-                                    </div>
-                                </div>
-                            </template>
-                            <template #footer>
-                                <div class="action-group">
-                                    <div class="action-l">查看详情</div>
-                                    <div class="action-r" v-if="section.orderStatus === 0">
-                                        <div class="action-item second-item">拍照识别</div>
-                                        <div class="action-item primary-item">去确认</div>
-                                    </div>
-                                    <div class="action-r" v-if="section.orderStatus === 1">
-                                        <div class="action-item warning-item">发起需求</div>
-                                        <div class="action-item primary-item">确认完成</div>
-                                    </div>
-                                    <div class="action-r" v-if="section.orderStatus === 2">
-                                        <div class="action-item warning-item">发起需求</div>
-                                        <div class="action-item primary-item">去复核</div>
-                                    </div>
-                                </div>
-                            </template>
-                        </record-item>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import recordItem from "@/components/recordItem.vue";
-import customHeader from "@/components/customHeader.vue";
-
-const input = ref("");
-const farmVal = ref("all");
-const farmOptions = ref([
-    { label: "农场1", value: "all" },
-    { label: "荔枝博览园", value: "1" },
-    { label: "荔枝博览园", value: "2" },
-    { label: "荔枝博览园", value: "3" },
-]);
-
-const typeVal = ref(null);
-const regionVal = ref(null);
-const levelVal = ref(null);
-const typeOptions = ref([
-    { label: "全部", value: "all" },
-    { label: "施肥", value: "1" },
-    { label: "用药", value: "2" },
-    { label: "修剪", value: "3" },
-    { label: "其他", value: "4" },
-]);
-
-const regionOptions = ref([
-    {
-        label: "全部",
-        value: "all",
-    },
-    {
-        label: "区域1",
-        value: "1",
-    },
-    {
-        label: "区域2",
-        value: "2",
-    },
-    {
-        label: "区域3",
-        value: "3",
-    },
-]);
-
-const levelOptions = ref([
-    { label: "全部", value: "all" },
-    { label: "紧急", value: "1" },
-    { label: "一般", value: "2" },
-    { label: "不紧急", value: "3" },
-]);
-
-const containerRef = ref(null);
-const handleClick = (e) => {
-    e.preventDefault();
-};
-
-// 菜单
-const defaultActive = ref("1-1");
-
-const menuData = [
-    {
-        id: 1,
-        title: "秋梢期",
-        children: [
-            { id: 1, title: "巡园农事", href: "#part1" },
-            { id: 2, title: "梢期防虫", href: "#part2" },
-            { id: 3, title: "梢期营养", href: "#part3" },
-        ],
-    },
-    {
-        id: 2,
-        title: "开花期",
-        children: [
-            { id: 1, title: "巡园农事", href: "#part4" },
-            { id: 2, title: "摇花吹花", href: "#part5" },
-            { id: 3, title: "花期防治", href: "#part6" },
-        ],
-    },
-];
-
-const contentData = ref([
-    {
-        targetId: "part1",
-        title: "巡园农事",
-        parentTitle: "秋梢期",
-        reCheckText: "本次农事复核成效优异,作物产量潜力实现大幅增长,虫害风险控制优异,未发现虫害风险",
-        expert: 91356,
-        orderStatus: 0,
-        activeStatus: 0,
-        regionId: 2,
-        speciesId: "1",
-        speciesName: "荔枝",
-        farmWorkId: "699343457474318336",
-        farmWorkLibId: "699343457474318336",
-        farmWorkLibName: "梢期防虫",
-        farmWorkName: "梢期防虫",
-        expertIcon:
-            "https://birdseye-img.sysuimars.com/birdseye-look-vue/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250411150343.png",
-        expertName: "韦帮稳",
-        icon: 4,
-        beforeExecuteDate: "2025-08-01",
-        executeDate: "2025-08-15",
-        code: "BZ-BC-04-SQFC-20",
-        expertPrescription: "",
-        condition: "单树嫩叶率大于20.0%",
-        defaultFarmWork: 0,
-        farmWorkType: 3,
-        farmWorkTypeName: "病虫",
-        usageMode: "叶面施",
-        serviceMain: "广州泽秾丰农资有限公司",
-        updateDate6: null,
-        confirmPicture: [],
-        executeMain: "广州泽秾丰农资有限公司",
-        storeShortName: "泽秾丰",
-        serviceRegion: "广州市从化区荔枝博览园",
-        attention: "当前为秋梢期,建议巡园,重点关注叶片、嫩梢等部位",
-    },
-    {
-        targetId: "part2",
-        title: "梢期防虫",
-        parentTitle: "秋梢期",
-        consequenceText: "如果不做本次农事,会导致您的产量、质量下降30%,管理得分降低10分",
-        id: "274654",
-        reCheckText: "本次农事复核成效优异,作物产量潜力实现大幅增长,树体营养较充足,土壤肥力增加",
-        farmName: "荔枝博览园",
-        farmPoint: "POINT(113.61702297075017 23.584863449735067)",
-        orderId: "745923632567422976",
-        area: 2.719998598098755,
-        expert: 91356,
-        orderStatus: 1,
-        activeStatus: 0,
-        farmId: 766,
-        regionId: 2,
-        speciesId: "1",
-        speciesName: "荔枝",
-        agriculturalId: 24,
-        farmWorkId: "699343457444958208",
-        farmWorkLibId: "699343457444958208",
-        farmWorkLibName: "梢期营养",
-        farmWorkName: "梢期营养",
-        expertIcon:
-            "https://birdseye-img.sysuimars.com/birdseye-look-vue/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250411150343.png",
-        expertName: "韦帮稳",
-        expertUserIcon: "",
-        expertUserName: "韦帮稳",
-        icon: 4,
-        indexChart: [],
-        indexName: "",
-        beforeExecuteDate: "2025-05-26",
-        checkDate: null,
-        executeDate: "2025-08-01",
-        indexJson: "",
-        code: "BZ-YY-04-SQYY-20",
-        expertPrescription: "",
-        condition: "园区叶芽率大于20.0%",
-        solarName: "",
-        reCheck: null,
-        executeBlueZones: [
-            {
-                id: "ws0y1m6x7cjz",
-                level: null,
-            },
-            {
-                id: "ws0y1md9v3ht",
-                level: null,
-            },
-            {
-                id: "ws0y1mdspbk7",
-                level: null,
-            },
-            {
-                id: "ws0y1mdvvdsz",
-                level: null,
-            },
-            {
-                id: "ws0y1me545tg",
-                level: null,
-            },
-        ],
-        menu: 1,
-        isEdit: 0,
-        isMaster: null,
-        num: null,
-        purpose: "",
-        selfExec: null,
-        defaultFarmWork: 0,
-        farmWorkType: 2,
-        farmWorkTypeName: "营养",
-        type: 1,
-        execute: 4,
-        updateDate0: "2025-08-20",
-        updateDate1: null,
-        updateDate2: null,
-        updateDate3: null,
-        updateDate4: null,
-        updateDate5: null,
-        usageMode: "根部施",
-        serviceMain: "广州泽秾丰农资有限公司",
-        updateDate6: null,
-        confirmPicture: [],
-        executeMain: "广州泽秾丰农资有限公司",
-        storeShortName: "泽秾丰",
-        weatherWarningMsg: "",
-        executeEvidence: [],
-        userEvaluation: null,
-        reviewDate: null,
-        reviewDate2: null,
-        reviewImage: [],
-        reviewImage2: [],
-        serviceRegion: "广州市从化区荔枝博览园",
-        users: [
-            {
-                id: null,
-                orderId: null,
-                serviceType: null,
-                userType: null,
-                userId: 81881,
-                joinStatus: null,
-                icon: "https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png",
-                userName: "飞鸟种植助手",
-                area: "",
-                point: "",
-                farmName: "",
-                selected: null,
-            },
-        ],
-        cost: null,
-        prescriptionList: [
-            {
-                name: "营养",
-                pesticideFertilizerList: [
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "尿素",
-                        defaultRatio: 0,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 15000.0,
-                        muUsage2: 15000.0,
-                        ratio: 0,
-                        ratio2: 0,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施、根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1001",
-                        pesticideFertilizerId: "1",
-                        pesticideFertilizerName: "尿素",
-                        brand: "山东联盟",
-                        typeName: "营养",
-                        price: 132,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "15-15-15复合肥",
-                        defaultRatio: 0,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 45000.0,
-                        muUsage2: 45000.0,
-                        ratio: 0,
-                        ratio2: 0,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1002",
-                        pesticideFertilizerId: "2",
-                        pesticideFertilizerName: "15-15-15复合肥",
-                        brand: "金正大",
-                        typeName: "营养",
-                        price: 220,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                ],
-            },
-        ],
-        conditionList: [
-            {
-                index: "1-2-001-02-02-02-01-0008",
-                name: "园区叶芽率",
-                type: 1,
-                value: "0.2",
-            },
-        ],
-    },
-    {
-        targetId: "part3",
-        title: "梢期营养",
-        consequenceText: "如果不做本次农事,会导致您的产量、质量下降5%,管理得分降低2分",
-        reCheckText: "本次农事复核成效优异,作物产量潜力实现大幅增长,树体营养较充足,转色速度非常稳定,转色率超过80%",
-        farmName: "荔枝博览园",
-        farmPoint: "POINT(113.61702297075017 23.584863449735067)",
-        orderId: "745923697054846976",
-        area: 2.719998598098755,
-        expert: 91356,
-        orderStatus: 2,
-        activeStatus: 0,
-        farmId: 766,
-        regionId: 2,
-        speciesId: "1",
-        speciesName: "荔枝",
-        agriculturalId: 24,
-        farmWorkId: "699343457482706947",
-        farmWorkLibId: "699343457482706947",
-        farmWorkLibName: "转色营养",
-        farmWorkName: "转色营养",
-        expertIcon:
-            "https://birdseye-img.sysuimars.com/birdseye-look-vue/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250411150343.png",
-        expertName: "韦帮稳",
-        expertUserIcon: "",
-        expertUserName: "韦帮稳",
-        icon: 0,
-        indexChart: [],
-        indexName: "",
-        beforeExecuteDate: "2025-05-26",
-        checkDate: null,
-        executeDate: "2025-05-26",
-        indexJson: "",
-        code: "BZ-YY-06-ZSYY-100",
-        expertPrescription: "",
-        condition: "园区转色率大于20.0%",
-        solarName: "",
-        reCheck: null,
-        executeBlueZones: [
-            {
-                id: "ws0y1m6x7cjz",
-                level: null,
-            },
-            {
-                id: "ws0y1md9v3ht",
-                level: null,
-            },
-            {
-                id: "ws0y1mdspbk7",
-                level: null,
-            },
-            {
-                id: "ws0y1mdvvdsz",
-                level: null,
-            },
-            {
-                id: "ws0y1me545tg",
-                level: null,
-            },
-        ],
-        menu: 1,
-        isEdit: 0,
-        isMaster: null,
-        num: null,
-        purpose: "",
-        selfExec: null,
-        defaultFarmWork: 0,
-        farmWorkType: 2,
-        farmWorkTypeName: "营养",
-        type: 1,
-        execute: 4,
-        updateDate0: "2025-08-20",
-        updateDate1: null,
-        updateDate2: null,
-        updateDate3: null,
-        updateDate4: null,
-        updateDate5: null,
-        usageMode: "根部施",
-        serviceMain: "广州泽秾丰农资有限公司",
-        updateDate6: null,
-        confirmPicture: [],
-        executeMain: "广州泽秾丰农资有限公司",
-        storeShortName: "泽秾丰",
-        weatherWarningMsg: "",
-        executeEvidence: [],
-        userEvaluation: null,
-        reviewDate: null,
-        reviewDate2: null,
-        reviewImage: [],
-        reviewImage2: [],
-        serviceRegion: "广州市从化区荔枝博览园",
-        users: [
-            {
-                id: null,
-                orderId: null,
-                serviceType: null,
-                userType: null,
-                userId: 81881,
-                joinStatus: null,
-                icon: "https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png",
-                userName: "飞鸟种植助手",
-                area: "",
-                point: "",
-                farmName: "",
-                selected: null,
-            },
-        ],
-        cost: null,
-        prescriptionList: [
-            {
-                name: "营养",
-                pesticideFertilizerList: [
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "矿源黄腐酸钾",
-                        defaultRatio: 2000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 4.0,
-                        muUsage2: 4.0,
-                        ratio: 2000,
-                        ratio2: 200,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施、根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1166",
-                        pesticideFertilizerId: "166",
-                        pesticideFertilizerName: "矿源黄腐酸钾",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 15000,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "有机质水溶肥",
-                        defaultRatio: 5000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 10.0,
-                        muUsage2: 10.0,
-                        ratio: 5000,
-                        ratio2: 500,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1167",
-                        pesticideFertilizerId: "167",
-                        pesticideFertilizerName: "有机质水溶肥",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 10000,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "磷酸二氢钾",
-                        defaultRatio: 5000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 10.0,
-                        muUsage2: 10.0,
-                        ratio: 5000,
-                        ratio2: 500,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施、根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1168",
-                        pesticideFertilizerId: "168",
-                        pesticideFertilizerName: "磷酸二氢钾",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 12000,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "高钾复合肥",
-                        defaultRatio: 5000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 10.0,
-                        muUsage2: 10.0,
-                        ratio: 5000,
-                        ratio2: 500,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1169",
-                        pesticideFertilizerId: "169",
-                        pesticideFertilizerName: "高钾复合肥",
-                        brand: "未知",
-                        typeName: "营养",
-                        price: 245,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "红牛硫酸钾",
-                        defaultRatio: 5000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 10.0,
-                        muUsage2: 10.0,
-                        ratio: 5000,
-                        ratio2: 500,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1170",
-                        pesticideFertilizerId: "170",
-                        pesticideFertilizerName: "红牛硫酸钾",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 230,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                ],
-            },
-        ],
-        conditionList: [
-            {
-                index: "1-2-016-02-02-02-01-0008",
-                name: "园区转色率",
-                type: 1,
-                value: "0.2",
-            },
-        ],
-    },
-    {
-        targetId: "part4",
-        title: "巡园农事",
-        parentTitle: "开花期",
-        consequenceText: "如果不做本次农事,会导致您的产量、质量下降20%,管理得分降低8分",
-        id: "274672",
-        reCheckText: "本次农事复核成效优异,作物产量潜力实现大幅增长,病虫害基数得到大幅下降,未发现病虫害风险",
-        farmName: "荔枝博览园",
-        farmPoint: "POINT(113.61702297075017 23.584863449735067)",
-        orderId: "745923690209742848",
-        area: 2.719998598098755,
-        expert: 91356,
-        orderStatus: 3,
-        activeStatus: 0,
-        farmId: 766,
-        regionId: 2,
-        speciesId: "1",
-        speciesName: "荔枝",
-        agriculturalId: 24,
-        farmWorkId: "699343457478512646",
-        farmWorkLibId: "699343457478512646",
-        farmWorkLibName: "果期防治II",
-        farmWorkName: "果期防治II",
-        expertIcon:
-            "https://birdseye-img.sysuimars.com/birdseye-look-vue/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250411150343.png",
-        expertName: "韦帮稳",
-        expertUserIcon: "",
-        expertUserName: "韦帮稳",
-        icon: 1,
-        indexChart: [],
-        indexName: "",
-        beforeExecuteDate: "2025-05-06",
-        checkDate: null,
-        executeDate: "2025-05-12",
-        indexJson: "",
-        code: "BZ-BC-06-GQFZ2-100",
-        expertPrescription: "",
-        condition: "园区膨果率大于20.0%",
-        solarName: "",
-        reCheck: null,
-        executeBlueZones: [
-            {
-                id: "ws0y1m6x7cjz",
-                level: null,
-            },
-            {
-                id: "ws0y1md9v3ht",
-                level: null,
-            },
-            {
-                id: "ws0y1mdspbk7",
-                level: null,
-            },
-            {
-                id: "ws0y1mdvvdsz",
-                level: null,
-            },
-            {
-                id: "ws0y1me545tg",
-                level: null,
-            },
-        ],
-        menu: 1,
-        isEdit: 0,
-        isMaster: null,
-        num: null,
-        purpose: "",
-        selfExec: null,
-        defaultFarmWork: 0,
-        farmWorkType: 3,
-        farmWorkTypeName: "病虫",
-        type: 1,
-        execute: 4,
-        updateDate0: "2025-08-20",
-        updateDate1: null,
-        updateDate2: null,
-        updateDate3: null,
-        updateDate4: null,
-        updateDate5: null,
-        usageMode: "叶面施",
-        serviceMain: "广州泽秾丰农资有限公司",
-        updateDate6: null,
-        confirmPicture: [],
-        executeMain: "广州泽秾丰农资有限公司",
-        storeShortName: "泽秾丰",
-        weatherWarningMsg: "",
-        executeEvidence: [],
-        userEvaluation: null,
-        reviewDate: null,
-        reviewDate2: null,
-        reviewImage: [],
-        reviewImage2: [],
-        serviceRegion: "广州市从化区荔枝博览园",
-        users: [
-            {
-                id: null,
-                orderId: null,
-                serviceType: null,
-                userType: null,
-                userId: 81881,
-                joinStatus: null,
-                icon: "https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png",
-                userName: "飞鸟种植助手",
-                area: "",
-                point: "",
-                farmName: "",
-                selected: null,
-            },
-        ],
-        cost: null,
-        prescriptionList: [
-            {
-                name: "病虫",
-                pesticideFertilizerList: [
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "威远.绿凯",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 150.0,
-                        muUsage2: 150.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1147",
-                        pesticideFertilizerId: "147",
-                        pesticideFertilizerName: "威远.绿凯",
-                        brand: "利民控股绿凯",
-                        typeName: "病虫",
-                        price: 90,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "微量元素益元液",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 300.0,
-                        muUsage2: 300.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1174",
-                        pesticideFertilizerId: "174",
-                        pesticideFertilizerName: "微量元素益元液",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 60,
-                        unit: "ml",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "中量元素益元液",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 300.0,
-                        muUsage2: 300.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1175",
-                        pesticideFertilizerId: "175",
-                        pesticideFertilizerName: "中量元素益元液",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 30,
-                        unit: "ml",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "济南中科翠剑",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 150.0,
-                        muUsage2: 150.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1149",
-                        pesticideFertilizerId: "149",
-                        pesticideFertilizerName: "吡唑醚菌酯",
-                        brand: "济南中科翠剑",
-                        typeName: "病虫",
-                        price: 60,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "佳果天成",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 300.0,
-                        muUsage2: 300.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1171",
-                        pesticideFertilizerId: "171",
-                        pesticideFertilizerName: "佳果天成",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 120,
-                        unit: "ml",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "高效氟氯氰菊酯",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 150.0,
-                        muUsage2: 150.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1155",
-                        pesticideFertilizerId: "155",
-                        pesticideFertilizerName: "高效氟氯氰菊酯",
-                        brand: "广东立威.立功",
-                        typeName: "病虫",
-                        price: 50,
-                        unit: "ml",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "联苯噻虫嗪",
-                        defaultRatio: 150000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 150.0,
-                        muUsage2: 150.0,
-                        ratio: 150000,
-                        ratio2: 15000,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1156",
-                        pesticideFertilizerId: "156",
-                        pesticideFertilizerName: "联苯噻虫嗪",
-                        brand: "青岛金正飞灵",
-                        typeName: "病虫",
-                        price: 60,
-                        unit: "ml",
-                        executeStyle: null,
-                    },
-                ],
-            },
-        ],
-        conditionList: [
-            {
-                index: "1-2-014-02-02-02-01-0008",
-                name: "园区膨果率",
-                type: 1,
-                value: "0.2",
-            },
-        ],
-    },
-    {
-        id: "part5",
-        title: "摇花吹花",
-        parentTitle: "开花期",
-        consequenceText: "如果不做本次农事,会导致您的产量、质量下降15%,管理得分降低5分",
-        id: "274671",
-        reCheckText: "本次农事复核成效优异,作物产量潜力实现大幅增长,树体营养较充足,膨果速度非常稳定,膨果率超过80%",
-        farmName: "荔枝博览园",
-        farmPoint: "POINT(113.61702297075017 23.584863449735067)",
-        orderId: "745923686854299648",
-        area: 2.719998598098755,
-        expert: 91356,
-        orderStatus: 4,
-        activeStatus: 0,
-        farmId: 766,
-        regionId: 2,
-        speciesId: "1",
-        speciesName: "荔枝",
-        agriculturalId: 24,
-        farmWorkId: "699343457482706944",
-        farmWorkLibId: "699343457482706944",
-        farmWorkLibName: "膨果营养",
-        farmWorkName: "膨果营养",
-        expertIcon:
-            "https://birdseye-img.sysuimars.com/birdseye-look-vue/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250411150343.png",
-        expertName: "韦帮稳",
-        expertUserIcon: "",
-        expertUserName: "韦帮稳",
-        icon: 2,
-        indexChart: [],
-        indexName: "",
-        beforeExecuteDate: "2025-05-01",
-        checkDate: null,
-        executeDate: "2025-05-06",
-        indexJson: "",
-        code: "BZ-YY-06-PGYY-100",
-        expertPrescription: "",
-        condition: "园区膨果率大于10.0%",
-        solarName: "",
-        reCheck: null,
-        executeBlueZones: [
-            {
-                id: "ws0y1m6x7cjz",
-                level: null,
-            },
-            {
-                id: "ws0y1md9v3ht",
-                level: null,
-            },
-            {
-                id: "ws0y1mdspbk7",
-                level: null,
-            },
-            {
-                id: "ws0y1mdvvdsz",
-                level: null,
-            },
-            {
-                id: "ws0y1me545tg",
-                level: null,
-            },
-        ],
-        menu: 1,
-        isEdit: 0,
-        isMaster: null,
-        num: null,
-        purpose: "",
-        selfExec: null,
-        defaultFarmWork: 0,
-        farmWorkType: 2,
-        farmWorkTypeName: "营养",
-        type: 1,
-        execute: 4,
-        updateDate0: "2025-08-20",
-        updateDate1: null,
-        updateDate2: null,
-        updateDate3: null,
-        updateDate4: null,
-        updateDate5: null,
-        usageMode: "根部施",
-        serviceMain: "广州泽秾丰农资有限公司",
-        updateDate6: null,
-        confirmPicture: [],
-        executeMain: "广州泽秾丰农资有限公司",
-        storeShortName: "泽秾丰",
-        weatherWarningMsg: "",
-        executeEvidence: [],
-        userEvaluation: null,
-        reviewDate: null,
-        reviewDate2: null,
-        reviewImage: [],
-        reviewImage2: [],
-        serviceRegion: "广州市从化区荔枝博览园",
-        users: [
-            {
-                id: null,
-                orderId: null,
-                serviceType: null,
-                userType: null,
-                userId: 81881,
-                joinStatus: null,
-                icon: "https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png",
-                userName: "飞鸟种植助手",
-                area: "",
-                point: "",
-                farmName: "",
-                selected: null,
-            },
-        ],
-        cost: null,
-        prescriptionList: [
-            {
-                name: "营养",
-                pesticideFertilizerList: [
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "硝酸铵钙",
-                        defaultRatio: 0,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 15000.0,
-                        muUsage2: 15000.0,
-                        ratio: 0,
-                        ratio2: 0,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1162",
-                        pesticideFertilizerId: "162",
-                        pesticideFertilizerName: "硝酸铵钙",
-                        brand: "未知",
-                        typeName: "营养",
-                        price: 2000,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "氯化钾",
-                        defaultRatio: 0,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 15000.0,
-                        muUsage2: 15000.0,
-                        ratio: 0,
-                        ratio2: 0,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1163",
-                        pesticideFertilizerId: "163",
-                        pesticideFertilizerName: "氯化钾",
-                        brand: "未知",
-                        typeName: "营养",
-                        price: 4500,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "高氮水溶肥",
-                        defaultRatio: 5000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 10.0,
-                        muUsage2: 10.0,
-                        ratio: 5000,
-                        ratio2: 500,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1165",
-                        pesticideFertilizerId: "165",
-                        pesticideFertilizerName: "高氮水溶肥",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 8500,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                    {
-                        defaultDroneRatio: null,
-                        defaultName: "矿源黄腐酸钾",
-                        defaultRatio: 2000,
-                        id: null,
-                        muPrice: null,
-                        muUsage: 4.0,
-                        muUsage2: 4.0,
-                        ratio: 2000,
-                        ratio2: 200,
-                        remark: "",
-                        usageMode: "",
-                        usageModeList: ["叶面施、根部施"],
-                        orderId: null,
-                        pesticideFertilizerCode: "1166",
-                        pesticideFertilizerId: "166",
-                        pesticideFertilizerName: "矿源黄腐酸钾",
-                        brand: "广州大炎",
-                        typeName: "营养",
-                        price: 15000,
-                        unit: "g",
-                        executeStyle: null,
-                    },
-                ],
-            },
-        ],
-        conditionList: [
-            {
-                index: "1-2-014-02-02-02-01-0008",
-                name: "园区膨果率",
-                type: 1,
-                value: "0.1",
-            },
-        ],
-    },
-]);
-</script>
-
-<style lang="scss" scoped>
-.farm-records-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f5f7fb;
-    .record-task {
-        height: 100%;
-        width: 100%;
-        .task-top {
-            padding: 0 12px;
-            border-radius: 0 0 14px 14px;
-            .record-filter {
-                display: flex;
-                justify-content: space-between;
-                align-items: center;
-                margin-top: 12px;
-                .farm-select {
-                    width: 110px;
-                    margin-right: 10px;
-                    ::v-deep {
-                        .el-select__wrapper {
-                            border-radius: 25px;
-                            background: none;
-                            box-shadow: none;
-                            border: 1px solid #2199f8;
-                            justify-content: center;
-                        }
-                        .el-select__selection {
-                            flex: none;
-                            width: fit-content;
-                        }
-                        .el-select__placeholder {
-                            color: #2199f8;
-                            position: static;
-                            transform: none;
-                            width: fit-content;
-                        }
-                        .el-select__caret {
-                            color: #2199f8;
-                        }
-                    }
-                }
-                .farm-search {
-                    width: calc(100% - 120px);
-                    ::v-deep {
-                        .el-input__wrapper {
-                            border-radius: 25px;
-                            box-shadow: none;
-                        }
-                    }
-                }
-            }
-            .select-box {
-                padding: 5px 10px 0 10px;
-                box-sizing: border-box;
-                width: 100%;
-                display: flex;
-                justify-content: space-between;
-                .select-item {
-                    width: fit-content;
-                    ::v-deep {
-                        .el-input__wrapper {
-                            background: none;
-                            box-shadow: none;
-                        }
-                        .el-input__inner {
-                            font-size: 14px;
-                            color: rgba(0, 0, 0, 0.2);
-                        }
-                        .el-select__wrapper {
-                            background: none;
-                            box-shadow: none;
-                            gap: 2px;
-                            padding: 4px 2px;
-                            justify-content: center;
-                        }
-                        .el-select__selection {
-                            flex: none;
-                            width: fit-content;
-                        }
-                        .el-select__placeholder {
-                            color: rgba(0, 0, 0, 0.2);
-                            position: static;
-                            transform: none;
-                            width: fit-content;
-                        }
-                    }
-                }
-            }
-        }
-        .task-content {
-            display: flex;
-            padding-top: 10px;
-            height: calc(100% - 140px);
-            .plan-menu {
-                width: 90px;
-                height: 100%;
-                padding: 10px 0;
-                box-sizing: border-box;
-                background: #fff;
-                border-radius: 0 10px 10px 0;
-                .menu-icon {
-                    width: 13px;
-                }
-                .menu-text {
-                    padding: 0 4px;
-                }
-                ::v-deep {
-                    .el-anchor {
-                        height: 100%;
-                        background: none;
-                    }
-                    .el-anchor__marker {
-                        display: none;
-                    }
-                    .el-menu {
-                        background: none;
-                        border: none;
-                        .el-sub-menu__title {
-                            background: none;
-                            padding: 0 2px;
-                            justify-content: center;
-                        }
-                        .el-sub-menu__title {
-                            height: 32px;
-                        }
-                        .el-sub-menu .el-sub-menu__icon-arrow {
-                            position: static;
-                            padding-top: 6px;
-                        }
-                        .el-sub-menu {
-                            margin-bottom: 16px;
-                            &.is-opened {
-                                .el-sub-menu__icon-arrow {
-                                    padding-bottom: 6px;
-                                    padding-top: 0;
-                                }
-                            }
-                            .el-menu-item {
-                                height: 32px;
-                                line-height: 32px;
-                                margin: 4px 8px;
-                                padding: 0 2px;
-                                justify-content: center;
-                                background: none;
-                            }
-                            .el-menu-item.is-active {
-                                background: none;
-                                color: #fff;
-                            }
-                            .el-anchor__item {
-                                width: 100%;
-                                text-align: center;
-                            }
-                            .el-anchor__link {
-                                color: #666666;
-                            }
-                            .el-anchor__link.is-active {
-                                background: linear-gradient(180deg, #70bffe, #2199f8);
-                                border-radius: 20px;
-                                color: #fff;
-                            }
-                        }
-                    }
-                    .el-anchor__list {
-                        padding-left: 0;
-                    }
-                }
-            }
-            .expert-content {
-                width: calc(100% - 90px);
-                height: 100%;
-                overflow: auto;
-                padding-bottom: 10px;
-                box-sizing: border-box;
-                .content-section {
-                    position: relative;
-                    .section-id {
-                        position: absolute;
-                        // top: -6px;
-                        top: 0;
-                        width: 100%;
-                        height: 1px;
-                    }
-                    .recipe-item {
-                        margin-right: 0;
-                    }
-                }
-                .box-title {
-                    display: flex;
-                    align-items: center;
-                    justify-content: space-between;
-                    padding-bottom: 8px;
-                    .title-l {
-                        font-size: 16px;
-                        font-weight: 600;
-                        color: #000;
-                        .parent-text {
-                            margin-left: 5px;
-                            font-size: 12px;
-                            font-weight: normal;
-                            padding: 4px 6px;
-                            border-radius: 14px;
-                            background: rgba(119, 119, 119, 0.1);
-                        }
-                    }
-                    .title-btn {
-                        width: 24px;
-                        height: 24px;
-                        border-radius: 50%;
-                        background: #2199f8;
-                        display: flex;
-                        align-items: center;
-                        justify-content: center;
-                    }
-                    .title-r {
-                        display: flex;
-                        align-items: center;
-                        color: #ff8a2a;
-                        font-size: 12px;
-                        .r-dot {
-                            width: 6px;
-                            height: 6px;
-                            border-radius: 50%;
-                            background: #ff8a2a;
-                            margin-right: 5px;
-                        }
-                    }
-                }
-
-                .action-group {
-                    display: flex;
-                    align-items: center;
-                    justify-content: space-between;
-                    padding-top: 8px;
-                    margin-top: 8px;
-                    border-top: 1px solid #f5f5f5;
-                    .action-l {
-                        font-size: 12px;
-                    }
-                    .action-r {
-                        display: flex;
-                        align-items: center;
-                        .action-item {
-                            padding: 0 11px;
-                            height: 30px;
-                            line-height: 30px;
-                            border-radius: 14px;
-                            font-size: 12px;
-                            &.second-item {
-                                border: 1px solid #2199f8;
-                                color: #2199f8;
-                            }
-                            &.primary-item {
-                                background: #2199f8;
-                                color: #fff;
-                            }
-                            &.warning-item {
-                                background: rgba(255, 131, 29, 0.1);
-                                color: #ff831d;
-                            }
-                        }
-                        .action-item + .action-item {
-                            margin-left: 5px;
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 208
src/views/old_mini/mine/pages/message.vue

@@ -1,208 +0,0 @@
-<template>
-    <div class="message-page">
-        <custom-header name="系统提醒" bgColor="#f7f7f7"></custom-header>
-        <List
-            v-model:loading="loading"
-            :finished="finished"
-            finished-text="没有更多了"
-            @load="onLoad"
-            :immediate-check="false"
-        >
-            <div class="message-list">
-                <div class="message-item" v-for="(item, index) in messageList" :key="index" @click="handleItem(item)">
-                    <el-badge class="badge" is-dot v-if="!item.status"> </el-badge>
-                    <div class="message-content">
-                        <div class="title">
-                            收到来自{{ item.farmData?.farmName }}的{{ item.farmData?.farmWorkName }}农事提醒
-                        </div>
-                        <div class="desc">{{ item.desc }}</div>
-                        <div class="footer">
-                            <div class="footer-left">
-                                <span class="view-detail">查看详情</span>
-                                <span class="date">{{ formatDate(item.createDate) }}</span>
-                            </div>
-                            <el-icon class="arrow-icon"><ArrowRight /></el-icon>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </List>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted } from "vue";
-import { useRouter } from "vue-router";
-import { ArrowRight } from "@element-plus/icons-vue";
-import { List } from "vant";
-import customHeader from "@/components/customHeader.vue";
-
-const router = useRouter();
-
-const handleItem = async (item) => {
-    VE_API.mine.confirmCard({ id: item.id }).then(async (res) => {
-        if (res.code === 0) {
-            const { data } = await VE_API.z_farm_work_record.getDetail({ id: item.farmData.farmWorkRecordId });
-            if (data && data.length > 0) {
-                const imgLength = data[0].executeEvidence.length;
-                if (imgLength > 0) {
-                    router.push("/review_work?miniJson=" + JSON.stringify({ id: data[0].id }));
-                } else {
-                    router.push("/completed_work?miniJson=" + JSON.stringify({ id: item.farmData.farmWorkRecordId }));
-                }
-            }
-        }
-    });
-};
-
-// 分页相关状态
-const messageList = ref([]);
-const loading = ref(false);
-const finished = ref(false);
-const currentPage = ref(1);
-const pageSize = ref(10);
-
-// 加载数据
-const getNoticeList = async () => {
-    try {
-        loading.value = true;
-        const params = {
-            page: currentPage.value,
-            limit: pageSize.value,
-            popType: 0,
-        };
-        const res = await VE_API.mine.listNotice(params);
-
-        if (res.data && res.data.length > 0) {
-            const newData = res.data.map((item) => {
-                return {
-                    ...item,
-                    farmData: JSON.parse(item.data),
-                };
-            });
-
-            if (currentPage.value === 1) {
-                messageList.value = newData;
-            } else {
-                messageList.value = [...messageList.value, ...newData];
-            }
-
-            // 如果返回的数据少于每页数量,说明没有更多数据了
-            if (res.data.length < pageSize.value) {
-                finished.value = true;
-            }
-        } else {
-            // 没有数据时,如果是第一页,显示空列表;否则标记为完成
-            if (currentPage.value === 1) {
-                messageList.value = [];
-            }
-            finished.value = true;
-        }
-    } catch (error) {
-        console.error("获取消息列表失败:", error);
-        finished.value = true;
-    } finally {
-        loading.value = false;
-    }
-};
-
-// 滚动加载更多
-const onLoad = () => {
-    if (finished.value) {
-        return;
-    }
-    currentPage.value += 1;
-    getNoticeList();
-};
-
-// 初始化加载
-onMounted(() => {
-    currentPage.value = 1;
-    finished.value = false;
-    getNoticeList();
-});
-
-// 格式化日期为 MM-DD 格式
-const formatDate = (dateStr) => {
-    if (!dateStr) return "--";
-    const date = new Date(dateStr);
-    if (Number.isNaN(date.getTime())) return dateStr;
-    const m = `${date.getMonth() + 1}`.padStart(2, "0");
-    const d = `${date.getDate()}`.padStart(2, "0");
-    return `${m}-${d}`;
-};
-</script>
-
-<style lang="scss" scoped>
-.message-page {
-    position: relative;
-    width: 100%;
-    height: 100vh;
-    box-sizing: border-box;
-    background-color: #f7f7f7;
-    display: flex;
-    flex-direction: column;
-
-    ::v-deep .van-list {
-        flex: 1;
-        height: calc(100vh - 40px);
-        overflow-y: auto;
-        padding: 12px;
-        box-sizing: border-box;
-    }
-
-    .message-list {
-        width: 100%;
-        .message-item {
-            background-color: #fff;
-            border-radius: 14px;
-            padding: 16px;
-            position: relative;
-            .badge {
-                position: absolute;
-                top: 0;
-                right: 0;
-            }
-            .message-content {
-                .title {
-                    font-size: 16px;
-                    font-weight: 500;
-                    margin-bottom: 8px;
-                }
-                .desc {
-                    color: #bbbbbb;
-                    margin-bottom: 10px;
-                }
-                .footer {
-                    display: flex;
-                    align-items: center;
-                    justify-content: space-between;
-                    border-top: 1px solid #f5f5f5;
-                    padding-top: 10px;
-                    .footer-left {
-                        display: flex;
-                        align-items: center;
-                    }
-                    .view-detail {
-                        color: #333333;
-                        font-size: 14px;
-                        margin-right: 8px;
-                    }
-                    .date {
-                        color: #b6b6b6;
-                        font-size: 14px;
-                    }
-                }
-            }
-            .arrow-icon {
-                color: #999999;
-                font-size: 16px;
-                margin-left: 12px;
-            }
-        }
-        .message-item + .message-item {
-            margin-top: 12px;
-        }
-    }
-}
-</style>

+ 0 - 149
src/views/old_mini/mine/pages/messageList.vue

@@ -1,149 +0,0 @@
-<template>
-    <div class="container">
-        <custom-header name="我的消息" isGoBack @goback="headerCallBack"></custom-header>
-        <div class="message-list">
-            <div class="message-item" v-for="(item, index) in messageList" :key="index" @click="handleItem(item)">
-                <div class="message">
-                    <img class="img" :src="item.targetUserAvatar || 'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'" alt="">
-                    <div class="info">
-                        <span class="name">{{item.targetUserName || '飞鸟种植助手'}}</span>
-                        <div class="van-ellipsis" v-if="item.newMessageType==='image'">[图片]</div>
-                        <div class="van-ellipsis" v-else>{{item.newContent}}</div>
-                    </div>
-                </div>
-                <div class="date-time">
-                    <div>{{timeFormat(item.updateTime) || '03/22 13:08'}}</div>
-                    <badge v-show="item.unreadCount&&item.unreadCount!=0" class="badge" :content="item.unreadCount" max="99"></badge>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { Badge } from "vant";
-import { onMounted, ref,onUnmounted } from "vue";
-import MqttClient from "@/plugins/MqttClient";
-import { useRouter,useRoute } from "vue-router";
-import customHeader from "@/components/customHeader.vue";
-const router = useRouter();
-const route = useRoute();
-const userId = Number(localStorage.getItem('MINI_USER_ID'))
-
-const messageList = ref([]);
-
-const timeFormat = (dateStr) =>{
-    // 提取月、日、时、分
-    const [, month, day, hours, minutes] = dateStr.match(
-    /(\d{2})-(\d{2})T(\d{2}):(\d{2})/
-    );
-    const formattedDate = `${month}/${day} ${hours}:${minutes}`;
-    return formattedDate
-}
-
-const handleItem = ({targetUserId,farmId}) =>{
-    VE_API.bbs.readUpdate({ targetUserId,farmId }).then((res) => {
-        if (res.code === 0) {
-            router.push(`/chat_frame?userId=${targetUserId}&farmId=${farmId}&formPage=${route.query.from}`);
-        }
-    });
-}
-
-const headerCallBack = () =>{
-    if(route.query.from === 'monitor') {
-        router.replace('/monitor');
-    } else {
-        router.replace('/mine');
-    }
-}
-
-const mqttClient = ref(null)
-const initMqtt = () =>{
-    mqttClient.value = new MqttClient(['chat/message/'+userId], (topic, message) => {
-        getMessageList()
-    });
-
-    mqttClient.value.connect();
-}
-
-const getMessageList = () =>{
-    VE_API.bbs.getSessionListAll().then((res) => {
-        messageList.value = res.data || [];
-    });
-}
-
-const getListByFarm = () =>{
-    VE_API.bbs.sessionListByFarm({ farmId: route.query.farmId }).then((res) => {
-        messageList.value = res.data || [];
-    });
-}
-
-onMounted(()=>{
-    // initMqtt()
-    if(localStorage.getItem('SET_USER_CUR_ROLE') == 0){
-        getListByFarm()
-    }else{
-        getMessageList()
-    }
-})
-
-// onUnmounted(()=>{
-//     mqttClient.value.client.end(true);
-// })
-</script>
-
-<style lang="scss" scoped>
-.container {
-    width: 100%;
-    height: 100vh;
-    background: #f7f7f7;
-    .message-list {
-        width: 100%;
-        height: calc(100% - 40px);
-        overflow: auto;
-        box-sizing: border-box;
-        padding: 0 12px;
-        .message-item {
-            margin-top: 12px;
-            display: flex;
-            justify-content: space-between;
-            background: #fff;
-            padding: 12px;
-            border-radius: 8px;
-
-            .message {
-                width: calc(100% - 64px - 58px - 10px);
-                display: flex;
-                .img {
-                    width: 48px;
-                    height: 48px;
-                    margin-right: 10px;
-                    border-radius: 10px;
-                    border-radius: 50%;
-                }
-                .info {
-                    width: 100%;
-                    color: #999999;
-                    line-height: 24px;
-                    .name {
-                        color: #333333;
-                        font-size: 16px;
-                        font-weight: 500;
-                    }
-                }
-            }
-            .date-time{
-                color: #BBBBBB;
-                font-size: 12px;
-                display: flex;
-                flex-direction: column;
-                align-items: flex-end;
-                margin-top: 4px;
-                .badge{
-                    margin: 20px 15px -6px 0;
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 101
src/views/old_mini/mine/pages/projectManager.vue

@@ -1,101 +0,0 @@
-<template>
-    <div class="authentication-page">
-        <custom-header name="项目管理员"></custom-header>
-        <div class="team-content">
-            <template v-if="teamList && teamList.length">
-                <div class="team-list">
-                    <farm-info-card
-                        v-for="ele in teamList"
-                        :key="ele.id"
-                        class="list-item"
-                        :data="{
-                            ...ele,
-                            maxWidth: 'fit-content',
-                            roleName: '项目管理员',
-                        }"
-                    >
-                        <template #right>
-                            <div @click.stop="handleRemoveProjectManager(ele)">移除</div>
-                        </template>
-                    </farm-info-card>
-                </div>
-            </template>
-            <div v-else class="empty-wrap">
-                <div class="empty-text">暂无数据</div>
-            </div>
-        </div>
-        <div class="custom-bottom-fixed-btns">
-            <div class="bottom-btn primary-btn" @click="handleAddProjectManager">添加项目管理员</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import FarmInfoCard from "@/components/pageComponents/FarmInfoCard.vue";
-import { ref, onMounted } from "vue";
-import { useRouter } from "vue-router";
-import { ElMessage, ElMessageBox } from "element-plus";
-const router = useRouter();
-
-const handleRemoveProjectManager = async (item) => {
-    ElMessageBox.confirm('确定移除该成员吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-    }).then(async () => {
-        const { code,msg } = await VE_API.mine.saveManager({id: item.id, role: 3,permissions:["TASK_ORDER"]});
-        if (code === 0) {
-            ElMessage.success("移除成功");
-            getManagerList();
-        } else {
-            ElMessage.error(msg);
-        }
-    }).catch(() => {});
-};
-
-const handleAddProjectManager = () => {
-    router.push("/team_manage?add=true");
-};
-
-onMounted(() => {
-    getManagerList();
-});
-
-const teamList = ref([]);
-const getManagerList = async () => {
-    const { data } = await VE_API.mine.listManagerList();
-    if (data && data.length > 0) {
-        const list = Array.isArray(data) ? data.filter((item) => item.role == 2) : [];
-        teamList.value = list;
-    }
-};
-</script>
-
-<style lang="scss" scoped>
-.authentication-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f5f7fb;
-    .team-content {
-        width: 100%;
-        height: 100%;
-        padding: 10px 12px;
-        box-sizing: border-box;
-        .team-list {
-            width: 100%;
-        }
-        .empty-wrap {
-            padding-top: 40px;
-            text-align: center;
-            .empty-text {
-                font-size: 14px;
-                color: #86909c;
-            }
-        }
-    }
-    .custom-bottom-fixed-btns {
-        justify-content: center;
-    }
-}
-</style>

+ 0 - 451
src/views/old_mini/mine/pages/register.vue

@@ -1,451 +0,0 @@
-<template>
-    <div class="register-page">
-        <custom-header :name="'注册' + pageName" bgColor="#E6F2FF"></custom-header>
-        <div class="content">
-            <Form @submit="onSubmit" required="auto" label-width="74px" ref="formRef">
-                <div class="card">
-                    <div class="card-title">
-                        <img src="@/assets/img/mine/label-icon.png" alt="" />
-                        <span>基本信息</span>
-                    </div>
-                    <div class="form">
-                        <field
-                            v-model="formData.name"
-                            label="姓名"
-                            :rules="[{ required: true, message: '请输入姓名' }]"
-                            placeholder="请输入姓名"
-                        />
-                        <field
-                            v-model="formData.tel"
-                            type="tel"
-                            name="tel"
-                            label="联系电话"
-                            :rules="[{ required: true, validator: validatorTel, message: '请输入电话号码' }]"
-                            placeholder="请输入电话号码"
-                        />
-                        <field
-                            v-show="pageType === 'NZ'"
-                            v-model="formData.subjectName"
-                            label="主体名称"
-                            placeholder="请输入主体名称"
-                        />
-                        <template v-if="pageType === 'EXPERT'">
-                            <field
-                                label-width="130px"
-                                readonly
-                                v-model="number"
-                                label="服务过的果园数量"
-                                placeholder="点击选择服务数量"
-                            >
-                                <template #input>
-                                    <el-dropdown trigger="click">
-                                        <div class="el-dropdown-link-text">
-                                            {{ number }}
-                                            <el-icon class="el-icon--right">
-                                                <CaretBottom />
-                                            </el-icon>
-                                        </div>
-                                        <template #dropdown>
-                                            <el-dropdown-menu class="v-dropdown-menu">
-                                                <el-dropdown-item
-                                                    v-for="(item, index) in numberList"
-                                                    :key="index"
-                                                    :class="{ active: numberActive === index }"
-                                                    @click="handleNumberDropdown(item, index)"
-                                                    >{{ item }}</el-dropdown-item
-                                                >
-                                            </el-dropdown-menu>
-                                        </template>
-                                    </el-dropdown>
-                                </template>
-                            </field>
-                            <field
-                                label-width="130px"
-                                readonly
-                                v-model="year"
-                                label="从事种植指导年数"
-                                placeholder="点击选择指导年数"
-                            >
-                                <template #input>
-                                    <el-dropdown trigger="click">
-                                        <div class="el-dropdown-link-text">
-                                            {{ year }}
-                                            <el-icon class="el-icon--right">
-                                                <CaretBottom />
-                                            </el-icon>
-                                        </div>
-                                        <template #dropdown>
-                                            <el-dropdown-menu class="v-dropdown-menu">
-                                                <el-dropdown-item
-                                                    v-for="(item, index) in yearList"
-                                                    :key="index"
-                                                    :class="{ active: yearActive === index }"
-                                                    @click="handleYearDropdown(item, index)"
-                                                    >{{ item }}</el-dropdown-item
-                                                >
-                                            </el-dropdown-menu>
-                                        </template>
-                                    </el-dropdown>
-                                </template>
-                            </field>
-                        </template>
-                        <div class="flex" v-else>
-                            <field v-model="formData.address" label="服务区域" readonly placeholder="默认位置" />
-                            <el-dropdown trigger="click">
-                                <div class="el-dropdown-link">
-                                    {{ dropdownName }}
-                                    <el-icon class="el-icon--right">
-                                        <CaretBottom />
-                                    </el-icon>
-                                </div>
-                                <template #dropdown>
-                                    <el-dropdown-menu class="v-dropdown-menu">
-                                        <el-dropdown-item
-                                            v-for="(item, index) in dropdownList"
-                                            :key="index"
-                                            :class="{ active: active === index }"
-                                            @click="handleDropdown(item, index)"
-                                            >{{ item }}</el-dropdown-item
-                                        >
-                                    </el-dropdown-menu>
-                                </template>
-                            </el-dropdown>
-                        </div>
-                        <upload ref="uploadRef" v-show="pageType === 'NZ'" exampleImg :maxCount="1" class="upload-wrap" @handleUpload="handleUploadSuccess">
-                            <div class="upload-btn">
-                                点击上传营业执照
-                            </div>
-                        </upload>
-                    </div>
-                </div>
-                <div class="card" v-if="pageType == 'EXPERT'">
-                    <div class="card-title">
-                        <img src="@/assets/img/mine/label-icon.png" alt="" />
-                        <span>个人简介</span>
-                    </div>
-                    <div class="form">
-                        <el-input v-model="input" :rows="5" type="textarea" placeholder="描述:" />
-                    </div>
-                </div>
-                <template v-else>
-                    <ServiceInfo 
-                        v-model:crops="crops"
-                        v-model:serviceTypes="serviceTypes"
-                        v-model:machines="machines"
-                        v-model:isEdit="isEdit"
-                        ref="serviceInfoRef"
-                    />
-                </template>
-                <Button class="button" round block type="primary" native-type="submit"> 提交 </Button>
-            </Form>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { Field, Form, Button } from "vant";
-import { onActivated, onDeactivated, ref } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import { ElMessage } from "element-plus";
-import upload from "@/components/upload";
-import ServiceInfo from "@/components/pageComponents/ServiceInfo.vue";
-const route = useRoute();
-const router = useRouter();
-
-const uploadRef = ref(null);
-const serviceInfoRef = ref(null);
-const formRef = ref(null);
-const formData = ref({
-    name: "",
-    tel: "",
-    subjectName: "",
-    point: "",
-    serviceCropsJson: [],
-    agriculturalEquipmentJson: [],
-    licenseImg: [],
-});
-
-const validatorTel = (val) => {
-    const phoneRegex = /^1[3-9]\d{9}$/;
-    if (!phoneRegex.test(val)) return "请输入正确的电话号码";
-};
-
-const onSubmit = () => {
-    formData.value.point = "POINT(113.1093017627431 22.574540836684672)";
-    if (pageType.value === "NZ" && !formData.value.licenseImg) {
-        ElMessage.warning("请上传营业执照");
-        return;
-    }
-    const {serviceCropsJson, serviceTypeJson, agriculturalEquipmentJson} = serviceInfoRef.value.getServiceInfo();
-    const params = {
-        ...formData.value,
-        serviceCropsJson,
-        serviceTypeJson,
-        agriculturalEquipmentJson,
-    }
-    VE_API.mine.register(params).then(res =>{
-        if(res.code===0){
-            ElMessage.success('注册成功,待审核')
-            router.push('/mine')
-        }else{
-            ElMessage.error(res.msg)
-        }
-    })
-};
-
-const resetForm = () => {
-    formRef.value.resetValidation();
-};
-
-const number = ref("请选择");
-const numberList = ["请选择", "10", "20", "30", "40"];
-const numberActive = ref(0);
-const handleNumberDropdown = (item, index) => {
-    number.value = item;
-    numberActive.value = index;
-};
-
-const year = ref("请选择");
-const yearList = ["请选择", "10", "20", "30", "40"];
-const yearActive = ref(0);
-const handleYearDropdown = (item, index) => {
-    year.value = item;
-    yearActive.value = index;
-};
-
-const dropdownList = ["周边20公里", "周边10公里", "周边5公里"];
-const active = ref(0);
-const dropdownName = ref("周边20公里");
-const handleDropdown = (item, index) => {
-    dropdownName.value = item;
-    active.value = index;
-};
-
-const input = ref("");
-
-const pageName = ref("");
-const pageType = ref("");
-const identityTyepe = {
-    EXPERT: "专家",
-    NZ: "农资",
-};
-// NF: "农服",
-
-// 服务信息数据,转换为 ServiceInfo 组件需要的格式
-const isEdit = ref(true); // 默认编辑状态
-const crops = ref([
-    { name: "荔枝", isSelf: 0 },
-    { name: "水稻", isSelf: 0 },
-    { name: "菠萝", isSelf: 0 },
-    { name: "柚子", isSelf: 0 },
-    { name: "蔬菜", isSelf: 0 },
-    { name: "小麦", isSelf: 0 },
-]);
-const serviceTypes = ref([
-    { name: "嫁接", isSelf: 0 },
-    { name: "施肥打药", isSelf: 0 },
-    { name: "修剪", isSelf: 0 },
-]);
-const machines = ref([
-    { name: "植保机", isSelf: 0 },
-    { name: "喷药车", isSelf: 0 },
-    { name: "收割机", isSelf: 0 }
-]);
-
-const handleUploadSuccess = (data) => {
-    formData.value.licenseImg = data.imgArr[0];
-};
-
-
-onActivated(() => {
-    pageName.value = identityTyepe[route.query.identity];
-    pageType.value = route.query.identity;
-    formData.value = {};
-    resetForm();
-});
-
-onDeactivated(() => {
-    // 重置 ServiceInfo 组件的选中状态
-    crops.value.forEach(item => {
-        item.selected = false;
-    });
-    serviceTypes.value.forEach(item => {
-        item.selected = false;
-    });
-    machines.value.forEach(item => {
-        item.selected = false;
-    });
-    uploadRef.value && uploadRef.value.uploadReset();
-});
-</script>
-
-<style lang="scss" scoped>
-.register-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f5f7fb;
-    ::v-deep{
-        .main-content {
-            margin: 12px 0;
-        }
-    }
-    .content {
-        height: calc(100% - 40px);
-        padding: 12px;
-        overflow: auto;
-        box-sizing: border-box;
-        background: linear-gradient(180deg, #e6f2ff 0%, #8fc5fe 100%);
-        .card {
-            background: #fff;
-            border-radius: 12px;
-            padding: 15px 12px;
-            box-sizing: border-box;
-            .card-title {
-                display: flex;
-                align-items: center;
-                margin-bottom: 10px;
-                font-size: 18px;
-
-                img {
-                    width: 14px;
-                    height: 8px;
-                    margin-right: 6px;
-                }
-            }
-            .form {
-                .van-cell {
-                    background: #f5f5f5;
-                    border-radius: 8px;
-                    ::v-deep {
-                        .van-field__label {
-                            color: #666666;
-                            border-right: 1px solid #dddddd;
-                        }
-                    }
-                }
-                .van-cell + .van-cell {
-                    margin-top: 12px;
-                }
-                .btn {
-                    width: 92%;
-                    color: #2199f8;
-                    font-size: 16px;
-                    border-radius: 8px;
-                    text-align: center;
-                    padding: 12px;
-                    margin-top: 12px;
-                    border: 1px solid #2199f8;
-                }
-
-                .el-dropdown-link-text {
-                    color: #2199f8;
-                    display: flex;
-                    align-items: center;
-                }
-
-                .flex {
-                    display: flex;
-                    align-items: center;
-                    margin-top: 12px;
-                    .el-dropdown-link {
-                        display: flex;
-                        align-items: center;
-                        justify-content: center;
-                        color: #2199f8;
-                        width: 100px;
-                        font-size: 12px;
-                        padding: 14px 0;
-                        border-radius: 8px;
-                        border: 1px solid rgba(33, 153, 248, 0.2);
-                        background: #fff;
-                        margin-left: 5px;
-                    }
-                }
-                .el-icon--right {
-                    margin-left: 4px;
-                }
-                .upload-btn {
-                    color: #2199f8;
-                    font-size: 16px;
-                    padding: 12px 0;
-                    text-align: center;
-                    width: 170px;
-                    border-radius: 8px;
-                    border: 1px solid #2199f8;
-                    background: #fff;
-                }
-                .upload-wrap{
-                    margin-top: 12px;
-                }
-            }
-        }
-        .card + .card {
-            margin-top: 12px;
-        }
-        .card-footer {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            font-size: 16px;
-            .tips {
-                position: relative;
-                &::before {
-                    content: "*";
-                    position: absolute;
-                    top: 0;
-                    right: -1px;
-                    color: #ff0000;
-                    font-weight: bold;
-                }
-            }
-            .btn {
-                color: #fff;
-                background: #2199f8;
-                border-radius: 8px;
-                padding: 5px 37px;
-                text-align: center;
-                font-size: 14px;
-            }
-        }
-
-        .button {
-            border-radius: 8px;
-            font-size: 18px;
-            padding: 10px;
-            text-align: center;
-            background: #2199f8;
-            color: #fff;
-            margin-top: 12px;
-            border: none;
-        }
-    }
-}
-</style>
-
-<style lang="scss">
-.v-dropdown-menu {
-    .active {
-        color: #2199f8;
-    }
-}
-
-.image-preview {
-    position: fixed;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background: rgba(0, 0, 0, 0.8);
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    z-index: 1000;
-}
-
-.image-preview img {
-    max-width: 90%;
-    max-height: 90%;
-    object-fit: contain;
-}
-</style>

+ 0 - 159
src/views/old_mini/mine/pages/serviceDetail.vue

@@ -1,159 +0,0 @@
-<template>
-    <div class="service-detail-page">
-        <custom-header name="农场详情"></custom-header>
-        <div class="service-detail-content">
-            <farm-info-card
-                v-if="
-                    farmInfoData.farmName !== '' ||
-                    farmInfoData.area !== '' ||
-                    farmInfoData.variety !== '' ||
-                    farmInfoData.address !== ''
-                "
-                class="record-box"
-                :data="farmInfoData"
-            >
-            </farm-info-card>
-            <div class="farm-service-box">
-                <div class="service-title">
-                    <img src="@/assets/img/home/label-icon.png" alt="" />
-                    <span>农事服务</span>
-                </div>
-                <stats-box :stats-data="serviceStatsData" />
-                <div
-                    v-for="(section, index) in detailList"
-                    :key="index"
-                    class="content-section"
-                >
-                    <record-item
-                        :record-item-data="section"
-                        content-mode="serviceDetail"
-                        title-mode="default"
-                        title-right-text="生成成果报告"
-                        class="recipe-item"
-                        showFarmImage
-                        @titleRightClick="handleTitleRightClick"
-                    />
-                </div>
-                <empty
-                    v-if="detailList.length === 0"
-                    image="https://birdseye-img.sysuimars.com/birdseye-look-mini/custom-empty-image.png"
-                    image-size="80"
-                    description="暂无数据"
-                    class="empty-state"
-                />
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import FarmInfoCard from "@/components/pageComponents/FarmInfoCard.vue";
-import StatsBox from "@/components/pageComponents/StatsBox.vue";
-import { ref, onMounted, computed } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import recordItem from "@/components/recordItem.vue";
-import { Empty } from "vant";
-const route = useRoute();
-const router = useRouter();
-const farmIdVal = ref(null);
-onMounted(() => {
-    farmIdVal.value = route.query.farmId;
-    getFarmDetail();
-    getFarmPastServiceCost();
-    getDetailList();
-});
-
-const farmDetail = ref({});
-const getFarmDetail = () => {
-    VE_API.user.getFarmDetail({ farmId: farmIdVal.value }).then(({ data }) => {
-        farmDetail.value = data || {};
-    });
-};
-
-// 计算属性,确保数据符合 FarmInfoCard 的验证要求
-const farmInfoData = computed(() => {
-    return {
-        farmName: farmDetail.value.name || "",
-        area: farmDetail.value.mianji ? farmDetail.value.mianji + "亩" : "",
-        variety: farmDetail.value.typeName || "",
-        address: farmDetail.value.address || "",
-        maxWidth: "100%",
-    };
-});
-
-const serviceStatsData = ref([]);
-const getFarmPastServiceCost = () => {
-    VE_API.user.getFarmPastServiceCost({ farmId: farmIdVal.value }).then(({ data }) => {
-        serviceStatsData.value = [
-            { value: data?.totalCost, unit: "元", desc: "成交额" },
-            { value: data?.serviceCount, unit: "次", desc: "服务次数" },
-        ];
-    });
-};
-
-const detailList = ref([]);
-const getDetailList = () => {
-    const params = {
-        farmId: farmIdVal.value,
-        limit: 99,
-        page: 1,
-        flowStatus: "5",
-    };
-    VE_API.user.getDetailList(params).then(({ data }) => {
-        detailList.value = data || [];
-    });
-};
-
-const handleTitleRightClick = ({ id }) => {
-    router.push({
-        path: "/achievement_report",
-        query: { miniJson: JSON.stringify({ id }) },
-    });
-};
-</script>
-
-<style lang="scss" scoped>
-.service-detail-page {
-    width: 100%;
-    height: 100vh;
-    background: #f7f7f7;
-    display: flex;
-    flex-direction: column;
-    overflow: hidden;
-    .service-detail-content {
-        flex: 1;
-        overflow-y: auto;
-        padding: 10px 12px;
-        .record-box {
-            margin-bottom: 0;
-        }
-        .farm-service-box {
-            padding: 16px 12px;
-            background: #fff;
-            border-radius: 8px;
-            margin-top: 12px;
-            .service-title {
-                display: flex;
-                align-items: center;
-                gap: 6px;
-                font-size: 16px;
-                color: #000;
-                font-weight: 500;
-                padding-bottom: 12px;
-                border-bottom: 1px solid #f5f5f5;
-                img {
-                    width: 14px;
-                    height: 8px;
-                }
-            }
-            .content-section {
-                .recipe-item {
-                    border: 1px solid rgba(0, 0, 0, 0.1);
-                    margin: 12px 0 0 0;
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 140
src/views/old_mini/mine/pages/serviceRecords.vue

@@ -1,140 +0,0 @@
-<template>
-    <div class="service-records-page">
-        <custom-header name="服务记录"></custom-header>
-        <div class="record-list">
-            <div v-if="recordList.length === 0" class="empty-data">暂无数据</div>
-            <div v-for="(item, index) in recordList" :key="index" class="record-card" @click="handleItemClick(item)">
-                <img class="thumb" :src=" base_img_url2 + item.executeEvidenceList[0] + resize" alt="照片" />
-                <div class="card-body">
-                    <div class="card-header">
-                        <div class="title van-ellipsis">{{ item.farmWorkName }}</div>
-                        <div class="date">{{ item.executeDate }}</div>
-                    </div>
-                    <div class="line">
-                        <span class="label">农场名称:</span>
-                        <span class="text van-ellipsis">{{ item.farmName }}</span>
-                    </div>
-                    <div class="line">
-                        <span class="label">药物处方:</span>
-                        <span class="text van-ellipsis">{{ getPrescriptionText(item) }}</span>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-<script setup>
-import { ref, onMounted } from "vue";
-import customHeader from "@/components/customHeader.vue";
-import { useRouter } from "vue-router";
-import { base_img_url2 } from "@/api/config";
-const router = useRouter();
-const resize = "?x-oss-process=image/resize,w_300";
-// 服务记录列表数据
-const recordList = ref([]);
-
-onMounted(() => {
-    getSimpleList();
-});
-
-const getSimpleList = async () => {
-    const { data } = await VE_API.mine.getSimpleList({
-        role: localStorage.getItem("SET_USER_CUR_ROLE"),
-        includePrescription: true,
-        isServiceRecord: true,
-        flowStatus: "5",
-    });
-    if (data.length > 0) {
-        recordList.value = data;
-    }
-};
-
-// 处理列表项点击
-const handleItemClick = (data) => {
-    router.push(`/review_work?miniJson={"id":${data.id},"goBack":true,"isBtn":true}`);
-};
-
-// 获取药肥处方文本(从prescriptionList中提取pesticideFertilizerList的defaultName,用+连接)
-const getPrescriptionText = (item) => {
-    if (!item.prescriptionList || !Array.isArray(item.prescriptionList) || item.prescriptionList.length === 0) {
-        return item.prescription || "无处方";
-    }
-
-    const nameList = [];
-    item.prescriptionList.forEach((prescription) => {
-        if (prescription.pesticideFertilizerList && Array.isArray(prescription.pesticideFertilizerList)) {
-            prescription.pesticideFertilizerList.forEach((pesticide) => {
-                if (pesticide.defaultName || pesticide.pesticideFertilizerName) {
-                    nameList.push(pesticide.defaultName || pesticide.pesticideFertilizerName);
-                }
-            });
-        }
-    });
-
-    return nameList.length > 0 ? nameList.join(" + ") : item.prescription || "无处方";
-};
-</script>
-<style lang="scss" scoped>
-.service-records-page {
-    width: 100%;
-    height: 100vh;
-    background: #f5f5f5;
-    .record-list {
-        padding: 10px 12px;
-        display: flex;
-        flex-direction: column;
-        gap: 14px;
-        height: calc(100% - 60px);
-        overflow-y: auto;
-        .empty-data {
-            text-align: center;
-            padding: 60px 0;
-            color: #999999;
-            font-size: 14px;
-        }
-    }
-    .record-card {
-        display: flex;
-        gap: 16px;
-        padding: 10px;
-        background: #ffffff;
-        border-radius: 16px;
-        align-items: center;
-        .thumb {
-            width: 64px;
-            height: 64px;
-            border-radius: 8px;
-            object-fit: cover;
-        }
-        .card-body {
-            width: calc(100% - 64px - 16px);
-            .card-header {
-                display: flex;
-                justify-content: space-between;
-                align-items: center;
-                .title {
-                    font-size: 16px;
-                    font-weight: 600;
-                    margin-bottom: 4px;
-                }
-                .date {
-                    font-size: 12px;
-                    color: #999999;
-                }
-            }
-            .line {
-                font-size: 12px;
-                color: #666;
-                display: flex;
-                align-items: center;
-                .label {
-                    color: #bbb;
-                }
-                .text {
-                    flex: 1;
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 638
src/views/old_mini/mine/pages/teamManage.vue

@@ -1,638 +0,0 @@
-<template>
-    <div class="team-management-page">
-        <custom-header :name="route.query.add ? '选择团队成员' : '团队管理'"></custom-header>
-        <div class="team-content">
-            <div class="team-title" v-show="!route.query.add">当前团队总人数({{ teamList.length || 0 }}人)</div>
-            <div class="team-list" v-if="teamList && teamList.length">
-                <div class="list-item" v-for="ele in teamList" :key="ele.id">
-                    <Checkbox v-if="route.query.add" @change="changeCheck" v-model="ele.checked"></Checkbox>
-                    <farm-info-card
-                        class="item-info"
-                        @click="handleItem(ele)"
-                        :style="{ width: !route.query.add ? '100%' : 'calc(100% - 55px)' }"
-                        :data="{
-                            ...ele,
-                            roleName: ele.role == 1 ? '超级管理员' : ele.role == 2 ? '项目管理员' : '普通成员',
-                            className: ele.role == 1 ? 'tag-role' : ele.role == 2 ? '' : 'tag-gray',
-                            maxWidth: 'fit-content',
-                            address: ele.role == 1 ? ele.store?.address || '--' : null,
-                        }"
-                    >
-                        <template #right v-if="ele.role === 2 && !route.query.add && currentUserRole === 1">
-                            <div @click.stop="handlePermission(ele)">权限设置</div>
-                        </template>
-                    </farm-info-card>
-                </div>
-            </div>
-            <div v-else class="empty-wrap">
-                <div class="empty-text">暂无数据</div>
-            </div>
-        </div>
-        <div class="custom-bottom-fixed-btns" :class="{ center: currentUserRole == 2 }" v-if="(currentUserRole === 1 || (currentUserRole !== 3 && currentEditPermissions))">
-            <div class="bottom-btn secondary-btn" @click="handleSetAdmin" v-if="currentUserRole === 1">
-                {{ route.query.add ? "取消选择" : "设置管理员" }}
-            </div>
-            <div class="bottom-btn primary-btn" @click="handleAddTeamMember">
-                {{ route.query.add ? "确认设为" : "邀请团队成员" }}
-            </div>
-        </div>
-
-        <!-- 新增团队成员弹窗 -->
-        <Popup
-            v-model:show="showAddMemberPopup"
-            closeable
-            round
-            class="add-member-popup"
-            :close-on-click-overlay="false"
-            @closed="handlePopupClosed"
-        >
-            <div class="popup-content">
-                <div class="popup-title">{{ detailType === "add" ? "新增团队成员" : "成员信息" }}</div>
-                <el-form
-                    ref="formRef"
-                    :model="formData"
-                    :rules="rules"
-                    label-position="top"
-                    class="member-form"
-                    size="large"
-                >
-                    <el-form-item label="姓名" prop="name">
-                        <el-input
-                            v-model="formData.name"
-                            placeholder="请输入姓名"
-                            clearable
-                            :readonly="detailType === 'detail'"
-                        />
-                    </el-form-item>
-                    <el-form-item label="手机号" prop="phone">
-                        <el-input
-                            v-model="formData.phone"
-                            placeholder="请输入手机号"
-                            clearable
-                            maxlength="11"
-                            :readonly="detailType === 'detail'"
-                        />
-                    </el-form-item>
-                    <!-- <el-form-item label="角色类型" prop="duties">
-                        <div class="role-type-grid">
-                            <div
-                                v-for="role in dutyList"
-                                :key="role.code"
-                                class="role-btn"
-                                :class="{
-                                    active: formData.duties.includes(role.code),
-                                    readonly: detailType === 'detail',
-                                }"
-                                @click="toggleRole(role.code)"
-                            >
-                                {{ role.name }}
-                            </div>
-                        </div>
-                    </el-form-item> -->
-                </el-form>
-                <div class="popup-footer" v-show="detailType === 'add'">
-                    <div class="footer-btn share-btn" @click="handleShare">分享微信好友</div>
-                    <div class="footer-btn confirm-btn" @click="handleConfirm">确认添加</div>
-                </div>
-                <template v-if="currentPermissionItem?.role !== 1">
-                    <div class="popup-footer" v-show="detailType === 'detail' && (currentUserRole === 1 || (currentUserRole !== 3 && currentEditPermissions))">
-                        <div class="footer-btn cancel-admin-btn" @click="handleDelete">删除成员</div>
-                    </div>
-                </template>
-            </div>
-        </Popup>
-
-        <!-- 权限设置弹窗 -->
-        <Popup
-            v-model:show="showPermissionPopup"
-            closeable
-            round
-            class="add-member-popup"
-            :close-on-click-overlay="false"
-            @closed="handlePermissionPopupClosed"
-        >
-            <div class="popup-content">
-                <div class="popup-title">权限设置</div>
-                <div class="role-type-grid permission-list">
-                    <div
-                        v-for="permission in permissionList"
-                        :key="permission.code"
-                        class="role-btn"
-                        :class="{ active: selectedPermission.includes(permission.code) }"
-                        @click="togglePermission(permission.code)"
-                    >
-                        {{ permission.name }}
-                    </div>
-                </div>
-                <div class="popup-footer">
-                    <div class="footer-btn cancel-admin-btn" @click="handleCancelAdmin">
-                        {{ route.query.add ? "取消" : "取消管理权限" }}
-                    </div>
-                    <div class="footer-btn confirm-btn" @click="handleConfirmPermission">确认设置</div>
-                </div>
-            </div>
-        </Popup>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { ref, reactive, onMounted } from "vue";
-import { useRouter, useRoute } from "vue-router";
-import { Popup, Checkbox } from "vant";
-import wx from "weixin-js-sdk";
-import { ElMessage, ElMessageBox } from "element-plus";
-import FarmInfoCard from "@/components/pageComponents/FarmInfoCard.vue";
-
-const router = useRouter();
-const formRef = ref(null);
-const showAddMemberPopup = ref(false);
-const showPermissionPopup = ref(false);
-const route = useRoute();
-
-onMounted(() => {
-    getManagerList();
-    //获取职责列表
-    getDutyList();
-    //获取权限列表
-    getPermissionList();
-});
-
-//职责列表
-const dutyList = ref([]);
-//获取职责列表
-const getDutyList = async () => {
-    const { data } = await VE_API.mine.listDutyList();
-    if (data && data.length > 0) {
-        dutyList.value = data;
-        // 默认选中第一个角色
-        // formData.duties = [data[0].code];
-    }
-};
-
-const teamList = ref([]);
-// 当前登录用户在团队中的角色(1 超管、2 项目管理员、3 普通成员)
-const currentUserRole = ref(null);
-const currentEditPermissions = ref(false);
-//查询当前农资店的成员列表
-const getManagerList = async () => {
-    const { data } = await VE_API.mine.listManagerList();
-    if (Array.isArray(data) && data.length > 0) {
-        if (route.query.add) {
-            teamList.value = data.filter((item) => item.role == 3);
-        } else {
-            teamList.value = data;
-        }
-
-        // 从本地存储中获取当前用户 miniUserId,并在成员列表中找到自己的角色
-        const miniUserId = localStorage.getItem("MINI_USER_ID");
-        if (miniUserId) {
-            const selfItem = data.find(
-                (item) =>
-                    item.miniUserId != null &&
-                    String(item.miniUserId) === String(miniUserId)
-            );
-            if (selfItem) {
-                currentUserRole.value = selfItem.role;
-                currentEditPermissions.value = selfItem.permissionList.includes("增删成员");
-            }
-        }
-    } else {
-        teamList.value = [];
-        currentUserRole.value = null;
-        currentEditPermissions.value = false;
-    }
-};
-
-// 权限数据
-const permissionList = ref([]);
-const selectedPermission = ref([]);
-const currentPermissionItem = ref(null);
-
-//获取权限列表
-const getPermissionList = async () => {
-    const { data } = await VE_API.mine.listPermissionList();
-    permissionList.value = data || [];
-};
-
-const handlePermission = (item) => {
-    currentPermissionItem.value = item;
-    // 初始化选中的权限,如果item中有permissions字段,则使用它,否则为空数组
-    if (item.permissionEnumList) {
-        // 如果permissions是字符串,需要转换为数组
-        selectedPermission.value = Array.isArray(item.permissionEnumList)
-            ? [...item.permissionEnumList]
-            : typeof item.permissionEnumList === "string"
-            ? item.permissionEnumList.split(",")
-            : [];
-    } else {
-        selectedPermission.value = [];
-    }
-    showPermissionPopup.value = true;
-};
-
-// 切换权限选择(多选)
-const togglePermission = (value) => {
-    const index = selectedPermission.value.indexOf(value);
-    if (index > -1) {
-        // 如果已选中,则移除
-        selectedPermission.value.splice(index, 1);
-    } else {
-        // 如果未选中,则添加
-        selectedPermission.value.push(value);
-    }
-};
-
-// 确认权限设置
-const handleConfirmPermission = async () => {
-    if (selectedPermission.value.length === 0) {
-        ElMessage.warning("请至少选择一个权限");
-        return;
-    }
-    if (route.query.add) {
-        const params = {
-            ids: filterList.value.map((item) => item.id),
-            permissions: selectedPermission.value,
-            role: 2,
-        };
-        const { code, msg } = await VE_API.mine.batchSaveManager(params);
-        if (code === 0) {
-            ElMessage.success("权限设置成功");
-            showPermissionPopup.value = false;
-            router.go(-1);
-        } else {
-            ElMessage.error(msg);
-        }
-    } else {
-        const params = {
-            id: currentPermissionItem.value.id,
-            permissions: selectedPermission.value,
-        };
-        const { code, msg } = await VE_API.mine.saveManager(params);
-        if (code === 0) {
-            ElMessage.success("权限设置成功");
-            showPermissionPopup.value = false;
-            // 刷新列表
-            getManagerList();
-        } else {
-            ElMessage.error(msg);
-        }
-    }
-};
-
-// 权限弹窗关闭处理
-const handlePermissionPopupClosed = () => {
-    currentPermissionItem.value = null;
-    selectedPermission.value = [];
-};
-
-// 过滤选中列表
-const filterList = ref([]);
-const changeCheck = () => {
-    filterList.value = teamList.value.filter((item) => item.checked);
-};
-
-// 表单数据
-const formData = reactive({
-    name: "",
-    phone: "",
-    duties: [],
-});
-
-// 切换角色选择(多选)
-const toggleRole = (code) => {
-    const index = formData.duties.indexOf(code);
-    if (index > -1) {
-        // 如果已选中,则移除
-        formData.duties.splice(index, 1);
-    } else {
-        // 如果未选中,则添加
-        formData.duties.push(code);
-    }
-    // 触发校验
-    if (formRef.value) {
-        formRef.value.validateField("duties");
-    }
-};
-
-// 表单校验规则
-const rules = reactive({
-    name: [
-        { required: true, message: "请输入姓名", trigger: "blur" },
-        { min: 1, max: 20, message: "姓名长度在 1 到 20 个字符", trigger: "blur" },
-    ],
-    phone: [
-        { required: true, message: "请输入手机号", trigger: "blur" },
-        { pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号", trigger: "blur" },
-    ],
-    duties: [
-        {
-            required: true,
-            validator: (rule, value, callback) => {
-                if (!value || value.length === 0) {
-                    callback(new Error("请选择角色类型"));
-                } else {
-                    callback();
-                }
-            },
-            trigger: "change",
-        },
-    ],
-});
-
-// 取消管理员
-const handleCancelAdmin = async () => {
-    if (route.query.add) {
-        showPermissionPopup.value = false;
-        return;
-    }
-    ElMessageBox.confirm("确定取消管理员权限吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        zIndex: 3500,
-        type: "warning",
-    })
-        .then(async () => {
-            const { code, msg } = await VE_API.mine.saveManager({ id: currentPermissionItem.value.id, role: 3 });
-            if (code === 0) {
-                ElMessage.success("取消管理员权限成功");
-                teamList.value = [];
-                getManagerList();
-                showPermissionPopup.value = false;
-            } else {
-                ElMessage.error(msg);
-            }
-        })
-        .catch(() => {});
-};
-
-// 弹窗关闭处理
-const handlePopupClosed = () => {
-    // 重置表单
-    if (formRef.value) {
-        formRef.value.resetFields();
-    }
-    // 重置为默认值(选中第一个角色)
-    // if (dutyList.value && dutyList.value.length > 0) {
-    //     formData.duties = [dutyList.value[0].code];
-    // } else {
-    //     formData.duties = [];
-    // }
-};
-
-// 分享微信好友
-const handleShare = () => {
-    const query = {
-        askInfo: { title: "分享团队", content: "是否邀请好友加入团队" },
-        shareText: "邀请您加入我的团队,快来查看吧~",
-        targetUrl: `user_info`,
-        paramsPage: JSON.stringify({
-            storeId: teamList.value[0]?.storeId || '',
-        }),
-        imageUrl: "https://birdseye-img.sysuimars.com/birdseye-look-mini/invite_bg.png",
-    };
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
-    });
-};
-
-// 确认添加
-const handleConfirm = () => {
-    if (!formRef.value) return;
-    formRef.value.validate(async (valid) => {
-        if (valid) {
-            const { code, msg } = await VE_API.mine.saveManager({ ...formData, role: 3 });
-            if (code === 0) {
-                ElMessage.success("添加成功");
-                showAddMemberPopup.value = false;
-                // 刷新列表
-                getManagerList();
-            } else {
-                ElMessage.error(msg);
-            }
-        } else {
-            // 校验失败,Element Plus 会自动显示错误信息
-            return false;
-        }
-    });
-};
-
-const handleAddTeamMember = async () => {
-    if (route.query.add) {
-        if (filterList.value.length) {
-            // 批量设置管理员时,默认勾选全部权限(排除"农事规划")
-            if (Array.isArray(permissionList.value) && permissionList.value.length > 0) {
-                selectedPermission.value = permissionList.value
-                    .filter((p) => p.name !== "农事规划")
-                    .map((p) => p.code);
-            }
-            showPermissionPopup.value = true;
-        } else {
-            ElMessage.warning("请选择团队成员");
-            return;
-        }
-    } else {
-        detailType.value = "add";
-        // showAddMemberPopup.value = true;
-        formData.name = "";
-        formData.phone = "";
-        formData.duties = [];
-        handleShare()
-    }
-};
-
-const handleSetAdmin = () => {
-    if (route.query.add) {
-        teamList.value = teamList.value.map((item) => {
-            item.checked = false;
-            return item;
-        });
-    } else {
-        router.push("/project_manager");
-    }
-};
-
-const detailType = ref("add");
-const handleItem = (item) => {
-    if (route.query.add) {
-        item.checked = !item.checked;
-    } else {
-        detailType.value = "detail";
-        showAddMemberPopup.value = true;
-        // 记录当前选中的成员,后续删除时使用
-        currentPermissionItem.value = item;
-        // 回填已知字段
-        formData.name = item.name || "";
-        formData.phone = item.phone || "";
-        // if (Array.isArray(item.dutyEnumList)) {
-        //     formData.duties = [...item.dutyEnumList];
-        // }
-    }
-};
-
-const handleDelete = () => {
-    ElMessageBox.confirm("确定删除该成员吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        zIndex: 3500,
-        type: "warning",
-    })
-        .then(async () => {
-            try {
-                const { code, msg } = await VE_API.mine.deleteManager({
-                    id: currentPermissionItem.value.id,
-                });
-                if (code === 0) {
-                    ElMessage.success("删除成功");
-                    showAddMemberPopup.value = false;
-                    await getManagerList();
-                } else {
-                    ElMessage.error(msg || "删除失败");
-                }
-            } catch (error) {
-                ElMessage.error("删除失败,请稍后重试");
-            }
-        })
-        .catch(() => {});
-};
-</script>
-
-<style lang="scss" scoped>
-.team-management-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f5f7fb;
-    .team-content {
-        width: 100%;
-        height: calc(100% - 40px);
-        padding: 10px 12px;
-        box-sizing: border-box;
-        .team-title {
-            margin-bottom: 10px;
-        }
-        .team-list {
-            .list-item {
-                display: flex;
-                justify-content: space-between;
-                width: 100%;
-                .item-info {
-                    width: calc(100% - 55px);
-                }
-            }
-            .list-item + .list-item {
-                margin-top: 10px;
-            }
-        }
-        .empty-wrap {
-            padding-top: 40px;
-            text-align: center;
-            .empty-text {
-                font-size: 14px;
-                color: #86909c;
-            }
-        }
-    }
-    .center {
-        justify-content: center;
-    }
-}
-
-.add-member-popup {
-    width: 90%;
-    max-width: 400px;
-    box-sizing: border-box;
-    padding: 24px 18px 20px;
-    background: #ffffff;
-    border-radius: 10px;
-
-    ::v-deep {
-        .van-popup__close-icon {
-            color: #000;
-            font-size: 18px;
-        }
-    }
-
-    .popup-content {
-        .popup-title {
-            font-size: 18px;
-            font-weight: 600;
-            color: #000;
-            text-align: center;
-            margin-bottom: 15px;
-        }
-
-        .member-form {
-            ::v-deep {
-                .el-form-item {
-                    .el-form-item__label {
-                        font-size: 15px;
-                        color: #000;
-                    }
-                }
-            }
-        }
-
-        .role-type-grid {
-            display: flex;
-            flex-wrap: wrap;
-            justify-content: space-between;
-            gap: 10px 0;
-            width: 100%;
-
-            .role-btn {
-                width: calc(50% - 8px);
-                border-radius: 4px;
-                text-align: center;
-                font-size: 14px;
-                color: rgba(0, 0, 0, 0.26);
-                border: 1px solid rgba(0, 0, 0, 0.26);
-
-                &.active {
-                    background: #2199f8;
-                    color: #ffffff;
-                    border-color: #2199f8;
-                }
-                &.readonly {
-                    pointer-events: none;
-                }
-            }
-
-            &.permission-list {
-                .role-btn {
-                    padding: 10px 0;
-                }
-            }
-        }
-
-        .popup-footer {
-            display: flex;
-            gap: 20px;
-            margin-top: 30px;
-            padding-top: 20px;
-            border-top: 1px solid rgba(0, 0, 0, 0.1);
-
-            .footer-btn {
-                flex: 1;
-                padding: 10px 20px;
-                border-radius: 25px;
-                text-align: center;
-                font-size: 16px;
-                color: #ffffff;
-
-                &.share-btn {
-                    background: #ff953d;
-                }
-
-                &.confirm-btn {
-                    background: #2199f8;
-                }
-
-                &.cancel-admin-btn {
-                    color: #666666;
-                    border: 1px solid rgba(153, 153, 153, 0.5);
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 237
src/views/old_mini/mine/pages/userInfo.vue

@@ -1,237 +0,0 @@
-<template>
-    <div class="user-info-page">
-        <custom-header name="个人信息填写" :isClose="true"></custom-header>
-        <div class="form-content">
-            <el-form
-                ref="formRef"
-                :model="formData"
-                :rules="rules"
-                label-position="top"
-                class="user-form"
-                size="large"
-            >
-                <el-form-item label="姓名" prop="name">
-                    <el-input v-model="formData.name" placeholder="请输入姓名" clearable />
-                </el-form-item>
-                <el-form-item label="手机号" prop="phone">
-                    <el-input
-                        v-model="formData.phone"
-                        placeholder="请输入手机号"
-                        clearable
-                        maxlength="11"
-                    />
-                </el-form-item>
-                <!-- <el-form-item label="角色类型" prop="duties">
-                    <div class="role-type-grid">
-                        <div
-                            v-for="role in roleList"
-                            :key="role.code"
-                            class="role-btn"
-                            :class="{ active: formData.duties.includes(role.code) }"
-                            @click="selectRole(role.code)"
-                        >
-                            {{ role.name }}
-                        </div>
-                    </div>
-                </el-form-item> -->
-            </el-form>
-        </div>
-        <div class="custom-bottom-fixed-btns">
-            <div class="bottom-btn primary-btn" @click="handleConfirm">确认加入</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { ref, reactive, onMounted } from "vue";
-import { useRouter, useRoute } from "vue-router";
-import { ElMessage } from "element-plus";
-
-const router = useRouter();
-const route = useRoute();
-const formRef = ref(null);
-
-// 表单数据
-const formData = reactive({
-    name: "",
-    phone: "",
-    duties: [],
-});
-
-// 角色列表
-const roleList = ref([]);
-//获取角色列表
-const getRoleList = async () => {
-    const { data } = await VE_API.mine.listDutyList();
-    if (data && data.length > 0) {
-        roleList.value = data;
-        // 默认选中第一个角色
-        // formData.duties = [data[0].code];
-    }
-};
-
-// 表单验证规则
-const rules = reactive({
-    name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
-    phone: [
-        { required: true, message: "请输入手机号", trigger: "blur" },
-        {
-            pattern: /^1[3-9]\d{9}$/,
-            message: "请输入正确的手机号码",
-            trigger: ["blur", "change"],
-        },
-    ],
-    duties: [
-        {
-            validator: (_, value, callback) => {
-                if (Array.isArray(value) && value.length > 0) {
-                    callback();
-                } else {
-                    callback(new Error("请选择角色类型"));
-                }
-            },
-            trigger: "change",
-        },
-    ],
-});
-
-// 选择角色(多选)
-const selectRole = (value) => {
-    const idx = formData.duties.indexOf(value);
-    if (idx > -1) {
-        // 已选中则取消选择
-        formData.duties.splice(idx, 1);
-    } else {
-        formData.duties.push(value);
-    }
-};
-
-const storeId = ref(null);
-// 确认加入
-const handleConfirm = () => {
-    if (!formRef.value) return;
-    formRef.value.validate(async (valid) => {
-        if (valid) {
-            const { code, msg } = await VE_API.mine.inviteManager({ ...formData, role: 3, storeId: storeId.value,miniUserId: localStorage.getItem("MINI_USER_ID")});
-            if (code === 0) {
-                ElMessage.success("加入成功");
-                setTimeout(() => {
-                    router.replace('/home');
-                }, 1000);
-            } else {
-                ElMessage.error(msg);
-            }
-        } else {
-            // 校验失败,Element Plus 会自动显示错误信息
-            return false;
-        }
-    });
-};
-
-onMounted(() => {
-    if(localStorage.getItem("SET_USER_CUR_ROLE") == 2){
-        router.replace('/home');
-        return;
-    }
-    getRoleList();
-    if (route.query.miniJson) {
-        const data = JSON.parse(route.query.miniJson);
-        storeId.value = JSON.parse(data.paramsPage).storeId;
-    }
-});
-</script>
-
-<style lang="scss" scoped>
-.user-info-page {
-    width: 100%;
-    min-height: 100vh;
-    background: #f5f5f5;
-    padding-bottom: 80px;
-
-    .form-content {
-        padding: 20px 12px;
-        background: #fff;
-        margin: 12px;
-        border-radius: 12px;
-
-        .user-form {
-            ::v-deep {
-                .el-form-item {
-                    margin-bottom: 24px;
-
-                    &:last-child {
-                        margin-bottom: 0;
-                    }
-
-                    .el-form-item__label {
-                        font-size: 14px;
-                        color: #1d2129;
-                        font-weight: 500;
-                        padding-bottom: 8px;
-                    }
-
-                    .el-input__wrapper {
-                        border-radius: 8px;
-                        box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset;
-                        background: #fff;
-
-                        &:hover {
-                            box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.5) inset;
-                        }
-
-                        &.is-focus {
-                            box-shadow: 0 0 0 1px #2199f8 inset;
-                        }
-
-                        .el-input__inner {
-                            color: #1d2129;
-                            font-size: 14px;
-
-                            &::placeholder {
-                                color: #86909c;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        .role-type-grid {
-            display: flex;
-            flex-wrap: wrap;
-            gap: 10px;
-            width: 100%;
-            .role-btn {
-                width: calc(50% - 10px);
-                text-align: center;
-                border-radius: 8px;
-                font-size: 14px;
-                color: #86909c;
-                background: #fff;
-                border: 1px solid rgba(153, 153, 153, 0.3);
-                padding: 4px 0;
-                &.active {
-                    background: #2199f8;
-                    color: #fff;
-                    border-color: #2199f8;
-                }
-            }
-        }
-    }
-}
-
-.custom-bottom-fixed-btns {
-    .bottom-btn {
-        width: 100%;
-        padding: 13px 0;
-        font-size: 16px;
-
-        &.primary-btn {
-            background: #2199f8;
-            color: #fff;
-        }
-    }
-}
-</style>
-

+ 1 - 1
src/views/old_mini/monitor/index.vue

@@ -56,7 +56,7 @@
             </template>
             <div class="archives-time-line-content">
                 <div class="time-line">
-                    <archives-farm-time-line :year="date.getFullYear()" :problemZoneId="currentVariety?.id" :farmId="farmIdData" :regionId="regionData" @card-click="handleCardClick"></archives-farm-time-line>
+                    <archives-farm-time-line :year="date.getFullYear()" :farmId="farmIdData" :regionId="regionData" @card-click="handleCardClick"></archives-farm-time-line>
                 </div>
             </div>
         </div>

+ 0 - 340
src/views/old_mini/plan/components/addGroup.vue

@@ -1,340 +0,0 @@
-<template>
-    <div>
-        <!-- 新增客户、编辑客户 -->
-        <popup v-model:show="showClient" closeable round class="popup-group">
-            <div class="group-wrap">
-                <div class="popup-content">
-                    <el-form
-                        ref="ruleFormRef"
-                        :model="ruleForm"
-                        :rules="rules"
-                        label-width="auto"
-                        class="rule-form"
-                        size="large"
-                    >
-                        <el-form-item label="方案名称" prop="name" v-if="popupType === 'add'">
-                            <el-input class="input" v-model="ruleForm.name" placeholder="请输入" />
-                        </el-form-item>
-                        <el-form-item label="添加到" v-else label-width="76">
-                            <el-select
-                                popper-class="select-popper-orange"
-                                class="select mr-10 select-orange"
-                                v-model="ruleForm.id"
-                            >
-                                <!-- <el-option
-                                    v-for="(item, index) in groupOptions"
-                                    :key="index"
-                                    :label="item.groupName"
-                                    :value="item.id"
-                                /> -->
-                                <el-option
-                                    v-for="(item, index) in groupOptions"
-                                    :key="index"
-                                    :label="item.groupName"
-                                    :value="item.id"
-                                    >
-                                    <span style="float: left">{{ item.groupName }}</span>
-                                    <span
-                                        style="
-                                        float: right;
-                                        color: var(--el-text-color-secondary);
-                                        "
-                                        v-show="item.id !== '-1'"
-                                        @click.stop="deleteGroupFun()"
-                                    >
-                                        <el-popconfirm
-                                            class="box-item"
-                                            title="确认删除该分组吗?"
-                                            placement="bottom"
-                                            width="180px"
-                                        >
-                                            <template #reference>
-                                                <el-icon size="16" color="#E04C4C"><CircleCloseFilled /></el-icon>
-                                            </template>
-                                            <template #actions="{ cancel }">
-                                                <el-button size="small" @click.stop="cancel">取消</el-button>
-                                                <el-button
-                                                    type="primary"
-                                                    size="small"
-                                                    @click.stop="deleteGroup(item, cancel)"
-                                                >
-                                                确认
-                                                </el-button>
-                                            </template>
-                                        </el-popconfirm>
-                                        
-                                    </span>
-                                    </el-option>
-                                <template #footer>
-                                    <div class="add-btn" v-if="!isAddingItem" @click="isAddingItem=true">
-                                        <el-icon class="add-icon" size="16">
-                                            <Plus />
-                                        </el-icon>
-                                        <span>新增分组</span>
-                                    </div>
-                                    <template v-else>
-                                        <el-input v-model="ruleForm.name" class="option-input" /><br />
-                                        <el-button type="primary" @click="submitGroupName"> 新增 </el-button>
-                                        <el-button @click="clear">取消</el-button>
-                                    </template>
-                                </template>
-                            </el-select>
-                        </el-form-item>
-                    </el-form>
-                </div>
-                <div class="popup-footer">
-                    <div class="cancel" @click="resetForm">取消</div>
-                    <div v-if="popupType === 'add'" :class="{'disabled': !ruleForm.name}" @click="submitGroupName">保存</div>
-                    <div v-else @click="submitForm" :class="{'disabled': !ruleForm.id}">保存</div>
-                </div>
-            </div>
-        </popup>
-    </div>
-</template>
-
-<script setup>
-import { Popup } from "vant";
-import { onMounted, reactive, ref } from "vue";
-import { ElMessage } from "element-plus";
-import { useStore } from "vuex";
-const store = useStore();
-
-const showClient = ref(false);
-const ruleForm = reactive({
-    name: "",
-    id: "",
-});
-const rules = reactive({
-    // id: { required: true, message: "请选择分组", trigger: ["blur", "change"] },
-    name: { required: true, message: "请输入分组名称", trigger: ["blur", "change"] },
-});
-
-const currentFarmId = 766
-
-const ruleFormRef = ref(null);
-const submitForm = () => {
-    // const params = {
-    //     farmId: currentFarmId,
-    //     groupId: ruleForm.id,
-    //     telList: telList.value,
-    // };
-    // VE_API.manage_user
-    //     .batchGroup(params)
-    //     .then(({ code }) => {
-    //         if (code === 0) {
-    //             ElMessage.success("保存成功");
-    //             showClient.value = false;
-    //             emit("updateTableList");
-    //         }
-    //     })
-};
-
-const submitGroupName = async () => {
-    if (!ruleFormRef.value) return;
-    await ruleFormRef.value.validate((valid, fields) => {
-        if (valid) {
-            const params = {
-                ...addParams.value,
-                name: ruleForm.name,
-            };
-            console.log('params', params);
-            VE_API.home
-                .savePlan(params)
-                .then(({ data, code }) => {
-                    if (code === 0) {
-                        ElMessage.success("新增方案成功");
-                        if (popupType.value === "add") {
-                            showClient.value = false;
-                        } else {
-                            console.log('data', data);
-                            clear()
-                            getGroupList(data.id)
-                        }
-                        emit("updateGroupList");
-                    }
-                });
-        } else {
-            console.log("error submit!");
-        }
-    });
-};
-
-const resetForm = () => {
-    if (!ruleFormRef.value) return;
-    ruleFormRef.value.resetFields();
-    showClient.value = false;
-};
-
-// 打开弹窗-类型
-const popupType = ref("add");
-const addParams = ref(null)
-function openClientPopup({type, params}) {
-    popupType.value = type || "add";
-    addParams.value = params
-    showClient.value = true;
-}
-
-const groupOptions = ref([
-        {
-            "farmId": 766,
-            "groupName": "分组1",
-            "id": "1"
-        },
-        {
-            "farmId": 766,
-            "groupName": "方案1",
-            "id": "3"
-        },
-        {
-            "farmId": 766,
-            "groupName": "方案122",
-            "id": "15"
-        },
-        {
-            "farmId": 766,
-            "groupName": "飞鸟方案",
-            "id": "21"
-        },
-    ]);
-
-const isAddingItem = ref(false);
-
-const clear = () => {
-    ruleForm.name = null
-    isAddingItem.value = false;
-};
-onMounted(() => {
-    getGroupList();
-});
-// 删除分组
-const deleteGroup = (item, cancel) => {
-    cancel();
-    const params = {
-        id: item.id,
-    };
-    // VE_API.manage_user.deleteGroup(params).then(({ code }) => {
-    //     if (code === 0) {
-    //         ElMessage.success("删除分组成功");
-    //         getGroupList();
-    //         emit("updateGroupList");
-    //     }
-    // });
-};
-
-function deleteGroupFun() {
-}
-
-function getGroupList(hasVal) {
-    // groupOptions.value = data;
-    if (hasVal) {
-        ruleForm.id = hasVal
-    }
-    // VE_API.manage_user.fetchGroupList({farmId: currentFarmId}).then(({ data }) => {
-    // });
-}
-
-const emit = defineEmits(["updateGroupList"]);
-
-defineExpose({
-    openClientPopup,
-});
-</script>
-
-<style lang="scss" scoped>
-.popup-group {
-    // width: 24%;
-    width: 325px;
-    padding: 0;
-    background: #fff;
-        margin-top: -50px;
-    ::v-deep {
-        .van-popup__close-icon {
-            color: #666666;
-        }
-    }
-    .group-wrap {
-        background: url("@/assets/img/home/mask-bg.png") no-repeat top left /100% auto;
-        padding: 50px 12px 30px 12px;
-        box-sizing: border-box;
-    }
-    .popup-title {
-        text-align: center;
-        color: #000;
-        font-size: 24px;
-        margin-bottom: 15px;
-    }
-    .popup-content {
-        width: 100%;
-        ::v-deep {
-            .el-form-item__label {
-                color: #000000;
-                font-size: 18px;
-                line-height: 44px;
-            }
-            .el-input__wrapper {
-                background: transparent;
-                box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.46) inset;
-            }
-        }
-        .input {
-            height: 44px;
-            font-size: 16px;
-        }
-    }
-    .popup-footer {
-        width: 100%;
-        display: flex;
-        padding-top: 2px;
-        div {
-            flex: 1;
-            background: #2199F8;
-            border-radius: 26px;
-            padding: 8px 13px;
-            font-size: 16px;
-            color: #fff;
-            text-align: center;
-            cursor: pointer;
-        }
-        .disabled {
-            opacity: 0.6;
-            cursor: not-allowed;
-        }
-        .cancel {
-            color: #666666;
-            background: none;
-            border: 1px solid #999999;
-            margin-right: 13px;
-        }
-    }
-}
-</style>
-
-<style lang="scss">
-.select-popper-orange {
-    .add-btn {
-        cursor: pointer;
-        width: 100%;
-        padding: 6px 16px;
-        box-sizing: border-box;
-        border-radius: 4px;
-        font-size: 16px;
-        color: #fff;
-        display: flex;
-        align-items: center;
-        background: linear-gradient(120deg, #92CFFF, #2199F8);
-        .add-icon {
-            padding-right: 4px;
-        }
-    }
-    .option-input {
-        margin-bottom: 20px;
-    }
-    .el-select-dropdown__wrap {
-        max-height: 180px;
-        .el-select-dropdown__item {
-            height: 32px;
-            line-height: 32px;
-        }
-    }
-}
-</style>

+ 0 - 1302
src/views/old_mini/plan/components/modifyPlan.vue

@@ -1,1302 +0,0 @@
-<template>
-    <div class="new-farming-page">
-        <custom-header name="编辑方案"></custom-header>
-        <div class="new-farming-content" v-loading="loading">
-            <el-form
-                ref="formRef"
-                style="max-width: 600px"
-                label-position="left"
-                :rules="rules"
-                :model="dynamicValidateForm"
-                class="demo-dynamic"
-            >
-                <div class="farm-card" v-if="!isAdd">
-                    <div class="card-title">{{ detailData?.farmWorkLib?.farmWorkName || detailData?.farmWorkLib?.name }}<span class="type-tag">标准农事</span></div>
-                    <div class="info-content">
-                        <el-form-item label-width="70px" class="form-item text-item" label="农事编号">
-                            <div class="info-text">
-                                {{ detailData?.farmWorkLib?.code }}
-                            </div>
-                        </el-form-item>
-                        <el-form-item label-width="70px" class="form-item" prop="condition" label="触发条件">
-                            <div class="condition-wrap">
-                                {{ detailData?.farmWorkLib?.condition }}
-                                <!-- <el-select v-model="dynamicValidateForm.condition" placeholder="请选择触发条件" style="width: 58%">
-                                    <el-option v-for="(item, index) in farmWorkIndexNameList" :key="index" :value="item" :label="item" />
-                                </el-select>
-                                <span class="symbol"></span>
-                                <el-select v-model="dynamicValidateForm.conditionRate" placeholder="" style="width: 38%">
-                                    <el-option :value="0" label="0%" />
-                                    <el-option :value="5" label="5%" />
-                                    <el-option :value="10" label="10%" />
-                                    <el-option :value="20" label="20%" />
-                                    <el-option :value="40" label="40%" />
-                                    <el-option :value="60" label="60%" />
-                                    <el-option :value="80" label="80%" />
-                                </el-select> -->
-                            </div>
-                        </el-form-item>
-                        <el-form-item label-width="70px" class="form-item" prop="executeDate" label="执行时间">
-                            <el-date-picker
-                                class="item-input"
-                                style="width: 100%"
-                                value-format="YYYY-MM-DD"
-                                v-model="dynamicValidateForm.executeDate"
-                                type="date"
-                                :clearable="false"
-                                placeholder="选择日期"
-                            />
-                        </el-form-item>
-                    </div>
-                </div>
-                <div class="farm-card prescription-content">
-                    <div class="card-title pb-12">药物处方</div>
-                    <el-form-item label-width="82px" class="form-item" prop="usageMode" label="施用方式">
-                        <el-select v-model="dynamicValidateForm.usageMode" placeholder="请选择施用方式" style="width: 100%">
-                            <el-option
-                                v-for="(usage, uId) in allUsageModeList"
-                                :key="uId"
-                                :label="usage"
-                                :value="usage"
-                            />
-                        </el-select>
-                    </el-form-item>
-                    <div v-if="dynamicValidateForm.usageMode !== '人工农事'">
-                        <el-form-item
-                            v-for="(prescriptionItem, prescriptionI) in dynamicValidateForm.prescriptionList"
-                            :key="prescriptionI"
-                            :prop="'prescriptions.' + prescriptionI + '.value'"
-                            class="prescription-item"
-                        >
-                            <div class="recipe-item">
-                                <div class="sub-title">
-                                    <div>{{ prescriptionItem.name }}处方</div>
-                                    <div class="add-tag" @click="addDomain(prescriptionI)">
-                                        <el-icon color="#2199F8"><Plus /></el-icon>新增药物
-                                    </div>
-                                </div>
-                                <div class="recipe-form">
-                                    <el-form-item
-                                        v-for="(domain, index) in prescriptionItem.pesticideFertilizerList"
-                                        :key="domain.key"
-                                        :prop="'pesticideFertilizerList.' + index + '.value'"
-                                    >
-                                        <div class="form-box">
-                                            <div class="form-index">{{ formatIndex(index) }}</div>
-                                            <div class="box-item" v-if="domain.typeName">
-                                                <div class="form-l">药肥类型</div>
-                                                <div class="form-r r-text">
-                                                    {{ domain.typeName }}
-                                                    <!-- <el-select
-                                                    v-model="domain.typeName"
-                                                    placeholder="请选择"
-                                                    style="width: 100%"
-                                                    >
-                                                        <el-option :label="domain.typeName" :value="domain.typeName" />
-                                                </el-select> -->
-                                                </div>
-                                            </div>
-                                            <div class="box-item">
-                                                <div class="form-l">药肥名称</div>
-                                                <div class="form-r">
-                                                    <el-select
-                                                        filterable
-                                                        @change="handlePesticideFertilizerChange(prescriptionI, index)"
-                                                        v-model="domain.pesticideFertilizerCode"
-                                                        placeholder="请选择"
-                                                        style="width: 100%"
-                                                    >
-                                                        <el-option
-                                                            v-for="item in pesticideFertilizersOptions"
-                                                            :key="item.pesticideFertilizerCode"
-                                                            :label="item.defaultName || item.name"
-                                                            :value="item.pesticideFertilizerCode"
-                                                        />
-                                                    </el-select>
-                                                </div>
-                                            </div>
-                                            <div class="form-title">人工方式</div>
-                                            <div class="box-item sub-item">
-                                                <div class="form-l has-sub">
-                                                    <div class="main-name">药肥配比</div>
-                                                </div>
-                                                <div class="form-r input-box text-center input-unit">
-                                                    <!-- <el-input
-                                                        v-model="domain.ratio"
-                                                        style="width: 100%"
-                                                        placeholder="请输入"
-                                                    /> -->
-
-                                                    <el-input v-model="domain.ratio" type="number" step="0.01" placeholder="请输入">
-                                                        <template #append>倍</template>
-                                                    </el-input>
-                                                </div>
-                                            </div>
-                                            <!-- <div class="box-item sub-item">
-                                                <div class="form-l">施用方式</div>
-                                                <div class="form-r">
-                                                    <el-select
-                                                        v-model="domain.usageMode"
-                                                        placeholder="请选择"
-                                                        style="width: 100%"
-                                                    >
-                                                        <el-option
-                                                            v-for="(usage, uId) in domain.usageModeList"
-                                                            :key="uId"
-                                                            :label="usage"
-                                                            :value="usage"
-                                                        />
-                                                    </el-select>
-                                                </div>
-                                            </div> -->
-                                            <div class="box-item sub-item">
-                                                <div class="form-l has-sub">
-                                                    <div class="main-name">单亩用量</div>
-                                                </div>
-                                                <div class="form-r input-box text-center">
-                                                    <!-- <el-input
-                                                        v-model="domain.muUsage"
-                                                        style="width: 100%"
-                                                        placeholder="请输入"
-                                                    /> -->
-                                                    <el-input v-model="domain.dosage" type="number" step="0.01" placeholder="请输入">
-                                                        <template #append>{{ domain.unit }}</template>
-                                                    </el-input>
-                                                </div>
-                                            </div>
-                                            <div v-if="dynamicValidateForm.usageMode === '叶面施'">
-                                                <div class="form-title">无人机</div>
-                                                <div class="box-item sub-item">
-                                                    <div class="form-l has-sub">
-                                                        <div class="main-name">药肥配比</div>
-                                                    </div>
-                                                    <div class="form-r input-box text-center">
-                                                        <!-- <el-input
-                                                            v-model="domain.ratio2"
-                                                            style="width: 100%"
-                                                            placeholder="请输入"
-                                                        /> -->
-                                                        <el-input v-model="domain.ratio2" type="number" step="0.01" placeholder="请输入">
-                                                            <template #append>倍</template>
-                                                        </el-input>
-                                                    </div>
-                                                </div>
-                                                <div class="box-item sub-item">
-                                                    <div class="form-l has-sub">
-                                                        <div class="main-name">单亩用量</div>
-                                                    </div>
-                                                    <div class="form-r input-box text-center">
-                                                        <!-- <el-input
-                                                            v-model="domain.muUsage2"
-                                                            style="width: 100%"
-                                                            placeholder="请输入"
-                                                        /> -->
-                                                        <el-input v-model="domain.dosage2" type="number" step="0.01" placeholder="请输入">
-                                                            <template #append>{{ domain.unit }}</template>
-                                                        </el-input>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="input-box mark-box">
-                                                <el-input
-                                                    v-model="domain.remark"
-                                                    style="width: 100%"
-                                                    placeholder="备注:用药注意事项"
-                                                />
-                                            </div>
-                                            <div class="action-btn">
-                                                <el-button
-                                                    class="btn delete-btn"
-                                                    @click.prevent="removeDomain(prescriptionI, domain)"
-                                                >
-                                                    删除
-                                                </el-button>
-                                                <el-button
-                                                    type="default"
-                                                    class="btn"
-                                                    @click.prevent="resetItemForm(prescriptionI, index)"
-                                                >
-                                                    重置
-                                                </el-button>
-                                            </div>
-                                        </div>
-                                    </el-form-item>
-                                </div>
-                            </div>
-                        </el-form-item>
-                    </div>
-                </div>
-
-                <div class="submit-btn" v-if="isEdit">
-                    <div class="btn second" @click.prevent="cancelEdit">取消编辑</div>
-                    <div class="btn" @click.prevent="submitForm(formRef)">保存方案</div>
-                </div>
-            </el-form>
-        </div>
-    </div>
-
-    <popup v-model:show="showTaskPopup" round class="task-tips-popup">
-        <img class="farm-check-icon" src="@/assets/img/home/right.png" alt="">
-        <div class="create-farm-text success-text">方案已保存成功</div>
-        <div class="create-farm-btn" @click="handlePopupBtn">我知道了</div>
-    </popup>
-</template>
-
-<script setup>
-import { onActivated, ref, reactive, onDeactivated, onBeforeUnmount, computed, onMounted } from "vue";
-import { useRouter, useRoute } from "vue-router";
-import { ElMessage ,ElMessageBox} from "element-plus";
-import customHeader from "@/components/customHeader.vue";
-import { useStore } from "vuex";
-import { Popup } from "vant";
-import dayjs from "dayjs";
-const store = useStore();
-const router = useRouter();
-const route = useRoute();
-
-// 角色
-// const curRole = store.state.app.curRole
-const curRole = 0
-
-const gardenId = ref(null);
-const actionType = ref([]);
-const isAdd = ref(false)
-
-const showTaskPopup = ref(false);
-const loading = ref(false);
-
-const isEdit = ref(false)
-isAdd.value = route.query.isAdd ? true : false
-isEdit.value = route.query.isEdit ? true : false
-onMounted(() => {
-    window.scrollTo(0, 0);
-    console.log('route.query', route.query);
-    const arrangeId = route.query.arrangeId;
-    if (arrangeId) {
-        getArrangeDetail(arrangeId);
-    }
-    
-    // if (route.query.data) {
-    //     actionType.value = JSON.parse(route.query.data);
-    // } else {
-    //     actionType.value = ["生长异常"];
-    // }
-    // const planData = JSON.parse(route.query.planData);
-    // detailData.value = planData;
-    // console.log('planData', planData);
-    // dynamicValidateForm.farmWorkName = planData.name;
-    // dynamicValidateForm.executeDate = planData.executeDate;
-    // dynamicValidateForm.usageMode = planData.prescription.usageMode;
-    // planData.prescription.pesticideFertilizerList.forEach(item => {
-    //     item.defaultName = item.name;
-    //     item.pesticideFertilizerCode = item.code;
-    // });
-    // dynamicValidateForm.prescriptionList = [planData.prescription];
-    // console.log('dynamicValidateForm.prescriptionList', dynamicValidateForm.prescriptionList);
-    // dynamicValidateForm.prescriptionList = actionType.value.map((name) => ({
-    //     name,
-    //     pesticideFertilizerList: [
-    //         {
-    //             key: 1,
-    //             typeName: "",
-    //             muUsage: "",
-    //             muUsage2: "",
-    //             ratio: "",
-    //             ratio2: "",
-    //             remark: "",
-    //         },
-    //     ],
-    // }));
-});
-
-const getArrangeDetail = (arrangeId) => {
-    loading.value = true;
-    VE_API.container_farm_work_arrange.getComposite({ arrangeId }).then(({ data }) => {
-        detailData.value = data;
-        
-        // 赋值表单数据
-        if (data.farmWorkLib) {
-            // 执行时间
-            if (data.farmWorkLib.executeDate) {
-                dynamicValidateForm.executeDate = data.farmWorkLib.executeDate;
-            }
-        }
-        
-        // 施用方式
-        if (data.prescription && data.prescription.usageMode) {
-            dynamicValidateForm.usageMode = data.prescription.usageMode;
-        }
-        
-        // 处理处方数据
-        if (data.prescription && data.prescription.pesticideFertilizerList) {
-            // 将 prescription 对象转换为 prescriptionList 数组格式
-            // 根据 typeName 分组,创建不同的处方项
-            const prescriptionMap = new Map();
-            
-            data.prescription.pesticideFertilizerList.forEach((item, index) => {
-                const typeName = item.typeName || '其他';
-                
-                if (!prescriptionMap.has(typeName)) {
-                    prescriptionMap.set(typeName, {
-                        name: typeName,
-                        pesticideFertilizerList: []
-                    });
-                }
-                
-                // 查找对应的药肥选项,获取完整信息
-                const pesticideOption = pesticideFertilizersOptions.value.find(
-                    opt => opt.pesticideFertilizerCode === item.code || opt.code === item.code
-                );
-                
-                // 映射字段到表单需要的格式
-                const prescriptionItem = {
-                    key: Date.now() + index,
-                    pesticideFertilizerCode: item.code,
-                    pesticideFertilizerName: item.name,
-                    pesticideFertilizerId: pesticideOption?.id || null, // 用于 handlePesticideFertilizerChange 函数
-                    typeName: item.typeName || '',
-                    ratio: item.ratio || '',
-                    dosage: item.dosage || '',
-                    ratio2: item.ratio2 || '', // 无人机方式的亩兑水量
-                    dosage2: item.dosage2 || '', // 无人机方式的单亩用量
-                    remark: item.remark || '',
-                    unit: pesticideOption?.unit || 'kg',
-                    defaultRatio: pesticideOption?.defaultRatio || item.ratio || '',
-                    usageModeList: pesticideOption?.usageModeList || [],
-                    defaultName: pesticideOption?.defaultName || pesticideOption?.name || item.name,
-                };
-                
-                prescriptionMap.get(typeName).pesticideFertilizerList.push(prescriptionItem);
-            });
-            
-            // 转换为数组
-            dynamicValidateForm.prescriptionList = Array.from(prescriptionMap.values());
-            
-            // 如果没有数据,至少保留一个空项
-            if (dynamicValidateForm.prescriptionList.length === 0) {
-                dynamicValidateForm.prescriptionList = [{
-                    name: "",
-                    pesticideFertilizerList: [{
-                        key: Date.now(),
-                        typeName: "",
-                        muUsage: "",
-                        muUsage2: "",
-                        ratio: "",
-                        ratio2: "",
-                        remark: "",
-                    }],
-                }];
-            }
-        }
-    }).finally(() => {
-        loading.value = false;
-    });
-};
-
-const detailData = ref({});
-
-function handlePopupBtn() {
-    showTaskPopup.value = false;
-    router.back();
-}
-
-const resetForm = (formEl) => {
-    if (!formEl) return;
-    formEl.resetFields();
-    serveArea.value = null;
-    regionId.value = null;
-};
-
-// 清空所有数据
-const clearData = () => {
-    // 清空表单
-    resetForm(formRef.value);
-    
-    // 清空详情数据
-    detailData.value = {};
-    
-    // 清空表单数据
-    dynamicValidateForm.farmWorkName = "";
-    dynamicValidateForm.conditionRate = "";
-    dynamicValidateForm.purpose = "";
-    dynamicValidateForm.executeDate = dayjs().format("YYYY-MM-DD");
-    dynamicValidateForm.checkDay = "";
-    dynamicValidateForm.usageMode = "";
-    dynamicValidateForm.prescriptionList = [{
-        name: "",
-        pesticideFertilizerList: [{
-            key: 1,
-            typeName: "",
-            muUsage: "",
-            muUsage2: "",
-            ratio: "",
-            ratio2: "",
-            remark: "",
-        }],
-    }];
-    
-    // 清空其他数据
-    serveArea.value = null;
-    regionId.value = null;
-    areaList.value = [];
-    situationDescription.value = '';
-    checkedArea.value = false;
-    actionType.value = [];
-    gardenId.value = null;
-    showTaskPopup.value = false;
-};
-
-onDeactivated(() => {
-    // areaRef.value && newFarmMap.destroyMap();
-    clearData();
-});
-
-onBeforeUnmount(() => {
-    clearData();
-});
-
-const cancelEdit = () => {
-    ElMessageBox.confirm("确认要取消编辑吗?", "提示", {
-        confirmButtonText: "确认",
-        cancelButtonText: "取消",
-        type: "warning",
-    })
-        .then(() => {
-            router.back();
-        })
-        .catch(() => {
-            console.log("取消编辑");
-        });
-};
-
-// 表单
-const formRef = ref();
-const dynamicValidateForm = reactive({
-    farmWorkName: "",
-    conditionRate: "",
-    purpose: "",
-    executeDate: dayjs().format("YYYY-MM-DD"),
-    checkDay: "",
-    usageMode: "",
-    prescriptionList: [
-        {
-            name: "",
-            pesticideFertilizerList: [
-                {
-                    key: 1,
-                    typeName: "",
-                    muUsage: "",
-                    muUsage2: "",
-                    ratio: "",
-                    ratio2: "",
-                    remark: "",
-                },
-            ],
-        },
-    ],
-});
-
-const rules = {
-    farmWorkName: [
-        {
-            required: true,
-            message: "请输入农事名称",
-            trigger: "blur",
-        },
-    ],
-    conditionRate: [
-        {
-            required: false,
-            message: "请输入触发条件",
-            trigger: "blur",
-        },
-    ],
-    executeDate: [
-        {
-            required: false,
-            message: "请选择执行时间",
-            trigger: "blur",
-        },
-    ],
-    checkDay: [
-        {
-            required: true,
-            message: "请选择复核时间",
-            trigger: "blur",
-        },
-    ],
-};
-
-const formatIndex = (index) => {
-    return String(index + 1).padStart(2, "0");
-};
-
-const addDomain = (parentIndex) => {
-    dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList.unshift({
-        key: Date.now(),
-        muUsage: "",
-        muUsage2: "",
-        ratio: "",
-        ratio2: "",
-        remark: "",
-    });
-};
-
-let pesticideFertilizersOptions = ref([]);
-VE_API.z_farm_work_order.pesticideFertilizersList().then(({ data }) => {
-    pesticideFertilizersOptions.value = data;
-});
-
-const allUsageModeList = ["叶面施", "根部施", "人工农事"];
-
-
-/**
- * 选择药肥的时候修改订单中药肥pesticideFertilizerCode 以外其他数据
- * @param parentIndex 处方索引
- * @param index 药物索引
- */
-const handlePesticideFertilizerChange = (parentIndex, index) => {
-    const currentItem = dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index];
-    const pesticideFertilizerCode = currentItem.pesticideFertilizerCode;
-    
-    // 根据 pesticideFertilizerCode 查找对应的药肥选项
-    const obj = pesticideFertilizersOptions.value.find(
-        (item) => item.pesticideFertilizerCode === pesticideFertilizerCode || item.code === pesticideFertilizerCode
-    );
-    
-    if (!obj) {
-        ElMessage({
-            message: "未找到对应的药肥信息",
-            type: "warning",
-        });
-        return;
-    }
-    
-    // 更新当前项的数据,保留原有数据并更新新字段
-    dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index] = {
-        ...currentItem,
-        pesticideFertilizerId: obj.id || null,
-        typeName: obj.typeName || currentItem.typeName || '',
-        unit: obj.unit || currentItem.unit || 'kg',
-        defaultRatio: obj.defaultRatio || currentItem.defaultRatio || '',
-        usageModeList: obj.usageModeList || currentItem.usageModeList || [],
-        // 如果 ratio 为空,则使用默认值
-        ratio: currentItem.ratio || obj.defaultRatio || '',
-        ratio2: currentItem.ratio2 || obj.defaultDroneRatio || '',
-        defaultName: obj.defaultName || obj.name || currentItem.defaultName || '',
-        pesticideFertilizerName: obj.name || currentItem.pesticideFertilizerName || '',
-        pesticideFertilizerCode: obj.pesticideFertilizerCode || pesticideFertilizerCode,
-    };
-};
-
-const removeDomain = (parentIndex, item) => {
-    const index = dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList.indexOf(item);
-    if (index !== -1) {
-        dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList.splice(index, 1);
-    }
-};
-
-const resetItemForm = (parentIndex, index) => {
-    dynamicValidateForm.prescriptionList[parentIndex].pesticideFertilizerList[index] = {
-        typeName: "",
-        muUsage: "",
-        muUsage2: "",
-        ratio: "",
-        ratio2: "",
-        remark: "",
-    };
-};
-
-const submitForm = (formEl) => {
-    if (!formEl) return;
-    formEl.validate((valid) => {
-        if (valid) {
-
-            // router.push({
-            //     path: "/completed_work",
-            //     query: {
-            //         id: 1,
-            //         status: 1,
-            //     },
-            // });
-
-            // showTaskPopup.value = true;
-            submit();
-        } else {
-            console.log("error submit!");
-        }
-    });
-};
-
-const submit = () => {
-    // 构造保存数据,格式与 getComposite 返回的一致
-    const saveData = {
-        arrange: {
-            ...detailData.value.arrange,
-        },
-        farmWorkLib: {
-            ...detailData.value.farmWorkLib,
-            // 更新执行时间
-            executeDate: dynamicValidateForm.executeDate || detailData.value.farmWorkLib?.executeDate,
-        },
-        prescription: {
-            id: detailData.value.prescription?.id || null,
-            usageMode: dynamicValidateForm.usageMode || detailData.value.prescription?.usageMode || '',
-            farmWorkLibCode: detailData.value.prescription?.farmWorkLibCode || detailData.value.farmWorkLib?.code || '',
-            expertId: detailData.value.prescription?.expertId || detailData.value.farmWorkLib?.expertId || '',
-            phenology: detailData.value.prescription?.phenology || '',
-            soil: detailData.value.prescription?.soil || '',
-            speed: detailData.value.prescription?.speed || null,
-            // 将 prescriptionList 扁平化为 pesticideFertilizerList
-            pesticideFertilizerList: dynamicValidateForm.prescriptionList.reduce((acc, prescriptionItem) => {
-                const items = prescriptionItem.pesticideFertilizerList.map(item => ({
-                    code: item.pesticideFertilizerCode || item.code || '',
-                    name: item.pesticideFertilizerName || item.name || '',
-                    dosage: item.dosage || '',
-                    ratio: item.ratio || '',
-                    ratio2: item.ratio2 || '', // 无人机方式的亩兑水量
-                    dosage2: item.dosage2 || '', // 无人机方式的单亩用量
-                    muPrice: item.muPrice || null,
-                    typeName: item.typeName || '',
-                    remark: item.remark || '',
-                }));
-                return acc.concat(items);
-            }, []),
-        },
-        triggers: detailData.value.triggers || [],
-    };
-console.log('saveData', saveData);
-    // 调用保存接口
-    VE_API.container_farm_work_arrange.saveComposite(saveData).then(({ code, message }) => {
-        if (code === 0) {
-            showTaskPopup.value = true;
-        }
-    });
-};
-
-const farmWorkTypeVal = computed(() => {
-    const valueMap = {
-        生长异常: 1,
-        病虫异常: 3,
-        营养农事: 2,
-    };
-
-    if (actionType.value.length === 1) {
-        return valueMap[actionType.value[0]] || null; // 如果只有一个元素,返回对应的值,否则返回 null
-    } else {
-        return 1;
-    }
-});
-
-function flattenDomains(data) {
-    return data.reduce((acc, item) => {
-        return acc.concat(item.pesticideFertilizerList);
-    }, []);
-}
-
-const serveArea = ref(null);
-// 农场分区列表
-const areaList = ref([]);
-const regionId = ref(null);
-
-
-// 状况描述相关数据
-const situationDescription = ref('')
-const checkedArea = ref(false);
-// 处理上传图片
-const handleUploadImage = () => {
-    // 这里可以添加上传图片的逻辑
-    console.log('上传图片');
-};
-
-// 处理邀请专家诊断
-const handleExpertDiagnosis = () => {
-    // 这里可以添加邀请专家诊断的逻辑
-    console.log('邀请专家诊断');
-};
-</script>
-
-<style lang="scss" scoped>
-.new-farming-page {
-    height: 100vh;
-    position: relative;
-    overflow: auto;
-    font-size: 14px;
-    background: #f2f3f5;
-    ::v-deep {
-        .custom-header {
-            position: fixed;
-            top: 0;
-            padding-bottom: 1px;
-        }
-    }
-    .step-wrap {
-        padding: 12px 0;
-    }
-    .box-wrap {
-        background: #fff;
-        padding: 10px;
-        border-radius: 8px;
-    }
-    .new-farming-content {
-        margin: 41px 0 62px 0;
-        padding: 4px 12px 8px 12px;
-        width: 100%;
-        box-sizing: border-box;
-        
-        // ::v-deep {
-        //     .el-select__input {
-        //         color: #2199F8;
-        //     }
-        //     .el-select__wrapper {
-        //         color: #2199F8;
-        //         min-height: 30px;
-        //         line-height: 28px;
-        //         box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
-        //     }
-        //     .el-select__caret {
-        //         color: #2199F8;
-        //     }
-        //     .el-select__placeholder {
-        //         color: #2199F8;
-        //     }
-        //     .el-radio {
-        //         margin-right: 16px;
-        //     }
-        //     .el-input__wrapper {
-        //         box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
-        //     }
-        //     .el-input__prefix {
-        //         color: #2199F8;
-        //     }
-        //     .el-input__inner {
-        //         color: #2199F8;
-        //         --el-input-placeholder-color: rgba(33, 153, 248, 0.43);
-        //     }
-        //     .el-tag.el-tag--info {
-        //         --el-tag-text-color: #2199F8;
-        //         --el-tag-bg-color: rgba(33, 153, 248, 0.1);
-        //     }
-        // }
-        .farm-info {
-            color: rgba(0, 0, 0, 0.6);
-            font-size: 14px;
-            margin-top: 14px;
-            .info-title {
-                display: flex;
-                align-items: center;
-                justify-content: space-between;
-                color: rgba(41, 41, 41, 0.3);
-                .info-more {
-                    display: flex;
-                    align-items: center;
-                }
-            }
-        }
-        .farm-photo {
-            margin-top: 10px;
-            .photo-list {
-                display: flex;
-                align-items: center;
-                width: 100%;
-                overflow: auto;
-                padding-bottom: 10px;
-                .photo-item {
-                    width: 92px;
-                    height: 92px;
-                    border-radius: 8px;
-                    object-fit: cover;
-                }
-                .img-item {
-                    img {
-                        width: 92px;
-                        height: 92px;
-                        border-radius: 8px;
-                        object-fit: cover;
-                        margin-right: 12px;
-                    }
-                }
-            }
-            .list-text {
-                text-align: center;
-                color: rgba(0, 0, 0, 0.5);
-                padding-top: 2px;
-            }
-        }
-        .submit-btn {
-            z-index: 10;
-            position: fixed;
-            bottom: 0px;
-            left: 0;
-            width: 100%;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            padding: 12px;
-            background: #fff;
-            box-sizing: border-box;
-            box-shadow: 0 4px 4px rgba(0, 0, 0, 0.4);
-            border-top: 1px solid rgba(0, 0, 0, 0.1);
-            .btn {
-                height: 40px;
-                border-radius: 25px;
-                line-height: 40px;
-                width: 110px;
-                text-align: center;
-                background: linear-gradient(180deg, #70BFFE, #2199F8);
-                color: #FFFFFF;
-                font-size: 14px;
-                &.second {
-                    background: #FFFFFF;
-                    border: 1px solid rgba(153, 153, 153, 0.5);
-                    color: #666666;
-                }
-            }
-            .btn + .btn {
-                margin-left: 12px;
-            }
-        }
-    }
-    .card-title {
-        font-size: 16px;
-        font-weight: bold;
-        color: #000;
-        display: flex;
-        align-items: center;
-        // justify-content: space-between;
-        .add-tag {
-            font-size: 12px;
-            color: #2199f8;
-            padding: 4px 8px;
-            background: rgba(33, 153, 248, 0.16);
-            border-radius: 20px;
-            font-weight: normal;
-            height: 25px;
-            line-height: 25px;
-        }
-        .type-tag {
-            margin-left: 5px;
-            font-size: 12px;
-            color: #000000;
-            padding: 0 10px;
-            background: rgba(119, 119, 119, 0.1);
-            border-radius: 20px;
-            font-weight: normal;
-            height: 26px;
-            line-height: 26px;
-        }
-    }
-    .pb-12 {
-        padding-bottom: 12px;
-    }
-    .farm-card {
-        background: #ffffff;
-        border-radius: 8px;
-        padding: 12px 12px 0 12px;
-        width: 100%;
-        box-sizing: border-box;
-        margin-top: 10px;
-        color: rgba(0, 0, 0, 0.4);
-        &.progress{
-            display: flex;
-            align-items: center;
-            padding: 12px;
-            .progress-title{
-                margin-right: 12px;
-            }
-            ::v-deep{
-                .el-radio{
-                    margin-right: 10px;
-                }
-            }
-        }
-        &.map-content {
-            margin-top: 12px;
-        }
-        &.prescription-content {
-            padding: 12px;
-        }
-    }
-
-    .usage-mode-wrap {
-        padding: 0 12px;
-        margin-top: 12px;
-        .info-content {
-            padding-top: 14px;
-            padding-bottom: 1px;
-        }
-
-        .el-form-item--default {
-            margin-bottom: 0;
-        }
-    }
-
-    ::v-deep {
-        .el-form-item__label {
-            height: 30px;
-            line-height: 30px;
-            color: rgba(0, 0, 0, 0.4);
-        }
-        .el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before {
-            display: none;
-        }
-    }
-    .info-content {
-        padding: 10px 0;
-        position: relative;
-
-        .condition-wrap {
-            display: flex;
-            align-items: center;
-            width: 100%;
-            .symbol {
-                width: 10px;
-                // text-align: center;
-                // padding: 0 4px;
-            }
-        }
-        .item-input {
-            // width: 60%;
-            min-width: 140px;
-            max-width: 240px;
-        }
-        .recheck-text {
-            padding-left: 6px;
-        }
-        .info-item {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            width: 100%;
-        }
-        .info-item + .info-item {
-            margin-top: 12px;
-        }
-
-        .bottom-map {
-            width: 100%;
-            height: 250px;
-            clip-path: inset(0px round 8px);
-        }
-        .check-btn {
-            position: absolute;
-            bottom: 16px;
-            right: 6px;
-            background: rgba(0, 0, 0, 0.6);
-            padding: 0 8px;
-            border-radius: 8px;
-
-            ::v-deep {
-                .el-checkbox {
-                    color: #fff;
-                }
-            }
-        }
-        .area-select {
-            padding-bottom: 12px;
-            .block {
-                width: 12px;
-                display: inline-block;
-            }
-        }
-    }
-
-    ::v-deep {
-        .el-form-item--default {
-            margin-bottom: 8px;
-            &.text-item {
-                margin-bottom: 2px;
-                .el-form-item__content {
-                    line-height: 24px;
-                }
-                .el-form-item__label {
-                    height: 24px;
-                    line-height: 24px;
-                }
-            }
-        }
-    }
-    .sub-title {
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        color: rgba(0, 0, 0, 0.6);
-        font-size: 14px;
-        .add-tag {
-            font-size: 12px;
-            color: #2199f8;
-            padding: 0 8px;
-            border: 1px solid #2199F8;
-            border-radius: 5px;
-            font-weight: normal;
-            height: 28px;
-            line-height: 28px;
-        }
-    }
-    .recipe-item {
-        width: 100%;
-        .recipe-form {
-            padding-top: 8px;
-            ::v-deep {
-                .el-form-item {
-                    &:last-child {
-                        margin-bottom: 0;
-                    }
-                }
-            }
-        }
-
-        .box-item {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            color: rgba(0, 0, 0, 0.4);
-            .r-text {
-                width: 140px;
-                text-align: center;
-            }
-            .form-r {
-                width: 60%;
-                min-width: 140px;
-                max-width: 240px;
-            }
-        }
-        .form-box {
-            border: 1px solid rgba(33, 153, 248, 0.8);
-            border-radius: 8px;
-            padding: 20px 10px;
-            width: 100%;
-            position: relative;
-            // background: rgb(209, 235, 255, 0.3);
-            // margin-bottom: 12px;
-            .form-index {
-                position: absolute;
-                left: 0;
-                top: 0;
-                padding: 0 6px;
-                background: #2199F8;
-                border-radius: 4px 0 4px 0;
-                height: 18px;
-                line-height: 18px;
-                font-size: 12px;
-                color: #fff;
-            }
-            .input-box {
-                &.mark-box {
-                    padding: 8px 0 12px 0;
-                }
-            }
-
-            
-            // .input-unit {
-            //     ::v-deep {
-            //         .el-input {
-            //             border: 1px solid #dcdfe6;
-            //             border-radius: 5px;
-            //             height: 32px;
-            //             box-sizing: border-box;
-            //         }
-            //         .el-input__wrapper {
-            //             padding: 0 2px 0 10px;
-            //             height: 30px;
-            //             line-height: 30px;
-            //             min-height: 30px;
-            //             box-shadow: none;
-            //         }
-            //         .el-input__inner {
-            //             --el-input-inner-height: 30px;
-            //             height: 30px;
-            //             line-height: 30px;
-            //             min-height: 30px;
-            //             color: #606266;
-            //             --el-input-placeholder-color: #a8abb2;
-            //         }
-            //         .el-input-group__append {
-            //             box-shadow: none;
-            //             border: none;
-            //             background: none;
-            //         }
-            //     }
-            // }
-            .text-center {
-                ::v-deep {
-                    .el-input__inner {
-                        text-align: center;
-                    }
-                }
-            }
-            .action-btn {
-                display: flex;
-                justify-content: flex-end;
-                .btn {
-                    color: #8F8F8F;
-                    border-radius: 25px;
-                    padding: 5px 30px;
-                }
-                .delete-btn {
-                    color: rgba(255, 89, 89, 0.9);
-                    background: #fff;
-                    border: 1px solid rgba(255, 89, 89, 0.9);
-                }
-            }
-            .btn-group {
-                padding-top: 12px;
-            }
-            .sub-item {
-                padding-left: 10px;
-                .has-sub {
-                    display: flex;
-                    flex-direction: column;
-                    align-items: center;
-                    .main-name {
-                        line-height: 20px;
-                    }
-                    .sub-name {
-                        font-size: 10px;
-                        color: rgba(129, 129, 129, 0.5);
-                        line-height: 14px;
-                    }
-                }
-                .colunm-sub {
-                    display: flex;
-                    align-items: center;
-                    .sub-name {
-                        font-size: 10px;
-                        color: rgba(129, 129, 129, 0.5);
-                    }
-                }
-                .r-text {
-                    width: 132px;
-                    text-align: center;
-                    font-size: 14px;
-                    color: #474747;
-                }
-                .price {
-                    ::v-deep {
-                        .el-input__wrapper {
-                            box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
-                        }
-                        .el-input__inner {
-                            color: #2199f8;
-                        }
-                    }
-                }
-            }
-            .form-title {
-                font-size: 14px;
-                padding-top: 6px;
-                color: #000;
-                font-weight: 600;
-            }
-            .box-item + .box-item {
-                margin-top: 8px;
-            }
-        }
-        .form-box + .form-box {
-            margin-top: 8px;
-        }
-        .usageMode-wrap {
-            padding-top: 8px;
-        }
-    }
-    
-    // 状况描述样式
-    .situation-description {
-        width: 100%;
-        .description-title {
-            font-size: 16px;
-            font-weight: bold;
-            color: #000;
-            margin-bottom: 12px;
-        }
-        
-        .description-content {
-            .description-textarea {
-                margin-bottom: 10px;
-                width: 100%;
-            }
-            
-            .upload-section {
-                .upload-btn {
-                    width: 112px;
-                    height: 32px;
-                    border-radius: 3px;
-                    border: 1px solid #e0e0e0;
-                    background: #fff;
-                    color: #000;
-                    font-size: 14px;
-                    display: flex;
-                    align-items: center;
-                    justify-content: center;
-                    margin-bottom: 8px;
-                    
-                    .el-icon {
-                        margin-right: 6px;
-                    }
-                }
-                
-                .upload-tip {
-                    font-size: 12px;
-                    color: #999;
-                    line-height: 1.4;
-                }
-            }
-        }
-    }
-    
-    // 专家诊断按钮样式
-    .expert-diagnosis-btn {
-        width: 180px;
-        height: 40px;
-        border-radius: 24px;
-        background: linear-gradient(180deg, #70BFFE 0%, #2199F8 100%);
-        color: #FFFFFF;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        margin: 30px auto 0;
-    }
-}
-.task-tips-popup {
-    width: 75%;
-    padding: 28px 28px 20px;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    .create-farm-icon{
-        width: 40px;
-        height: 40px;
-        margin-bottom: 12px;
-    }
-    .farm-check-icon{
-        width: 68px;
-        height: 68px;
-        margin-bottom: 12px;
-    }
-    .create-farm-text{
-        font-size: 20px;
-        font-weight: 500;
-        line-height: 40px;
-        margin-bottom: 32px;
-        text-align: center;
-        &.success-text{
-            font-size: 24px;
-            font-weight: 500;
-        }
-    }
-    .main-text {
-        color: #2199F8;
-    }
-    .create-farm-btn{
-        width: 100%;
-        box-sizing: border-box;
-        padding: 8px;
-        border-radius: 25px;
-        font-size: 16px;
-        background: #2199F8;
-        color: #fff;
-        text-align: center;
-    }
-}
-</style>

+ 0 - 437
src/views/old_mini/plan/components/myPrescription.vue

@@ -1,437 +0,0 @@
-<template>
-    <div class="prescription-page">
-        <div class="filter-list">
-            <div
-                class="filter-item"
-                v-for="(label, i) in filterTabs"
-                :key="i"
-                :class="{ active: i === activeFilterIndex }"
-                @click="activeFilterIndex = i"
-            >
-                {{ label }}
-            </div>
-        </div>
-        <div class="expert-prescription" :class="{ isSubPage: isSubPage }">
-            <div class="plan-menu">
-                <el-anchor :container="containerRef" direction="vertical" type="default" @click="handleClick">
-                    <el-menu :default-active="defaultActive" class="el-menu-vertical-demo">
-                        <el-sub-menu v-for="(menu, index) in menuData" :key="index" :index="String(menu.id)">
-                            <template #title>
-                                <img class="menu-icon" :src="require(`@/assets/img/gallery/icon-${index}.png`)" />
-                                <span class="menu-text">{{ menu.name }}</span>
-                            </template>
-                            <el-menu-item
-                                v-for="item in menu.farmWorkArrangeList"
-                                :key="item.id"
-                                :index="`${menu.id}-${item.id}`"
-                            >
-                                <el-anchor-link
-                                    :href="'#' + menu.name + item.farmWorkDetail?.name"
-                                    :title="item.farmWorkDetail?.name"
-                                />
-                            </el-menu-item>
-                        </el-sub-menu>
-                    </el-menu>
-                </el-anchor>
-            </div>
-            <div class="expert-content" ref="containerRef">
-                <div v-for="(section, index) in menuData" :key="index" class="content-section">
-                    <div
-                        class="section-item"
-                        v-for="(sub, subI) in section.farmWorkArrangeList"
-                        :key="index + '-' + subI"
-                    >
-                        <div class="section-id" :id="section.name + sub.farmWorkDetail?.name"></div>
-                        <record-item :record-item-data="sub">
-                            <template #title>
-                                <div class="box-title">
-                                    <div class="title-l">
-                                        {{ sub.farmWorkDetail?.name }}
-                                        <span class="parent-text">{{ section.name }}</span>
-                                    </div>
-                                    <!-- <div class="title-r">
-                                        <div class="btn-item del-btn" @click="deletePlan">
-                                            <el-icon color="#fff" size="14"><Delete /></el-icon>
-                                        </div>
-                                        <div class="btn-item edit-btn">
-                                            <el-icon color="#fff" size="14"><Edit /></el-icon>
-                                        </div>
-                                    </div> -->
-                                </div>
-                            </template>
-                        </record-item>
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        <!-- 底部 -->
-        <div class="fixed-bottom" :style="{ color: activeFilterIndex === defaultFilterIndex ? 'rgba(0, 0, 0, 0.5)' : '#2199F8' }" @click="handleSetDefault">{{activeFilterIndex === defaultFilterIndex ? '当前已是 默认方案' : '设置为 默认方案'}}</div>
-    </div>
-    <!-- <add-group ref="addGroupRef" @updateGroupList="getPlan" /> -->
-    <action-sheet :style="{ bottom: tabBarHeight + 'px' }" v-model:show="showAction" title="选择农事类型(可多选)">
-        <div class="content">
-            <checkbox-group v-model="checkedType">
-                <div class="action-content">
-                    <div
-                        class="action-item"
-                        :class="{ active: checkedType.includes(item) }"
-                        v-for="(item, index) in actionTypeList"
-                        :key="index"
-                        @click="toggleActionType(index)"
-                    >
-                        <div class="type-name">{{ item }}</div>
-                        <div>
-                            <checkbox :name="item" :ref="(el) => (checkboxRefs[index] = el)" @click.stop />
-                        </div>
-                    </div>
-                </div>
-                <div class="action-btn">
-                    <el-button @click="toNewFarming" :disabled="checkedType.length === 0" class="btn-one" type="primary"
-                        >确定</el-button
-                    >
-                </div>
-            </checkbox-group>
-        </div>
-    </action-sheet>
-</template>
-
-<script setup>
-import { computed, onMounted, ref } from "vue";
-import addGroup from "./addGroup.vue";
-import recordItem from "@/components/recordItem.vue";
-import { useStore } from "vuex";
-import { useRouter } from "vue-router";
-import { ActionSheet, Checkbox, CheckboxGroup } from "vant";
-import { ElMessage, ElMessageBox } from "element-plus";
-const props = defineProps({
-    isSubPage: {
-        type: Boolean,
-        default: false,
-    },
-});
-const store = useStore();
-const router = useRouter();
-// 顶部筛选标签
-const filterTabs = ref(["韦帮稳", "某某某", "某某某", "某某某"]);
-const activeFilterIndex = ref(0);
-const defaultFilterIndex = ref(0);
-const handleSetDefault = () => {
-    if (activeFilterIndex.value === defaultFilterIndex.value) {
-        ElMessage.warning('当前已是 默认方案');
-    } else {
-        ElMessageBox.confirm('确定要将当前方案设置为默认方案吗?', '提示', {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning'
-        }).then(() => {
-            defaultFilterIndex.value = activeFilterIndex.value;
-            ElMessage.success('设置成功');
-        }).catch(() => {});
-    }
-};
-
-const tabBarHeight = computed(() => store.state.home.tabBarHeight);
-// 菜单
-const defaultActive = ref("1-1");
-
-const menuData = ref([]);
-
-function deletePlan() {
-    ElMessageBox.confirm("是否确认删除该农事?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-    })
-        .then(() => {
-            // ElMessage({
-            //     type: "success",
-            //     message: "删除成功!",
-            // });
-        })
-        .catch(() => {});
-}
-const handleClick = (e) => {
-    e.preventDefault();
-};
-const addGroupRef = ref(null);
-// 新增方案
-function newPlan() {
-    addGroupRef.value.openClientPopup({ params: { farmIds: [farmId.value], containerId: containerId.value } });
-}
-
-// -------新增农事-----
-const showAction = ref(false);
-const addWork = () => {
-    showAction.value = true;
-};
-
-const checkedType = ref([]);
-const checkboxRefs = ref([]);
-const actionTypeList = ref(["生长异常", "病虫异常", "营养农事"]);
-const toggleActionType = (index) => {
-    checkboxRefs.value[index].toggle();
-};
-
-// 新增农事确定
-const toNewFarming = () => {
-    router.push({
-        path: "/modify_work",
-        query: { data: JSON.stringify(checkedType.value), gardenId: 766, isAdd: true },
-    });
-    showAction.value = false;
-};
-
-const containerRef = ref(null);
-
-onMounted(() => {
-    getFarmList(() => {
-        getWorkList();
-    });
-});
-
-const miniUserId = store.state.home.miniUserId;
-
-const farmItem = ref(null);
-const farmId = ref(null);
-const containerId = ref(null);
-const farmList = ref([]);
-function getFarmList(callback) {
-    VE_API.farm.fetchFarmList({ userId: miniUserId, show3dFarm: false }).then(({ data }) => {
-        farmList.value = data || [];
-        if (data && data.length) {
-            farmItem.value = { ...data[0], value: data[0].organId };
-            farmId.value = data[0].organId;
-            containerId.value = data[0].containerId;
-            callback && callback();
-        }
-    });
-}
-
-function getWorkList() {
-    VE_API.home
-        .getPhenologyFarmWorkList({ farmId: farmId.value, containerId: containerId.value })
-        .then(({ data }) => {
-            menuData.value = data;
-        });
-}
-</script>
-
-<style lang="scss" scoped>
-.prescription-page {
-    height: 100%;
-    background: #f5f7fb;
-    position: relative;
-    .filter-list {
-        padding: 10px 12px;
-        display: flex;
-        align-items: center;
-        gap: 12px;
-        .filter-item {
-            color: #8a8f94;
-            padding: 6px 12px;
-            &.active {
-                color: #2199f8;
-                background: rgba(33, 153, 248, 0.12);
-                border-radius: 28px;
-            }
-        }
-    }
-
-    .expert-prescription {
-        display: flex;
-        width: 100%;
-        height: calc(100vh - 52px - 48px);
-        &.isSubPage {
-            height: calc(100vh - 52px - 48px);
-        }
-        .plan-menu {
-            width: 100px;
-            height: 100%;
-            overflow: auto;
-            padding: 10px 0;
-            box-sizing: border-box;
-            background: #fff;
-            border-radius: 0 10px 10px 0;
-            .menu-icon {
-                width: 13px;
-            }
-            .menu-text {
-                padding: 0 4px;
-            }
-            ::v-deep {
-                .el-anchor {
-                    height: 100%;
-                    background: none;
-                }
-                .el-anchor__marker {
-                    display: none;
-                }
-                .el-menu {
-                    background: none;
-                    border: none;
-                    .el-sub-menu__title {
-                        background: none;
-                        padding: 0 2px;
-                        justify-content: center;
-                    }
-                    .el-sub-menu__title {
-                        height: 32px;
-                    }
-                    .el-sub-menu .el-sub-menu__icon-arrow {
-                        position: static;
-                        padding-top: 6px;
-                    }
-                    .el-sub-menu {
-                        margin-bottom: 16px;
-                        &.is-opened {
-                            .el-sub-menu__icon-arrow {
-                                padding-bottom: 6px;
-                                padding-top: 0;
-                            }
-                        }
-                        .el-menu-item {
-                            height: 32px;
-                            line-height: 32px;
-                            margin: 4px 8px;
-                            padding: 0 2px;
-                            justify-content: center;
-                            background: none;
-                        }
-                        .el-menu-item.is-active {
-                            background: none;
-                            color: #fff;
-                        }
-                        .el-anchor__item {
-                            width: 100%;
-                            text-align: center;
-                        }
-                        .el-anchor__link {
-                            color: #666666;
-                        }
-                        .el-anchor__link.is-active {
-                            background: linear-gradient(180deg, #70bffe, #2199f8);
-                            border-radius: 20px;
-                            color: #fff;
-                        }
-                    }
-                }
-                .el-anchor__list {
-                    padding-left: 0;
-                }
-            }
-        }
-        .expert-content {
-            width: calc(100% - 100px);
-            height: 100%;
-            overflow: auto;
-            padding-bottom: 80px;
-            box-sizing: border-box;
-            .content-section {
-                .section-item {
-                    position: relative;
-                }
-                .section-id {
-                    position: absolute;
-                    // top: -6px;
-                    top: 0;
-                    width: 100%;
-                    height: 1px;
-                }
-            }
-            .box-title {
-                display: flex;
-                align-items: center;
-                justify-content: space-between;
-                padding-bottom: 8px;
-                border-bottom: 1px solid #f5f5f5;
-                margin-bottom: 8px;
-                .title-l {
-                    font-size: 16px;
-                    font-weight: 600;
-                    color: #000;
-                    .parent-text {
-                        margin-left: 5px;
-                        font-size: 12px;
-                        font-weight: normal;
-                        padding: 4px 6px;
-                        border-radius: 14px;
-                        background: rgba(119, 119, 119, 0.1);
-                    }
-                }
-                .title-btn {
-                    width: 24px;
-                    height: 24px;
-                    border-radius: 50%;
-                    background: #2199f8;
-                    display: flex;
-                    align-items: center;
-                    justify-content: center;
-                }
-
-                .title-r {
-                    display: flex;
-                    align-items: center;
-                    .btn-item {
-                        width: 24px;
-                        height: 24px;
-                        border-radius: 50%;
-                        display: flex;
-                        align-items: center;
-                        justify-content: center;
-                        background: #2199f8;
-                        &.del-btn {
-                            margin-right: 5px;
-                            background: #ff953d;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    .fixed-bottom {
-        position: fixed;
-        bottom: 0;
-        left: 0;
-        width: 100%;
-        text-align: center;
-        padding: 20px;
-        background: #fff;
-        box-sizing: border-box;
-        border-top: 1px solid rgba(153, 153, 153, 0.2);
-        color: rgba(0, 0, 0, 0.5);
-    }
-}
-
-.action-content {
-    padding: 4px 12px 40px 12px;
-    .action-item {
-        display: flex;
-        align-items: center;
-        padding: 16px;
-        border: 1px solid #dddddd;
-        border-radius: 8px;
-        color: #000000;
-        .type-name {
-            flex: 1;
-        }
-        &.active {
-            background: rgba(33, 153, 248, 0.1);
-            border-color: #2199f8;
-            color: #2199f8;
-        }
-    }
-    .action-item + .action-item {
-        margin-top: 16px;
-    }
-}
-.action-btn {
-    padding: 0 12px 10px 12px;
-    width: 100%;
-    box-sizing: border-box;
-    .btn-one {
-        width: 100%;
-    }
-}
-</style>

+ 0 - 86
src/views/old_mini/plan/editPlan.vue

@@ -1,86 +0,0 @@
-<template>
-    <div class="edit-plan">
-        <custom-header name="查看详情"></custom-header>
-        <div class="edit-plan-content" v-if="contentData && Object.keys(contentData).length > 0">
-            <record-item :record-item-data="contentData.farmWorkLib" title-mode="default" class="recipe-item" />
-            <prescription-table
-                v-if="contentData?.prescription"
-                :prescription-list="[contentData?.prescription]"
-                :usage-mode="contentData?.prescription?.usageMode"
-                :attention="contentData?.attention"
-            ></prescription-table>
-        </div>
-        <div class="custom-bottom-fixed-btns">
-            <div class="bottom-btn secondary-btn" @click="deletePrescription">删除方案</div>
-            <div class="bottom-btn primary-btn" @click="editPrice">编辑方案</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import recordItem from "@/components/recordItem.vue";
-import prescriptionTable from "@/views/old_mini/agri_work/components/prescriptionTable.vue";
-import { ref, onMounted } from "vue";
-import { ElMessageBox } from "element-plus";
-import { useRouter, useRoute } from "vue-router";
-
-const router = useRouter();
-const route = useRoute();
-onMounted(() => {
-    // const data = JSON.parse(route.query.data);
-    // console.log('data', data);
-    // contentData.value = data;
-    const arrangeId = route.query.arrangeId;
-    if (arrangeId) {
-        getArrangeDetail(arrangeId);
-    }
-});
-const getArrangeDetail = (arrangeId) => {
-    VE_API.container_farm_work_arrange.getComposite({ arrangeId }).then(({ data }) => {
-        contentData.value = data;
-    });
-};
-
-const deletePrescription = () => {
-    ElMessageBox.confirm("确认要删除该处方吗?", "提示", {
-        confirmButtonText: "确认",
-        cancelButtonText: "取消",
-        type: "warning",
-    })
-        .then(() => {
-            console.log("删除成功");
-        })
-        .catch(() => {
-            console.log("取消删除");
-        });
-};
-const editPrice = () => {
-    router.push({
-        path: "/modify_plan",
-        query: { arrangeId: contentData.value.arrange.id, isEdit: true },
-    });
-};
-
-const contentData = ref({});
-
-</script>
-
-<style scoped lang="scss">
-.edit-plan {
-    width: 100%;
-    height: 100vh;
-    background: #f2f3f5;
-    .edit-plan-content {
-        padding: 12px;
-        height: calc(100% - 40px - 82px);
-        overflow: auto;
-        .record-item {
-            margin: 0;
-        }
-        .farm-table {
-            margin-top: 10px;
-        }
-    }
-}
-</style>

+ 0 - 104
src/views/old_mini/plan/farmCard.vue

@@ -1,104 +0,0 @@
-<template>
-    <div class="farm-card-page">
-        <custom-header name="农事卡片"></custom-header>
-        <div class="farm-card-content">
-            <plan-list class="plan-list" :farmId="route.query.farmId" isCheck @selectionChange="handleSelectionChange"></plan-list>
-        </div>
-    </div>
-    <div class="selection-info" v-if="selectedItem">
-        <div class="selection-btn" @click="handleSend">发送</div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { ref } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import PlanList from "@/components/pageComponents/PlanList.vue";
-import { ElMessage } from "element-plus";
-
-const route = useRoute();
-const router = useRouter();
-
-// 选中状态
-const selectedItem = ref({});
-
-// 本地用户头像
-const localUserInfoIcon = (() => {
-    try {
-        const info = JSON.parse(localStorage.getItem("localUserInfo") || "{}");
-        return info?.icon || "";
-    } catch (e) {
-        return "";
-    }
-})();
-
-// 发送功能
-const handleSend = () => {
-    if (!selectedItem.value.id) {
-        ElMessage.warning("请先选择一项");
-        return;
-    }
-    
-    // 创建对话样式的消息
-    const dialogMessage = {
-        sender: "sent",
-        messageType: "report",
-        senderIcon: localUserInfoIcon,
-        title: `分享了一个${selectedItem.value.name}的农事`,
-        reportId:selectedItem.value.id,
-        reportType:'farm_card',
-    }
-    
-    // 返回到上一页并传递数据
-    router.back();
-    
-    // 可以通过事件总线或其他方式传递数据到聊天窗口
-    // 这里使用localStorage临时存储,实际项目中可以使用事件总线
-    sessionStorage.setItem('selectedFarmWork', JSON.stringify(dialogMessage));
-};
-
-// 处理选择变化
-const handleSelectionChange = (value) => {
-    selectedItem.value = value;
-};
-</script>
-
-<style scoped lang="scss">
-.farm-card-page {
-    width: 100%;
-    height: 100vh;
-    background: #f5f7fb;
-    .farm-card-content {
-        width: 100%;
-        height: calc(100% - 35px);
-        .plan-list {
-            height: 100%;
-            margin-top: 10px;
-        }
-    }
-}
-.selection-info {
-    position: fixed;
-    bottom: 0;
-    left: 0;
-    width: 100%;
-    box-sizing: border-box;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    background: #fff;
-    padding: 16px;
-    font-size: 16px;
-    border-top: 1px solid rgba(0, 0, 0, 0.15);
-    box-shadow: 2px 2px 11px rgba(0, 0, 0, 0.48);
-    .selection-btn {
-        background: linear-gradient(180deg, #70BFFE 0%, #2199F8 100%);
-        color: white;
-        padding: 8px;
-        text-align: center;
-        width: 60%;
-        border-radius: 20px;
-    }
-}
-</style>

+ 0 - 276
src/views/old_mini/plan/index copy.vue

@@ -1,276 +0,0 @@
-<template>
-    <div class="farm-card-page">
-        <custom-header name="农事方案"></custom-header>
-        <!-- <Tabs v-model:active="activeTab" class="tabs-wrap" v-if="!route.query.containerId">
-            <Tab title="专家方案">
-                <expert-list :isShowHeader="true"></expert-list>
-            </Tab>
-            <Tab title="我的方案">
-                <div class="farm-card-content">
-                    <tab-list
-                        v-if="curRole == 2"
-                        type="light"
-                        v-model="active"
-                        :tabs="tabs"
-                        @change="handleTabChange"
-                        class="tabs-list"
-                    />
-                    <plan-list :schemeId="active" :farmId="route.query.farmId" :containerId="containerId" :isEdit="isEditVal"> </plan-list>
-                </div>
-            </Tab>
-        </Tabs>
-        <div v-else class="system-generated">
-            <div class="tip-box">
-                <el-icon size="18"><CircleCheckFilled /></el-icon>
-                <span>系统已生成多套方案,请选择最佳方案</span>
-            </div>
-            <tab-list
-                v-if="curRole == 2"
-                type="light"
-                v-model="active"
-                :tabs="tabs"
-                @change="handleTabChange"
-                class="tabs-list"
-            />
-            <plan-list :schemeId="active" :containerId="containerId" :isEdit="isEditVal"> </plan-list>
-        </div> -->
-        <div class="farm-card-content" v-if="!route.query.containerId">
-            <tab-list
-                v-if="curRole == 2"
-                type="light"
-                v-model="active"
-                :tabs="tabs"
-                @change="handleTabChange"
-                class="tabs-list"
-            />
-            <plan-list :schemeId="active" :farmId="route.query.farmId" :containerId="containerId" :isEdit="true"> </plan-list>
-        </div>
-        <div v-else class="system-generated">
-            <div class="tip-box">
-                <el-icon size="18"><CircleCheckFilled /></el-icon>
-                <span>系统已生成多套方案,请选择最佳方案</span>
-            </div>
-            <tab-list
-                v-if="curRole == 2"
-                type="light"
-                v-model="active"
-                :tabs="tabs"
-                @change="handleTabChange"
-                class="tabs-list"
-            />
-            <plan-list :schemeId="active" :containerId="containerId" :isEdit="false"> </plan-list>
-        </div>
-    </div>
-    <div v-if="route.query.containerId" class="custom-bottom-fixed-btns">
-        <div class="bottom-btn primary-btn" @click="handleConfirmPlan">确认方案</div>
-    </div>
-
-    <tip-popup
-        v-model:show="showFarmPopup"
-        type="success"
-        text="农场创建成功"
-        buttonText="分享微信"
-        @confirm="handleShareFarm"
-        @handleClickOverlay="handleClickOverlay"
-    />
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { onActivated, ref,onDeactivated } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import { Tab, Tabs } from "vant";
-import wx from "weixin-js-sdk";
-import expertList from "@/views/old_mini/home/subPages/expertList.vue";
-import tabList from "@/components/pageComponents/TabList.vue";
-import PlanList from "@/components/pageComponents/PlanList.vue";
-import tipPopup from "@/components/popup/tipPopup.vue";
-import { ElMessage } from "element-plus";
-
-const activeTab = ref(1);
-const router = useRouter();
-const route = useRoute();
-
-const curRole = localStorage.getItem("SET_USER_CUR_ROLE");
-
-const tabs = ref([]);
-const active = ref(null);
-const containerId = ref(null);
-const handleTabChange = (id, item) => {
-    containerId.value = item.containerId;
-    active.value = id;
-};
-
-onActivated(() => {
-    if (route.query.containerId || curRole == 2) {
-        getListMySchemes();
-    }
-});
-
-onDeactivated(() => {
-    active.value = null;
-    containerId.value = null;
-});
-
-const getListMySchemes = () => {
-    VE_API.home.listMySchemes().then(({ data }) => {
-        if (data.length) {
-            tabs.value = data || [];
-            if (route.query.containerId) {
-                const index = data.findIndex((item) => item.containerId == 9);
-                active.value = data[index].id;
-                containerId.value = 9;
-            } else {
-                active.value = data[0].id;
-                containerId.value = data[0].containerId;
-            }
-        } else {
-            getSchemes();
-        }
-    });
-};
-
-const getSchemes = () => {
-    VE_API.home.batchInitSchemes({ containerIds: [3], schemeName: "农资荔枝方案" }).then(({ code }) => {
-        if (code == 0) {
-            getListMySchemes();
-        }
-    });
-};
-
-const showFarmPopup = ref(false);
-const shareData = ref({});
-const handleConfirmPlan = () => {
-    // 从路由参数中获取农场数据
-    let geomValue = route.query.geom;
-    
-    // 处理 geom 参数,可能是 JSON 字符串或数组
-    if (typeof geomValue === 'string') {
-        try {
-            // 尝试解析 JSON 字符串
-            const parsed = JSON.parse(geomValue);
-            if (Array.isArray(parsed)) {
-                geomValue = parsed;
-            }
-        } catch (e) {
-            // 如果不是 JSON 字符串,保持原值
-            console.warn('geom 参数解析失败,使用原值:', e);
-        }
-    }
-    
-    const farmParams = {
-        ...route.query,
-        containerId: containerId.value,
-        geom: geomValue,
-        defaultFarm: Boolean(route.query.defaultFarm),
-        agriculturalCreate: route.query.agriculturalCreate * 1,
-    };
-    
-    // 验证必填字段
-    if (!farmParams.wkt || !farmParams.speciesId || !farmParams.containerId || !farmParams.address || !farmParams.mu || !farmParams.name || !farmParams.fzr || !farmParams.tel) {
-        ElMessage.error('农场信息不完整,请返回重新填写');
-        return;
-    }
-    
-    delete farmParams.from;
-    // 调用创建农场接口
-    VE_API.farm.saveFarm(farmParams).then((res) => {
-        if (res.code === 0) {
-            shareData.value = res.data;
-            //选择方案
-            VE_API.home.selectSchemes({ schemeId: active.value ,farmId:res.data.id}).then(({code}) => {
-                if (code === 0) {
-                    showFarmPopup.value = true;
-                } else {
-                    ElMessage.error(res.msg || '创建失败');
-                }
-            });
-        } else {
-            ElMessage.error(res.msg || '创建失败');
-        }
-    }).catch((err) => {
-        console.error('创建农场失败:', err);
-        ElMessage.error('创建失败,请稍后重试');
-    });
-};
-
-const handleShareFarm = () => {
-    const query = {
-        agriculturalStoreId: shareData.value.agriculturalStoreId,
-        farmId: shareData.value.id,
-        speciesName: route.query.speciesName,
-        containerId: shareData.value.containerId,
-    };
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=shareFarm`,
-    });
-};
-
-const handleClickOverlay = () => {
-    // 根据 from 参数跳转回原页面
-    const fromPage = route.query.from;
-    if (fromPage) {
-        router.replace(`/${fromPage}`);
-    } else {
-        // 如果没有 from 参数,默认跳转到首页
-        router.replace('/home');
-    }
-};
-</script>
-
-<style scoped lang="scss">
-.farm-card-page {
-    width: 100%;
-    height: 100vh;
-    background: #f5f7fb;
-    .system-generated{
-        padding: 17px 10px 10px;
-        height: calc(100vh - 150px);
-        .tip-box {
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            padding: 10px;
-            background: rgba(33, 153, 248, 0.1);
-            border-radius: 8px;
-            color: #2199f8;
-            box-sizing: border-box;
-            span {
-                margin-left: 5px;
-            }
-        }
-        .tabs-list{
-            margin: 10px 0;
-        }
-    }
-    .tabs-wrap {
-        ::v-deep {
-            .van-tabs__line {
-                width: 24px;
-                height: 4px;
-            }
-            .van-tab {
-                width: 100px;
-                flex: none;
-            }
-            .van-tabs__nav {
-                justify-content: center;
-            }
-        }
-    }
-    .farm-card-content {
-        width: 100%;
-        height: calc(100vh - 40px);
-        padding-top: 10px;
-        .tabs-list {
-            margin: 0 0 10px 10px;
-        }
-    }
-}
-.custom-bottom-fixed-btns{
-    justify-content: center;
-    .bottom-btn{
-        padding: 10px 40px;
-    }
-}
-</style>

+ 0 - 480
src/views/old_mini/plan/index.vue

@@ -1,480 +0,0 @@
-<template>
-    <div class="farm-card-page">
-        <custom-header name="种植方案"></custom-header>
-        <div class="system-generated">
-            <div class="tip-box">
-                <el-icon size="18"><CircleCheckFilled /></el-icon>
-                <span>系统已生成多套方案,请选择最佳方案</span>
-            </div>
-            <tab-list
-                type="light"
-                v-model="active"
-                :tabs="tabs"
-                @change="handleTabChange"
-                class="tabs-list"
-            />
-            <div class="timeline-wrap">
-                <farm-work-plan-timeline
-                    pageType="plant"
-                    :containerId="containerId"
-                    :schemeId="active"
-                    :disableClick="true"
-                />
-            </div>
-        </div>
-    </div>
-    <div class="custom-bottom-fixed-btns">
-        <div class="bottom-btn primary-btn" :class="{ 'disabled': isCreating }" @click="handleConfirmPlan">
-            {{ isCreating ? '创建中...' : '确认方案' }}
-        </div>
-    </div>
-
-    <tip-popup
-        v-model:show="showFarmPopup"
-        type="success"
-        text="农场创建成功"
-        buttonText="分享微信"
-        @confirm="handleShareFarm"
-        @handleClickOverlay="handleClickOverlay"
-    />
-
-    <!-- 物候期设置弹窗 -->
-    <Popup
-        v-model:show="showPhenologySetting"
-        class="copy-plan-popup phenology-popup"
-        round
-        closeable
-        :close-on-click-overlay="false"
-    >
-        <div class="phenology-header">物候期时间设置</div>
-        <div class="phenology-list">
-            <div class="phenology-item" v-for="(item, index) in mergedReproductiveList" :key="item.id || index">
-                <div class="item-label">
-                    <span class="label-text">{{ item.name }}</span>
-                    <span>起始时间</span>
-                </div>
-                <div class="item-value">
-                    <el-date-picker
-                        style="width: 100%"
-                        size="large"
-                        value-format="YYYY-MM-DD"
-                        v-model="item.startDate"
-                        :clearable="false"
-                        :editable="false"
-                        type="date"
-                        placeholder="选择日期"
-                        @change="(date) => handleStartDateChange(date, index)"
-                    />
-                </div>
-            </div>
-            <div class="phenology-footer-tip">
-                <span>注:</span>
-                <span class="text">请从上往下按照时间顺序填写日期</span>
-            </div>
-        </div>
-        <div class="phenology-footer" @click="handleConfirmPhenologySetting">确认设置</div>
-    </Popup>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { onActivated, ref, onDeactivated } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import { Tab, Tabs, Popup } from "vant";
-import FarmWorkPlanTimeline from "@/components/pageComponents/FarmWorkPlanTimeline.vue";
-import wx from "weixin-js-sdk";
-import tabList from "@/components/pageComponents/TabList.vue";
-import tipPopup from "@/components/popup/tipPopup.vue";
-import { ElMessage } from "element-plus";
-
-const router = useRouter();
-const route = useRoute();
-
-const tabs = ref([]);
-const active = ref(null);
-const containerId = ref(null);
-const handleTabChange = (id, item) => {
-    containerId.value = item.containerId;
-    active.value = id;
-};
-
-onActivated(() => {
-    containerId.value = route.query.containerId;
-    getListMySchemes();
-});
-
-onDeactivated(() => {
-    active.value = null;
-    containerId.value = null;
-});
-
-const getListMySchemes = () => {
-    VE_API.home.listMySchemes({containerId: route.query.containerId}).then(({ data }) => {
-        if (data.length) {
-            tabs.value = data.filter((item) => item.enabled == 1) || [];
-            active.value = tabs.value[0].id;
-            containerId.value = route.query.containerId;
-        }
-    });
-};
-
-const showFarmPopup = ref(false);
-const shareData = ref({});
-const isCreating = ref(false); // 标识是否正在创建农场
-
-// 物候期设置相关
-const showPhenologySetting = ref(false);
-const mergedReproductiveList = ref([]);
-const containerSpaceTimeId = ref(null);
-const intervalDaysArr = ref([]);
-const pendingFarmParams = ref(null); // 保存待创建的农场参数
-
-// 获取物候期列表
-const getPhenologyList = async () => {
-    if (!containerSpaceTimeId.value) {
-        return;
-    }
-    const userInfoStr = localStorage.getItem("localUserInfo");
-    const userInfo = userInfoStr ? JSON.parse(userInfoStr) : {};
-    const params = {
-        containerSpaceTimeId: containerSpaceTimeId.value,
-        agriculturalId: userInfo?.agriculturalId,
-        farmId: route.query.farmId || null,
-    };
-    const res = await VE_API.monitor.listPhenology(params);
-    if (res.code === 0) {
-        // 将intervalDaysArr合并到mergedReproductiveList中
-        if (intervalDaysArr.value.length > 0 && res.data.length > 0) {
-            mergedReproductiveList.value = res.data.map((item, index) => {
-                return {
-                    ...item,
-                    intervalDays: intervalDaysArr.value[index],
-                };
-            });
-        } else {
-            mergedReproductiveList.value = res.data;
-        }
-    }
-};
-
-// 获取农事规划数据以获取 containerSpaceTimeId
-const getFarmWorkPlanForPhenology = async () => {
-    try {
-        const { data, code } = await VE_API.monitor.farmWorkPlan({
-            containerId: containerId.value,
-            schemeId: active.value,
-        });
-        if (code === 0 && data?.phenologyList?.[0]?.containerSpaceTimeId) {
-            containerSpaceTimeId.value = data.phenologyList[0].containerSpaceTimeId;
-            intervalDaysArr.value = [];
-            data.phenologyList.forEach((phenology) => {
-                intervalDaysArr.value.push(phenology.intervalDays);
-            });
-        }
-    } catch (error) {
-        console.error("获取农事规划数据失败:", error);
-    }
-};
-
-/**
- * 处理物候期开始时间变化
- * 当修改某个物候期的开始时间时,自动更新后续所有物候期的开始时间
- */
-const handleStartDateChange = (date, currentIndex) => {
-    if (!date || !mergedReproductiveList.value || mergedReproductiveList.value.length === 0) {
-        return;
-    }
-    
-    // 从当前修改的物候期开始,更新后续所有物候期的开始时间
-    for (let i = currentIndex; i < mergedReproductiveList.value.length - 1; i++) {
-        const currentItem = mergedReproductiveList.value[i];
-        const nextItem = mergedReproductiveList.value[i + 1];
-        
-        // 获取当前物候期的间隔天数
-        const intervalDays = currentItem.intervalDays || 0;
-        
-        if (intervalDays > 0 && currentItem.startDate) {
-            // 将日期字符串转换为时间戳(毫秒)
-            const currentStartDateTimestamp = new Date(currentItem.startDate).getTime();
-            
-            // 在时间戳基础上加上间隔天数(转换为毫秒:天数 * 24小时 * 60分钟 * 60秒 * 1000毫秒)
-            const nextStartDateTimestamp = currentStartDateTimestamp + (intervalDays * 24 * 60 * 60 * 1000);
-            
-            // 将时间戳转换回日期对象,然后格式化为 YYYY-MM-DD 格式
-            const nextStartDate = new Date(nextStartDateTimestamp);
-            const year = nextStartDate.getFullYear();
-            const month = String(nextStartDate.getMonth() + 1).padStart(2, '0');
-            const day = String(nextStartDate.getDate()).padStart(2, '0');
-            const nextStartDateStr = `${year}-${month}-${day}`;
-            
-            // 更新下一个物候期的开始时间
-            nextItem.startDate = nextStartDateStr;
-        }
-    }
-};
-
-/**
- * 确认物候期设置
- */
-const handleConfirmPhenologySetting = async () => {
-    const userInfoStr = localStorage.getItem("localUserInfo");
-    const userInfo = userInfoStr ? JSON.parse(userInfoStr) : {};
-    const params = {
-        farmId: route.query.farmId || null,
-        agriculturalId: userInfo?.agriculturalId,
-        items: mergedReproductiveList.value.map((item) => ({
-            phenologyId: item.id,
-            startDate: item.startDate,
-        })),
-    };
-    const res = await VE_API.monitor.batchSaveFarmPhenologyTime(params);
-    if (res.code === 0) {
-        showPhenologySetting.value = false;
-        // 物候期设置完成后,继续创建农场
-        if (pendingFarmParams.value) {
-            createFarm(pendingFarmParams.value);
-            pendingFarmParams.value = null;
-        }
-    }
-};
-
-// 创建农场的实际逻辑
-const createFarm = (farmParams) => {
-    // 设置正在创建状态
-    isCreating.value = true;
-    
-    // 调用创建农场接口
-    VE_API.farm
-        .saveFarm(farmParams)
-        .then((res) => {
-            if (res.code === 0) {
-                shareData.value = res.data;
-                //选择方案
-                VE_API.home.selectSchemes({ sourceSchemeId: active.value ,farmId:res.data.id}).then(({code}) => {
-                    // 请求完成,重置状态
-                    isCreating.value = false;
-                    if (code === 0) {
-                        ElMessage.success("创建成功");
-                        setTimeout(() => {
-                            handleClickOverlay();
-                        }, 1000);
-                    } else {
-                        ElMessage.error(res.msg || '创建失败');
-                    }
-                }).catch((err) => {
-                    // 请求失败,重置状态
-                    isCreating.value = false;
-                    console.error("选择方案失败:", err);
-                    ElMessage.error("创建失败,请稍后重试");
-                });
-                
-            } else {
-                // 请求失败,重置状态
-                isCreating.value = false;
-                ElMessage.error(res.msg || "创建失败");
-            }
-        })
-        .catch((err) => {
-            // 请求失败,重置状态
-            isCreating.value = false;
-            console.error("创建农场失败:", err);
-            ElMessage.error("创建失败,请稍后重试");
-        });
-};
-
-const handleConfirmPlan = async () => {
-    // 如果正在创建,阻止重复点击
-    if (isCreating.value) {
-        return;
-    }
-    
-    // 从路由参数中获取农场数据
-    let geomValue = route.query.geom;
-
-    // 处理 geom 参数,可能是 JSON 字符串或数组
-    if (typeof geomValue === "string") {
-        try {
-            // 尝试解析 JSON 字符串
-            const parsed = JSON.parse(geomValue);
-            if (Array.isArray(parsed)) {
-                geomValue = parsed;
-            }
-        } catch (e) {
-            // 如果不是 JSON 字符串,保持原值
-            console.warn("geom 参数解析失败,使用原值:", e);
-        }
-    }
-
-    const farmParams = {
-        ...route.query,
-        containerId: containerId.value,
-        geom: geomValue,
-        defaultFarm: Boolean(route.query.defaultFarm),
-        agriculturalCreate: route.query.agriculturalCreate * 1,
-    };
-
-    // 验证必填字段
-    if (
-        !farmParams.wkt ||
-        !farmParams.speciesId ||
-        !farmParams.containerId ||
-        !farmParams.address ||
-        !farmParams.mu ||
-        !farmParams.name ||
-        !farmParams.fzr ||
-        !farmParams.tel
-    ) {
-        ElMessage.error("农场信息不完整,请返回重新填写");
-        return;
-    }
-
-    delete farmParams.from;
-    
-    // 先获取物候期数据,然后弹出物候期设置弹窗
-    await getFarmWorkPlanForPhenology();
-    if (containerSpaceTimeId.value) {
-        // 保存待创建的农场参数
-        pendingFarmParams.value = farmParams;
-        // 获取物候期列表并显示弹窗
-        await getPhenologyList();
-        showPhenologySetting.value = true;
-    } else {
-        // 如果没有物候期数据,直接创建农场
-        createFarm(farmParams);
-    }
-};
-
-const handleShareFarm = () => {
-    const query = {
-        agriculturalStoreId: shareData.value.agriculturalStoreId,
-        farmId: shareData.value.id,
-        speciesName: route.query.speciesName,
-        containerId: shareData.value.containerId,
-    };
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=shareFarm`,
-    });
-};
-
-const handleClickOverlay = () => {
-    // 根据 from 参数跳转回原页面
-    const fromPage = route.query.from;
-    if (fromPage) {
-        router.replace(`/${fromPage}`);
-    } else {
-        // 如果没有 from 参数,默认跳转到首页
-        router.replace("/home");
-    }
-};
-</script>
-
-<style scoped lang="scss">
-.farm-card-page {
-    width: 100%;
-    height: 100vh;
-    background: #f5f7fb;
-    .system-generated {
-        padding: 0 10px 0 4px;
-        .tip-box {
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            padding: 10px;
-            background: rgba(33, 153, 248, 0.1);
-            border-radius: 8px;
-            color: #2199f8;
-            box-sizing: border-box;
-            margin: 10px;
-            span {
-                margin-left: 5px;
-            }
-        }
-        .tabs-list {
-            margin-bottom: 10px;
-        }
-        .timeline-wrap{
-            height: calc(100vh - 150px - 54px);
-        }
-    }
-    .tabs-wrap {
-        ::v-deep {
-            .van-tabs__line {
-                width: 24px;
-                height: 4px;
-            }
-            .van-tab {
-                width: 100px;
-                flex: none;
-            }
-            .van-tabs__nav {
-                justify-content: center;
-            }
-        }
-    }
-}
-.custom-bottom-fixed-btns {
-    justify-content: center;
-    .bottom-btn {
-        padding: 10px 40px;
-        &.disabled {
-            opacity: 0.6;
-            cursor: not-allowed;
-            pointer-events: none;
-        }
-    }
-}
-
-.phenology-popup {
-    padding: 28px 20px 20px;
-    .phenology-header {
-        font-size: 24px;
-        text-align: center;
-        margin-bottom: 20px;
-        font-family: "PangMenZhengDao";
-    }
-    .phenology-list {
-        width: 100%;
-        .phenology-item {
-            width: 100%;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            .item-label {
-                display: flex;
-                align-items: center;
-                gap: 4px;
-                font-size: 15px;
-                color: rgba(0, 0, 0, 0.4);
-                .label-text {
-                    color: #000;
-                    font-size: 16px;
-                    font-weight: 500;
-                }
-            }
-            .item-value {
-                width: calc(100% - 156px);
-            }
-        }
-        .phenology-item + .phenology-item {
-            margin-top: 10px;
-        }
-    }
-    .phenology-footer-tip {
-        margin-top: 20px;
-        text-align: center;
-        .text{
-            color: rgba(0, 0, 0, 0.4);
-        }
-    }
-    .phenology-footer {
-        width: 100%;
-        text-align: center;
-        font-size: 16px;
-        margin-top: 10px;
-        color: #fff;
-        background: #2199f8;
-        border-radius: 25px;
-        padding: 10px 0;
-    }
-}
-</style>

+ 0 - 415
src/views/old_mini/task_condition/components/calendar.vue

@@ -1,415 +0,0 @@
-<template>
-    <div class="calendar">
-        <div class="header-wrap">
-            <div class="header-l">
-                <div class="top-l">
-                    <el-icon class="icon icon-l" color="#999999" size="11" @click="prevPeriod"><ArrowLeftBold /></el-icon>
-                    <!-- <span class="top-tag red" v-if="expiredCounts">{{ expiredCounts }}过期</span> -->
-                </div>
-                <div class="top-c">
-                    <span class="header-text">
-                        {{ dateRange.start }} <span class="center-line">-</span> {{ dateRange.end }}
-                    </span>
-                </div>
-                <div class="top-r">
-                    <!-- <span class="top-tag orange" v-if="completedCounts">{{ completedCounts }}待完成</span> -->
-                    <el-icon class="icon icon-r" color="#999999" size="11" @click="nextPeriod"><ArrowRightBold /></el-icon>
-                </div>
-
-            </div>
-            <!-- <div class="header-r">
-                <span class="line"></span>
-                高温预警
-            </div> -->
-        </div>
-        <div class="days">
-            <div
-                class="days-item"
-                v-for="(day, index) in calendarDays"
-                :key="index"
-                :class="[{ activeDay: activeDay === day.date, today: day.isToday && !day.solarTerm }]"
-                @click="selectDate(day.date, day)"
-            >
-                <div class="day-box">
-                    <span class="days-week">{{ day.isToday ? "今天" : `周${day.dayOfWeek}` }}</span>
-                    <span class="days-one">{{ day.day }}</span>
-                </div>
-                <div v-if="day.solarTerm" class="solar-term">{{ day.solarTerm }}</div>
-                <div v-if="day.typeName" class="type-num">{{ day.typeName.lengthVal }}</div>
-                <!-- <div v-if="day.isHeatWarning" class="heat-warning"></div>
-                <div v-if="day.typeName" class="type-name">
-                    <div class="type-text">{{ day.typeName.farmWorkName }}</div>
-                </div> -->
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, computed, onDeactivated, onMounted } from "vue";
-import solarLunar from "solarlunar";
-// const props = defineProps({
-//     calendarWorkList: {
-//         type: Array,
-//         required: true,
-//     },
-// });
-
-const today = new Date();
-// const startDate = ref(getAlignedStartDate(today));
-const startDate = ref(new Date(today));
-// 定义星期几的名称
-const weekdays = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
-const weekdaysShort = ["一", "二", "三", "四", "五", "六", "日"];
-// 存储任务列表数据
-const taskListData = ref([]);
-
-const days = computed(() => {
-    return Array.from({ length: 7 }, (_, i) => {
-        const date = new Date(startDate.value);
-        date.setDate(startDate.value.getDate() + i);
-        return date;
-    });
-});
-
-const calendarDays = computed(() => {
-    const daysList = [];
-    for (let i = 0; i < days.value.length; i++) {
-        const date = days.value[i];
-        const dayOfWeek = date.getDay(); // 0是周日,1是周一,...,6是周六
-        // 调整显示:周一显示为"一",周二显示为"二",...,周日显示为"日"
-        const displayDayOfWeek = dayOfWeek === 0 ? "日" : weekdaysShort[dayOfWeek - 1];
-
-        // 获取该日期的节气
-        const solarTerm = getSolarTerm(date);
-        // 获取该日期的农事数据
-        const typeName = getTaskByDate(formatDate(date));
-
-        daysList.push({
-            day: date.getDate(),
-            date: formatDate(date),
-            isToday: formatDate(date) === formatDate(today),
-            dayOfWeek: displayDayOfWeek,
-            solarTerm: solarTerm, // 使用真实计算的节气数据
-            isHeatWarning: i === 5,
-            typeName: typeName, // 使用传入的任务数据
-        });
-    }
-    return daysList;
-});
-
-// 根据日期获取农事数据
-function getTaskByDate(dateStr) {
-    if (!taskListData.value || taskListData.value.length === 0) {
-        return null;
-    }
-    // 查找匹配日期的农事
-    const matchedTasks = taskListData.value.filter(task => {
-        if (!task.expectedExecuteDate && !task.executeDeadlineDate) return false;
-        // 格式化日期字符串进行比较(确保格式一致)
-        const taskDate = formatDate(new Date(task.expectedExecuteDate || task.executeDeadlineDate));
-        return taskDate === dateStr;
-    });
-
-    if (matchedTasks.length === 0) {
-        return null;
-    }
-
-    // const farmWorkNames = matchedTasks.map(task => task.farmWorkName || '').filter(Boolean);
-    return {
-        lengthVal: matchedTasks.length,
-        // farmWorkName: farmWorkNames.length > 1 ? farmWorkNames.join('、') : farmWorkNames[0] || ''
-    };
-}
-
-function setSolarTerm(taskList) {
-    // 存储任务列表数据
-    taskListData.value = taskList || [];
-    // 为每个任务计算节气
-    for (let task of taskListData.value) {
-        if (task.expectedExecuteDate || task.executeDeadlineDate) {
-            task.solarTerm = getSolarTerm(new Date(task.expectedExecuteDate || task.executeDeadlineDate));
-        }
-    }
-}
-
-const expiredCounts = ref(0);
-const completedCounts = ref(0);
-function setCounts(index, counts) {
-    if (index === 2) {
-        completedCounts.value = counts;
-    } else if (index === 3) {
-        expiredCounts.value = counts;
-    }
-}
-
-// 清除选中状态
-const clearSelection = () => {
-    activeDay.value = null;
-    selectedDate.value = null;
-};
-
-defineExpose({
-    setSolarTerm,
-    setCounts,
-    clearSelection
-});
-
-const dateRange = computed(() => {
-    let start = calendarDays.value[0].date;
-    start = start.replace(/-/g, ".");
-    let end = calendarDays.value[6].date;
-    end = end.replace(/^\d{4}-(\d{2})-(\d{2})$/, "$1.$2");
-    return { start, end };
-});
-
-function getAlignedStartDate(referenceDate) {
-    const start = new Date(referenceDate);
-    const dayOfWeek = start.getDay();
-    start.setDate(start.getDate() - dayOfWeek + (dayOfWeek === 0 ? -13 : 1)); // 对齐至周一,确保21天周期合理
-    return start;
-}
-
-function formatDate(date) {
-    // String(currentMonth.value).padStart(2, "0")
-    return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(
-        2,
-        "0"
-    )}`;
-}
-
-// 获取指定日期的节气
-function getSolarTerm(date) {
-    try {
-        const year = date.getFullYear();
-        const month = date.getMonth() + 1; // getMonth() 返回 0-11,需要加1
-        const day = date.getDate();
-        const lunar = solarLunar.solar2lunar(year, month, day);
-        // lunar.term 返回节气名称,如果没有节气则返回空字符串
-        return lunar.term || null;
-    } catch (error) {
-        console.error("获取节气失败:", error);
-        return null;
-    }
-}
-
-function prevPeriod() {
-    startDate.value.setDate(startDate.value.getDate() - 7);
-    startDate.value = new Date(startDate.value);
-}
-
-function nextPeriod() {
-    startDate.value.setDate(startDate.value.getDate() + 7);
-    startDate.value = new Date(startDate.value);
-}
-
-const activeDay = ref(null);
-const emit = defineEmits(['dateSelect']);
-
-const selectDate = (date, day) => {
-    // 如果点击的是已选中的日期,取消选中
-    if (activeDay.value === date) {
-        activeDay.value = null;
-        selectedDate.value = null;
-        emit('dateSelect', null); // 传递 null 表示取消筛选
-    } else {
-        activeDay.value = date;
-        selectedDate.value = `${date} (${day.dayOfWeek})`;
-        emit('dateSelect', date); // 传递选中的日期
-    }
-};
-
-// 初始化时不选择任何日期(默认不选中)
-// onMounted(() => {
-//     selectDate(formatDate(today), {
-//         day: today.getDate(),
-//         dayOfWeek: weekdaysShort[today.getDay() === 0 ? 6 : today.getDay() - 1],
-//     });
-// });
-
-function closeDialog() {
-    activeDay.value = null;
-}
-const selectedDate = ref(null);
-</script>
-
-<style lang="scss" scoped>
-.calendar {
-    width: 100%;
-    text-align: center;
-    box-sizing: border-box;
-    .header-wrap {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 10px;
-        .header-l {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            width: 100%;
-            .top-c {
-                flex: 1;
-                text-align: center;
-            }
-            .header-text {
-                color: #000;
-                font-size: 16px;
-                font-weight: bold;
-                .center-line {
-                    position: relative;
-                    top: -3px;
-                }
-            }
-            .icon {
-                width: 20px;
-                height: 20px;
-                background: #F2F3F5;
-                border-radius: 50%;
-                text-align: center;
-                line-height: 20px;
-                &.icon-l {
-                    margin-right: 2px;
-                }
-                &.icon-r {
-                    margin-left: 2px;
-                }
-            }
-            .top-tag {
-                font-size: 12px;
-                padding: 0 8px;
-                height: 20px;
-                line-height: 20px;
-                border-radius: 20px;
-                &.red {
-                    color: #FF0000;
-                    background: rgba(255, 0, 0, 0.1);
-                }
-                &.orange {
-                    color: #FF790B;
-                    background: rgba(255, 149, 61, 0.2);
-                }
-            }
-        }
-        .header-r {
-            background: rgba(252, 138, 44, 0.12);
-            padding: 6px 10px;
-            border-radius: 28px;
-            color: #fc8a2c;
-            display: inline-flex;
-            align-items: center;
-            font-size: 10px;
-            .line {
-                width: 12px;
-                height: 1px;
-                margin-right: 5px;
-                background: #fc8a2c;
-            }
-        }
-    }
-}
-
-.weekdays {
-    display: grid;
-    grid-template-columns: repeat(7, 1fr);
-    font-size: 12px;
-}
-.days {
-    display: grid;
-    grid-template-columns: repeat(7, 1fr);
-    // gap: 5px;
-    font-size: 12px;
-    .days-item + .days-item {
-        margin-left: 6px;
-    }
-    .days-item {
-        cursor: pointer;
-        position: relative;
-        &.today {
-            min-height: 70px;
-            .day-box {
-                color: #2199f8;
-            }
-        }
-
-        &.activeDay {
-            .day-box {
-                color: #fff;
-                background: linear-gradient(136deg, #9fd5ff, #2199f8);
-            }
-        }
-        .day-box {
-            background: #ffffff;
-            color: #000;
-            border-radius: 8px;
-            padding: 7px 0;
-            position: relative;
-            .days-week {
-                font-size: 12px;
-            }
-        }
-        .solar-term {
-            padding-top: 3px;
-            color: #8D8D8D;
-            font-size: 12px;
-        }
-        .type-num {
-            position: absolute;
-            top: -5px;
-            right: -5px;
-            color: #fff;
-            font-size: 10px;
-            background: #2199F8;
-            width: 14px;
-            height: 14px;
-            line-height: 16px;
-            border-radius: 50%;
-        }
-        .days-one {
-            text-align: center;
-            display: block;
-            margin: 0 auto;
-            font-size: 14px;
-            line-height: 16px;
-            font-weight: bold;
-            padding-top: 2px;
-            // width: 32px;
-            // height: 32px;
-            // line-height: 32px;
-            // border-radius: 50%;
-        }
-        .type-name {
-            font-size: 10px;
-            position: relative;
-            top: -4px;
-            border-radius: 12px;
-            position: relative;
-            background: #fff;
-            padding-top: 2px;
-            .type-text {
-                border-radius: 12px;
-                padding: 2px;
-            }
-        }
-    }
-}
-.today {
-    position: relative;
-    &::after {
-        content: "";
-        position: absolute;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        margin: 0 auto;
-        width: 10px;
-        height: 10px;
-        background: url("@/assets/img/home/today.png") no-repeat center center / 100% 100%;
-    }
-    &.no-type {
-        &::after {
-            bottom: 14px;
-        }
-    }
-}
-</style>

+ 0 - 738
src/views/old_mini/task_condition/components/interact.vue

@@ -1,738 +0,0 @@
-<template>
-    <div class="task-page" :style="{ height: `calc(100vh - ${tabBarHeight}px - 50px)` }">
-        <div class="task-top">
-            <div class="map-container" ref="mapContainer"></div>
-        </div>
-        <div class="task-list">
-            <!-- <div class="list-filter">
-                <div class="filter-item" :class="{ active: activeIndex === 0 }" @click="handleActiveFilter(0)">
-                    待确认({{ taskCounts[0] || 0 }})
-                </div>
-                <div class="filter-item" :class="{ active: activeIndex === 2 }" @click="handleActiveFilter(2)">
-                    已确认({{ taskCounts[2] || 0 }})
-                </div>
-                <div class="filter-item" :class="{ active: activeIndex === 3 }" @click="handleActiveFilter(3)">
-                    待提醒({{ taskCounts[3] || 0 }})
-                </div>
-            </div> -->
-            <!-- <div class="select-group">
-                <el-select
-                    class="select-item"
-                    v-model="selectParma.farmWorkTypeId"
-                    placeholder="用户类型"
-                    @change="getSimpleList"
-                >
-                    <el-option v-for="item in farmWorkTypeList" :key="item.id" :label="item.name" :value="item.id" />
-                </el-select>
-                <el-select
-                    class="select-item"
-                    v-model="selectParma.districtCode"
-                    placeholder="切换作物"
-                    @change="getSimpleList"
-                >
-                    <el-option v-for="item in districtList" :key="item.code" :label="item.name" :value="item.code" />
-                </el-select>
-            </div> -->
-            <van-list
-                v-model:loading="loadingMore"
-                :finished="finished"
-                finished-text=""
-                @load="onLoad"
-                :immediate-check="false"
-            >
-                <div class="task-content" v-loading="loading && taskList.length === 0">
-                    <div class="task-item" v-for="(item, index) in taskList" :key="item.id || index">
-                        <div class="img-text-wrap">
-                            <div class="left-wrap">
-                                <div class="left-img">
-                                    <img src="@/assets/img/home/farm.png" alt="" />
-                                </div>
-                                <div class="right-text">
-                                    <div  class="farm-info">
-                                        <div class="farm-name van-ellipsis">{{ item?.farmName }}</div>
-                                        <div class="info-tag-wrap">
-                                            <div class="tag-item primary">
-                                                {{ item?.typeName }}
-                                            </div>
-                                            <div class="tag-item" :class="{ 'second': item.userType === 2 }">{{ item.userType === 1 ? '普通客户' : '托管客户' }}</div>
-                                        </div>
-                                    </div>
-                                    <div class="farm-addr">{{ item?.address }}</div>
-                                </div>
-                            </div>
-                            <div class="right-wrap" @click.stop="handleRemindCustomer(item)">提醒客户</div>
-                        </div>
-                        <div class="item-bottom">
-                            <div class="bottom-tag">
-                                <div class="tag-card" :class="{ active: item.sourceData?.daysUntilNext < 5 }">
-                                    <div class="card-content">
-                                        <div class="card-main-text">{{ item.sourceData?.currentPhenologyName || '--' }}</div>
-                                        <div class="card-sub-text">
-                                            当前物候期
-                                            <!-- <span class="card-icon" @click="handleSelectCurrentPhenology(item)">
-                                                <el-icon><Edit /></el-icon>
-                                            </span> -->
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="tag-card">
-                                    <div class="card-content">
-                                        <div class="card-main-text">{{ item.sourceData?.currentPhenologyStartDate || '--' }}</div>
-                                        <div class="card-sub-text">起始时间</div>
-                                    </div>
-                                </div>
-                                <div class="tag-card">
-                                    <div class="card-content">
-                                        <div class="card-main-text">{{ item.sourceData?.daysUntilNext || '--' }}天</div>
-                                        <div class="card-sub-text">预计下次物候</div>
-                                    </div>
-                                </div>
-                            </div>
-
-                            <!-- 时间轴组件 -->
-                            <AgriculturalInteractionCard :item="item" @updateList="resetAndLoad" />
-                        </div>
-                    </div>
-                    <div class="empty-data" v-if="!loading && taskList.length === 0">暂无数据</div>
-                </div>
-            </van-list>
-        </div>
-    </div>
-    <upload-execute ref="uploadExecuteRef" :onlyShare="onlyShare" @uploadSuccess="handleUploadSuccess" />
-    <!-- 服务报价单 -->
-    <price-sheet-popup :key="activeIndex" ref="priceSheetPopupRef"></price-sheet-popup>
-    <!-- 新增:激活上传弹窗 -->
-    <active-upload-popup ref="activeUploadPopupRef" @handleUploadSuccess="handleUploadSuccess"></active-upload-popup>
-</template>
-
-<script setup>
-import { computed, nextTick, onActivated, onMounted, ref, watch } from "vue";
-import { useRoute } from "vue-router";
-import { useStore } from "vuex";
-import { List as VanList } from "vant";
-import IndexMap from "../../farm_manage/map/index";
-import { useRouter } from "vue-router";
-import uploadExecute from "./uploadExecute.vue";
-import priceSheetPopup from "@/components/popup/priceSheetPopup.vue";
-import { ElMessage } from "element-plus";
-import activeUploadPopup from "@/components/popup/activeUploadPopup.vue";
-import AgriculturalInteractionCard from "@/components/pageComponents/AgriculturalInteractionCard.vue";
-
-const store = useStore();
-const router = useRouter();
-const route = useRoute();
-const indexMap = new IndexMap();
-const mapContainer = ref(null);
-const tabBarHeight = computed(() => store.state.home.tabBarHeight);
-const uploadExecuteRef = ref(null);
-
-const selectParma = ref({
-    farmWorkTypeId: null,
-    districtCode: null,
-});
-
-// 任务列表数据(用于显示,可能被筛选)
-const taskList = ref([]);
-// 各状态任务数量
-const taskCounts = ref([0, 0, 0]);
-// 当前选中的筛选索引
-const activeIndex = ref(2);
-const noData = ref(false);
-const loading = ref(true);
-// 分页相关
-const page = ref(0);
-const limit = ref(10);
-const loadingMore = ref(false);
-const finished = ref(false);
-
-// 查询未来农事预警
-const getFutureFarmWorkWarning = async (item) => {
-    const res = await VE_API.home.listFutureFarmWorkWarning({ farmId: item.farmId });
-    item.timelineList = res.data || [];
-};
-
-const taskItemRefs = ref([]);
-const handleUploadSuccess = async () => {
-    // 刷新列表
-    await resetAndLoad();
-
-    // 等待 DOM 更新完成,refs 被重新收集
-    await nextTick();
-
-    // 更新所有task-item的triggerImg
-    taskItemRefs.value.forEach((ref) => {
-        if (ref && ref.updateTriggerImg) {
-            ref.updateTriggerImg();
-        }
-    });
-};
-
-const cityCode = ref("");
-//根据城市的坐标返回区县列表
-const districtList = ref([]);
-function getDistrictListByCity() {
-    VE_API.z_farm_work_record.getDistrictListByCity({ point: mapPoint.value }).then(({ data }) => {
-        districtList.value = data || [];
-        // cityCode.value = data[0].code.slice(0, -2);
-        cityCode.value = "";
-        districtList.value.unshift({ code: cityCode.value, name: "全部" });
-        selectParma.value.districtCode = cityCode.value;
-        resetAndLoad();
-    });
-}
-
-//农事类型列表
-const farmWorkTypeList = ref([]);
-function getFarmWorkTypeList() {
-    VE_API.z_farm_work_record.getFarmWorkTypeList().then(({ data }) => {
-        farmWorkTypeList.value = data;
-        farmWorkTypeList.value.unshift({ id: 0, name: "全部" });
-    });
-}
-
-const mapPoint = ref(null);
-
-onMounted(() => {
-    mapPoint.value = store.state.home.miniUserLocationPoint;
-    // getDistrictListByCity();
-    resetAndLoad();
-    getFarmWorkTypeList();
-    nextTick(() => {
-        indexMap.initMap(mapPoint.value, mapContainer.value, true);
-    });
-});
-
-onActivated(() => {
-    if (route.query.noReload) {
-        return;
-    }
-    // 确保地图已初始化,使用 nextTick 等待 DOM 更新
-    nextTick(() => {
-        // 检查地图实例是否已初始化
-        if (!indexMap.kmap) {
-            // 如果地图未初始化,重新初始化
-            if (mapContainer.value) {
-                mapPoint.value = store.state.home.miniUserLocationPoint;
-                indexMap.initMap(mapPoint.value, mapContainer.value, true);
-                // 等待地图初始化完成后再加载数据
-                setTimeout(() => {
-                    resetAndLoad();
-                }, 300);
-                return;
-            }
-        } else {
-            // 如果地图已初始化,需要等待 tab 切换完成,容器完全可见后再更新尺寸
-            // Tab 切换时容器可能被隐藏,需要更长的延迟确保容器可见
-            if (mapContainer.value && indexMap.kmap.map) {
-                // 检查容器是否可见
-                const checkAndUpdateSize = () => {
-                    const container = mapContainer.value;
-                    if (container) {
-                        const rect = container.getBoundingClientRect();
-                        // 如果容器可见(有宽度和高度),更新地图尺寸
-                        if (rect.width > 0 && rect.height > 0) {
-                            indexMap.kmap.map.updateSize();
-                        } else {
-                            // 如果容器不可见,继续等待
-                            setTimeout(checkAndUpdateSize, 100);
-                        }
-                    }
-                };
-                // 延迟检查,确保 tab 切换完成
-                setTimeout(checkAndUpdateSize, 200);
-            }
-        }
-        resetAndLoad();
-    });
-});
-
-// 监听 activeIndex 变化,重新加载数据
-watch(activeIndex, () => {
-    resetAndLoad();
-});
-
-// 加载列表数据(支持分页)
-async function getSimpleList(isLoadMore = false) {
-    if (!isLoadMore) {
-        // 重置分页
-        page.value = 0;
-        finished.value = false;
-        taskList.value = [];
-        taskItemRefs.value = [];
-        loading.value = true;
-    } else {
-        loadingMore.value = true;
-    }
-
-    const params = {
-        ...selectParma.value,
-        page: page.value,
-        limit: limit.value,
-        flowStatus: 5,
-    };
-
-    try {
-        const { data } = await VE_API.home.listUnansweredFarms(params);
-
-        if (data && data.length > 0) {
-            // 为每个item初始化timelineList
-            const newItems = data.map((item) => {
-                let sourceData = item?.latestPhenologyProgressBroadcast?.sourceData;
-                if (sourceData) {
-                    try {
-                        sourceData = JSON.parse(sourceData);
-                    } catch (e) {
-                        console.error("解析sourceData失败:", e);
-                        sourceData = null;
-                    }
-                }
-                return {
-                    ...item,
-                    sourceData,
-                    timelineList: [],
-                };
-            });
-
-            // 串行请求,为每个农场获取时间轴数据
-            for (let i = 0; i < newItems.length; i++) {
-                await getFutureFarmWorkWarning(newItems[i]);
-            }
-
-            // 追加数据
-            const newTaskList = [...taskList.value, ...newItems];
-            taskList.value = newTaskList.filter(item => item.timelineList.length > 0);
-            
-            // 更新分页
-            page.value += 1;
-            
-            // 判断是否还有更多数据
-            if (data.length < limit.value) {
-                finished.value = true;
-            }
-
-            // 更新地图数据
-            indexMap.initData(taskList.value,'','farmPoint');
-        } else {
-            finished.value = true;
-            if (taskList.value.length === 0) {
-                noData.value = true;
-            }
-        }
-
-        // 数据处理完成后再设置loading为false
-        if (!isLoadMore) {
-            loading.value = false;
-        } else {
-            loadingMore.value = false;
-        }
-    } catch (error) {
-        console.error("获取任务列表失败:", error);
-        if (!isLoadMore) {
-            loading.value = false;
-        } else {
-            loadingMore.value = false;
-        }
-        finished.value = true;
-        if (taskList.value.length === 0) {
-            noData.value = true;
-        }
-    }
-}
-
-// 滚动加载更多
-const onLoad = () => {
-    if (!finished.value && !loadingMore.value) {
-        getSimpleList(true);
-    }
-};
-
-// 重置并重新加载
-const resetAndLoad = () => {
-    getSimpleList(false);
-};
-
-function handleActiveFilter(i) {
-    activeIndex.value = i;
-    selectParma.value.districtCode = cityCode.value;
-    selectParma.value.farmWorkTypeId = null;
-}
-
-const showUploadExecutePopup = (item) => {
-    if (item?.executeEvidence.length) {
-        onlyShare.value = true;
-    } else {
-        onlyShare.value = false;
-    }
-    setTimeout(() => {
-        uploadExecuteRef.value.showPopup(item);
-    }, 10);
-};
-
-function toDetail(item) {
-    // if (activeIndex.value === 0) {
-    //     router.push({
-    //         path: "/modify_work",
-    //         query: { id: item.id },
-    //     });
-    // } else {
-    // }
-    router.push({
-        path: "/completed_work",
-        query: { miniJson: JSON.stringify({ id: item.id }) },
-    });
-}
-
-const onlyShare = ref(false);
-const phenologyList = ref([
-    {
-        id: 1,
-        name: "花芽分化",
-    },
-    {
-        id: 2,
-        name: "开花",
-    },
-    {
-        id: 3,
-        name: "成熟",
-    },
-]);
-
-const activeUploadPopupRef = ref(null);
-function handleSelectCurrentPhenology(item) {
-    activeUploadPopupRef.value.showPopup({
-        gardenIdVal: item.farmId,
-        problemTitleVal: "进入 物候期 的时间",
-        imgDescVal: "请上传凭证(转入农事任务凭证)",
-        arrangeIdVal: item.farmWorkArrangeId,
-        selectCurrentPhenologyVal: true,
-        phenologyListVal: phenologyList.value,
-    });
-}
-
-function handleRemindCustomer(item) {
-    router.push({
-        path: "/remind_customer",
-        query: { farmId: item.farmId },
-    });
-}
-</script>
-
-<style lang="scss" scoped>
-.task-page {
-    width: 100%;
-    height: calc(100vh - 50px - 50px);
-    overflow: auto;
-    box-sizing: border-box;
-    background: #f5f7fb;
-    .map-container {
-        width: 100%;
-        height: 162px;
-        clip-path: inset(0px round 8px);
-    }
-
-    .select-group {
-        display: flex;
-        padding: 0px 12px 0 12px;
-        .select-item {
-            width: 100%;
-            ::v-deep {
-                .el-select__wrapper {
-                    text-align: center;
-                    gap: 2px;
-                    box-shadow: none;
-                    justify-content: center;
-                    background: none;
-                }
-                .el-select__selection {
-                    flex: none;
-                    width: fit-content;
-                }
-                .el-select__placeholder {
-                    position: static;
-                    transform: none;
-                    width: fit-content;
-                    color: rgba(0, 0, 0, 0.2);
-                }
-                .el-select__caret {
-                    color: rgba(0, 0, 0, 0.2);
-                }
-            }
-        }
-    }
-
-    .task-top {
-        padding: 10px 12px 0 12px;
-    }
-
-    .task-content-loading {
-        height: 80px;
-        border-radius: 8px;
-        position: absolute;
-        top: 60px;
-        left: 0;
-        width: 100%;
-    }
-
-    .task-content {
-        min-height: 80px;
-    }
-
-    .empty-data {
-        text-align: center;
-        font-size: 14px;
-        color: #6f7274;
-        padding: 20px 0;
-    }
-    .task-list {
-        position: relative;
-        background: #fff;
-        padding: 12px 12px 8px 12px;
-    }
-    .list-filter {
-        display: flex;
-        align-items: center;
-        justify-content: space-around;
-        .filter-item {
-            padding: 0 12px;
-            height: 28px;
-            color: rgba(0, 0, 0, 0.5);
-            font-size: 14px;
-            line-height: 28px;
-            border-radius: 20px;
-            &.active {
-                color: #2199f8;
-                background: rgba(33, 153, 248, 0.2);
-            }
-        }
-    }
-    .task-item {
-        border-radius: 12px;
-        border: 0.3px solid rgba(0, 0, 0, 0.2);
-        padding: 12px;
-    }
-
-    .task-item + .task-item {
-        margin-top: 10px;
-    }
-
-    .img-text-wrap {
-        display: flex;
-        align-items: flex-start;
-        justify-content: space-between;
-        padding-bottom: 10px;
-        border-bottom: 0.5px solid rgba(0, 0, 0, 0.1);
-        .left-wrap {
-            display: flex;
-            align-items: center;
-            width: calc(100% - 45px);
-            .left-img {
-                width: 40px;
-                height: 40px;
-                border-radius: 6px;
-                img {
-                    width: 100%;
-                    height: 100%;
-                    object-fit: contain;
-                }
-            }
-            .right-text {
-                padding-left: 8px;
-                width: calc(100% - 50px);
-                .farm-info {
-                    font-size: 14px;
-                    color: #1d2129;
-                    display: flex;
-                    align-items: center;
-                    .farm-name{
-                        max-width: calc(100% - 133px);
-                    }
-                    .info-tag-wrap {
-                        margin-left: 10px;
-                        display: flex;
-                        align-items: center;
-                        gap: 4px;
-                        .tag-item {
-                            height: 20px;
-                            line-height: 20px;
-                            padding: 0 8px;
-                            border-radius: 2px;
-                            font-size: 12px;
-                            color: #848282;
-                            background-color: rgba(148, 148, 148, 0.1);
-                            &.second {
-                                color: #ff953d;
-                                background: rgba(255, 149, 61, 0.1);
-                            }
-                            &.primary {
-                                color: #2199f8;
-                                background: #e8f3ff;
-                            }
-                        }
-                    }
-                }
-                .farm-addr {
-                    padding-top: 2px;
-                    font-size: 12px;
-                    color: #86909c;
-                }
-            }
-        }
-        .right-wrap {
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            text-align: center;
-            color: #fff;
-            background: #2199f8;
-            font-size: 12px;
-            flex: none;
-            width: 44px;
-            height: 44px;
-            padding: 8px;
-            border-radius: 5px;
-            box-sizing: border-box;
-            .click-item {
-                display: flex;
-                align-items: center;
-                gap: 2px;
-            }
-            .follow-text {
-                color: #d0d0d0;
-            }
-        }
-    }
-
-    .item-bottom {
-        padding-top: 10px;
-        .bottom-tag {
-            display: flex;
-            gap: 10px;
-            .tag-card {
-                flex: 1;
-                border-radius: 2px;
-                padding: 4px;
-                box-sizing: border-box;
-                border: 0.4px solid rgba(215, 215, 215, 0.5);
-                .card-content {
-                    display: flex;
-                    flex-direction: column;
-                    align-items: center;
-                    justify-content: center;
-                    text-align: center;
-                    height: 100%;
-                    .card-main-text {
-                        font-size: 16px;
-                        font-weight: 500;
-                        color: #202020;
-                        margin-bottom: 2px;
-                    }
-                    .card-sub-text {
-                        font-size: 10px;
-                        color: rgba(32, 32, 32, 0.4);
-                        display: flex;
-                        align-items: center;
-                        gap: 4px;
-                        .card-icon {
-                            display: inline-flex;
-                            align-items: center;
-                            justify-content: center;
-                            width: 12px;
-                            height: 12px;
-                            color: #2199f8;
-                        }
-                    }
-                }
-                &.active {
-                    background: rgba(33, 153, 248, 0.1);
-                    border: 0.5px solid #2199f8;
-                    .card-content {
-                        .card-main-text {
-                            color: #2199f8;
-                        }
-                        .card-sub-text {
-                            color: #2199f8;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    .item-footer {
-        margin-top: 10px;
-        padding-top: 11px;
-        border-top: 1px solid rgba(0, 0, 0, 0.1);
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        font-size: 12px;
-        .footer-l {
-            color: #8b8b8b;
-            font-size: 12px;
-            &.primary-btn {
-                display: inline-flex;
-                align-items: center;
-                border: 1px solid #2199f8;
-                background: rgba(33, 153, 248, 0.1);
-                padding: 0 12px;
-                height: 32px;
-                box-sizing: border-box;
-                display: flex;
-                align-items: center;
-                border-radius: 20px;
-                color: #2199f8;
-                .share-icon {
-                    width: 12px;
-                    padding-right: 4px;
-                }
-            }
-            &.farm-name-text {
-                font-size: 14px;
-                color: #6f7274;
-                .name-text {
-                    padding-left: 4px;
-                }
-            }
-        }
-        .footer-r {
-            display: flex;
-            align-items: center;
-            .btn {
-                height: 32px;
-                line-height: 32px;
-                padding: 0 12px;
-                border-radius: 20px;
-                display: flex;
-                align-items: center;
-                box-sizing: border-box;
-                &.second {
-                    // border: 1px solid #8B8B8B;
-                    // color: #8B8B8B;
-                    color: #2199f8;
-                    background: rgba(33, 153, 248, 0.1);
-                }
-                &.primary {
-                    background: #2199f8;
-                    color: #fff;
-                }
-                .btn-icon {
-                    padding-right: 4px;
-                }
-                &.warning {
-                    color: #ff953d;
-                    background: #fff;
-                    border: 1px solid #ff953d;
-                }
-                &.secondary-text {
-                    color: #2199f8;
-                    border: 1px solid #2199f8;
-                }
-            }
-            .btn + .btn {
-                margin-left: 8px;
-            }
-        }
-    }
-}
-</style>

+ 0 - 155
src/views/old_mini/task_condition/components/remindCustomer.vue

@@ -1,155 +0,0 @@
-<template>
-    <div class="service-records-page">
-        <custom-header name="提醒客户"></custom-header>
-        <div class="record-list" v-if="recordList && recordList.length">
-            <div v-for="(item, index) in recordList" :key="index" class="record-card">
-                <img class="thumb" :src="item.postInfo.media && item.postInfo.media[0]" alt="暂无图片" />
-                <div class="card-body" @click="handleItemClick(item)">
-                    <div class="card-body-left">
-                        <div class="title van-multi-ellipsis--l2">{{ item.postInfo.title }}</div>
-                        <div class="date">{{item.interactionTime }}</div>
-                    </div>
-                    <div class="forward-btn" @click.stop="handleShare(item)">转发</div>
-                </div>
-            </div>
-        </div>
-        <div v-else class="empty-wrap">
-            <div class="empty-text">暂无数据</div>
-        </div>
-    </div>
-    <fn-share-sheet v-model:show="showShareSheet" :options="shareOptions" @select="handleShareSelect" />
-</template>
-<script setup>
-import { ref, onMounted } from "vue";
-import customHeader from "@/components/customHeader.vue";
-import { useRouter, useRoute } from "vue-router";
-import wx from "weixin-js-sdk";
-import FnShareSheet from "@/components/pageComponents/FnShareSheet.vue";
-const router = useRouter();
-const route = useRoute();
-// 服务记录列表数据
-const recordList = ref([]);
-const showShareSheet = ref(false);
-const shareOptions = ref([{ name: "微信", icon: "wechat", type: "wechat" }]);
-const handleShareSelect = () => {
-    const query = {
-        askInfo: { title: "提醒客户", content: "是否分享该提醒给好友" },
-        shareText: shareParams.value.title,
-        targetUrl: `warning_detail`,
-        paramsPage: JSON.stringify(shareParams.value),
-        imageUrl: shareParams.value.imageUrl,
-    };
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
-    });
-};
-
-const shareParams = ref({});
-const handleShare = (data) => {
-    shareParams.value = {
-        id: data.postInfo.postId,
-        title: data.postInfo.title,
-        questTitle: data.interactionQuestion,
-        arrangeId: data.arrangeId,
-        farmId: route.query.farmId,
-        imageUrl: data.postInfo.media[0],
-    };
-    showShareSheet.value = true;
-};
-
-onMounted(() => {
-    getListWithAnswer();
-});
-
-const getListWithAnswer = async () => {
-    const { data } = await VE_API.user.listWithAnswer({ farmId: route.query.farmId });
-    if (data.length) {
-        recordList.value = data;
-    }
-};
-const formatDate = (dateStr) => {
-    if (!dateStr) return "--";
-    const date = new Date(dateStr);
-    if (Number.isNaN(date.getTime())) return dateStr;
-    const y = date.getFullYear();
-    const m = `${date.getMonth() + 1}`.padStart(2, "0");
-    const d = `${date.getDate()}`.padStart(2, "0");
-    return `${y}-${m}-${d}`;
-};
-
-// 处理列表项点击
-const handleItemClick = (data) => {
-    router.push({
-        path: "/warning_detail",
-        query: {
-            id: data.postInfo.postId,
-            questTitle: data.interactionQuestion,
-            arrangeId: data.arrangeId,
-            farmId: route.query.farmId,
-        },
-    });
-};
-</script>
-<style lang="scss" scoped>
-.service-records-page {
-    width: 100%;
-    min-height: 100vh;
-    background: #f5f5f5;
-    .record-list {
-        padding: 10px 12px;
-        display: flex;
-        flex-direction: column;
-        gap: 10px;
-    }
-    .record-card {
-        display: flex;
-        gap: 12px;
-        padding: 12px 10px;
-        background: #ffffff;
-        border-radius: 12px;
-        align-items: center;
-        height: 98px;
-        box-sizing: border-box;
-        .thumb {
-            width: 80px;
-            height: 74px;
-            border-radius: 8px;
-            object-fit: cover;
-        }
-        .card-body {
-            width: calc(100% - 80px - 12px);
-            height: 100%;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            .card-body-left {
-                width: calc(100% - 62px - 12px);
-                height: 95%;
-                display: flex;
-                flex-direction: column;
-                justify-content: space-between;
-                .date {
-                    font-size: 13px;
-                    color: #86909c;
-                    margin-top: 4px;
-                }
-            }
-        }
-        .forward-btn {
-            padding: 6px 19px;
-            background: rgba(33, 153, 248, 0.1);
-            color: #2199f8;
-            border-radius: 25px;
-            font-size: 12px;
-        }
-    }
-    .empty-wrap {
-        padding-top: 40px;
-        text-align: center;
-        .empty-text {
-            font-size: 14px;
-            color: #86909c;
-        }
-    }
-}
-</style>

+ 0 - 699
src/views/old_mini/task_condition/components/reviewPopup.vue

@@ -1,699 +0,0 @@
-<template>
-    <popup class="price-sheet-popup" :overlay-style="{'z-index': 9999}" teleport="body" v-model:show="showPopup">
-        <div class="price-sheet-content">
-            <div class="price-sheet-content-inner">
-                <div class="sheet-content">
-                    <div class="review-image">
-                        <div class="vs-wrap" v-if="preImg">
-                            <img src="@/assets/img/home/vs.png" alt="" />
-                        </div>
-                        <div class="review-image-item" v-if="preImg">
-                            <div class="review-image-item-title">农事前</div>
-                            <img class="review-image-item-img" :src="preImg" alt="" />
-                        </div>
-                        <div class="review-image-item" v-if="resImg">
-                            <div class="review-image-item-title">农事后</div>
-                            <img class="review-image-item-img" :src="resImg" alt="" />
-                        </div>
-                    </div>
-                    <!-- 报价详情区域 -->
-                    <div class="quotation-info">
-                        <div class="info-item">
-                            <span class="info-label">执行农资</span>
-                            <span class="info-value">{{ quotationData.serviceMain || "--" }}</span>
-                        </div>
-                        <div class="info-item">
-                            <span class="info-label">农事名称</span>
-                            <span class="info-value">{{ quotationData?.farmWorkName || "--" }}</span>
-                        </div>
-                        <!-- <div class="info-item flex-wrap">
-                            <div class="info-label">复核成效</div>
-                            <div class="info-value">
-                                促进分蘖芽萌发、加快分蘖生长,同时补充氮素等关键养分,增强植株长势,为形成足够穗数、提高群体产量打基础。
-                            </div>
-                        </div> -->
-
-                        <div class="info-item flex-wrap">
-                            <div class="info-label">药肥处方</div>
-                            <div class="info-value">
-                                <div class="rescription" v-if="quotationData?.prescriptionList">
-                                    <span
-                                        v-for="(fertilizer, fertilizerI) in quotationData.prescriptionList"
-                                        :key="fertilizerI"
-                                    >
-                                        <span
-                                            v-for="(pest, pestI) in fertilizer.pesticideFertilizerList"
-                                            :key="'sub' + pestI"
-                                        >
-                                            {{ pest.defaultName || pest.pesticideFertilizerName }}
-                                            <span
-                                                v-if="
-                                                    pestI !== fertilizer.pesticideFertilizerList.length - 1 ||
-                                                    fertilizerI !== quotationData.prescriptionList.length - 1
-                                                "
-                                            >
-                                                +
-                                            </span>
-                                        </span>
-                                    </span>
-                                </div>
-                                <div class="rescription" v-else>无处方</div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="bottom-info">
-                        <div class="bottom-l">
-                            <div class="l-img">
-                                <img src="@/assets/img/home/bird.png" alt="" />
-                            </div>
-                            <div class="l-text">
-                                <div class="l-text-title">飞鸟管家</div>
-                                <div class="l-text-time">扫描二维码,查看更多详情</div>
-                            </div>
-                        </div>
-                        <div class="bottom-r">
-                            <img src="@/assets/img/home/qrcode.png" alt="" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-
-            <!-- 底部操作按钮 -->
-            <div class="bottom-actions" @click.stop="showPopup = false">
-                <div class="action-buttons">
-                    <div class="action-btn blue-btn" @click.stop="handleShare">
-                        <div class="icon-circle">
-                            <img src="@/assets/img/home/bird.png" alt="" />
-                        </div>
-                        <span class="btn-label">飞鸟用户</span>
-                    </div>
-                    <div class="action-btn green-btn" @click.stop="handleWechat">
-                        <div class="icon-circle">
-                            <img src="@/assets/img/home/wechat.png" alt="" />
-                        </div>
-                        <span class="btn-label">微信</span>
-                    </div>
-                    <!-- <div class="action-btn orange-btn">
-                        <div class="icon-circle">
-                            <el-icon :size="24"><Download /></el-icon>
-                        </div>
-                        <span class="btn-label">保存图片</span>
-                    </div> -->
-                </div>
-                <div class="cancel-btn" @click="handleCancel">取消</div>
-            </div>
-        </div>
-    </popup>
-</template>
-
-<script setup>
-import { Popup } from "vant";
-import { ref, computed, onActivated } from "vue";
-import { useRouter } from "vue-router";
-import { ElMessage } from "element-plus";
-import wx from "weixin-js-sdk";
-import html2canvas from "html2canvas";
-
-const router = useRouter();
-const showPopup = ref(false);
-const contentEl = ref(null);
-const preImg = ref("");
-const resImg = ref("");
-// 报价数据
-const quotationData = ref({});
-
-onActivated(() => {});
-const recordId = ref("");
-const handleShowPopup = async (id, preImgVal, resImgVal) => {
-    recordId.value = id;
-    await getDetail();
-    preImg.value = preImgVal;
-    resImg.value = resImgVal;
-    showPopup.value = true;
-};
-
-async function getDetail() {
-    const { data } = await VE_API.z_farm_work_record.getDetail({ id: recordId.value });
-    quotationData.value = data[0];
-}
-
-const handleShare = () => {
-    const userId = quotationData.value.farmMiniUserId;
-    const parmasPage = {
-        farmWorkOrderId: quotationData.value.orderId,
-        farmMiniUserId: userId,
-        farmMiniUserName: quotationData.value.farmMiniUserName,
-        farmId: quotationData.value.farmId,
-        farmWorkName: quotationData.value.farmWorkName,
-        id: quotationData.value.id,
-        imageList: [resImg.value],
-        type: "reviewWork",
-    };
-    if (userId) {
-        router.push(
-            `/chat_frame?userId=${userId}&farmId=${
-                parmasPage.farmId
-            }&pageParams=${JSON.stringify(parmasPage)}`
-        );
-    } else {
-        ElMessage.warning("尚未绑定用户,暂时无法分享");
-    }
-};
-
-const handleWechat = () => {
-    console.log("handleWechat");
-    // router.push({
-    //     path: "/completed_work",
-    //     query: { id: quotationData.value.id, farmWorkOrderId: quotationData.value.orderId, isAssign: true },
-    // });
-    const query = {
-        askInfo: { title: "农事执行成果", content: "是否分享该农事执行成果给好友" },
-        shareText: "向您分享了农事执行成果",
-        id: recordId.value,
-        postImg: resImg.value,
-    };
-
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=reviewWork`,
-    });
-};
-
-const handleSaveImage = async () => {
-    try {
-        if (!contentEl.value) return;
-        const element = contentEl.value;
-        const scroller = element.querySelector(".sheet-content");
-
-        // 记录原样式
-        const prev = {
-            elementOverflow: element.style.overflow,
-            elementMaxHeight: element.style.maxHeight,
-            elementHeight: element.style.height,
-            scrollerOverflow: scroller ? scroller.style.overflow : undefined,
-            scrollerMaxHeight: scroller ? scroller.style.maxHeight : undefined,
-            scrollerHeight: scroller ? scroller.style.height : undefined,
-        };
-
-        // 展开内容,去除滚动限制,确保截图包含全部内容
-        element.style.overflow = "visible";
-        element.style.maxHeight = "none";
-        element.style.height = "auto";
-        if (scroller) {
-            scroller.style.overflow = "visible";
-            scroller.style.maxHeight = "none";
-            scroller.style.height = "auto";
-        }
-
-        // 计算完整尺寸
-        const width = element.scrollWidth;
-        const height = element.scrollHeight;
-
-        const canvas = await html2canvas(element, {
-            backgroundColor: "#ffffff",
-            useCORS: true,
-            allowTaint: true,
-            scale: Math.min(2, window.devicePixelRatio || 2),
-            width,
-            height,
-            windowWidth: width,
-            windowHeight: height,
-            scrollX: 0,
-            scrollY: 0,
-        });
-        const dataUrl = canvas.toDataURL("image/png");
-        const link = document.createElement("a");
-        link.href = dataUrl;
-        link.download = "服务报价单.png";
-        document.body.appendChild(link);
-        link.click();
-        document.body.removeChild(link);
-
-        // 还原样式
-        element.style.overflow = prev.elementOverflow;
-        element.style.maxHeight = prev.elementMaxHeight;
-        element.style.height = prev.elementHeight;
-        if (scroller) {
-            scroller.style.overflow = prev.scrollerOverflow;
-            scroller.style.maxHeight = prev.scrollerMaxHeight;
-            scroller.style.height = prev.scrollerHeight;
-        }
-    } catch (e) {
-        console.error("保存图片失败", e);
-    }
-};
-
-const handleCancel = () => {
-    showPopup.value = false;
-};
-
-defineExpose({
-    handleShowPopup,
-});
-</script>
-
-<style lang="scss" scoped>
-.price-sheet-popup {
-    z-index: 9999 !important;
-    width: 90%;
-    max-height: 90vh;
-    background: none;
-    border-radius: 12px;
-    overflow: hidden;
-    display: flex;
-    flex-direction: column;
-    backdrop-filter: 4px;
-
-    ::v-deep {
-        .van-popup__close-icon {
-            color: #000;
-            font-size: 18px;
-            top: 12px;
-            right: 12px;
-        }
-    }
-}
-
-.price-sheet-content {
-    display: flex;
-    flex-direction: column;
-    max-height: 90vh;
-    // height: 95vh;
-    .price-sheet-content-inner {
-        background: #fff;
-        border-radius: 12px;
-        display: flex;
-        flex-direction: column;
-        height: 100%;
-        overflow: hidden;
-    }
-}
-
-.sheet-content {
-    padding: 12px 12px 10px 12px;
-    flex: 1;
-    overflow-y: auto;
-    overflow-x: hidden;
-    position: relative;
-}
-.bottom-info {
-    padding: 16px 16px 16px 16px;
-    border-top: 1px dotted rgba(0, 0, 0, 0.3);
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    .bottom-l {
-        display: flex;
-        align-items: center;
-        gap: 8px;
-        .l-img {
-            img {
-                width: 40px;
-            }
-        }
-        .l-text-time {
-            font-size: 12px;
-        }
-    }
-    .bottom-r {
-        width: 40px;
-        height: 40px;
-        img {
-            width: 100%;
-            height: 100%;
-            object-fit: cover;
-        }
-    }
-}
-.review-image {
-    position: relative;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    gap: 8px;
-    .vs-wrap {
-        position: absolute;
-        left: 50%;
-        top: 50%;
-        transform: translate(-50%, -50%);
-        width: 40px;
-        height: 40px;
-        z-index: 10;
-        img {
-            width: 100%;
-            height: 100%;
-            object-fit: cover;
-        }
-    }
-    .review-image-item {
-        position: relative;
-        flex: 1;
-        .review-image-item-title {
-            position: absolute;
-            top: 0;
-            left: 0;
-            background: rgba(54, 52, 52, 0.6);
-            padding: 4px 10px;
-            border-radius: 8px 0 8px 0;
-            backdrop-filter: 4px;
-            font-size: 12px;
-            color: #fff;
-        }
-        .review-image-item-img {
-            width: 100%;
-            height: 250px;
-            object-fit: cover;
-        }
-    }
-}
-
-// 报价详情区域
-.quotation-info {
-    margin-top: 12px;
-
-    .flex-wrap {
-        display: flex;
-        .info-label {
-            flex: none;
-        }
-    }
-
-    .info-item {
-        font-size: 14px;
-        color: #000;
-        margin-bottom: 8px;
-
-        .info-label {
-            padding-right: 8px;
-            color: rgba(0, 0, 0, 0.5);
-        }
-
-        .info-value {
-            color: #000;
-        }
-
-        &.catalog-label {
-            font-weight: bold;
-            margin-top: 10px;
-            margin-bottom: 10px;
-            position: relative;
-
-            .info-label {
-                color: #000;
-            }
-        }
-    }
-
-    .total-bar {
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        background: rgba(33, 153, 248, 0.1);
-        border: 1px solid rgba(33, 153, 248, 0.5);
-        height: 38px;
-        border-radius: 4px;
-
-        .total-label {
-            font-size: 14px;
-            color: #000000;
-        }
-
-        .total-value {
-            font-size: 22px;
-            font-weight: bold;
-            color: #2199f8;
-        }
-
-        .total-unit {
-            font-size: 14px;
-            color: #000;
-            margin-left: 4px;
-        }
-    }
-}
-
-// 药肥费用区域
-.fertilizer-cost-section {
-    margin-bottom: 10px;
-
-    .section-header {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 8px;
-
-        .section-title {
-            font-size: 14px;
-            color: #000;
-        }
-
-        .section-total {
-            font-size: 16px;
-            font-weight: bold;
-            color: #000;
-
-            .unit-text {
-                padding-left: 2px;
-                font-size: 12px;
-                font-weight: normal;
-            }
-        }
-    }
-
-    .cost-table {
-        border: 1px solid rgba(225, 225, 225, 0.5);
-        border-radius: 5px;
-        overflow: hidden;
-
-        .table-header {
-            display: flex;
-            background: rgba(241, 241, 241, 0.4);
-            padding: 8px 6px;
-            font-size: 12px;
-            color: #767676;
-            border-bottom: 1px solid rgba(225, 225, 225, 0.5);
-
-            .col-1 {
-                width: 40px;
-                text-align: center;
-            }
-
-            .col-2 {
-                flex: 1;
-                text-align: center;
-            }
-
-            .col-3 {
-                width: 52px;
-                text-align: center;
-            }
-
-            .col-4 {
-                width: 56px;
-                text-align: center;
-            }
-
-            .col-5 {
-                width: 52px;
-                text-align: center;
-            }
-
-            .col-6 {
-                width: 52px;
-                text-align: center;
-            }
-        }
-
-        .table-row {
-            display: flex;
-            padding: 8px 6px;
-            font-size: 11px;
-            color: rgba(0, 0, 0, 0.6);
-            background: #fff;
-            border-bottom: 1px solid rgba(225, 225, 225, 0.3);
-
-            &:last-child {
-                border-bottom: none;
-            }
-
-            .col-1,
-            .col-2,
-            .col-3,
-            .col-4,
-            .col-5,
-            .col-6 {
-                display: flex;
-                align-items: center;
-                justify-content: center;
-            }
-
-            .col-1 {
-                width: 40px;
-            }
-
-            .col-2 {
-                flex: 1;
-            }
-
-            .col-3 {
-                width: 52px;
-            }
-
-            .col-4 {
-                width: 56px;
-            }
-
-            .col-5 {
-                width: 52px;
-            }
-
-            .col-6 {
-                width: 52px;
-            }
-        }
-    }
-}
-
-// 服务费用区域
-.service-cost-section {
-    position: relative;
-
-    .section-header {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        margin-bottom: 12px;
-
-        .section-title {
-            font-size: 14px;
-            color: #000;
-        }
-
-        .section-total {
-            font-size: 16px;
-            font-weight: bold;
-            color: #000;
-
-            .unit-text {
-                padding-left: 2px;
-                font-size: 12px;
-                font-weight: normal;
-            }
-        }
-    }
-
-    .service-details {
-        display: flex;
-        align-items: center;
-        border: 1px solid rgba(206, 206, 206, 0.5);
-        padding: 8px 0;
-        border-radius: 4px;
-        margin-bottom: 10px;
-
-        .detail-item {
-            font-size: 14px;
-            flex: 1;
-            text-align: center;
-
-            .detail-label {
-                color: rgba(0, 0, 0, 0.2);
-                margin-top: 6px;
-            }
-
-            .detail-value {
-                color: rgba(0, 0, 0, 0.8);
-            }
-        }
-        .detail-item + .detail-item {
-            position: relative;
-            &::before {
-                content: "";
-                position: absolute;
-                left: 0;
-                top: 50%;
-                transform: translateY(-50%);
-                width: 1px;
-                height: 20px;
-                background: rgba(0, 0, 0, 0.1);
-            }
-        }
-    }
-}
-.edit-btn-box {
-    display: flex;
-    justify-content: end;
-    position: absolute;
-    right: 0;
-    top: -8px;
-    z-index: 10;
-}
-.edit-btn {
-    background: rgba(33, 153, 248, 0.1);
-    color: #2199f8;
-    padding: 6px 16px;
-    border-radius: 20px;
-    font-size: 14px;
-    width: fit-content;
-    cursor: pointer;
-}
-
-// 底部操作按钮
-.bottom-actions {
-    flex-shrink: 0;
-
-    .action-buttons {
-        padding: 16px;
-        display: flex;
-        justify-content: space-around;
-
-        .action-btn {
-            display: flex;
-            flex-direction: column;
-            align-items: center;
-            cursor: pointer;
-
-            .icon-circle {
-                width: 48px;
-                height: 48px;
-                border-radius: 50%;
-                display: flex;
-                align-items: center;
-                justify-content: center;
-                color: #fff;
-                margin-bottom: 4px;
-
-                .el-icon {
-                    color: #fff;
-                }
-                img {
-                    width: 50px;
-                }
-            }
-
-            &.blue-btn .icon-circle {
-                background: #2199f8;
-            }
-
-            &.green-btn .icon-circle {
-                background: #07c160;
-            }
-
-            &.orange-btn .icon-circle {
-                background: #ff790b;
-            }
-
-            .btn-label {
-                font-size: 12px;
-                color: #fff;
-            }
-        }
-    }
-
-    .cancel-btn {
-        text-align: center;
-        font-size: 18px;
-        color: #fff;
-        cursor: pointer;
-    }
-}
-</style>

+ 0 - 758
src/views/old_mini/task_condition/components/task.vue

@@ -1,758 +0,0 @@
-<template>
-    <div class="task-page" :style="{ height: `calc(100vh - ${tabBarHeight}px - 50px)` }">
-        <div class="task-top">
-            <div class="map-container" ref="mapContainer"></div>
-            <div class="calendar-wrap">
-                <customCalendar ref="calendarRef" @dateSelect="handleDateSelect"></customCalendar>
-            </div>
-        </div>
-        <div class="task-list">
-            <div class="list-filter">
-                <div class="filter-item" :class="{ active: activeIndex === 0 }" @click="handleActiveFilter(0)">
-                    待完成({{ taskCounts[0] || 0 }})
-                </div>
-                <div class="filter-item" :class="{ active: activeIndex === 1 }" @click="handleActiveFilter(1)">
-                    已完成({{ taskCounts[1] || 0 }})
-                </div>
-                <div class="filter-item" :class="{ active: activeIndex === 2 }" @click="handleActiveFilter(2)">
-                    待复核({{ taskCounts[2] || 0 }})
-                </div>
-            </div>
-            <div class="select-group">
-                <el-select
-                    class="select-item"
-                    v-model="selectParma.farmWorkTypeId"
-                    placeholder="农事类型"
-                    @change="getSimpleList"
-                >
-                    <el-option v-for="item in farmWorkTypeList" :key="item.id" :label="item.name" :value="item.id" />
-                </el-select>
-                <el-select
-                    class="select-item"
-                    v-model="selectParma.districtCode"
-                    placeholder="区域筛选"
-                    @change="getSimpleList"
-                >
-                    <el-option v-for="item in districtList" :key="item.code" :label="item.name" :value="item.code" />
-                </el-select>
-            </div>
-            <!-- <div class="task-content-loading" v-if="loading && noData" v-loading="loading">
-            </div> -->
-            <div class="task-content" v-loading="loading">
-                <div class="task-item" v-for="(item, index) in taskList" :key="item.id || item.workRecordId">
-                    <task-item
-                        :key="activeIndex + '-' + index"
-                        :itemIndex="activeIndex"
-                        :status="activeIndex === 0 ? 0 : 1"
-                        :item-data="item"
-                        @handleUploadSuccess="handleUploadSuccess"
-                        :ref="(el) => setTaskItemRef(el, index)"
-                    >
-                        <template #footer>
-                            <div class="execute-wrap" v-if="activeIndex === 0">
-                                <img class="execute-icon" src="@/assets/img/monitor/execute-icon.png" alt="" />
-                                <span>{{ item.executorName }}</span>
-                            </div>
-                            <div class="item-footer" v-if="activeIndex === 2">
-                                <div class="footer-l farm-name-text van-ellipsis">
-                                    来自<span class="name-text">{{ item.farmName || "--" }}</span>
-                                </div>
-
-                                <div class="footer-r" v-if="item.reviewImage && item.reviewImage.length">
-                                    <div class="btn warning" @click="generateReport(item)">生成成果报告</div>
-                                </div>
-                                <div class="footer-r" v-else>
-                                    <div class="btn primary" :class="{ 'primary-text': getButtonText(item) }" @click="handleAction(item)">{{ getButtonText(item) ? '提醒复核' : '上传复核照片' }}</div>
-                                </div>
-                            </div>
-                            <div v-else-if="activeIndex === 1" class="item-footer">
-                                <div class="footer-l farm-name-text van-ellipsis">
-                                    来自<span class="name-text">{{ item.farmName || "--" }}</span>
-                                </div>
-                                <div class="footer-r">
-                                    <div class="btn warning" @click="generateReport(item)">生成成果报告</div>
-                                </div>
-                            </div>
-                            <div v-else-if="activeIndex === 0" class="item-footer">
-                                <div class="footer-l" @click="toDetail(item)">查看详情</div>
-                                <div class="footer-r" v-if="item.expectedExecuteDate">
-                                    <div
-                                        class="btn primary"
-                                        :class="{ 'primary-text': getButtonText(item) }"
-                                        @click="showUploadExecutePopup(item)"
-                                    >
-                                        {{ getButtonText(item) ? "提醒执行" : "上传照片" }}
-                                    </div>
-                                </div>
-                                <div class="footer-r" v-else>
-                                    <div
-                                        class="btn warning"
-                                        :class="{ 'primary-text': getButtonText(item) }"
-                                        @click="selectExecuteTime(item)"
-                                    >
-                                        {{ getButtonText(item) ? "提醒确认执行时间" : "确认执行时间" }}
-                                    </div>
-                                </div>
-                            </div>
-                        </template>
-                    </task-item>
-                </div>
-                <div class="empty-data" v-if="noData">暂无数据</div>
-            </div>
-        </div>
-    </div>
-    <upload-execute ref="uploadExecuteRef" :onlyShare="onlyShare" @uploadSuccess="handleUploadSuccess" />
-
-    <!-- 服务报价单 -->
-    <price-sheet-popup :key="activeIndex" ref="priceSheetPopupRef"></price-sheet-popup>
-    <offer-popup ref="offerPopupRef" @uploadSuccess="handleUploadSuccess"></offer-popup>
-
-    <!-- 确认执行时间 -->
-    <calendar
-        teleport="#app"
-        v-model:show="showCalendar"
-        @confirm="onConfirmExecuteTime"
-        :min-date="minDate"
-        :max-date="maxDate"
-    />
-</template>
-
-<script setup>
-import { computed, nextTick, onActivated, onMounted, ref, watch } from "vue";
-import { useStore } from "vuex";
-import { Popup, Calendar } from "vant";
-import IndexMap from "../../farm_manage/map/index";
-import taskItem from "@/components/taskItem.vue";
-import wx from "weixin-js-sdk";
-import customCalendar from "./calendar.vue";
-import { useRouter } from "vue-router";
-import uploadExecute from "./uploadExecute.vue";
-import priceSheetPopup from "@/components/popup/priceSheetPopup.vue";
-import { ElMessage } from "element-plus";
-import offerPopup from "@/components/popup/offerPopup.vue";
-import { formatDate } from "@/common/commonFun";
-
-const store = useStore();
-const router = useRouter();
-const indexMap = new IndexMap();
-const mapContainer = ref(null);
-const tabBarHeight = computed(() => store.state.home.tabBarHeight);
-const uploadExecuteRef = ref(null);
-const dateValue = ref("1");
-const calendarRef = ref(null);
-const showPopup = ref(false);
-const executionData = ref(null);
-const selectParma = ref({
-    farmWorkTypeId: null,
-    districtCode: null,
-});
-
-// 任务列表数据(用于显示,可能被筛选)
-const taskList = ref([]);
-// 完整的任务列表数据(用于日历显示,不被筛选影响)
-const fullTaskList = ref([]);
-// 各状态任务数量
-const taskCounts = ref([0, 0, 0]);
-// 当前选中的筛选索引
-const activeIndex = ref(0);
-// 筛选日期(用于按日期筛选)
-const filterDate = ref(null);
-const noData = ref(false);
-const loading = ref(false);
-
-// 根据 activeIndex 计算 startFlowStatus
-const getStartFlowStatus = (index) => {
-    const statusMap = {
-        0: 4, // 待完成
-        1: 5, // 已完成
-        2: 5, // 待复核
-    };
-    return statusMap[index] ?? 4;
-};
-
-// 获取单个状态的任务数量
-function getTaskCount(flowStatus, index) {
-    const location = store.state.home.miniUserLocationPoint;
-    // 根据传入的 index 参数来设置 needReview 和 includePrescription,而不是根据 activeIndex.value
-    const needReview = index === 2 ? 1 : null; // 待复核需要 needReview=1
-    const includePrescription = index === 0 ? false : true; // 待完成不需要处方,其他需要
-    return VE_API.z_farm_work_record
-        .getSimpleList({ role: 2, location, flowStatus, needReview, includePrescription })
-        .then(({ data }) => {
-            if (Array.isArray(data)) {
-                taskCounts.value[index] = data.length;
-                calendarRef.value && calendarRef.value.setCounts(index, taskCounts.value[index]);
-
-                if (index === 0) {
-                    calendarRef.value && calendarRef.value.setSolarTerm(data);
-                    indexMap.initData(data);
-                }
-            } else if (data?.total !== undefined) {
-                taskCounts.value[index] = data.total;
-            } else {
-                taskCounts.value[index] = 0;
-            }
-        })
-        .catch((error) => {
-            console.error(`获取状态${index}任务数量失败:`, error);
-            taskCounts.value[index] = 0;
-        });
-}
-
-const taskItemRefs = ref([]);
-const setTaskItemRef = (el, index) => {
-    if (el) {
-        taskItemRefs.value[index] = el;
-    }
-};
-
-const handleUploadSuccess = async () => {
-    // 刷新列表
-    await initTaskCounts();
-    // 加载当前选中状态的数据列表
-    getSimpleList();
-};
-
-const cityCode = ref("");
-//根据城市的坐标返回区县列表
-const districtList = ref([]);
-function getDistrictListByCity() {
-    VE_API.z_farm_work_record.getDistrictListByCity({ point: mapPoint.value }).then(({ data }) => {
-        districtList.value = data || [];
-        // cityCode.value = data[0].code.slice(0, -2);
-        cityCode.value = "";
-        districtList.value.unshift({ code: cityCode.value, name: "全部" });
-        selectParma.value.districtCode = cityCode.value;
-        getSimpleList();
-    });
-}
-
-//农事类型列表
-const farmWorkTypeList = ref([]);
-function getFarmWorkTypeList() {
-    VE_API.z_farm_work_record.getFarmWorkTypeList().then(({ data }) => {
-        farmWorkTypeList.value = data;
-        farmWorkTypeList.value.unshift({ id: 0, name: "全部" });
-    });
-}
-
-// 初始化时获取所有状态的任务数量
-function initTaskCounts() {
-    // 并行请求状态的数量
-    Promise.all([
-        getTaskCount(4, 0), // 待完成
-        getTaskCount(5, 1), // 已完成
-        getTaskCount(5, 2), // 待复核
-    ]);
-}
-const mapPoint = ref(null);
-
-const agriculturalRole = ref(null);
-const userId = ref(null);
-onMounted(() => {
-    mapPoint.value = store.state.home.miniUserLocationPoint;
-    const userInfo = JSON.parse(localStorage.getItem("localUserInfo"));
-    agriculturalRole.value = userInfo.agriculturalRole;
-    userId.value = userInfo.id;
-    // 初始化时获取所有状态的数量
-    initTaskCounts();
-    // 加载当前选中状态的数据列表
-    getSimpleList();
-    getDistrictListByCity();
-    getFarmWorkTypeList();
-    nextTick(() => {
-        indexMap.initMap(mapPoint.value, mapContainer.value, true);
-    });
-});
-
-onActivated(() => {
-    // 确保地图已初始化,使用 nextTick 等待 DOM 更新
-    nextTick(() => {
-        // 检查地图实例是否已初始化
-        if (!indexMap.kmap) {
-            // 如果地图未初始化,重新初始化
-            if (mapContainer.value) {
-                mapPoint.value = store.state.home.miniUserLocationPoint;
-                indexMap.initMap(mapPoint.value, mapContainer.value, true);
-                // 等待地图初始化完成后再加载数据
-                setTimeout(() => {
-                    initTaskCounts();
-                    getSimpleList();
-                }, 300);
-                return;
-            }
-        } else {
-            // 如果地图已初始化,需要等待 tab 切换完成,容器完全可见后再更新尺寸
-            // Tab 切换时容器可能被隐藏,需要更长的延迟确保容器可见
-            if (mapContainer.value && indexMap.kmap.map) {
-                // 检查容器是否可见
-                const checkAndUpdateSize = () => {
-                    const container = mapContainer.value;
-                    if (container) {
-                        const rect = container.getBoundingClientRect();
-                        // 如果容器可见(有宽度和高度),更新地图尺寸
-                        if (rect.width > 0 && rect.height > 0) {
-                            indexMap.kmap.map.updateSize();
-                        } else {
-                            // 如果容器不可见,继续等待
-                            setTimeout(checkAndUpdateSize, 100);
-                        }
-                    }
-                };
-                // 延迟检查,确保 tab 切换完成
-                setTimeout(checkAndUpdateSize, 200);
-            }
-        }
-        // 初始化时获取所有状态的数量
-        initTaskCounts();
-        getSimpleList();
-    });
-});
-
-// 标记是否正在通过日期选择切换筛选(避免 watch 清除日期筛选)
-const isDateSelecting = ref(false);
-
-// 监听 activeIndex 变化,重新加载数据
-watch(activeIndex, () => {
-    // 如果正在通过日期选择切换,不清除日期筛选
-    if (isDateSelecting.value) {
-        isDateSelecting.value = false;
-        getSimpleList();
-        return;
-    }
-    // 切换筛选时清除日期筛选
-    filterDate.value = null;
-    // 清除日历选中状态
-    if (calendarRef.value) {
-        calendarRef.value.clearSelection();
-    }
-    getSimpleList();
-});
-
-function getSimpleList() {
-    loading.value = true;
-    noData.value = false;
-    // 清空refs数组,避免索引错乱
-    taskItemRefs.value = [];
-    const startFlowStatus = getStartFlowStatus(activeIndex.value);
-    const needReview = activeIndex.value === 2 ? 1 : null;
-    const params = {
-        ...selectParma.value,
-        role: 2,
-        location: mapPoint.value,
-        flowStatus: startFlowStatus,
-        farmWorkTypeId: selectParma.value.farmWorkTypeId || null,
-        needReview: needReview,
-        includePrescription: activeIndex.value === 0 ? false : true,
-    };
-
-    return VE_API.z_farm_work_record
-        .getSimpleList(params)
-        .then(({ data }) => {
-            loading.value = false;
-            // 假设返回的数据结构是 { list: [], total: 0 } 或者直接是数组
-            let filteredData = data;
-
-            // 保存完整数据(用于日历显示)
-            if (activeIndex.value === 0) {
-                // 如果是"待完成"状态,保存完整数据用于日历
-                fullTaskList.value = Array.isArray(data) ? data : [];
-            }
-
-            // 如果有日期筛选,在前端再次过滤(确保数据准确)
-            if (filterDate.value && Array.isArray(filteredData)) {
-                filteredData = filteredData.filter((item) => {
-                    if (!item.expectedExecuteDate && !item.executeDeadlineDate) return false;
-                    const itemDate = formatDate(new Date(item.expectedExecuteDate || item.executeDeadlineDate));
-                    return itemDate === filterDate.value;
-                });
-            }
-
-            if (Array.isArray(filteredData) && filteredData.length > 0) {
-                taskList.value = filteredData;
-                // 更新当前状态的数量
-                taskCounts.value[activeIndex.value] = filteredData.length;
-                if (activeIndex.value === 0) {
-                    // 传递给日历的数据应该是完整的未筛选数据
-                    const calendarData = filterDate.value ? fullTaskList.value : taskList.value;
-                    calendarRef.value && calendarRef.value.setSolarTerm(calendarData);
-                    // 地图使用筛选后的数据
-                    indexMap.initData(taskList.value);
-                }
-            } else {
-                noData.value = true;
-                taskList.value = [];
-                taskCounts.value[activeIndex.value] = 0;
-            }
-        })
-        .catch((error) => {
-            console.error("获取任务列表失败:", error);
-            loading.value = false;
-            taskList.value = [];
-            taskCounts.value[activeIndex.value] = 0;
-            if (activeIndex.value === 0) {
-                // 即使筛选后没有数据,日历也应该显示完整数据
-                const calendarData = filterDate.value ? fullTaskList.value : [];
-                indexMap.initData(taskList.value);
-                calendarRef.value && calendarRef.value.setSolarTerm(calendarData);
-            }
-            noData.value = true;
-        });
-}
-
-// 处理日历日期选择
-const handleDateSelect = (date) => {
-    if (date) {
-        // 有日期选择,切换到"待完成"筛选并设置筛选日期
-        filterDate.value = date;
-        // 如果当前不是"待完成"状态,切换到"待完成"
-        if (activeIndex.value !== 0) {
-            isDateSelecting.value = true; // 标记正在通过日期选择切换
-            activeIndex.value = 0;
-            // watch 会处理 getSimpleList
-        } else {
-            // 如果已经是"待完成"状态,直接重新加载列表
-            getSimpleList();
-        }
-    } else {
-        // 取消日期筛选
-        filterDate.value = null;
-        // 重新加载列表
-        getSimpleList();
-    }
-};
-
-function handleActiveFilter(i) {
-    activeIndex.value = i;
-    // watch 会自动处理清除日期筛选和日历选中状态
-    selectParma.value.districtCode = cityCode.value;
-    selectParma.value.farmWorkTypeId = null;
-}
-
-const offerPopupRef = ref(null);
-const showUploadExecutePopup = (item) => {
-    if(getButtonText(item)) {
-        const query = {
-            askInfo: { title: "农事提醒", content: "是否分享该农事提醒给好友" },
-            shareText: '向您分享了一条农事执行提醒,请您尽快执行',
-            targetUrl: `completed_work`,
-            paramsPage: JSON.stringify({id: item.id}),
-            imageUrl: 'https://birdseye-img.sysuimars.com/birdseye-look-mini/invite_bg.png',
-        };
-        wx.miniProgram.navigateTo({
-            url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
-        });
-    }else{
-        offerPopupRef.value.openPopup(item);
-    }
-};
-
-const generateReport = (item) => {
-    router.push({
-        path: "/achievement_report",
-        query: { miniJson: JSON.stringify({ id: item.id }) },
-    });
-};
-
-function toDetail(item) {
-    // router.push({
-    //         path: "/modify",
-    //         query: { id: item.id },
-    //     });
-    router.push({
-        path: "/completed_work",
-        query: { miniJson: JSON.stringify({ id: item.id }) },
-    });
-}
-
-const showCalendar = ref(false);
-const maxDate = ref();
-// 最小日期设置为今天,今天可以选择
-const minDate = new Date();
-const executeItem = ref(null);
-const selectExecuteTime = (item) => {
-    if (getButtonText(item)) {
-        const query = {
-            askInfo: { title: "农事提醒", content: "是否分享该农事提醒给好友" },
-            shareText: '向您分享了一条农事提醒,请您尽快确认执行时间',
-            targetUrl: `completed_work`,
-            paramsPage: JSON.stringify({id: item.id}),
-            imageUrl: 'https://birdseye-img.sysuimars.com/birdseye-look-mini/invite_bg.png',
-        };
-        wx.miniProgram.navigateTo({
-            url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
-        });
-    } else {
-        executeItem.value = item;
-        maxDate.value = new Date(item.executeDeadlineDate);
-        showCalendar.value = true;
-    }
-};
-
-const onConfirmExecuteTime = (date) => {
-    showCalendar.value = false;
-    VE_API.z_farm_work_record
-        .updateExpectedExecuteDate({ recordId: executeItem.value.id, expectedExecuteDate: formatDate(date) })
-        .then((res) => {
-            if (res.code === 0) {
-                ElMessage.success("操作成功");
-                getSimpleList();
-            }
-        });
-};
-
-// 获取上传按钮的文本(计算属性方式)
-const getButtonText = (item) => {
-    return agriculturalRole.value === 1 || (agriculturalRole.value === 2 && item.executorUserId != userId.value);
-};
-
-// const isShowPermission = (item) => {
-//     return agriculturalRole.value === 1 || agriculturalRole.value === 2 || item.executorUserId === userId.value;
-// };
-
-const priceSheetPopupRef = ref(null);
-const showPriceSheetPopup = (item) => {
-    VE_API.z_farm_work_record.getDetail({ id: item.id }).then(({ data }) => {
-        const res = data[0];
-        priceSheetPopupRef.value.handleShowPopup(res);
-    });
-};
-
-const onlyShare = ref(false);
-function handleAction(item) {
-    if(getButtonText(item)) {
-        const query = {
-            askInfo: { title: "农事提醒", content: "是否分享该农事提醒给好友" },
-            shareText: '向您分享了一条农事复核提醒,请您尽快复核',
-            targetUrl: `review_work`,
-            paramsPage: JSON.stringify({id: item.id}),
-            imageUrl: 'https://birdseye-img.sysuimars.com/birdseye-look-mini/invite_bg.png',
-        };
-        wx.miniProgram.navigateTo({
-            url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
-        });
-    }else{
-        setTimeout(() => {
-            uploadExecuteRef.value.showPopup(item, "share-sheet");
-        }, 10);
-    }
-}
-
-function handleForward(item) {
-    if (item.quoteCount && item.quoteCount != 0) {
-        onlyShare.value = true;
-        setTimeout(() => {
-            uploadExecuteRef.value.showPopup(
-                { ...item, type: "quotation", farmWorkOrderId: item.orderId },
-                "share-sheet"
-            );
-        }, 10);
-    } else {
-        ElMessage.warning("暂无报价数据,无法分享");
-        return;
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-.task-page {
-    width: 100%;
-    height: calc(100vh - 50px - 50px);
-    overflow: auto;
-    box-sizing: border-box;
-    background: #f5f7fb;
-    .map-container {
-        width: 100%;
-        height: 162px;
-        clip-path: inset(0px round 8px);
-    }
-
-    .select-group {
-        display: flex;
-        padding: 0 12px;
-        .select-item {
-            width: 100%;
-            ::v-deep {
-                .el-select__wrapper {
-                    text-align: center;
-                    gap: 2px;
-                    box-shadow: none;
-                    justify-content: center;
-                    background: none;
-                }
-                .el-select__selection {
-                    flex: none;
-                    width: fit-content;
-                }
-                .el-select__placeholder {
-                    position: static;
-                    transform: none;
-                    width: fit-content;
-                    color: rgba(0, 0, 0, 0.2);
-                }
-                .el-select__caret {
-                    color: rgba(0, 0, 0, 0.2);
-                }
-            }
-        }
-    }
-
-    .calendar-wrap {
-        padding: 10px 0 4px 0;
-    }
-
-    .task-top {
-        padding: 10px 12px;
-    }
-
-    .task-content-loading {
-        height: 80px;
-        border-radius: 8px;
-        position: absolute;
-        top: 60px;
-        left: 0;
-        width: 100%;
-    }
-
-    .task-content {
-        min-height: 80px;
-    }
-
-    .empty-data {
-        text-align: center;
-        font-size: 14px;
-        color: #6f7274;
-        padding: 20px 0;
-    }
-    .task-list {
-        position: relative;
-        background: #fff;
-        padding: 8px 12px;
-    }
-    .list-filter {
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        gap: 20px;
-        .filter-item {
-            padding: 0 12px;
-            height: 28px;
-            color: rgba(0, 0, 0, 0.5);
-            font-size: 14px;
-            line-height: 28px;
-            border-radius: 20px;
-            &.active {
-                color: #2199f8;
-                background: rgba(33, 153, 248, 0.2);
-            }
-        }
-    }
-
-    .task-item + .task-item {
-        margin-top: 10px;
-    }
-
-    .execute-wrap {
-        background: rgba(153, 153, 153, 0.1);
-        border: 1px solid rgba(153, 153, 153, 0.2);
-        border-radius: 2px;
-        padding: 6px 10px;
-        color: #999999;
-        display: flex;
-        align-items: center;
-        gap: 5px;
-        margin-top: 10px;
-        .execute-icon {
-            width: 14px;
-            height: 14px;
-        }
-    }
-
-    .item-footer {
-        margin-top: 10px;
-        padding-top: 11px;
-        border-top: 1px solid rgba(0, 0, 0, 0.1);
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        font-size: 12px;
-        .footer-l {
-            color: #8b8b8b;
-            font-size: 12px;
-            &.primary-btn {
-                display: inline-flex;
-                align-items: center;
-                border: 1px solid #2199f8;
-                background: rgba(33, 153, 248, 0.1);
-                padding: 0 12px;
-                height: 32px;
-                box-sizing: border-box;
-                display: flex;
-                align-items: center;
-                border-radius: 20px;
-                color: #2199f8;
-                .share-icon {
-                    width: 12px;
-                    padding-right: 4px;
-                }
-            }
-            &.farm-name-text {
-                font-size: 14px;
-                color: #6f7274;
-                .name-text {
-                    padding-left: 4px;
-                }
-            }
-        }
-        .footer-r {
-            display: flex;
-            align-items: center;
-            .btn {
-                height: 32px;
-                line-height: 32px;
-                padding: 0 12px;
-                border-radius: 20px;
-                display: flex;
-                align-items: center;
-                box-sizing: border-box;
-                &.second {
-                    // border: 1px solid #8B8B8B;
-                    // color: #8B8B8B;
-                    color: #2199f8;
-                    background: rgba(33, 153, 248, 0.1);
-                }
-                &.primary {
-                    background: #2199f8;
-                    color: #fff;
-                }
-                .btn-icon {
-                    padding-right: 4px;
-                }
-                &.warning {
-                    color: #ff953d;
-                    background: #fff;
-                    border: 1px solid #ff953d;
-                }
-                &.secondary-text {
-                    color: #2199f8;
-                    border: 1px solid #2199f8;
-                }
-                &.primary-text {
-                    background: rgba(33, 153, 248, 0.1);
-                    color: #2199f8;
-                    border: 1px solid #2199f8;
-                }
-            }
-            .btn + .btn {
-                margin-left: 8px;
-            }
-        }
-    }
-}
-</style>
-
-<style lang="scss">
-.van-calendar__popup {
-    z-index: 9999 !important;
-}
-</style>

+ 0 - 203
src/views/old_mini/task_condition/components/uploadExecute.vue

@@ -1,203 +0,0 @@
-<template>
-    <popup
-        class="active-upload-popup"
-        v-model:show="show"
-        closeable
-        :close-on-click-overlay="false"
-    >
-        <div class="header">
-            <div class="title">
-                <span class="required">*</span>
-                请上传复核照片
-            </div>
-        </div>
-        <upload ref="uploadRef" exampleImg class="upload-wrap" @handleUpload="handleUpload">
-            <img class="example" src="@/assets/img/home/example-4.png" alt="" />
-            <img class="example" src="@/assets/img/home/plus.png" alt="">
-        </upload>
-        <div class="btn" @click="handleConfirm">确认上传</div>
-    </popup>
-    <!-- <FnShareSheet v-model:show="showShare" @select="onSelect" :class="className" /> -->
-</template>
-
-<script setup>
-import wx from 'weixin-js-sdk';
-import { Popup } from "vant";
-import { ref } from "vue";
-import upload from "@/components/upload";
-import { useRouter } from "vue-router";
-import { ElMessage } from "element-plus";
-import FnShareSheet from "@/components/pageComponents/FnShareSheet.vue";
-import { base_img_url2 } from "@/api/config";
-
-const router = useRouter();
-const props = defineProps({
-    onlyShare: {
-        type: Boolean,
-        default: false,
-    },
-});
-
-const emit = defineEmits(['uploadSuccess']);
-
-const show = ref(false);
-const className = ref(null);
-const farmWorkRecordId = ref(null);
-const farmData = ref({});
-function showPopup(data,classNameVal) {
-    // if (props.onlyShare) {
-    //     showShare.value = true;
-    //     className.value = classNameVal;
-    // } else {
-    // }
-    show.value = true;
-    farmWorkRecordId.value = data.id;
-    farmData.value = data;
-}
-const images = ref([]);
-function handleUpload({imgArr}) {
-    images.value = imgArr;
-}
-
-const uploadRef = ref(null);
-
-function handleConfirm() {
-    if (images.value.length === 0) return ElMessage.warning("请上传图片");
-    const params = {
-        recordId: farmWorkRecordId.value,
-        executeEvidence: images.value,
-    };
-    VE_API.monitor.addReviewImg(params).then((res) => {
-        if (res.code === 0) {
-            ElMessage.success('上传成功');
-            show.value = false;
-            VE_API.z_farm_work_record.getDetail({ id: farmData.value.id }).then(({ data }) => {
-                const dataItem = data[0];
-                farmData.value = {
-                    farmMiniUserId: dataItem.farmMiniUserId || (dataItem.users && dataItem.users.length > 0 ? dataItem.users[0]?.userId : null),
-                    farmWorkOrderId: dataItem.orderId,
-                    farmId: dataItem.farmId,
-                    executeEvidence:JSON.stringify(dataItem.executeEvidence),
-                    farmWorkName: dataItem.farmWorkName,
-                    id: dataItem.id,
-                }
-                farmData.value.type = 'confirmExecute'
-                uploadRef.value.uploadReset();
-                emit('uploadSuccess', farmData.value.id);
-                showShare.value = true;
-            });
-        }
-    });
-}
-
-const showShare = ref(false);
-const onSelect = async ({type}) => {
-    if(farmData.value.type === 'remindExecute' || farmData.value.type === 'remindUser') {
-        await getTriggerImg();
-    }
-    if(type === 'birdseye') {
-        if(farmData.value.farmMiniUserId){
-            if(triggerImg.value.length) {
-                farmData.value.imageList = triggerImg.value;
-            }
-            router.push(`/chat_frame?userId=${farmData.value.farmMiniUserId}&farmId=${farmData.value.farmId}&pageParams=${JSON.stringify(farmData.value)}`);
-        }else{
-            ElMessage.warning('尚未绑定用户,暂时无法分享')
-        }
-    } else {
-        if (farmData.value.type === 'quotation') {
-            const query = { askInfo: {title: "服务报价单", content: "是否分享该服务报价单给好友"}, shareText: "向您发送了一张 服务报价单", id: farmData.value.id, farmWorkOrderId: farmData.value.orderId, isAssign: true }
-            wx.miniProgram.navigateTo({
-                url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=priceSheet`,
-            });
-        } else if (farmData.value.type === 'remindExecute') {
-            const query = { askInfo: {title: "提醒执行", content: "是否分享该提示给好友"}, shareText: " 请您尽快执行" + farmData.value.farmWorkName + "农事", id: farmData.value.id, farmWorkOrderId: farmData.value.orderId, postImg: triggerImg.value.length ? base_img_url2 + triggerImg.value[triggerImg.value.length - 1].cloudFilename : '' }
-            wx.miniProgram.navigateTo({
-                url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=priceSheet`,
-            });
-        } else if (farmData.value.type === 'remindUser') {
-            const query = { askInfo: {title: "提醒拍照", content: "是否分享该提示给好友"}, shareText: " 请您尽快完成复核", id: farmData.value.id, farmWorkOrderId: farmData.value.orderId, postImg: triggerImg.value.length ? base_img_url2 + triggerImg.value[triggerImg.value.length - 1].cloudFilename : '' }
-            // reviewWork跳转到农事复核
-            wx.miniProgram.navigateTo({
-                url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=reviewWork`,
-            });
-        } else {
-            const img = JSON.parse(farmData.value.executeEvidence);
-            const imgUrl = base_img_url2 + img[img.length - 1];
-            const query = { askInfo: {title: "农事确认单", content: "是否分享该农事确认单给好友"}, shareText: farmData.value.farmWorkName + " 农事已完成,请您确认", id: farmData.value.id, farmWorkOrderId: farmData.value.orderId, postImg: imgUrl }
-            wx.miniProgram.navigateTo({
-                url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=priceSheet`,
-            });
-        }
-    }
-};
-
-const triggerImg = ref([]);
-const getTriggerImg = async () => {
-    const { data } = await VE_API.z_farm_work_record.getTriggerImg({ farmWorkRecordId: farmData.value.id });
-    triggerImg.value = data || [];
-}
-
-defineExpose({
-    showPopup,
-});
-
-</script>
-
-<style lang="scss" scoped>
-.active-upload-popup {
-    width: 90%;
-    box-sizing: border-box;
-    padding: 24px 18px 20px;
-    background: linear-gradient(0deg, #ffffff 70%, #d1ebff 100%);
-    border-radius: 10px;
-    ::v-deep {
-        .van-popup__close-icon {
-            color: #000;
-        }
-    }
-    .header {
-        .title {
-            font-size: 16px;
-            font-weight: 500;
-            display: flex;
-            align-items: center;
-            .required {
-                color: #ff4d4f;
-                margin-right: 4px;
-            }
-        }
-        .date-input {
-            margin: 12px 0;
-        }
-    }
-    .tips-text {
-        font-weight: 500;
-    }
-    .upload-wrap {
-        margin: 12px 0 24px;
-        .example {
-            width: 80px;
-            height: 80px;
-        }
-        .example + .example {
-            margin-left: 12px;
-        }
-    }
-}
-
-.btn {
-    padding: 8px;
-    background: #2199f8;
-    border-radius: 25px;
-    color: #fff;
-    font-size: 16px;
-    text-align: center;
-}
-
-</style>
-<style>
-.share-sheet{
-    bottom: 50px;
-}
-</style>

+ 0 - 69
src/views/old_mini/task_condition/index.vue

@@ -1,69 +0,0 @@
-<template>
-    <div class="farm-manage">
-        <tabs v-model:active="active" class="tabs">
-            <tab title="农情互动">
-                <!-- <demand-hall :isCapital="true" ref="demandHallRef" /> -->
-                <interact></interact>
-            </tab>
-            <tab title="我的任务">
-                <task></task>
-            </tab>
-        </tabs>
-        <system-reminder />
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, onActivated } from "vue";
-import { Tab, Tabs } from "vant";
-// import demandHall from "../farm_manage/components/demandHall.vue";
-import interact from "./components/interact.vue";
-import systemReminder from "../farm_manage/components/systemReminder.vue";
-import task from "./components/task.vue"
-import { useRoute } from "vue-router";
-const route = useRoute();
-
-const active = ref(0);
-const getManagerList = async () => {
-    const { data } = await VE_API.mine.listManagerList({ onlyExecutor: true });
-    if (data && data.length > 0) {
-        // 过滤 permissionList 中包含"任务接单"的成员,并过滤掉超管(role为1)
-        const executorList = data.filter((item) => item.role !== 1);
-        sessionStorage.setItem("executorList", JSON.stringify(executorList));
-    }
-};
-onMounted(() => {
-    getManagerList();
-});
-
-onActivated(() => {
-    if(route.query.active){
-        active.value = Number(route.query.active);
-    }
-});
-</script>
-
-<style lang="scss" scoped>
-.farm-manage {
-    width: 100%;
-    height: 100%;
-    .tabs{
-        ::v-deep{
-            .van-tabs__wrap{
-                margin-bottom: 8px;
-            }
-            .van-tabs__line{
-                width: 24px;
-                height: 4px;
-            }
-            .van-tab {
-                width: 80px;
-                flex: none;
-            }
-            .van-tabs__nav {
-                justify-content: center;
-            }
-        }
-    }
-}
-</style>

+ 0 - 73
src/views/old_mini/user/components/addPopup.vue

@@ -1,73 +0,0 @@
-<template>
-    <popup class="add-popup" round v-model:show="showAddPopup" :close-on-click-overlay="false">
-        <div class="popup-title">添加分组</div>
-        <el-input class="popup-input" v-model="input" placeholder="分组名" size="large" />
-        <div class="popup-button">
-            <div class="cancel" @click="showAddPopup = false">取消</div>
-            <div class="confirm" @click="handleConfirm">确定</div>
-        </div>
-    </popup>
-</template>
-
-<script setup>
-import { ref, watch } from "vue";
-import { Popup} from "vant";
-
-const props = defineProps({
-    show:{
-        type:Boolean,
-        defalut:false
-    }
-})
-const input = ref("");
-
-const showAddPopup = ref(false)
-
-watch(()=>props.show,()=>{
-    input.value = ""
-    showAddPopup.value = true
-})
-
-const emit = defineEmits(["confirm"]);
-
-const handleConfirm = () => {
-    showAddPopup.value = false;
-    emit("confirm", input.value);
-}
-</script>
-
-<style lang="scss" scoped>
-.add-popup{
-    width: 90%;
-    padding: 20px 16px;
-    .popup-title{
-        font-size: 18px;
-        font-weight: 500;
-        text-align: center;
-        margin-bottom: 12px;
-    }
-    .popup-input{
-        margin-bottom: 30px;
-    }
-    .popup-button{
-        display: flex;
-        padding-top: 20px;
-        border-top: 1px solid rgba(0, 0, 0, 0.1);
-        div{
-            flex: 1;
-            font-size: 16px;
-            padding: 9px;
-            border-radius: 20px;
-            background: #2199F8;
-            color: #fff;
-            text-align: center;
-        }
-        .cancel{
-            margin-right: 20px;
-            color: #000;
-            background: #fff;
-            border: 1px solid #999999;
-        }
-    }
-}
-</style>

+ 0 - 691
src/views/old_mini/user/farmDetails.vue

@@ -1,691 +0,0 @@
-<template>
-    <div class="farm-details-page">
-        <custom-header name="农场详情"></custom-header>
-        <div class="farm-details-content">
-            <farm-info-card
-                v-if="farmDetail.name"
-                :data="{
-                    farmName: farmDetail.name || '',
-                    userType: farmDetail.userType || '托管客户',
-                    variety: farmDetail.typeName || '',
-                    address: farmDetail.address || '',
-                }"
-                @click="handleFarmInfo"
-            >
-                <template #right>
-                    <div @click="handleDetail('plan')">农事规划</div>
-                </template>
-                <!-- <template #footerData>
-                    <div class="footer-data">
-                        <div class="footer-l">
-                            <div class="farm-info-footer-item">
-                                <div class="farm-info-footer-item-label">农事服务</div>
-                                <div class="farm-info-footer-item-value">10<span class="unit">次</span></div>
-                            </div>
-                            <div class="farm-info-footer-item">
-                                <div class="farm-info-footer-item-label">总收益</div>
-                                <div class="farm-info-footer-item-value">1450<span class="unit">元</span></div>
-                            </div>
-                        </div>
-                        <div class="footer-action" @click.stop="handleDetail('plan')">农事规划</div>
-                    </div>
-                </template> -->
-            </farm-info-card>
-            <tabs v-model:active="activeTab" class="custom-tabs" scrollspy sticky offset-top="40" background="#F2F3F5">
-                <tab title="农情档案" class="tab-item">
-                    <common-box title="农情档案">
-                        <template #right>
-                            <span @click="handleDetail('crop_record')">查看详情</span>
-                        </template>
-                        <template v-if="farmWorkData.length">
-                            <div class="farm-work-timeline">
-                                <div
-                                    class="farm-work-item"
-                                    v-for="(item, index) in farmWorkData"
-                                    :key="index"
-                                >
-                                    <div class="timeline-left">
-                                        <div class="timeline-dot"></div>
-                                        <div class="timeline-line"></div>
-                                    </div>
-                                    <div class="timeline-right">
-                                        <div class="farm-work-card" :class="['card-' + getRecordTypeText(item.speakTitleName), , {'is-future': item.isFuture}]">
-                                            <div class="type-box">{{ item.speakTitleName }}</div>
-                                            <div class="farm-work-date" v-html="item.content.renderedContent"></div>
-                                            <!-- <div class="farm-work-desc">
-                                                <span class="farm-work-action">{{ item.action }}</span>
-                                                <span class="farm-work-content">{{ item.content }}</span>
-                                                <span>{{ item.text }}</span>
-                                            </div> -->
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </template>
-                        <empty
-                            v-else
-                            image="https://birdseye-img.sysuimars.com/birdseye-look-mini/custom-empty-image.png"
-                            image-size="80"
-                            description="暂无数据"
-                            class="empty-state"
-                        />
-                    </common-box>
-                </tab>
-                <tab title="农事服务" class="tab-item">
-                    <common-box title="农事服务">
-                        <template #right>
-                            <span @click="handleDetail('service_list')">查看详情</span>
-                        </template>
-                        <tab-list
-                            type="light"
-                            v-model="farmServiceActiveTab"
-                            :tabs="farmServiceTabs"
-                            @change="handleFarmServiceTabChange"
-                        />
-                        <stats-box :stats-data="serviceStatsData" />
-                        <div v-for="(section, index) in detailList" :key="index" class="content-section">
-                            <record-item
-                                :record-item-data="section"
-                                onlyRecipeName
-                                :content-mode="farmServiceActiveTab === 0 ? 'serviceDetail' : ''"
-                                title-mode="default"
-                                :title-right-text="farmServiceActiveTab === 0 ? '生成成果报告' : ''"
-                                :title-right-type="farmServiceActiveTab === 1 ? 'dot' : null"
-                                :title-right-dot-text="farmServiceActiveTab === 1 ? '全区' : ''"
-                                class="recipe-item"
-                                @titleRightClick="handleTitleRightClick"
-                            />
-                        </div>
-                        <empty
-                            v-if="detailList.length === 0"
-                            image="https://birdseye-img.sysuimars.com/birdseye-look-mini/custom-empty-image.png"
-                            image-size="80"
-                            description="暂无数据"
-                            class="empty-state"
-                        />
-                    </common-box>
-                </tab>
-                <tab title="作物相册" class="tab-item">
-                    <common-box title="作物相册">
-                        <template #right>
-                            <span @click="handleShareReport()">查看更多</span>
-                        </template>
-                        <div class="photo-img-wrap" v-loading="imgsLoading">
-                            <photo-provider :photo-closable="true">
-                                <photo-consumer
-                                    v-for="(src, index) in cropAlbum"
-                                    intro="执行照片"
-                                    :key="index"
-                                    :src="base_img_url2 + src.filename"
-                                >
-                                    <div class="photo-img">
-                                        <img :src="base_img_url2 + src.filename + resize_300" />
-                                    </div>
-                                </photo-consumer>
-                            </photo-provider>
-                        </div>
-                    </common-box>
-                </tab>
-            </tabs>
-        </div>
-        <div class="custom-bottom-fixed-btns center-btn">
-            <div class="bottom-btn primary-btn" @click="handleShareFarm">分享认领农场</div>
-            <!-- <div class="bottom-btn primary-btn" @click="handleChatFarm">在线沟通</div> -->
-        </div>
-    </div>
-    <fn-share-sheet v-model:show="showShare" @select="onSelect" :options="[{ name: '微信', icon: 'wechat' }]" />
-    <!-- 农场信息 -->
-    <farm-info-popup
-        ref="farmInfoRef"
-        :farmId="farmIdVal"
-        :showEditBtn="!farmDetail.farmersMiniUserId"
-        :showBtn="true"
-    ></farm-info-popup>
-</template>
-
-<script setup>
-import { ref, onMounted } from "vue";
-import { useRoute, useRouter } from "vue-router";
-import { Tab, Tabs, Empty } from "vant";
-import { base_img_url2, resize_300 } from "@/api/config";
-import wx from "weixin-js-sdk";
-import customHeader from "@/components/customHeader.vue";
-import FarmInfoCard from "@/components/pageComponents/FarmInfoCard.vue";
-import tabList from "@/components/pageComponents/TabList.vue";
-import commonBox from "@/components/pageComponents/CommonBox.vue";
-import StatsBox from "@/components/pageComponents/StatsBox.vue";
-import recordItem from "@/components/recordItem.vue";
-import farmInfoPopup from "../home/components/farmInfoPopup.vue";
-import FnShareSheet from "@/components/pageComponents/FnShareSheet.vue";
-import config from "@/api/config";
-import { ElMessage } from "element-plus";
-const router = useRouter();
-const route = useRoute();
-const activeTab = ref(0);
-const farmServiceTabs = ["过往服务", "未来服务"];
-const farmServiceActiveTab = ref(0);
-
-const farmInfoRef = ref(null);
-const handleFarmInfo = () => {
-    farmInfoRef.value.handleShow();
-};
-
-const handleFarmServiceTabChange = (index) => {
-    if (index === 0) {
-        getFarmPastServiceCost();
-        getDetailList();
-    } else {
-        getFutureFarmWorkWarning()
-    }
-};
-
-const getFutureFarmWorkWarning = async () => {
-    const {data} = await VE_API.home.listFutureFarmWorkWarning({ farmId: farmIdVal.value });
-    let totalCost = 0;
-    if (data.length > 0) {
-        totalCost = data.reduce((acc, item) => acc + item.estimatedCost, 0);
-        detailList.value = data.slice(0, 1);
-    }
-    serviceStatsData.value = [
-        { value: totalCost || 0, unit: "元", desc: "预计成交额" },
-        { value: data.length || 0, unit: "次", desc: "预计服务次数" },
-    ];
-};
-
-const serviceStatsData = ref([]);
-
-onMounted(() => {
-    farmIdVal.value = route.query.farmId;
-    paramsPage.value = {
-        farmId: farmIdVal.value,
-        limit: 1,
-        page: 1,
-    };
-    getFarmDetail();
-    getFarmWorkList();
-    getDetailList();
-    getFarmPastServiceCost();
-
-    // 获取图片数据
-    getFarmPhoto();
-});
-
-const farmIdVal = ref(null);
-const farmDetail = ref({});
-const paramsPage = ref({});
-const getFarmDetail = () => {
-    VE_API.user.getFarmDetail({ farmId: farmIdVal.value }).then(({ data }) => {
-        farmDetail.value = data || {};
-    });
-};
-
-const farmWorkData = ref([]);
-const typeObj = {
-    物候: '1',
-    异常: '2',
-    病虫: '3',
-    农事: '4',
-}
-
-const getRecordTypeText = (recordType) => {
-    return typeObj[recordType];
-}
-const getFarmWorkList = () => {
-    VE_API.container_phenology.getFarmSpeakInfo({ farmId: farmIdVal.value }).then(({ data }) => {
-        const list = data || [];
-        const res = list.filter(item => item.content.hasException !== 0);
-        getPhenologyBroadcast();
-        // 只展示前三条数据
-        farmWorkData.value = res.slice(0, 3);
-    });
-};
-
-const getPhenologyBroadcast = () => {
-    VE_API.container_phenology.phenologyBroadcast({ farmId: farmIdVal.value }).then(({ data }) => {
-        farmWorkData.value.push({
-            speakTitleName: "物候",
-            isFuture: true,
-            content: {
-                renderedContent: data.content,
-            },
-        });
-    });
-};
-
-const cropAlbum = ref([]);
-const imgsLoading = ref(false);
-// 获取作物相册的三张照片(参考 patrolPhoto 的获取逻辑)
-const getFarmPhoto = async () => {
-    if (!farmIdVal.value) return;
-    imgsLoading.value = true;
-    try {
-        // 先获取有图片的日期列表
-        const dateParams = {
-            farmId: farmIdVal.value,
-            pageIndex: 0,
-            limit: 10,
-        };
-        const { data: dateData } = await VE_API.farm.findHasImagesDate(dateParams);
-        const dateList = Array.isArray(dateData) ? dateData : [];
-        if (!dateList.length) {
-            cropAlbum.value = [];
-            return;
-        }
-
-        const result = [];
-        let dateIndex = 0;
-
-        // 按日期依次取图片,直到凑够 3 张或没有更多日期
-        while (result.length < 3 && dateIndex < dateList.length) {
-            const currentDate = dateList[dateIndex];
-            const imgParams = {
-                farmId: farmIdVal.value,
-                date: currentDate,
-            };
-            const { data } = await VE_API.farm.getImageInfo(imgParams);
-            const images = (data && Array.isArray(data.images)) ? data.images : [];
-
-            images.forEach((item) => {
-                if (result.length < 3) {
-                    // 统一存成 filename 字段,供模板使用
-                    result.push({
-                        ...item,
-                        filename: item.resFilename || item.filename,
-                    });
-                }
-            });
-
-            dateIndex += 1;
-        }
-
-        cropAlbum.value = result;
-    } catch (e) {
-        console.error("获取农场相册失败", e);
-        cropAlbum.value = [];
-    } finally {
-        imgsLoading.value = false;
-    }
-};
-
-const detailList = ref([]);
-const getDetailList = () => {
-    VE_API.user.farmServiceRecord({ farmId: farmIdVal.value }).then(({ data }) => {
-        if(data.length > 0) {
-            detailList.value = [data[0]];
-        } else {
-            detailList.value = [];
-        }
-    });
-};
-
-const getFarmPastServiceCost = () => {
-    VE_API.user.getFarmPastServiceCost({ farmId: farmIdVal.value }).then(({ data }) => {
-        serviceStatsData.value = [
-            { value: data?.totalCost, unit: "元", desc: "成交额" },
-            { value: data?.serviceCount, unit: "次", desc: "服务次数" },
-        ];
-    });
-};
-const handleDetail = (path) => {
-    router.push(`/${path}?farmId=${farmIdVal.value}&agriculturalStoreId=${route.query.agriculturalStoreId}`);
-};
-
-const handleShareReport = () => {
-    router.push({
-        path: "/farm_photo",
-        query: {
-            // miniJson: JSON.stringify({ farmId: farmIdVal.value }),
-            farmId: farmIdVal.value 
-        },
-    });
-};
-
-const showShare = ref(false);
-const handleShareFarm = () => {
-    showShare.value = true;
-};
-
-const handleChatFarm = () => {
-    if (route.query.receiveUserId != "null") {
-        router.push(`/chat_frame?userId=${route.query.receiveUserId}&farmId=${farmIdVal.value}`);
-    } else {
-        ElMessage.warning("尚未绑定用户,暂时无法沟通");
-    }
-};
-
-const onSelect = () => {
-    const query = {
-        agriculturalStoreId: route.query.agriculturalStoreId,
-        farmId: route.query.farmId,
-        containerId: farmDetail.value.containerId,
-        speciesName: farmDetail.value.speciesName,
-        // receiveUserId: route.query.receiveUserId,
-    };
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=shareFarm`,
-    });
-};
-
-const handleTitleRightClick = (section) => {
-    router.push({
-        path: "/achievement_report",
-        query: { miniJson: JSON.stringify({ id: section.id }) },
-    });
-};
-</script>
-
-<style scoped lang="scss">
-.farm-details-page {
-    width: 100%;
-    height: 100vh;
-    background: #F2F3F5;
-    .center-btn {
-        justify-content: center;
-    }
-    .farm-details-content {
-        box-sizing: border-box;
-        padding: 10px 12px;
-        overflow: auto;
-        height: calc(100% - 40px - 60px);
-        box-sizing: border-box;
-        .custom-tabs {
-            ::v-deep {
-                .van-tabs__wrap {
-                    height: auto;
-                }
-                .van-tabs__nav {
-                    .van-tab {
-                        color: #8b8b8b;
-                        background: #F7F8FA;
-                        height: 34px;
-                        font-weight: 400;
-                        border-radius: 25px;
-                        width: fit-content;
-                        flex: none;
-                        padding: 0 12px;
-                        margin-right: 8px;
-                    }
-                    .van-tab--active {
-                        color: #fff;
-                        background: #2199f8;
-                        font-weight: 400;
-                    }
-                }
-
-                .van-tabs__line {
-                    display: none;
-                }
-                .van-tabs__nav--line {
-                    padding: 12px 0;
-                }
-            }
-            .tab-item + .tab-item {
-                margin-top: 12px;
-            }
-
-            .photo-img-wrap {
-                display: flex;
-                flex-wrap: wrap;
-                gap: 10px;
-                ::v-deep {
-                    .PhotoConsumer {
-                        width: 31%;
-                        height: 92px;
-                    }
-                }
-                .photo-img {
-                    width: 100%;
-                    height: 100%;
-                    position: relative;
-                    box-sizing: border-box;
-                    border: 2px solid transparent;
-                    border-radius: 8px;
-                    overflow: hidden;
-                    img {
-                        width: 100%;
-                        height: 100%;
-                        border-radius: 8px;
-                        object-fit: cover;
-                    }
-                }
-            }
-        }
-        .question-header {
-            display: flex;
-            align-items: center;
-            margin-bottom: 6px;
-            gap: 8px;
-            font-weight: 500;
-            .question-icon {
-                width: 22px;
-                height: 20px;
-            }
-        }
-        .answer-content {
-            color: #333333;
-            margin: 6px 0 10px 0;
-        }
-        .answer-img {
-            display: flex;
-            gap: 5px;
-            img {
-                flex: 1;
-                max-width: 105px;
-                height: 105px;
-                border-radius: 5px;
-                object-fit: cover;
-            }
-        }
-        .content-section {
-            .recipe-item {
-                border: 1px solid rgba(0, 0, 0, 0.1);
-                margin: 12px 0 0 0;
-            }
-        }
-        .plan-tab-item {
-            .recipe-item {
-                padding: 0;
-            }
-        }
-        .plan-list-wrapper {
-            height: 500px;
-            margin-top: 12px;
-        }
-        .report-content {
-            font-size: 13px;
-        }
-        .answer-btn {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            margin-top: 10px;
-            > div {
-                display: flex;
-                gap: 10px;
-            }
-        }
-        .answer-btn-item {
-            padding: 7px 12px;
-            border-radius: 25px;
-            font-size: 12px;
-            text-align: center;
-            background: rgba(33, 153, 248, 0.1);
-            color: #2199f8;
-            min-width: 52px;
-            box-sizing: border-box;
-            &.primary {
-                background: #2199f8;
-                color: #ffffff;
-            }
-        }
-        .empty-state {
-            ::v-deep .van-empty {
-                padding: 40px 0;
-            }
-        }
-        .footer-data {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            gap: 12px;
-            margin-top: 12px;
-            .footer-l {
-                display: flex;
-                gap: 8px;
-                flex: 1;
-                .farm-info-footer-item {
-                    display: flex;
-                    border: 0.4px solid rgba(215, 215, 215, 0.5);
-                    padding: 8px 5px 5px;
-                    box-sizing: border-box;
-                    .farm-info-footer-item-label {
-                        font-size: 12px;
-                        color: rgba(32, 32, 32, 0.4);
-                        margin-bottom: 4px;
-                    }
-                    .farm-info-footer-item-value {
-                        font-size: 16px;
-                        color: #202020;
-                        padding-left: 2px;
-                        .unit {
-                            font-size: 12px;
-                            padding-left: 2px;
-                            color: rgba(32, 32, 32, 0.4);
-                        }
-                    }
-                }
-            }
-            .footer-action {
-                border: 0.5px solid #888B8D;
-                border-radius: 20px;
-                padding: 5px 12px;
-                font-size: 12px;
-                color: #888B8D;
-                white-space: nowrap;
-                cursor: pointer;
-                flex-shrink: 0;
-            }
-        }
-        .farm-work-timeline {
-            padding: 10px 0;
-            .farm-work-item {
-                display: flex;
-                align-items: flex-start;
-                position: relative;
-                &:not(:last-child) {
-                    margin-bottom: 20px;
-                }
-                .timeline-left {
-                    display: flex;
-                    flex-direction: column;
-                    align-items: center;
-                    margin-right: 12px;
-                    position: relative;
-                    .timeline-dot {
-                        width: 6px;
-                        height: 6px;
-                        border-radius: 50%;
-                        border: 1px solid #2199f8;
-                        flex-shrink: 0;
-                        z-index: 1;
-                    }
-                    .timeline-line {
-                        width: 1px;
-                        height: 48px;
-                        background: #e5e6eb;
-                        position: absolute;
-                        top: 8px;
-                    }
-                }
-                .timeline-right {
-                    flex: 1;
-                    .farm-work-card {
-                        border: 1px solid #8bccff;
-                        border-radius: 4px;
-                        background: #f8fcff;
-                        padding: 12px;
-                        display: flex;
-                        align-items: center;
-                        color: #1d2129;
-                        font-size: 14px;
-                        line-height: 22px;
-                        display: flex;
-                        align-items: center;
-                        &.card-1 {
-                            border: 1px solid #8BCCFF;
-                            .type-box {
-                                background: #2199F8;
-                            }
-                            .farm-work-content {
-                                color: #2199F8;
-                            }
-                        }
-                        &.card-4 {
-                            border: 1px solid #FFBB83;
-                            .type-box {
-                                background: #FF953D;
-                            }
-                            .farm-work-content {
-                                color: #FF953D;
-                            }
-                        }
-                        &.card-2, &.card-3 {
-                            border: 1px solid #FF9C9C;
-                            .type-box {
-                                background: #FD7676;
-                            }
-                            .farm-work-content {
-                                color: #FD7676;
-                            }
-                        }
-                        &.is-future {
-                            padding: 0 12px;
-                            // opacity: 0.5;
-                            background: rgba(246, 250, 255, 0.5);
-                            .type-box {
-                                background: rgba(33, 153, 248, 0.5);
-                            }
-                            .farm-work-content {
-                                color: rgba(29, 33, 41, 0.5);
-                            }
-                        }
-                        .type-box {
-                            margin-right: 12px;
-                            padding: 0 5px;
-                            height: 20px;
-                            line-height: 20px;
-                            font-size: 12px;
-                            flex: none;
-                            color: #fff;
-                            border-radius: 0 4px 0 4px;
-                        }
-                        .farm-work-date {
-                            padding-right: 4px;
-                        }
-                        .farm-work-desc {
-                            .farm-work-action {
-                                padding-right: 4px;
-                            }
-                            .farm-work-content {
-                                padding-right: 4px;
-                            }
-                        }
-                    }
-                }
-                &.is-estimated {
-                    .timeline-right {
-                        .farm-work-card {
-                            background: rgba(246, 250, 255, 0.5);
-                            border: 1px solid rgba(190, 218, 255, 0.5);
-                            .farm-work-date,
-                            .farm-work-desc {
-                                color: rgba(29, 33, 41, 0.5);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 448
src/views/old_mini/user/index.vue

@@ -1,448 +0,0 @@
-<template>
-    <div class="user-index" :style="{ height: `calc(100vh - ${tabBarHeight}px)` }">
-        <div class="user-header">
-            <!-- <el-input class="search" v-model="input" placeholder="搜索">
-                <template #prefix>
-                    <el-icon><search /></el-icon>
-                </template>
-            </el-input> -->
-            <div class="button" @click="handleAddClient">
-                <img src="@/assets/img/mine/firend-icon.png" alt="" />
-                新增客户
-            </div>
-        </div>
-        <div class="list">
-            <div class="map-container" ref="mapContainer"></div>
-
-            <collapse v-model="activeNames" class="collapse-list">
-                <collapse-item :name="index" v-for="(item, index) in dataList" :key="index" :is-link="false">
-                    <template #title>
-                        <el-icon class="icon"><CaretRight /></el-icon>
-                        {{ item.name }}
-                        <span class="span">{{ item.children?.length || 0 }}</span>
-                    </template>
-                    <!-- <template #value>
-                        <div @click.stop="hadnleManage(item)" class="text">管理</div>
-                    </template> -->
-                    <farm-info-card
-                        v-for="ele in item.children"
-                        :key="ele.agriculturalStoreId"
-                        class="list-item"
-                        :data="{
-                            ...ele,
-                            farmName: ele.name,
-                            userType: ele.userType || '--',
-                            variety: ele.speciesName,
-                            address: ele.address,
-                            noAction: true,
-                            maxWidth: '100%',
-                            customRight: 'tag-right',
-                        }"
-                        @click="handleItemClick(ele)"
-                    >
-                        <!-- <template #right>
-                            <el-popover title="" :popper-style="'min-width: 110px;'" :width="110" placement="left-start" trigger="click">
-                                <div class="tag-list">
-                                    <div class="tag-item">全托管</div>
-                                    <div class="tag-item">飞防托管</div>
-                                    <div class="tag-item">营养托管</div>
-                                    <div class="tag-item active">优质客户</div>
-                                </div>
-                                <template #reference>
-                                    <div class="title-tag add-tag">标记为</div>
-                                </template>
-                            </el-popover>
-                        </template> -->
-                        <template #footerData>
-                            <div class="footer-data">
-                                <div class="footer-l">
-                                    <div class="farm-info-footer-item">
-                                        <div class="farm-info-footer-item-label">农事服务</div>
-                                        <div class="farm-info-footer-item-value">{{ ele.serviceCost?.serviceCount || 0 }}<span class="unit">次</span></div>
-                                    </div>
-                                    <div class="farm-info-footer-item">
-                                        <div class="farm-info-footer-item-label">总收益</div>
-                                        <div class="farm-info-footer-item-value">{{ ele.serviceCost?.totalCost || 0 }}<span class="unit">元</span></div>
-                                    </div>
-                                </div>
-                                <div class="footer-action" @click.stop="handleDetail('plan', ele.id, ele.agriculturalStoreId, ele.schemeId)">农事规划</div>
-                            </div>
-                        </template>
-                    </farm-info-card>
-                </collapse-item>
-            </collapse>
-        </div>
-        <!-- <div class="footer">
-            <div class="btn" @click="showPopup">新建分组</div>
-        </div> -->
-    </div>
-    <!-- 添加分组弹窗 -->
-    <add-popup :show="showGroupPopup"></add-popup>
-    <fn-share-sheet class="share-sheet" v-model:show="showShare" @select="onSelect" :options="[{ name: '微信', icon: 'wechat' }]" />
-</template>
-
-<script setup>
-import { Collapse, CollapseItem } from "vant";
-import { ref, onMounted, computed, nextTick, onActivated } from "vue";
-import wx from "weixin-js-sdk";
-import { useRouter } from "vue-router";
-import addPopup from "./components/addPopup.vue";
-import FarmInfoCard from "@/components/pageComponents/FarmInfoCard.vue";
-import { useStore } from "vuex";
-import FnShareSheet from "@/components/pageComponents/FnShareSheet.vue";
-import IndexMap from "../farm_manage/map/index";
-
-const router = useRouter();
-const store = useStore();
-const tabBarHeight = computed(() => store.state.home.tabBarHeight);
-
-const indexMap = new IndexMap();
-const mapContainer = ref(null);
-
-onMounted(() => {
-    const point = store.state.home.miniUserLocationPoint;
-    nextTick(() => {
-        indexMap.initMap(point, mapContainer.value, true);
-    });
-});
-
-onActivated(() => {
-    // 确保地图已初始化,使用 nextTick 等待 DOM 更新
-    nextTick(() => {
-        // 检查地图实例是否已初始化,并且绑定到正确的容器
-        const isMapValid = indexMap.kmap && 
-                          indexMap.kmap.map && 
-                          mapContainer.value &&
-                          indexMap.kmap.map.getTargetElement() === mapContainer.value;
-        
-        if (!isMapValid) {
-            // 如果地图未初始化或绑定到错误的容器,重新初始化
-            if (mapContainer.value) {
-                const point = store.state.home.miniUserLocationPoint;
-                indexMap.initMap(point, mapContainer.value, true);
-                // 等待地图初始化完成后再加载数据
-                setTimeout(() => {
-                    getUserList();
-                }, 200);
-            } else {
-                getUserList();
-            }
-        } else {
-            // 如果地图已初始化且绑定正确,更新地图尺寸(解决页面切换后地图不显示的问题)
-            setTimeout(() => {
-                indexMap.kmap.map.updateSize();
-            }, 100);
-            // 地图已存在,直接加载数据(数据加载完成后会自动调用 initData 更新缩放)
-            getUserList();
-        }
-    });
-});
-
-const activeNames = ref([1]);
-const dataList = ref([
-    {
-        name: "Vip客户",
-        isGroup: 0,
-        children: [],
-    },
-    {
-        name: "农场客户",
-        isGroup: 1,
-        children: [],
-    },
-]);
-const getUserList = async () => {
-    const { data } = await VE_API.farm.userFarmSelectOption({ agriculturalQuery: true });
-    if (data.length) {
-        indexMap.initData(data, 'name','point');
-        // 清空现有的子项
-        dataList.value[0].children = [];
-        dataList.value[1].children = data || [];
-        
-        // 为每个数据项的ID请求getFarmPastServiceCost,并将返回的数据添加到每一项中
-        const promises = data.map(async (item) => {
-            const farmId = item.id || item.farmId;
-            if (farmId) {
-                try {
-                    const { data: serviceCostData } = await VE_API.user.getFarmPastServiceCost({ farmId });
-                    // 将返回的数据添加到当前项中
-                    return {
-                        ...item,
-                        serviceCost: serviceCostData || {},
-                    };
-                } catch (error) {
-                    console.error(`获取农场 ${farmId} 的服务成本失败:`, error);
-                    // 如果请求失败,返回原数据
-                    return {
-                        ...item,
-                        serviceCost: {},
-                    };
-                }
-            }
-            return item;
-        });
-        
-        // 等待所有请求完成
-        const updatedData = await Promise.all(promises);
-        // 更新数据列表
-        dataList.value[1].children = updatedData;
-    }
-};
-
-const getLatestBroadcast = () => {
-    VE_API.user.getLatestBroadcast({sourceTypes:[0,1]}).then(({ data }) => {
-        if (data && typeof data === 'object') {
-            // 遍历广播数据,key 是 farmId(字符串格式)
-            Object.keys(data).forEach(farmIdStr => {
-                const farmId = Number(farmIdStr);
-                const broadcasts = data[farmIdStr] || [];
-                
-                // 在农场列表中找到对应的农场
-                const farmItem = dataList.value[1].children.find(item => item.id === farmId || item.farmId === farmId);
-                
-                if (farmItem && broadcasts.length > 0) {
-                    // 将广播数据合并到农场项中
-                    farmItem.broadcasts = broadcasts;
-                }
-            });
-        }
-    });
-};
-
-const input = ref("");
-//新建分组
-const showGroupPopup = ref(false);
-const showPopup = () => {
-    showGroupPopup.value = !showGroupPopup.value;
-};
-
-// 新增客户
-const handleAddClient = () => {
-    router.push("/create_farm?type=client&from=user");
-};
-
-// 管理
-const hadnleManage = (value) => {
-    router.push(`/user_manage?name=${value.name}&total=${value.children.length}&isGroup=${value.isGroup}`);
-};
-
-const showShare = ref(false);
-const onSelect = () => {
-    const query = {
-        agriculturalStoreId: shareData.value.agriculturalStoreId,
-        farmId: shareData.value.id,
-        speciesName: shareData.value.speciesName,
-        containerId: shareData.value.containerId,
-    };
-    wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=shareFarm`,
-    });
-};
-
-const shareData = ref({});
-// 在线沟通
-const handleChat = (data) => {
-    if(data.receiveUserId){
-        router.push(`/chat_frame?userId=${data.receiveUserId}&farmId=${data.id}`);
-    }else{
-        showShare.value = true;
-        shareData.value = data;
-    }
-};
-
-// 处理列表项点击
-const handleItemClick = (data) => {
-    router.push(`/farm_details?farmId=${data.id}&agriculturalStoreId=${data.agriculturalStoreId}&receiveUserId=${data.receiveUserId}`);
-};
-
-const handleDetail = (path, farmId, agriculturalStoreId, schemeId) => {
-    router.push(`/${path}?farmId=${farmId}&agriculturalStoreId=${agriculturalStoreId}&schemeId=${schemeId}`);
-};
-</script>
-
-<style lang="scss" scoped>
-.user-index {
-    width: 100%;
-    height: 100vh;
-    box-sizing: border-box;
-    padding: 10px 12px;
-    background: #f5f7fb;
-    .user-header {
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        .search {
-            width: 90px;
-            margin-right: 10px;
-            --el-input-placeholder-color: rgba(0, 0, 0, 0.5);
-            ::v-deep {
-                .el-input__wrapper {
-                    box-shadow: none;
-                    border: 1px solid rgba(0, 0, 0, 0.5);
-                    background: transparent;
-                    border-radius: 20px;
-                }
-                .el-input__prefix,
-                .el-input__inner {
-                    color: #000;
-                }
-            }
-        }
-        .button {
-            width: 100%;
-            background: #fff;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            padding: 8px;
-            border-radius: 20px;
-            img {
-                width: 20px;
-                height: 17px;
-                margin-right: 6px;
-            }
-        }
-    }
-    .list {
-        width: 100%;
-        margin-top: 12px;
-        height: calc(100% - 36px);
-        overflow: auto;
-        padding-bottom: 12px;
-        box-sizing: border-box;
-        
-        .map-container {
-            width: 100%;
-            height: 162px;
-            clip-path: inset(0px round 8px);
-            margin-bottom: 10px;
-        }
-        .collapse-list {
-            // height: 100%;
-        }
-        .text {
-            color: #7c7c7c;
-        }
-        ::v-deep {
-            .van-collapse-item__content {
-                padding: 0;
-                background: #F5F7FB;
-            }
-            .van-cell {
-                border-radius: 5px 5px 0 0;
-                justify-content: space-between;
-                .van-cell__value {
-                    flex: none;
-                }
-                .van-cell__title {
-                    display: flex;
-                    align-items: center;
-                    .icon {
-                        margin-right: 3px;
-                        color: #bfbfbf;
-                        font-size: 16px;
-                    }
-                    .span {
-                        color: rgba(0, 0, 0, 0.4);
-                        margin-left: 10px;
-                    }
-                }
-            }
-            .van-collapse-item__title--expanded {
-                .van-cell__title {
-                    .icon {
-                        transform: rotate(90deg);
-                    }
-                }
-            }
-            .van-collapse-item + .van-collapse-item {
-                margin-top: 12px;
-            }
-        }
-        .list-item {
-            margin-top: 10px;
-        }
-
-        .add-tag {
-            font-size: 12px;
-            color: #2199f8;
-            line-height: 24px;
-        }
-        
-        .footer-data {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            gap: 12px;
-            margin-top: 12px;
-            .footer-l {
-                display: flex;
-                gap: 8px;
-                flex: 1;
-                .farm-info-footer-item {
-                    display: flex;
-                    align-items: baseline;
-                    border: 0.4px solid rgba(215, 215, 215, 0.5);
-                    padding: 8px 5px 5px;
-                    box-sizing: border-box;
-                    .farm-info-footer-item-label {
-                        font-size: 12px;
-                        color: rgba(32, 32, 32, 0.4);
-                        margin-bottom: 4px;
-                    }
-                    .farm-info-footer-item-value {
-                        font-size: 16px;
-                        color: #202020;
-                        padding-left: 2px;
-                        .unit {
-                            font-size: 12px;
-                            padding-left: 2px;
-                            color: rgba(32, 32, 32, 0.4);
-                        }
-                    }
-                }
-            }
-            .footer-action {
-                border: 0.5px solid #888B8D;
-                border-radius: 20px;
-                padding: 5px 12px;
-                font-size: 12px;
-                color: #888B8D;
-                white-space: nowrap;
-                cursor: pointer;
-                flex-shrink: 0;
-            }
-        }
-    }
-    .footer {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        margin-top: 12px;
-        .btn {
-            font-size: 12px;
-            color: #7f7f7f;
-            padding: 5px 45px;
-            background: rgba(201, 201, 201, 0.27);
-            border-radius: 20px;
-        }
-    }
-}
-
-
-.tag-list {
-    font-size: 14px;
-    .tag-item + .tag-item {
-        margin-top: 6px;
-    }
-    .tag-item {
-        padding: 2px 8px;
-        text-align: center;
-        &.active {
-            color: #2199f8;
-            background: rgba(33, 153, 248, 0.16);
-            border-radius: 4px;
-        }
-    }
-}
-</style>

+ 0 - 300
src/views/old_mini/user/manage.vue

@@ -1,300 +0,0 @@
-<template>
-    <div class="container">
-        <custom-header :name="headerName" :isClose="isClose" :showClose="isClose" @close="handleClose"></custom-header>
-        <div class="content" v-if="total!=='0'">
-            <el-input class="search" v-model="input" placeholder="搜索">
-                <template #prefix>
-                    <el-icon class="el-input__icon"><search /></el-icon>
-                </template>
-            </el-input>
-            <div class="list">
-                <div class="list-item" v-for="(item, index) in list" :key="index">
-                    <checkbox @change="changeCheck" v-show="setingShow" v-model="item.checked"></checkbox>
-                    <div class="item-flex">
-                        <img class="photo" :src="item.icon || 'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'" alt="" />
-                        <div class="item-text">
-                            <div class="name">{{ item.name }}</div>
-                            <div>电话:19875236548</div>
-                            <div>地址:湖北省武汉市富里唱鑫园5023</div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div v-else class="no-data">
-            <span>当前列表无好友</span>
-            <div class="button-row">
-                <div class="del">删除分组</div>
-                <div>添加好友</div>
-            </div>
-        </div>
-        <div class="footer" v-show="total!=='0'">
-            <span @click="handleSeting('新增分组')" v-show="!setingShow && isGroup === '1'">批量设置</span>
-            <div v-show="!setingShow && isGroup!=='1'" class="btn-group">
-                <div class="delete" @click="handleDelete">删除分组</div>
-                <div class="btn-txt">
-                    <span @click="handleSeting('添加')" class="add">添加</span>
-                    <span @click="handleSeting('移出')">移出</span>
-                </div>
-            </div>
-            <div v-show="setingShow" class="footer-flex">
-                <div class="text-group">
-                    <div class="icon" v-show="filterList.length">
-                        <el-icon><ArrowUpBold /></el-icon>
-                    </div>
-                    <div class="text-item" v-for="(item, index) in filterList" :key="index">
-                        {{ item.name }}
-                        <span v-show="filterList.length - 1 !== index">/</span>
-                    </div>
-                </div>
-                <div class="button" @click="handleAdd">{{btnText}}({{ filterList.length }})</div>
-            </div>
-        </div>
-    </div>
-    <!-- 新增分组弹窗 -->
-    <add-popup :show="showPopup" @confirm="handleAddConfirm"></add-popup>
-    <!-- 删除弹窗 -->
-    <action-sheet class="action-sheet" v-model:show="showAction" :actions="actions" cancel-text="取消" @select="onSelect">
-        <template #description>
-            <span class="desc">该分组下还有好友存在,删除后好友会放在 未分组的好友列表里</span>
-        </template>
-    </action-sheet>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import addPopup from "./components/addPopup.vue";
-import { onActivated, onMounted, ref } from "vue";
-import { useRoute } from "vue-router";
-import { Checkbox } from "vant";
-import { ElMessage } from "element-plus";
-import { ActionSheet } from 'vant';
-const route = useRoute();
-
-const input = ref("");
-const list = ref([
-    {
-        name: "123",
-        checked: false,
-    },
-    {
-        name: "456",
-        checked: false,
-    },
-]);
-
-const showPopup = ref(false);
-//新增分组
-const handleAdd = () => {
-    if (filterList.value.length) {
-        showPopup.value = !showPopup.value;
-    } else {
-        ElMessage.warning("请选择好友");
-    }
-};
-
-const handleAddConfirm = (name) => {
-    const selectedList = list.value.filter((item) => item.checked).map((item) => item.name);
-    console.log("name", name, selectedList);
-}
-
-const isClose = ref(false);
-const handleClose = () => {
-    isClose.value = false;
-    setingShow.value = false;
-    list.value = list.value.map((item) => {
-        item.checked = false;
-        return item;
-    });
-}
-
-//批量设置
-const setingShow = ref(false);
-const btnText = ref('')
-const handleSeting = (str) => {
-    btnText.value = str
-    setingShow.value = true;
-    isClose.value = true;
-};
-
-//删除
-const showAction = ref(false)
-const actions = [{ name: '删除' ,color: '#F73C3C'},]
-const handleDelete = () =>{
-    showAction.value = true
-}
-const onSelect = (item) =>{
-    showAction.value = false
-}
-
-const filterList = ref([]);
-const changeCheck = () => {
-    filterList.value = list.value.filter((item) => item.checked);
-};
-
-const headerName = ref("");
-const isGroup = ref(null);
-const total = ref(0)
-onMounted(() => {
-    headerName.value = `${route.query.name}(${route.query.total})`;
-    total.value = route.query.total;
-    isGroup.value = route.query.isGroup;
-    // setingShow.value = false
-    // filterList.value = []
-});
-</script>
-
-<style lang="scss" scoped>
-.container {
-    width: 100%;
-    height: 100vh;
-    background: #f5f7fb;
-    .content {
-        width: 100%;
-        height: 100%;
-        position: relative;
-        padding: 20px 12px;
-        box-sizing: border-box;
-        .search {
-            width: 100%;
-            ::v-deep {
-                &.el-input {
-                    --el-input-placeholder-color: #000;
-                }
-                .el-input__prefix {
-                    color: #000;
-                }
-                .el-input__wrapper {
-                    box-shadow: none;
-                    border-radius: 20px;
-                    border: 1px solid rgba(0, 0, 0, 0.25);
-                }
-            }
-        }
-        .list {
-            .list-item {
-                padding: 12px 10px;
-                border-radius: 8px;
-                background: #fff;
-                display: flex;
-                align-items: center;
-                margin-top: 12px;
-                .item-flex {
-                    display: flex;
-                    align-items: center;
-                }
-                .item-flex {
-                    display: flex;
-                    align-items: center;
-                    margin-left: 10px;
-                }
-                .photo {
-                    width: 62px;
-                    height: 62px;
-                    border-radius: 8px;
-                    margin-right: 12px;
-                }
-                .item-text {
-                    color: #999999;
-                    font-size: 12px;
-                    line-height: 1.6;
-                    .name {
-                        font-size: 15px;
-                        color: #000;
-                        font-weight: 500;
-                    }
-                }
-            }
-        }
-    }
-     .no-data{
-        width: 100%;
-        height: 100%;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        flex-direction: column;
-        span{
-            font-size: 16px;
-            color: rgba(0, 0, 0, 0.49);
-        }
-        .button-row{
-            margin-top: 12px;
-            display: flex;
-            div{
-                padding: 7px 24px;
-                color: rgba(0, 0, 0, 0.49);
-                border-radius: 5px;
-                background: #fff;
-            }
-            .del{
-                color: #F27777;
-                margin-right: 10px;
-                background: rgba(242, 119, 119, 0.12);
-            }
-        }
-    }
-    .footer {
-        position: fixed;
-        bottom: 0;
-        background: #fff;
-        width: 100%;
-        padding: 12px;
-        box-sizing: border-box;
-        text-align: center;
-        color: #262626;
-        .btn-group{
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            .delete{
-                color: #F27777;
-                padding: 5px 12px;
-                border-radius: 20px;
-                background: rgba(242, 119, 119, 0.12);
-            }
-            .btn-txt{
-                span{
-                   padding: 5px 12px;
-                }
-                .add{
-                    color: #8F8F8F;
-                    margin-right: 5px;
-                }
-            }
-        }
-        .footer-flex {
-            display: flex;
-            justify-content: space-between;
-            .text-group {
-                display: flex;
-                align-items: center;
-                color: #2199F8;
-                .icon {
-                    width: 18px;
-                    height: 18px;
-                    background: #2199F8;
-                    border-radius: 50%;
-                    color: #fff;
-                    line-height: 22px;
-                    font-size: 13px;
-                    margin-right: 5px;
-                }
-            }
-            .button {
-                color: #fff;
-                padding: 5px 12px;
-                font-size: 12px;
-                border-radius: 2px;
-                background: #2199F8;
-            }
-        }
-    }
-}
-
-.action-sheet{
-    .desc{
-        font-size: 12px;
-    }
-}
-</style>

+ 0 - 197
src/views/old_mini/user/subPages/cropRecord.vue

@@ -1,197 +0,0 @@
-<template>
-    <div class="crop-record-page">
-        <custom-header name="农情档案"></custom-header>
-        <div class="farm-work-timeline">
-            <div class="farm-work-item" v-for="(item, index) in farmWorkData" :key="index">
-                <div class="timeline-left">
-                    <div class="timeline-dot"></div>
-                    <div class="timeline-line"></div>
-                </div>
-                <div class="timeline-right">
-                    <div class="farm-work-card" :class="['card-' + getRecordTypeText(item.speakTitleName), {'is-future': item.isFuture}]">
-                        <div class="type-box">{{ item.speakTitleName }}</div>
-                        <div class="farm-work-date" v-html="item.content.renderedContent"></div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import CustomHeader from "@/components/customHeader.vue";
-import { ref, onMounted } from "vue";
-import { useRoute } from "vue-router";
-
-const route = useRoute();
-const cropRecordList = ref([]);
-
-onMounted(() => {
-    getFarmWorkList();
-});
-
-const farmWorkData = ref([]);
-const typeObj = {
-    物候: "1",
-    异常: "2",
-    病虫: "3",
-    农事: "4",
-};
-
-const getRecordTypeText = (recordType) => {
-    return typeObj[recordType];
-};
-const getFarmWorkList = () => {
-    VE_API.container_phenology.getFarmSpeakInfo({ farmId: route.query.farmId }).then(({ data }) => {
-        const res = data.filter((item) => item.content.hasException !== 0);
-        farmWorkData.value = res || [];
-        getPhenologyBroadcast();
-    });
-};
-
-const getPhenologyBroadcast = () => {
-    VE_API.container_phenology.phenologyBroadcast({ farmId: 93954 }).then(({ data }) => {
-        farmWorkData.value.push({
-            speakTitleName: "物候",
-            isFuture: true,
-            content: {
-                renderedContent: data.content,
-            },
-        });
-    });
-};
-</script>
-
-<style lang="scss" scoped>
-.crop-record-page {
-    width: 100%;
-    min-height: 100vh;
-    background: #f5f7fb;
-
-    .farm-work-timeline {
-        padding: 12px;
-        height: calc(100% - 40px);
-        .farm-work-item {
-            display: flex;
-            align-items: flex-start;
-            position: relative;
-            &:not(:last-child) {
-                margin-bottom: 20px;
-            }
-            .timeline-left {
-                display: flex;
-                flex-direction: column;
-                align-items: center;
-                margin-right: 12px;
-                position: relative;
-                .timeline-dot {
-                    width: 6px;
-                    height: 6px;
-                    border-radius: 50%;
-                    border: 1px solid #2199f8;
-                    flex-shrink: 0;
-                    z-index: 1;
-                }
-                .timeline-line {
-                    width: 1px;
-                    height: 48px;
-                    background: #e5e6eb;
-                    position: absolute;
-                    top: 8px;
-                }
-            }
-            .timeline-right {
-                flex: 1;
-                .farm-work-card {
-                    border: 1px solid #8bccff;
-                    border-radius: 4px;
-                    background: #f8fcff;
-                    padding: 12px;
-                    display: flex;
-                    align-items: center;
-                    color: #1d2129;
-                    font-size: 14px;
-                    line-height: 22px;
-                    display: flex;
-                    align-items: center;
-                    &.card-1 {
-                        border: 1px solid #8bccff;
-                        .type-box {
-                            background: #2199f8;
-                        }
-                        .farm-work-content {
-                            color: #2199f8;
-                        }
-                    }
-                    &.card-4 {
-                        border: 1px solid #ffbb83;
-                        .type-box {
-                            background: #ff953d;
-                        }
-                        .farm-work-content {
-                            color: #ff953d;
-                        }
-                    }
-                    &.card-2,
-                    &.card-3 {
-                        border: 1px solid #ff9c9c;
-                        .type-box {
-                            background: #fd7676;
-                        }
-                        .farm-work-content {
-                            color: #fd7676;
-                        }
-                    }
-                    &.is-future {
-                        padding: 0 12px;
-                        // opacity: 0.5;
-                        background: rgba(246, 250, 255, 0.5);
-                        .type-box {
-                            background: rgba(33, 153, 248, 0.5);
-                        }
-                        .farm-work-content {
-                            color: rgba(29, 33, 41, 0.5);
-                        }
-                    }
-                    .type-box {
-                        margin-right: 12px;
-                        padding: 0 5px;
-                        height: 20px;
-                        line-height: 20px;
-                        flex: none;
-                        font-size: 12px;
-                        color: #fff;
-                        border-radius: 0 4px 0 4px;
-                    }
-                    .farm-work-date {
-                        padding-right: 4px;
-                        &.is-future {
-                            // color: rgba(29, 33, 41, 0.5);
-                        }
-                    }
-                    .farm-work-desc {
-                        .farm-work-action {
-                            padding-right: 4px;
-                        }
-                        .farm-work-content {
-                            padding-right: 4px;
-                        }
-                    }
-                }
-            }
-            &.is-estimated {
-                .timeline-right {
-                    .farm-work-card {
-                        background: rgba(246, 250, 255, 0.5);
-                        border: 1px solid rgba(190, 218, 255, 0.5);
-                        .farm-work-date,
-                        .farm-work-desc {
-                            color: rgba(29, 33, 41, 0.5);
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 124
src/views/old_mini/user/subPages/farmList.vue

@@ -1,124 +0,0 @@
-<template>
-    <div class="farm-page">
-        <custom-header name="农情互动"></custom-header>
-        <div class="farm-list">
-            <div class="list-item" v-for="item in farmList" :key="item.id">
-                <div class="question-header">
-                    <img class="question-icon" src="@/assets/img/home/ask-icon.png" alt="" />
-                    <div class="question-title">{{ item.quest }}</div>
-                </div>
-                <template v-if="item.images.length">
-                    <div class="answer-content">
-                        答:{{ item.agriDate }} {{ item.answerLabel }}出现{{ item.indicatorName }}
-                    </div>
-                    <div class="answer-img" >
-                        <img v-for="image in item.images" :key="image" :src="config.base_img_url2 + image.cloudFilename" alt="" />
-                    </div>
-                </template>
-                <div v-else class="answer-btn">
-                    <div class="answer-btn-item">转发给客户</div>
-                    <div class="answer-btn-item-group">
-                        <div class="answer-btn-item">否</div>
-                        <div class="answer-btn-item primary">是</div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted } from "vue";
-import customHeader from "@/components/customHeader.vue";
-import { useRoute } from "vue-router";
-import config from "@/api/config";
-
-const route = useRoute();
-onMounted(() => {
-    getFarmWorkList();
-});
-
-const farmList = ref([]);
-const paramsPage = ref(1);
-const getFarmWorkList = () => {
-    const params = {
-        farmId: route.query.farmId,
-        limit: 99,
-        page: paramsPage.value,
-    }
-    VE_API.user.getFarmWorkList(params).then(({ data }) => {
-        farmList.value = data || [];
-    });
-};
-</script>
-
-<style scoped lang="scss">
-.farm-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f7f7f7;
-    .farm-list {
-        width: 100%;
-        height: 100%;
-        box-sizing: border-box;
-        padding: 12px;
-        overflow: auto;
-        .list-item {
-            background-color: #fff;
-            border-radius: 8px;
-            padding: 10px;
-            box-sizing: border-box;
-            .question-header {
-                display: flex;
-                align-items: center;
-                margin-bottom: 6px;
-                gap: 8px;
-                font-weight: 500;
-                .question-icon {
-                    width: 22px;
-                    height: 20px;
-                }
-            }
-            .answer-content {
-                color: #333333;
-                margin: 6px 0 10px 0;
-            }
-            .answer-img {
-                display: flex;
-                gap: 5px;
-                img {
-                    flex: 1;
-                    max-width: 105px;
-                    height: 105px;
-                    border-radius: 5px;
-                    object-fit: cover;
-                }
-            }
-            .answer-btn {
-                display: flex;
-                align-items: center;
-                justify-content: space-between;
-                margin-top: 10px;
-                > div {
-                    display: flex;
-                    gap: 10px;
-                }
-            }
-            .answer-btn-item {
-                padding: 7px 12px;
-                border-radius: 25px;
-                font-size: 12px;
-                text-align: center;
-                background: rgba(33, 153, 248, 0.1);
-                color: #2199f8;
-                min-width: 52px;
-                box-sizing: border-box;
-                &.primary {
-                    background: #2199f8;
-                    color: #ffffff;
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 145
src/views/old_mini/user/subPages/serviceList.vue

@@ -1,145 +0,0 @@
-<template>
-    <div class="service-list-page">
-        <custom-header name="农事服务"></custom-header>
-        <div class="service-content">
-            <tab-list
-                type="light"
-                v-model="farmServiceActiveTab"
-                :tabs="farmServiceTabs"
-                @change="handleFarmServiceTabChange"
-            />
-            <stats-box :stats-data="serviceStatsData" />
-            <div class="content-section">
-                <record-item
-                    v-for="(section, index) in detailList"
-                    :key="index"
-                    :record-item-data="section"
-                    onlyRecipeName
-                    :content-mode="farmServiceActiveTab === 0 ? 'serviceDetail' : ''"
-                    title-mode="default"
-                    :title-right-text="farmServiceActiveTab === 0 ? '生成成果报告' : ''"
-                    :title-right-type="farmServiceActiveTab === 1 ? 'dot' : null"
-                    :title-right-dot-text="farmServiceActiveTab === 1 ? '全区' : ''"
-                    class="recipe-item"
-                    @titleRightClick="handleTitleRightClick"
-                    @click="handleClick(section)"
-                />
-                <empty
-                    v-show="detailList.length === 0"
-                    image="https://birdseye-img.sysuimars.com/birdseye-look-mini/custom-empty-image.png"
-                    image-size="80"
-                    description="暂无数据"
-                />
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import tabList from "@/components/pageComponents/TabList.vue";
-import StatsBox from "@/components/pageComponents/StatsBox.vue";
-import recordItem from "@/components/recordItem.vue";
-import { Empty } from "vant";
-import { useRoute, useRouter } from "vue-router";
-import { ref, onMounted } from "vue";
-
-const route = useRoute();
-const farmIdVal = ref(null);
-const router = useRouter();
-onMounted(() => {
-    farmIdVal.value = route.query.farmId;
-    if(sessionStorage.getItem("activeSection")){
-        farmServiceActiveTab.value = Number(sessionStorage.getItem("activeSection"));
-        sessionStorage.removeItem("activeSection");
-    }
-    handleFarmServiceTabChange(farmServiceActiveTab.value);
-});
-
-const farmServiceTabs = ["过往服务", "未来服务"];
-const farmServiceActiveTab = ref(0);
-const serviceStatsData = ref([]);
-
-const handleFarmServiceTabChange = (index) => {
-    if (index === 0) {
-        getFarmPastServiceCost();
-        getDetailList();
-    } else {
-        getFutureFarmWorkWarning()
-    }
-};
-
-const getFutureFarmWorkWarning = async () => {
-    const {data} = await VE_API.home.listFutureFarmWorkWarning({ farmId: farmIdVal.value });
-    let totalCost = 0;
-    if (data.length > 0) {
-        totalCost = data.reduce((acc, item) => acc + item.estimatedCost, 0);
-    }
-    serviceStatsData.value = [
-        { value: totalCost || 0, unit: "元", desc: "预计成交额" },
-        { value: data.length || 0, unit: "次", desc: "预计服务次数" },
-    ];
-    detailList.value = data || [];
-};
-
-const detailList = ref([]);
-const getDetailList = () => {
-    VE_API.user.farmServiceRecord({ farmId: farmIdVal.value }).then(({ data }) => {
-        detailList.value = data || [];
-    });
-};
-
-const getFarmPastServiceCost = () => {
-    VE_API.user.getFarmPastServiceCost({ farmId: farmIdVal.value }).then(({ data }) => {
-        serviceStatsData.value = [
-            { value: data.totalCost, unit: "元", desc: "成交额" },
-            { value: data.serviceCount, unit: "次", desc: "服务次数" },
-        ];
-    });
-};
-
-const handleTitleRightClick = (section) => {
-    router.push({
-        path: "/achievement_report",
-        query: { miniJson: JSON.stringify({ id: section.id }) },
-    });
-};
-
-const handleClick = (section) => {
-    sessionStorage.setItem("activeSection", farmServiceActiveTab.value);
-    if(farmServiceActiveTab.value === 0){
-        router.push({
-            path: "/review_work",
-            query: { miniJson: JSON.stringify({ id: section.id }) },
-        });
-    } else {
-        router.push({
-            path: "/detail_work",
-            query: { miniJson: JSON.stringify({ id: section.farmWorkId,arrangeId: section.arrangeId,farmId: farmIdVal.value }) },
-        });
-    }
-};
-</script>
-
-<style scoped lang="scss">
-.service-list-page {
-    width: 100%;
-    height: 100vh;
-    background-color: #f7f7f7;
-    .service-content {
-        box-sizing: border-box;
-        padding: 12px;
-        .content-section {
-            overflow: auto;
-            height: calc(100vh - 95px - 70px);
-            .recipe-item {
-                border: 1px solid rgba(0, 0, 0, 0.1);
-                margin: 12px 0 0 0;
-            }
-            ::v-deep .van-empty {
-                padding: 40px 0;
-            }
-        }
-    }
-}
-</style>