Jelajahi Sumber

fix: 删除多余页面

lxf 2 hari lalu
induk
melakukan
72d51380b9

+ 7 - 51
src/router/globalRoutes.js

@@ -76,18 +76,6 @@ export default [
         name: "FarmPhoto",
         component: () => import("@/views/old_mini/home/patrolPhoto.vue"),
     },
-    // 聊天
-    {
-        path: "/chat_frame",
-        name: "ChatFrame",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/chat_frame/index.vue"),
-    },// 咨询专家
-    {
-        path: "/expert_list",
-        name: "ExpertList",
-        component: () => import("@/views/old_mini/home/subPages/expertList.vue"),
-    },
     // 我的农场
     {
         path: "/my_farm",
@@ -317,31 +305,12 @@ export default [
         name: "ServiceDetail",
         component: () => import("@/views/old_mini/mine/pages/serviceDetail.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",
-        name: "Modify",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/modify_work/modify.vue"),
-    },
     // 农场列表
     {
         path: "/farm_list",
@@ -361,20 +330,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/home/subPages/prescriptionPage.vue"),
     },
-    // 知识库
-    {
-        path: "/knowledge_list",
-        name: "KnowledgeList",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/home/subPages/knowledgeList.vue"),
-    },
-    // 成果报告
-    {
-        path: "/achievement_report",
-        name: "AchievementReport",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/achievement_report/index.vue"),
-    },
     // 长势报告
     {
         path: "/growth_report",
@@ -382,12 +337,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/growth_report/index.vue"),
     },
-    // 咨询专家
-    {
-        path: "/consult",
-        name: "Consult",
-        component: () => import("@/views/old_mini/chat_frame/consult.vue"),
-    },
     // 农事记录详情
     {
         path: "/status_detail",
@@ -437,4 +386,11 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/work_detail/index.vue"),
     },
+    // 农情互动
+    {
+        path: "/interaction",
+        name: "Interaction",
+        meta: { keepAlive: true },
+        component: () => import("@/views/old_mini/interaction/index.vue"),
+    },
 ];

+ 0 - 782
src/views/old_mini/achievement_report/index.vue

@@ -1,782 +0,0 @@
-<template>
-    <div class="achievement-report-page">
-        <custom-header name="生成成果报告"></custom-header>
-        <div class="report-content-wrap" v-loading="loading">
-            <div class="report-content" ref="reportDom">
-                <img src="@/assets/img/home/qrcode.png" alt="" class="code-icon" />
-                <div class="report-header">
-                    <img class="header-book" src="@/assets/img/home/book.png" alt="" />
-                    <div class="time-tag">{{ workItem?.executeDate }}</div>
-                    <div class="report-title">成果报告</div>
-                    <div class="report-info">
-                        <div class="info-item">
-                            <img class="info-icon" :src="workItem?.executorIcon || 'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'" alt="" />
-                            <span class="info-text">执行组织:{{ workItem?.executeMain }}</span>
-                        </div>
-                        <div class="info-item">
-                            <img class="info-icon" src="@/assets/img/home/farm.png" alt="" />
-                            <span class="info-text">服务农场:{{ workItem?.farmName }}</span>
-                        </div>
-                    </div>
-                </div>
-
-                <div class="report-box">
-                    <div class="report-box-item">
-                        <div class="item-content">{{ workItem?.farmWorkName || "--" }}</div>
-                        <div class="item-title">作业农事</div>
-                    </div>
-                    <div class="report-box-item">
-                        <div class="item-content">{{ formatArea(workItem?.area) || "--" }}</div>
-                        <div class="item-title">作业面积</div>
-                    </div>
-                    <div class="report-box-item">
-                        <div class="item-content">{{ reportData?.workCycle ? (reportData?.workCycle + '天') : "--" }}</div>
-                        <div class="item-title">作业周期</div>
-                    </div>
-                    <div class="report-box-item">
-                        <div class="item-content">{{ reportData?.deviceName || "--" }}</div>
-                        <div class="item-title">使用设备</div>
-                    </div>
-                </div>
-
-                <!-- <div class="report-box">
-                    <div class="box-title">精准施治,智慧护航</div>
-                    <div class="box-text">
-                        {{ reportData?.resultInfo || "--" }}
-                    </div>
-                </div> -->
-
-                <div class="report-excute" v-for="(item, index) in workItem?.executeEvidence" :key="index">
-                    <div class="tag-label">执行照片</div>
-                    <album-draw-box :key="paramsPage.id" :isShowNum="0" :imgData="workItem" :photo="item" :current="index" :index="index" :length="workItem?.executeEvidence?.length"></album-draw-box>
-                </div>
-                <div class="report-excute" v-for="(item, index) in workItem?.reviewImage" :key="index">
-                    <div class="tag-label">复核照片</div>
-                    <album-draw-box :key="paramsPage.id+'复核'" :isShowNum="0" :isAchievementImgs="true" :imgData="workItem" :photo="item" :current="index" :index="index" :length="workItem?.reviewImage?.length"></album-draw-box>
-                </div>
-                <!-- <div class="report-excute" v-for="(item, index) in workItem?.reviewImage" :key="index">
-                    <div class="tag-label">复核照片</div>
-                    <album-draw-box :isShowNum="0" :photo="item" :current="index" :index="'review'+index" :length="workItem?.reviewImage?.length"></album-draw-box>
-                </div> -->
-                <!-- <div class="report-excute">
-                    <album-carousel
-                        :key="93"
-                        :isAchievementImgs="true"
-                        :images="combinedReviewImages"
-                    ></album-carousel>
-                </div> -->
-            </div>
-
-            <div class="bottom-btn">
-                <div class="btn-item second" @click="handleDownload">保存图片</div>
-                <div class="btn-item primay" @click="handleDownload">转发</div>
-            </div>
-        </div>
-
-        <!-- 组合照片(用于生成合成图片) -->
-        <div class="review-hide-box">
-            <div class="review-image" ref="reviewComboRef">
-                <div class="review-mask">
-                    <div class="review-text">复核成效</div>
-                    <div class="review-content">
-                        {{ workItem?.reCheckText }}
-                    </div>
-                </div>
-                <div class="vs-wrap" v-if="workItem?.reviewImage && workItem?.reviewImage?.length">
-                    <img src="@/assets/img/home/vs.png" alt="" />
-                </div>
-                <div class="review-image-item" v-if="workItem?.executeEvidence?.length">
-                    <div class="review-image-item-title">复核照片</div>
-                    <img
-                        class="review-image-item-img left-img"
-                        :src="leftCoverImg"
-                        style="width: 100%; height: 255px; display: block; image-rendering: auto"
-                    />
-                </div>
-                <div class="review-image-item" v-if="workItem?.reviewImage?.length">
-                    <img
-                        class="review-image-item-img right-img"
-                        :src="rightCoverImg"
-                        style="width: 100%; height: 255px; display: block; image-rendering: auto"
-                    />
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <popup class="cavans-popup" v-model:show="showPopup">
-        <div class="cavans-content">
-            <img class="current-img" :src="pageImg" alt="" />
-        </div>
-        <!-- 底部操作按钮 -->
-        <div class="bottom-actions" @click.stop="showPopup = false">
-            <div class="action-buttons">
-                
-                <div class="action-btn text-btn">
-                    &lt;&lt;长按图片保存或转发&gt;&gt;
-                </div>
-            </div>
-            <div class="cancel-btn" @click="handleCancel">取消</div>
-        </div>
-    </popup>
-</template>
-
-<script setup>
-import CustomHeader from "@/components/customHeader.vue";
-import AlbumCarousel from "@/components/album_compoents/albumCarousel";
-import { ref, onActivated, onDeactivated, onUnmounted, nextTick, watch } from "vue";
-import html2canvas from "html2canvas";
-import { uploadBase64 } from "@/common/uploadImg";
-import { detectRuntimeEnvironment } from "@/common/commonFun";
-import { useRoute } from "vue-router";
-import { Popup } from "vant";
-import { base_img_url2 } from "@/api/config";
-import wx from "weixin-js-sdk";
-import AlbumDrawBox from "@/components/album_compoents/albumDrawBox.vue";
-
-const route = useRoute();
-const loading = ref(false);
-const workItem = ref({});
-const showPopup = ref(false);
-function formatArea(val) {
-    const num = typeof val === "number" ? val : parseFloat(val);
-    if (Number.isNaN(num)) return val;
-    return Number.isInteger(num) ? num : num.toFixed(2) + "亩";
-}
-const paramsPage = ref({});
-onActivated(() => {
-    window.scrollTo(0, 0);
-    paramsPage.value = route.query.miniJson ? JSON.parse(route.query.miniJson) : {};
-    getDetail();
-    getResultReport();
-});
-
-const reportData = ref({});
-const getResultReport = () => {
-    VE_API.z_farm_work_record.resultReport({ recordId: paramsPage.value.id }).then((res) => {
-        if (res.code === 0) {
-            reportData.value = res.data;
-        }
-    });
-};
-
-const getDetail = () => {
-    if (!paramsPage.value.id) return;
-    loading.value = true;
-    VE_API.z_farm_work_record
-        .getDetail({ id: paramsPage.value.id })
-        .then(({ data }) => {
-            workItem.value = data[0];
-        })
-        .finally(() => {
-            loading.value = false;
-        });
-};
-
-const isDowload = ref(true);
-const reportDom = ref(null);
-const pageImg = ref(null);
-
-async function handleDownload() {
-    isDowload.value = false;
-    setTimeout(async () => {
-        // 获取要截图的DOM元素
-        const element = reportDom.value;
-
-        try {
-            const canvas = await html2canvas(element, {
-                scrollY: -window.scrollY, // 处理滚动条位置
-                allowTaint: true, // 允许跨域图片
-                useCORS: true, // 使用CORS
-                scale: 2, // 提高分辨率(2倍)
-                height: element.scrollHeight, // 设置完整高度
-                width: element.scrollWidth, // 设置完整宽度
-                logging: true, // 开启日志(调试用)
-            });
-
-            // 转换为图片并下载
-            const image = canvas.toDataURL("image/png");
-            pageImg.value = image;
-            nextTick(() => {
-                showPopup.value = true;
-            })
-        } catch (error) {
-            isDowload.value = true;
-        }
-    });
-}
-
-const handleCancel = () => {
-    showPopup.value = false;
-};
-
-function downloadImage(dataUrl, filename) {
-    const link = document.createElement("a");
-    link.href = dataUrl;
-    link.download = filename;
-    document.body.appendChild(link);
-    link.click();
-    document.body.removeChild(link);
-}
-
-const reviewComboRef = ref(null);
-const combinedReviewImages = ref([]);
-// 生成组合照片,传给相册组件
-const generateCombinedReviewImage = async () => {
-    try {
-        await prepareCoverImages();
-        await nextTick();
-
-        const canvas = await html2canvas(reviewComboRef.value, {
-            backgroundColor: null,
-            useCORS: true,
-            allowTaint: true,
-            scale: window.devicePixelRatio || 2,
-        });
-
-        combinedReviewImages.value = [canvas.toDataURL("image/png")];
-    } catch (e) {
-        console.error("生成组合照片失败", e);
-    }
-};
-
-const prepareCoverImages = async () => {
-    await nextTick();
-
-    const itemEl = reviewComboRef.value.querySelector(".review-image-item");
-
-    const cssWidth = itemEl.offsetWidth;
-    const cssHeight = 255;
-
-    if (workItem.value?.executeEvidence?.length) {
-        leftCoverImg.value = await coverImageToBase64HD(
-            base_img_url2 + workItem.value.executeEvidence.at(-1),
-            cssWidth,
-            cssHeight
-        );
-    }
-
-    if (workItem.value?.reviewImage?.length) {
-        rightCoverImg.value = await coverImageToBase64HD(
-            base_img_url2 + workItem.value.reviewImage.at(-1),
-            cssWidth,
-            cssHeight
-        );
-    }
-};
-
-const leftCoverImg = ref("");
-const rightCoverImg = ref("");
-
-function coverImageToBase64HD(imgUrl, cssWidth, cssHeight) {
-    return new Promise((resolve, reject) => {
-        const dpr = window.devicePixelRatio || 2;
-
-        const img = new Image();
-        img.crossOrigin = "anonymous";
-        img.src = imgUrl;
-
-        img.onload = () => {
-            // ⚠️ 用“物理像素”创建 canvas
-            const canvas = document.createElement("canvas");
-            canvas.width = cssWidth * dpr;
-            canvas.height = cssHeight * dpr;
-
-            const ctx = canvas.getContext("2d");
-            ctx.scale(dpr, dpr);
-
-            const imgRatio = img.width / img.height;
-            const targetRatio = cssWidth / cssHeight;
-
-            let sx = 0,
-                sy = 0,
-                sw = img.width,
-                sh = img.height;
-
-            if (imgRatio > targetRatio) {
-                sw = img.height * targetRatio;
-                sx = (img.width - sw) / 2;
-            } else {
-                sh = img.width / targetRatio;
-                sy = (img.height - sh) / 2;
-            }
-
-            ctx.drawImage(img, sx, sy, sw, sh, 0, 0, cssWidth, cssHeight);
-
-            resolve(canvas.toDataURL("image/png"));
-        };
-
-        img.onerror = reject;
-    });
-}
-
-
-const userInfoStr = localStorage.getItem("localUserInfo");
-const userInfo = userInfoStr ? JSON.parse(userInfoStr) : {};
-
-async function handleForward() {
-    setTimeout(async () => {
-        // 获取要截图的DOM元素
-        const element = reportDom.value;
-
-        try {
-            const canvas = await html2canvas(element, {
-                scrollY: -window.scrollY, // 处理滚动条位置
-                allowTaint: true, // 允许跨域图片
-                useCORS: true, // 使用CORS
-                scale: 2, // 提高分辨率(2倍)
-                height: element.scrollHeight, // 设置完整高度
-                width: element.scrollWidth, // 设置完整宽度
-                logging: true, // 开启日志(调试用)
-            });
-
-            // 转换为图片并下载
-            const image = canvas.toDataURL("image/png");
-            const process = detectRuntimeEnvironment();
-            // if (process === "wechat-webview") {
-                const imgUrl = await uploadBase64(image, false);
-                const params = {
-                    val: 'share',
-                    key: "report",
-                };
-                VE_API.mine.saveSessionStore({ ...params, text: imgUrl }).then((res) => {
-                    if (res.success) {
-                        wx.miniProgram.navigateTo({
-                            url: `/pages/subPages/report_page/index`,
-                        });
-                    }
-                });
-            // }
-            isDowload.value = true;
-        } catch (error) {
-            isDowload.value = true;
-        }
-    });
-
-
-    // const image = await handleDownload(true);
-    // const imgUrl = await uploadBase64(image, false);
-    // const params = {
-    //     miniUserId: 766,
-    //     key: "report",
-    // };
-    // VE_API.mine.saveSessionStore({ ...params, text: imgUrl }).then((res) => {
-    //     if (res.success) {
-    //         wx.miniProgram.navigateTo({
-    //             url: `/pages/subPages/report_page/index`,
-    //         });
-    //     }
-    // });
-}
-
-watch(
-    () => [workItem.value.executeEvidence, workItem.value.reviewImage],
-    ([preImgs, reviewImgs]) => {
-        if (preImgs && preImgs.length && reviewImgs && reviewImgs.length) {
-            generateCombinedReviewImage();
-        }
-    },
-    { deep: true }
-);
-
-// 清理数据的函数
-const clearData = () => {
-    workItem.value = {};
-    reportData.value = {};
-    paramsPage.value = {};
-    loading.value = false;
-    isDowload.value = true;
-    combinedReviewImages.value = [];
-    leftCoverImg.value = "";
-    rightCoverImg.value = "";
-};
-
-onDeactivated(() => {
-    clearData();
-});
-
-onUnmounted(() => {
-    clearData();
-});
-</script>
-
-<style lang="scss" scoped>
-.achievement-report-page {
-    width: 100%;
-    height: 100vh;
-    background: linear-gradient(195.35deg, #d4e4ff 16.34%, rgba(93, 189, 255, 0) 50.3%),
-        linear-gradient(156.64deg, rgba(255, 255, 255, 0.16) 27.7%, rgba(255, 255, 255, 0) 72.82%);
-
-    .report-content-wrap {
-        height: calc(100% - 40px);
-        padding-bottom: 60px;
-        overflow: auto;
-        box-sizing: border-box;
-        position: relative;
-        .bottom-btn {
-            z-index: 2;
-            position: fixed;
-            bottom: 0;
-            left: 0;
-            width: 100%;
-            background: #fff;
-            height: 60px;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            padding: 0 12px;
-            box-sizing: border-box;
-            box-shadow: 2px 2px 4.5px 0px rgba(0, 0, 0, 0.4);
-            .btn-item {
-                height: 40px;
-                line-height: 40px;
-                padding: 0 24px;
-                border-radius: 20px;
-                font-size: 14px;
-                &.second {
-                    color: #666666;
-                    border: 1px solid rgba(153, 153, 153, 0.5);
-                }
-                &.primay {
-                    padding: 0 34px;
-                    background: linear-gradient(180deg, #76c3ff, #2199f8);
-                    color: #fff;
-                }
-            }
-        }
-    }
-    
-    .code-icon {
-        position: absolute;
-        right: 10px;
-        top: 12px;
-        width: 48px;
-    }
-    .report-content {
-        background: url("@/assets/img/home/report_bg.png") no-repeat center center;
-        background-size: 100% auto;
-        background-position: top center;
-        padding: 24px 16px 16px;
-        box-sizing: border-box;
-        position: relative;
-        .report-header {
-            position: relative;
-            .header-book {
-                position: absolute;
-                right: 0;
-                bottom: -6px;
-                height: 88px;
-                z-index: 10;
-            }
-            .time-tag {
-                background: linear-gradient(137.86deg, #9fd5ff 5.87%, #2199f8 82.98%);
-                border-radius: 5px 0 5px 0;
-                height: 23px;
-                line-height: 23px;
-                font-size: 13px;
-                font-weight: 500;
-                color: #fff;
-                padding: 0 9px;
-                width: fit-content;
-            }
-            .report-title {
-                font-family: "PangMenZhengDao";
-                font-size: 34px;
-                line-height: 38px;
-                color: #000000;
-            }
-            .report-info {
-                padding: 10px 0 16px 0;
-                .info-item {
-                    width: fit-content;
-                    display: flex;
-                    height: 33px;
-                    align-items: center;
-                    padding: 0 6px 0 3px;
-                    background: linear-gradient(90deg, rgba(255, 255, 255, 0.58) 0%, rgba(255, 255, 255, 0.0696) 100%);
-                    border-radius: 20px;
-                    border: 0.5px solid rgba(33, 153, 248, 0.35);
-                    gap: 3px;
-                    .info-icon {
-                        width: 26px;
-                        height: 26px;
-                        object-fit: cover;
-                        border-radius: 50%;
-                    }
-                    .info-text {
-                        font-size: 14px;
-                        color: #2199f8;
-                    }
-                }
-                .info-item + .info-item {
-                    margin-top: 5px;
-                }
-            }
-        }
-
-        .report-box {
-            display: flex;
-            align-items: center;
-            padding: 8px;
-            background: linear-gradient(0deg, #ffffff 86.32%, #2199f8 136.87%);
-            border: 1px solid #ffffff;
-            border-radius: 8px;
-            gap: 5px;
-            position: relative;
-            .report-box-item {
-                flex: 1;
-                background: rgba(33, 153, 248, 0.1);
-                border-radius: 8px;
-                min-height: 62px;
-                box-sizing: border-box;
-                padding: 2px 4px;
-                display: flex;
-                flex-direction: column;
-                justify-content: center;
-                .item-content {
-                    color: #2199f8;
-                    font-size: 14px;
-                    text-align: center;
-                }
-                .item-title {
-                    color: #000000;
-                    font-size: 10px;
-                    text-align: center;
-                    padding-top: 5px;
-                }
-            }
-
-            .box-title {
-                position: absolute;
-                top: -8px;
-                left: 0;
-                height: 32px;
-                line-height: 26px;
-                padding: 0 10px;
-                color: #ffffff;
-                background: url("@/assets/img/home/title-bg.png") no-repeat center center / 100% 100%;
-            }
-            .box-text {
-                padding: 22px 0 12px 0;
-            }
-        }
-        .report-box + .report-box {
-            margin-top: 20px;
-        }
-        .report-excute {
-            position: relative;
-            margin-top: 12px;
-            .tag-label {
-                position: absolute;
-                top: 0;
-                left: 0;
-                padding: 4px 10px;
-                background: rgba(54, 52, 52, 0.8);
-                color: #fff;
-                font-size: 12px;
-                border-radius: 8px 0 8px 0;
-                z-index: 1;
-            }
-            ::v-deep {
-                .carousel-container .carousel-wrapper .carousel-img {
-                    min-width: calc(100vw - 32px);
-                    width: calc(100vw - 32px);
-                }
-            }
-        }
-    }
-    .download-btn {
-        position: fixed;
-        bottom: 20px;
-        left: 50%;
-        // background: #fff;
-        // box-shadow: 2px 2px 4.5px 0px #00000066;
-        // width: 100%;
-        transform: translateX(-50%);
-    }
-
-    .review-hide-box {
-        position: absolute;
-        left: 0;
-        width: 100%;
-        height: 100%;
-        z-index: -1;
-        bottom: 0;
-    }
-
-    .review-image {
-        position: relative;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        gap: 8px;
-        margin: 12px;
-        background: #fff;
-        border-radius: 8px;
-        .review-mask {
-            z-index: 1;
-            pointer-events: none;
-            position: absolute;
-            left: 0;
-            top: 0;
-            width: 100%;
-            height: 100%;
-            border-radius: 8px;
-            background: linear-gradient(
-                360deg,
-                rgba(0, 0, 0, 0.78) 0%,
-                rgba(0, 0, 0, 0.437208) 19.87%,
-                rgba(0, 0, 0, 0) 33.99%
-            );
-            display: flex;
-            flex-direction: column;
-            align-items: baseline;
-            justify-content: end;
-            padding: 12px;
-            box-sizing: border-box;
-            color: #fff;
-            .review-text {
-                font-family: "PangMenZhengDao";
-                font-size: 16px;
-                margin-bottom: 1px;
-            }
-            .review-content {
-                font-size: 10px;
-                line-height: 15px;
-            }
-        }
-        .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;
-            // }
-            .review-image-item-img {
-                width: 100%;
-                height: 100%;
-                object-fit: cover;
-                object-position: center;
-            }
-            .left-img {
-                border-radius: 8px 0 0 8px;
-            }
-            .right-img {
-                border-radius: 0 8px 8px 0;
-            }
-        }
-    }
-}
-
-
-.cavans-popup {
-    width: 100%;
-    max-width: 100%;
-    max-height: 92vh;
-    background: none;
-    border-radius: 12px;
-    overflow: auto;
-    display: flex;
-    flex-direction: column;
-    backdrop-filter: 4px;
-    .cavans-content {
-        text-align: center;
-        padding: 0 12px;
-        height: fit-content;
-        overflow: auto;
-        .current-img {
-            width: 100%;
-        }
-    }
-
-    // 底部操作按钮
-    .bottom-actions {
-        flex-shrink: 0;
-
-        .action-buttons {
-            padding: 12px 0 4px 0;
-            display: flex;
-            justify-content: space-around;
-
-            .action-btn {
-                display: flex;
-                flex-direction: column;
-                align-items: center;
-                cursor: pointer;
-                &.text-btn {
-                    font-size: 12px;
-                    color: rgba(255, 255, 255, 0.7);
-                }
-
-                .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 - 690
src/views/old_mini/chat_frame/consult.vue

@@ -1,690 +0,0 @@
-<template>
-    <div class="consult">
-        <custom-header name="咨询专家"></custom-header>
-        <div class="consult-content">
-            <!-- 聊天消息区域 -->
-            <div class="chat-messages" ref="messagesContainer">
-                <div v-for="(msg, index) in messages" :key="index" class="message" :class="msg.sender">
-                    <!-- 对方消息 -->
-                    <template v-if="msg.sender === 'received'">
-                        <!-- <div class="avatar">{{ msg.receiverName.charAt(0) }}</div> -->
-                        <el-avatar class="avatar" :size="40" :src="msg.receiverIcon ||
-                            'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'
-                            " />
-                        <div class="bubble"
-                            :class="{ 'no-bubble': msg.messageType === 'image', 'card-bubble': msg.messageType === 'card' }">
-                            <!-- 文本消息 -->
-                            <div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
-
-                            <!-- 图片消息 -->
-                            <div v-if="msg.messageType === 'image'" class="image-message">
-                                <img :src="msg.content + resize" @click="showImagePreview(msg.content)"
-                                    @load="handleImageLoad" alt="图片" />
-                            </div>
-
-                            <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'report'" class="dialog-message"
-                                @click="handleReportClick(msg)">
-                                <template v-if="(msg.reportType || msg.content.reportType) === 'farm_report'">
-                                    <div class="report-title">{{ msg.title || msg.content.title }}</div>
-                                    <div class="dialog-title">这是{{ curRole == 2 ? '该农场' : '我' }}的果园情况,请查看~</div>
-                                    <img src="https://birdseye-img.sysuimars.com/birdseye-look-mini/share-report-bg.png"
-                                        alt="" class="monitor-image" />
-                                </template>
-                                <template v-else>
-                                    <div class="dialog-title">{{ msg.title || msg.content.title }}</div>
-                                    <img src="@/assets/img/monitor/image.png" alt="" class="monitor-image" />
-                                </template>
-                            </div>
-
-                            <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'card'" class="question-message">
-                                <div class="question-title">{{ msg.title || msg.content.title }}</div>
-                                <div class="image-wrap">
-                                    <!-- coverUrl 为 JSON 字符串的数组时,解析后遍历 -->
-                                    <template
-                                        v-if="msg.content && msg.content.coverUrl && Array.isArray(msg.content.coverUrl)">
-                                        <img v-for="item in msg.content.coverUrl" :key="item" :src="handleImgUrl(item)"
-                                            alt="" />
-                                    </template>
-                                    <!-- 否则当作普通字符串 URL 使用 -->
-                                    <img v-else :src="handleImgUrl(msg.content.coverUrl)" alt="">
-                                </div>
-                                <div class="btn-detail" @click="handleDetailClick">查看详情</div>
-                            </div>
-                        </div>
-                    </template>
-
-                    <!-- 我方消息 -->
-                    <template v-else>
-                        <div class="bubble"
-                            :class="{ 'no-bubble': msg.messageType === 'image', 'card-bubble': msg.messageType === 'card' || msg.messageType === 'report' }">
-                            <!-- 文本消息 -->
-                            <div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
-
-                            <!-- 图片消息 -->
-                            <div v-if="msg.messageType === 'image'" class="image-message">
-                                <img :src="msg.content + resize" @click="showImagePreview(msg.content)"
-                                    @load="handleImageLoad" alt="图片" />
-                            </div>
-
-                            <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'report'" class="dialog-message"
-                                @click="handleReportClick(msg)">
-                                <template v-if="(msg.reportType || msg.content.reportType) === 'farm_report'">
-                                    <div class="report-title">{{ msg.title || msg.content.title }}</div>
-                                    <div class="dialog-title">这是{{ curRole == 2 ? '该农场' : '我' }}果园情况,请查看~</div>
-                                    <img src="https://birdseye-img.sysuimars.com/birdseye-look-mini/share-report-bg.png"
-                                        alt="" class="monitor-image" />
-                                </template>
-                                <template v-else>
-                                    <div class="dialog-title">{{ msg.title || msg.content.title }}</div>
-                                    <img src="@/assets/img/monitor/image.png" alt="" class="monitor-image" />
-                                </template>
-                            </div>
-
-                            <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'card'" class="question-message">
-                                <div class="question-title">{{ msg.title || msg.content.title }}</div>
-                                <div class="image-wrap">
-                                    <!-- coverUrl 为 JSON 字符串的数组时,解析后遍历 -->
-                                    <template
-                                        v-if="msg.content && msg.content.coverUrl && Array.isArray(msg.content.coverUrl)">
-                                        <img v-for="item in msg.content.coverUrl" :key="item" :src="handleImgUrl(item)"
-                                            alt="" />
-                                    </template>
-                                    <!-- 否则当作普通字符串 URL 使用 -->
-                                    <img v-else :src="handleImgUrl(msg.content.coverUrl)" alt="">
-                                </div>
-                                <div class="btn-detail" @click="handleDetailClick">查看详情</div>
-                            </div>
-                        </div>
-                        <!-- <div class="avatar avatar-r">{{ msg.senderName.charAt(0) }}</div> -->
-                        <el-avatar class="avatar avatar-r" :size="40" :src="msg.senderIcon ||
-                            'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'
-                            " />
-                    </template>
-                </div>
-            </div>
-
-            <!-- 输入框区域 -->
-            <div class="input-area">
-                <!-- <div class="toolbar">
-                    <el-icon class="link" @click="startImageUpload"><Link /></el-icon>
-                    <input type="file" ref="fileInput" accept="image/*" style="display: none" @change="handleImageUpload" />
-                </div> -->
-
-                <input type="text" v-model="inputMessage" placeholder="请输入你想说的话~" @keyup.enter="sendTextMessage" />
-                <div class="send" @click="sendTextMessage">发送</div>
-            </div>
-
-            <!-- 图片预览模态框 -->
-            <div v-if="previewImage" class="image-preview" @click="previewImage = null">
-                <img :src="previewImage" alt="预览" />
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, nextTick, onDeactivated, onMounted } from "vue";
-import { useRouter, useRoute } from "vue-router";
-import { base_img_url2 } from "@/api/config";
-import { getFileExt } from "@/utils/util";
-import UploadFile from "@/utils/upliadFile";
-import MqttClient from "@/plugins/MqttClient";
-import customHeader from "@/components/customHeader.vue";
-import { useStore } from "vuex";
-const store = useStore();
-const resize = "?x-oss-process=image/resize,p_120/format,webp/quality,q_100";
-const router = useRouter();
-const route = useRoute();
-
-
-const curUserId = Number(localStorage.getItem("MINI_USER_ID"));
-const storeFarmId = ref(store.state.home.gardenId)
-const senderIcon = ref("");
-const receiverIcon = ref("");
-
-// 本地用户头像
-const localUserInfoIcon = (() => {
-    try {
-        const info = JSON.parse(localStorage.getItem("localUserInfo") || "{}");
-        return info?.icon || "";
-    } catch (e) {
-        return "";
-    }
-})();
-
-// mqtt 连接
-const mqttClient = ref(null);
-const messagesContainer = ref(null);
-
-// 初始化 mqtt
-const initMqtt = () => {
-    const topics = [`user/chat/message/${storeFarmId.value}/${curUserId}`]; // 订阅的主题数组
-    mqttClient.value = new MqttClient(topics, (topic, message) => {
-        if (message && message.length > 10) {
-            const obj = JSON.parse(message);
-            console.log("message有值", obj);
-            if (obj.senderId === curUserId) {
-                return;
-            }
-            if (obj.senderId === Number(route.query.userId)) {
-                // 检查是否已存在相同 id 的消息,避免重复添加
-                if (obj.id && messages.value.some(msg => msg.id === obj.id)) {
-                    return;
-                }
-                if (obj.messageType === "image") {
-                    if (obj.image && (obj.image.url || obj.image.originUrl)) {
-                        obj.content = obj.image.url || obj.image.originUrl;
-                    } else if (obj.content) {
-                        try {
-                            const img = JSON.parse(obj.content);
-                            obj.content = img.url || img.originUrl;
-                        } catch (e) {
-                            console.error(e, "e");
-                        }
-                    }
-                } else if (obj.messageType !== 'text') {
-                    obj.content = JSON.parse(obj.content);
-                    // card 类型的 content 中,如果 coverUrl 是数组,则转成字符串(兼容旧格式)
-                    if (obj.messageType === 'card' && obj.content && Array.isArray(obj.content.coverUrl)) {
-                        obj.content.coverUrl = JSON.stringify(obj.content.coverUrl);
-                    }
-                }
-                obj.receiverId = curUserId;
-                (obj.sender = obj.senderId === curUserId ? "sent" : "received"), (obj.senderIcon = senderIcon.value);
-                obj.receiverIcon = receiverIcon.value;
-                messages.value.push(obj);
-
-                scrollToBottom();
-            }
-        }
-    });
-
-    mqttClient.value.connect();
-};
-
-// 消息数据
-const messages = ref([]);
-
-// 输入相关
-const inputMessage = ref("");
-const fileInput = ref(null);
-
-function handleImageLoad() {
-    scrollToBottom();
-}
-
-const handleDetailClick = () => {
-    router.push(`/interaction_list?expertMiniUserId=${route.query.userId}`);
-}
-
-// 图片预览
-const previewImage = ref(null);
-
-const handleCardClick = (msg) => {
-    router.push(msg.linkUrl || msg.content.linkUrl);
-}
-
-const handleImgUrl = (url) => {
-    if (url && url.includes('https://')) {
-        return url;
-    } else {
-        return base_img_url2 + url + resize;
-    }
-}
-
-// 图片处理
-const startImageUpload = () => {
-    fileInput.value.click();
-};
-
-const uploadFileObj = new UploadFile();
-
-const handleImageUpload = (event) => {
-    const file = event.target.files[0];
-    if (file) {
-        // 实际项目中应该上传到服务器,这里使用本地URL模拟
-        const miniUserId = localStorage.getItem("MINI_USER_ID");
-        let ext = getFileExt(file.name);
-        let key = `birdseye-look-mini/${miniUserId}/${new Date().getTime()}.${ext}`;
-        let imageUrl = "";
-        uploadFileObj.put(key, file).then((resFilename) => {
-            imageUrl = base_img_url2 + resFilename;
-            sendImageMessage(imageUrl);
-        });
-    }
-};
-
-const showImagePreview = (imageUrl) => {
-    previewImage.value = imageUrl;
-};
-
-// 发送图片消息
-const sendImageMessage = (thumbnailUrl) => {
-    const message = {
-        sender: "sent",
-        messageType: "image",
-        senderIcon: senderIcon.value,
-        content: thumbnailUrl,
-    };
-    sendMessage(message);
-};
-
-//发送消息接口
-//类型 text ,file,image
-const sendMsg = (messageType = "text", content = "", obj = {}) => {
-    const params = {
-        farmId: storeFarmId.value,
-        receiverId: route.query.userId,
-        content,
-        [messageType]: obj,
-        messageType,
-    };
-    VE_API.bbs.sendMsg(params);
-};
-
-// 发送消息
-const sendMessage = (message) => {
-    if (message.messageType === "text") {
-        sendMsg("text", message.content);
-    } else if (message.messageType === "image") {
-        // 按新协议:不传 content,传 image 对象
-        sendMsg("image", "", { url: message.content, thumbnailUrl: message.content + resize });
-    } else if (message.messageType === "report") {
-        // 对话样式消息不发送到服务器,只显示在本地
-        console.log("发送对话样式消息:", message);
-        if (message.reportType === 'farm_report') {
-            sendMsg('report', '', {
-                title: message.title,
-                reportId: message.reportId,
-                reportType: message.reportType,
-            });
-        } else {
-            sendMsg('report', '', {
-                title: message.title,
-                reportId: message.reportId,
-                reportType: message.reportType,
-            });
-            console.log('其他文件1');
-        }
-    } else {
-        sendMsg('card', '', {
-            title: message.title,
-            coverUrl: message.coverUrl,
-            cardType: message.cardType,
-            linkUrl: message.linkUrl
-        });
-    }
-    messages.value.push(message);
-    scrollToBottom();
-};
-
-// 发送文本消息
-const sendTextMessage = () => {
-    if (inputMessage.value.trim()) {
-        const message = {
-            sender: "sent",
-            messageType: "text",
-            senderIcon: senderIcon.value,
-            content: inputMessage.value,
-        };
-        sendMessage(message);
-        inputMessage.value = "";
-    }
-};
-
-const scrollToBottom = () => {
-    nextTick(() => {
-        setTimeout(() => {
-            if (messagesContainer.value) {
-                messagesContainer.value.scrollTop = messagesContainer.value.scrollHeight;
-            }
-        }, 300);
-    });
-};
-
-const curRole = ref(null);
-
-// 点击农场报告对话框
-const handleReportClick = (msg) => {
-    if (msg.reportType === 'farm_report' || msg.messageType === 'report') {
-        const params = {
-            farmId: msg.reportId || msg.content?.reportId,
-            showFilter: true,
-        }
-        router.push(`/farm_report?miniJson=${JSON.stringify(params)}`);
-    } else {
-        console.log('其他文件');
-    }
-}
-
-// 页面加载时自动添加欢迎消息
-onMounted(() => {
-    createSession(route.query.userId);
-    scrollToBottom();
-});
-
-//聊天会话
-const createSession = (targetUserId, callback) => {
-    VE_API.bbs.createSession({ farmId: storeFarmId.value, targetUserId }).then(({ data, code }) => {
-        if (code === 0) {
-            senderIcon.value = localUserInfoIcon;
-            receiverIcon.value = data.session.targetUserAvatar;
-            messages.value = data.messages.map((item) => {
-                let content = item.content;
-                if (item.messageType === "image") {
-                    // 优先读取后端的 image 字段,其次兼容旧的 content(JSON)
-                    if (item.image && (item.image.url || item.image.originUrl)) {
-                        content = item.image.url || item.image.originUrl;
-                    } else if (item.content) {
-                        try {
-                            const imgObj = JSON.parse(item.content);
-                            content = imgObj.url || imgObj.originUrl;
-                        } catch (e) {
-                            console.error(e, "e");
-                        }
-                    }
-                } else if (item.messageType !== 'text') {
-                    content = JSON.parse(item.content);
-                }
-                return {
-                    ...item,
-                    content,
-                    sender: item.senderId === curUserId ? "sent" : "received",
-                    senderIcon: item.senderId === curUserId ? localUserInfoIcon : data.session.targetUserAvatar,
-                    receiverIcon: data.session.targetUserAvatar,
-                };
-            });
-
-            setTimeout(() => {
-                scrollToBottom();
-            }, 300);
-            callback && callback();
-
-            // 初始化mqtt
-            initMqtt();
-        }
-    });
-};
-
-onDeactivated(() => {
-    mqttClient.value && mqttClient.value.client.end(true);
-});
-</script>
-
-<style scoped lang="scss">
-.consult {
-    width: 100%;
-    height: calc(100vh - 40px);
-    box-sizing: border-box;
-
-    .consult-content {
-        width: 100%;
-        height: 100%;
-        display: flex;
-        flex-direction: column;
-        position: relative;
-    }
-}
-
-/* 聊天消息区域样式 */
-.chat-messages {
-    flex: 1;
-    padding: 12px;
-    overflow-y: auto;
-    background-color: #fff;
-    box-sizing: border-box;
-
-    .message {
-        display: flex;
-        margin-bottom: 15px;
-    }
-
-    .received {
-        justify-content: flex-start;
-
-        .bubble {
-            background-color: #F4F5F8;
-            border-radius: 0 10px 10px 10px;
-            padding: 10px 12px;
-            box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
-
-            .content {
-                font-size: 16px;
-                color: #666666;
-            }
-        }
-    }
-
-    .sent {
-        justify-content: flex-end;
-
-        .bubble {
-            background-color: #07c160;
-            border-radius: 10px 0 10px 10px;
-            padding: 10px 15px;
-            box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
-
-            .content {
-                font-size: 16px;
-                color: #000;
-            }
-        }
-        .question-message {
-            .question-title{
-                color: #000;
-            }
-        }
-    }
-
-    .avatar {
-        width: 40px;
-        height: 40px;
-        border-radius: 50%;
-        background-color: #07c160;
-        color: white;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        margin-right: 10px;
-        font-weight: bold;
-    }
-
-    .avatar-r {
-        margin: 0 0 0 10px;
-    }
-
-    .bubble {
-        max-width: 70%;
-    }
-}
-
-
-
-.input-area {
-    display: flex;
-    align-items: center;
-    padding: 15px 10px;
-    border-top: 1px solid #e6e6e6;
-    background-color: white;
-    position: relative;
-    width: 100%;
-    box-sizing: border-box;
-
-    input {
-        flex: 1;
-        padding: 10px;
-        border: 1px solid #e6e6e6;
-        border-radius: 20px;
-        outline: none;
-    }
-
-    .send {
-        margin-left: 10px;
-        padding: 8px 20px;
-        background-color: #07c160;
-        color: white;
-        border: none;
-        border-radius: 20px;
-        cursor: pointer;
-    }
-}
-
-/* 新增的多媒体消息样式 */
-.image-message {
-    img {
-        max-width: 200px;
-        max-height: 200px;
-        border-radius: 8px;
-    }
-}
-
-/* 图片消息不使用对话气泡样式 */
-.no-bubble {
-    background: transparent !important;
-    border-radius: 0 !important;
-    padding: 0 !important;
-    box-shadow: none !important;
-    color: inherit !important;
-}
-
-/* 工具栏样式 */
-.toolbar {
-    display: flex;
-    align-items: center;
-
-    button {
-        background: none;
-        border: none;
-        font-size: 20px;
-        margin-right: 10px;
-        cursor: pointer;
-        padding: 5px;
-    }
-
-    .link {
-        font-size: 24px;
-        margin-right: 10px;
-    }
-}
-
-/* 图片预览 */
-.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;
-}
-
-/* 对话样式消息 */
-.dialog-message {
-    max-width: 100%;
-    background: #fff !important;
-    border-radius: 10px;
-
-    .report-title {
-        font-size: 16px;
-        font-weight: 600;
-        color: #000;
-        margin-bottom: 5px;
-    }
-
-    .dialog-title {
-        font-size: 12px;
-        color: rgba(0, 0, 0, 0.6);
-        margin-bottom: 10px;
-    }
-
-    .monitor-image {
-        width: 222px;
-        height: 180px;
-        object-fit: cover;
-    }
-
-    .farm-report-content,
-    .farm-work-content {
-
-        .report-details,
-        .work-details {
-            background: #f8f9fa;
-            border-radius: 8px;
-            padding: 12px;
-            margin-top: 10px;
-
-            .detail-item {
-                display: flex;
-                margin-bottom: 6px;
-                font-size: 13px;
-
-                &:last-child {
-                    margin-bottom: 0;
-                }
-
-                .detail-label {
-                    color: #666;
-                    min-width: 80px;
-                }
-
-                .detail-value {
-                    color: #333;
-                    flex: 1;
-                }
-            }
-        }
-    }
-}
-
-.question-message {
-    .question-title {
-        font-size: 16px;
-        color: #666666;
-        margin-bottom: 6px;
-    }
-
-    .image-wrap {
-        display: flex;
-        // flex-wrap: wrap;
-        gap: 10px;
-
-        img {
-            width: 75px;
-            height: 70px;
-            border-radius: 8px;
-            object-fit: cover;
-        }
-    }
-
-    .btn-detail {
-        font-size: 14px;
-        margin-top: 8px;
-        background: #FFFFFF;
-        border-radius: 6px;
-        text-align: center;
-        padding: 6px;
-    }
-}
-
-/* 我方消息中的对话样式 */
-.message.sent .dialog-message {
-    background: #e3f2fd;
-
-    .work-details {
-        background: #f0f8ff;
-    }
-}
-</style>

+ 0 - 66
src/views/old_mini/chat_frame/index.vue

@@ -1,66 +0,0 @@
-<template>
-    <div class="dialogue">
-        <custom-header :name="nameVal || '飞鸟种植助手'" bgColor="#f2f3f5" isGoBack @goback="headerCallBack"></custom-header>
-        <chat-window :text="desc" :userId="userIdVal" :img="imgVal" @update:name="nameVal = $event"></chat-window>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { onActivated, ref } from "vue";
-import chatWindow from "@/components/chatWindow";
-import { useRoute, useRouter } from "vue-router";
-
-const route = useRoute();
-const router = useRouter();
-const desc = ref("");
-const nameVal = ref("");
-const userIdVal = ref(null);
-const imgVal = ref("");
-const formPageVal = ref("");
-onActivated(() => {
-    userIdVal.value = null;
-    setTimeout(() => {
-        const { text, formPage, userId, img } = route.query;
-        desc.value = text;
-        userIdVal.value = userId;
-        imgVal.value = img;
-        formPageVal.value = formPage;
-        if(formPage) {
-            sessionStorage.setItem('chat_frame_page', formPage);
-        }
-    }, 100);
-});
-
-function headerCallBack() {
-    const page = sessionStorage.getItem('chat_frame_page');
-    if(page === 'messageList' || page === 'monitor') {
-        VE_API.bbs.readUpdate({ targetUserId: userIdVal.value, farmId: route.query.farmId }).then((res) => {
-            if (res.code === 0) {
-                sessionStorage.removeItem('chat_frame_page');
-                router.replace({ path: '/message_list', query: { farmId: route.query.farmId, from: 'monitor' } });
-            }
-        });
-    } else {
-        router.go(-1);
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-.dialogue {
-    width: 100%;
-    height: calc(100vh - 40px);
-    background: #f2f3f5;
-    box-sizing: border-box;
-    .chat-container {
-        display: flex;
-        flex-direction: column;
-        height: 100%;
-        width: 100%;
-        margin: 0 auto;
-        border: 1px solid #e6e6e6;
-        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
-    }
-}
-</style>

+ 0 - 483
src/views/old_mini/home/subPages/expertList.vue

@@ -1,483 +0,0 @@
-<template>
-    <div class="prescription-list">
-        <custom-header v-if="!isShowHeader" :name="isToSelect ? '选择专家' : '咨询专家'"></custom-header>
-        <div class="prescription-filter">
-            <div class="filter-search">
-                <el-input v-model="keyword" style="width: 100%" placeholder="搜索位置" :prefix-icon="Search" />
-            </div>
-            <div class="select-box">
-                <div class="select-item width-30">
-                    <el-select v-model="typeVal" placeholder="品种" @change="getList">
-                        <el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id" />
-                    </el-select>
-                </div>
-                <div class="select-item width-20">
-                    <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 width-30">
-                    <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 class="select-item width-20">
-                    <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="prescription-content">
-            <div class="list">
-                <div class="list-item" v-for="(item, index) in list" :key="index">
-                    <div class="list-top">
-                        <div class="user">
-                            <!-- <img :src="item.pic" alt="" /> -->
-                            <img v-show="index === 0" :src="require(`@/assets/img/home/zj-1.png`)" alt="" />
-                            <img v-show="index === 1" :src="require(`@/assets/img/home/zj-2.png`)" alt="" />
-                            <img v-show="index === 2" :src="require(`@/assets/img/home/zj-3.png`)" alt="" />
-                            <!-- <div class="checkbox" @click.stop="handleCheck(item)">
-                                <el-icon class="icon" v-if="item.isDefault"><Select /></el-icon>
-                                <el-icon class="icon rotate" v-else><CloseBold /></el-icon>
-                            </div> -->
-                        </div>
-                        <div class="info">
-                            <div class="text">
-                                <div class="info-flex">
-                                    <span class="name">{{ item.name }}</span>
-                                    <!-- <span class="expert-tag">
-                                        <img class="expert-img" src="@/assets/img/home/expert-icon.png" alt="">
-                                        专家
-                                    </span> -->
-                                    <div class="fruit-tag" v-for="(ele, eleIndex) in item.tagList" :key="eleIndex">
-                                        {{ ele.name }}
-                                    </div>
-                                </div>
-                                <div class="add-btn">
-                                    <el-icon size="16" color="#fff"><Plus /></el-icon>
-                                </div>
-                            </div>
-                            <div class="van-multi-ellipsis--l2 ellipsis">擅长:{{ item.strongPoint }}</div>
-
-                            <div class="list-btn">
-                                <div class="btn-primary" @click.stop="toPage(item)">
-                                    <span>免费咨询</span>
-                                </div>
-                                <div class="btn-plain" @click.stop="handlePage(item)">查看处方</div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <empty
-                    v-show="list.length < 1"
-                    image="https://fastly.jsdelivr.net/npm/@vant/assets/custom-empty-image.png"
-                    image-size="80"
-                    description="暂无数据"
-                />
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { Empty } from "vant";
-import { onMounted, ref } from "vue";
-import { useRouter, useRoute } from "vue-router";
-import { useStore } from "vuex";
-import { ElMessage } from "element-plus";
-import { Search } from "@element-plus/icons-vue";
-const store = useStore();
-const router = useRouter();
-const route = useRoute();
-
-const props = defineProps({
-    isShowHeader: {
-        type: Boolean,
-        default: false,
-    },
-});
-
-const isToSelect = route.query.isToSelect ? true : false;
-
-const handlePage = ({ isDefault, userId }) => {
-    if (isDefault == null) {
-        console.log("isDefault", isDefault);
-        // router.push(`/expert_prescription?userId=${userId}&disabled=true`)
-    } else {
-        router.push("/expert_prescription");
-    }
-};
-
-const typeOptions = ref([]);
-
-function getSpecieList() {
-    VE_API.farm.fetchSpecieList().then(({ data }) => {
-        typeOptions.value = data;
-
-        // getList(data[0].id);
-    });
-}
-
-const list = ref([
-    {
-        containerId: "9",
-        expertId: "739294587868155904",
-        name: "冼继东",
-        strongPoint: "擅长:长期从事农业昆虫与害虫防治教学与研究工作。取得成果和奖励10项,发表学术论文50余篇。多年来一直致力于果树、蔬菜以及水稻主要病虫害非化学防控技术的推广工作,为有机荔枝龙眼、稻米、蔬菜以及多种水果的高效、安全生产提供技术指导。",
-        tagList: [
-            {
-                id: 825,
-                name: "荔枝",
-                remark: "花穗生长速度过慢",
-            },
-            {
-                id: 829,
-                name: "病虫害",
-                remark: "防止落果",
-            },
-        ],
-        userId: 81881,
-    },
-    {
-        containerId: "9",
-        expertId: "739294587868155904",
-        name: "韦帮稳",
-        pic: "https://birdseye-img-ali-cdn.sysuimars.com//expert/1757473957076.png",
-        strongPoint: "擅长:深耕果树栽培领域达30年,在荔枝、龙眼、柑橘、番茄、木瓜等多个品类果树具有非常丰富的种植栽培经验;自管荔枝果园超2000亩,每年指导海南、湛江、茂名、广州、汕尾、惠州、广西等多地的种植户超百户,面积超1万亩!",
-        tagList: [
-            {
-                id: 825,
-                name: "荔枝",
-                remark: "花穗生长速度过慢",
-            },
-            {
-                id: 829,
-                name: "龙眼",
-                remark: "防止落果",
-            },
-        ],
-        userId: 81881,
-    },
-    {
-        containerId: "9",
-        expertId: "739294587868155904",
-        name: "黄旭明",
-        pic: "https://birdseye-img-ali-cdn.sysuimars.com//expert/1757473957076.png",
-        strongPoint: "擅长:长期从事南方果树生理学研究,研究领域包括常绿果树枝梢生长节奏及调控、具假种皮果实果皮发育、细胞壁代谢和钙营养与生理病害发生关系、果实膨大生长与水分关系等。研究方向为果树生态生理学。1998年获华南农业大学植物生理学博士学位,现任南方果树研究室主任。",
-        tagList: [
-            {
-                id: 825,
-                name: "荔枝",
-                remark: "花穗生长速度过慢",
-            },
-            {
-                id: 829,
-                name: "龙眼",
-                remark: "防止落果",
-            },
-        ],
-        userId: 81881,
-    },
-]);
-
-const getList = (speciesId) => {
-    VE_API.home.fetchExpertList({ speciesId }).then(({ data }) => {
-        list.value = data || [];
-    });
-};
-
-onMounted(() => {
-    getSpecieList();
-});
-
-function toPage({ containerId, userId, name }) {
-    if (isToSelect) {
-        router.push(`/expert_homepage?containerId=${containerId}`);
-        // router.replace(`/expert_homepage?containerId=${containerId}`)
-    } else {
-        router.push(`/chat_frame?userId=${userId}`);
-    }
-}
-
-// 搜索
-const keyword = ref(null);
-const typeVal = ref(null);
-const regionVal = ref(null);
-const levelVal = ref(null);
-
-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" },
-]);
-</script>
-
-<style lang="scss" scoped>
-.prescription-list {
-    position: relative;
-    width: 100%;
-    height: 100vh;
-    background-color: #f5f7fb;
-    .prescription-filter {
-        padding: 12px 12px 0 12px;
-        .filter-search {
-            padding-bottom: 6px;
-            ::v-deep {
-                .el-input__wrapper {
-                    box-shadow: 0 0 0 1px #fff inset;
-                    border-radius: 20px;
-                }
-            }
-        }
-        .select-box {
-            width: 100%;
-            display: flex;
-            justify-content: space-around;
-            .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.5);
-                    }
-                    .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.5);
-                        position: static;
-                        transform: none;
-                        width: fit-content;
-                    }
-                }
-            }
-            .width-30 {
-                width: 30%;
-            }
-            .width-20 {
-                width: 20%;
-            }
-        }
-    }
-    .prescription-content {
-        overflow-y: auto;
-        height: calc(100% - 40px);
-        padding: 6px 12px 12px;
-        box-sizing: border-box;
-        width: 100%;
-        .list {
-            position: relative;
-            .list-item {
-                background: #fff;
-                padding: 16px 12px 12px;
-                border-radius: 8px;
-                .user {
-                    width: 68px;
-                    height: 68px;
-                    margin-right: 12px;
-                    position: relative;
-                    img {
-                        width: 100%;
-                        height: 100%;
-                        border-radius: 8px;
-                        object-fit: scale-down;
-                    }
-                    .checkbox {
-                        position: absolute;
-                        bottom: -2px;
-                        right: -1px;
-                        width: 25px;
-                        height: 25px;
-                        background: #2199f8;
-                        border-radius: 50%;
-                        display: flex;
-                        align-items: center;
-                        justify-content: center;
-                        .icon {
-                            color: #fff;
-                            font-size: 16px;
-                        }
-                        .rotate {
-                            transform: rotate(45deg);
-                        }
-                    }
-                }
-                .list-top {
-                    display: flex;
-                    img{
-                        border-radius: 50%;
-                        object-fit: cover;
-                    }
-                }
-                .list-btn {
-                    display: flex;
-                    // justify-content: center;
-                    font-size: 12px;
-                    margin-top: 8px;
-                    .btn-primary {
-                        background: rgba(33, 153, 248, 0.12);
-                        padding: 0 12px;
-                        color: #2199f8;
-                        border-radius: 20px;
-                        height: 32px;
-                        line-height: 32px;
-                        display: flex;
-                        span {
-                            margin-left: 3px;
-                        }
-                    }
-                    .btn-plain {
-                        background: rgba(162, 162, 162, 0.12);
-                        color: rgba(0, 0, 0, 0.5);
-                        padding: 0px 12px;
-                        border-radius: 20px;
-                        height: 32px;
-                        line-height: 32px;
-                        margin-left: 8px;
-                    }
-                }
-                .info {
-                    width: calc(100% - 78px);
-                    line-height: 1.6;
-                    .ellipsis {
-                        max-width: 255px;
-                        color: #666666;
-                    }
-                    .text {
-                        display: flex;
-                        color: #666666;
-                        align-items: center;
-                        justify-content: space-between;
-                        .info-flex {
-                            display: flex;
-                            align-items: center;
-                        }
-                        .add-btn {
-                            width: 26px;
-                            height: 26px;
-                            border-radius: 50%;
-                            background: #2199f8;
-                            text-align: center;
-                            display: flex;
-                            align-items: center;
-                            justify-content: center;
-                        }
-                        .name {
-                            color: #000;
-                            font-size: 16px;
-                            font-weight: bold;
-                        }
-                        .expert-tag {
-                            height: 20px;
-                            width: 48px;
-                            display: flex;
-                            align-items: center;
-                            justify-content: center;
-                            color: #c77d05;
-                            background: #ffecad;
-                            border-radius: 4px;
-                            font-size: 12px;
-                            margin-left: 8px;
-                            line-height: 20px;
-                            .expert-img {
-                                width: 12px;
-                                padding-right: 2px;
-                            }
-                        }
-                        .btn-text {
-                            font-size: 12px;
-                            color: #a8a8a8;
-                            padding: 2px 12px;
-                            border-radius: 20px;
-                            border: 1px solid #a8a8a8;
-                            background: rgba(220, 220, 220, 0.1);
-                            &.actice {
-                                color: #f3c11d;
-                                border-color: #f3c11d;
-                                background: rgba(243, 193, 29, 0.1);
-                            }
-                        }
-                    }
-                    .fruit-tag {
-                        margin-left: 5px;
-                        padding: 0 8px;
-                        height: 20px;
-                        line-height: 20px;
-                        background: #cae7ff;
-                        border-radius: 2px;
-                        font-size: 12px;
-                        color: #2199f8;
-                        // &.pest {
-                        //     background: #eedaff;
-                        //     color: #ac4dff;
-                        // }
-                        &:nth-child(3) {
-                            background: #eedaff;
-                            color: #ac4dff;
-                        }
-                    }
-                    .ellipsis {
-                        font-size: 12px;
-                        color: #999;
-                        margin-top: 4px;
-                    }
-                }
-            }
-            .list-item + .list-item {
-                margin-top: 16px;
-                padding-top: 16px;
-                border-top: 1px solid #f5f5f5;
-            }
-        }
-    }
-}
-</style>

+ 0 - 205
src/views/old_mini/home/subPages/knowledgeList.vue

@@ -1,205 +0,0 @@
-<template>
-    <div class="service-records-page">
-        <custom-header name="知识库"></custom-header>
-        <div class="record-list">
-            <list v-model:loading="listLoading" :finished="listFinished" finished-text="" @load="getKnowledgeList">
-                <div v-for="(item, index) in knowledgeList" :key="index" class="record-card">
-                    <img class="thumb" :src="item.media && item.media[0]" alt="暂无图片" />
-                    <div class="card-body" @click="handleItemClick(item)">
-                        <div class="card-body-left">
-                            <div class="title van-multi-ellipsis--l2">{{ item.title }}</div>
-                            <div class="date">{{ formatDate(item.createTime) }}</div>
-                        </div>
-                    </div>
-                </div>
-
-                <!-- 加载完成且无数据时的空状态 -->
-                <div v-if="!knowledgeList.length && listFinished" class="empty-wrap">
-                    <div class="empty-text">暂无数据</div>
-                </div>
-            </list>
-        </div>
-    </div>
-</template>
-<script setup>
-import { ref, onMounted, watch, onActivated } from "vue";
-import customHeader from "@/components/customHeader.vue";
-import { List } from "vant";
-import { useRouter, useRoute } from "vue-router";
-import { useStore } from "vuex";
-
-const router = useRouter();
-const route = useRoute();
-const store = useStore();
-
-// 服务记录列表数据
-const knowledgeList = ref([]);
-const topicId = ref(6);
-
-// 分页与滚动加载状态
-const page = ref(1);
-const pageSize = ref(10);
-const listLoading = ref(false);
-const listFinished = ref(false);
-// 存储全部数据(用于 topicId === 6 时的前端分页)
-const allDataCache = ref([]);
-
-// 重置列表状态
-const resetListState = () => {
-    knowledgeList.value = [];
-    page.value = 1;
-    listFinished.value = false;
-    allDataCache.value = [];
-};
-
-// 初始化或重置时加载数据
-const initList = () => {
-    resetListState();
-    // 重置后触发首次加载
-    getKnowledgeList();
-};
-
-onMounted(() => {
-    // 从路由获取当前知识库类型
-    topicId.value = Number(route.query.topicId) || 6;
-    // 不主动请求,交给 vant List 的 @load 触发首次加载
-});
-
-// 监听路由参数变化
-watch(
-    () => route.query.topicId,
-    (newTopicId) => {
-        const newId = Number(newTopicId) || 6;
-        if (newId !== topicId.value) {
-            topicId.value = newId;
-            initList();
-        }
-    }
-);
-
-// 页面激活时也检查参数变化
-onActivated(() => {
-    const newId = Number(route.query.topicId) || 6;
-    if (newId !== topicId.value) {
-        topicId.value = newId;
-        initList();
-    }
-});
-
-const getKnowledgeList = async () => {
-    if (listFinished.value) return;
-
-    listLoading.value = true;
-
-    try {
-        let list = [];
-        // 实战知识库:使用原接口(支持分页)
-        const params = {
-            page: page.value,
-            limit: pageSize.value,
-            topicId: topicId.value,
-        };
-        const { data } = await VE_API.home.warningPageList(params);
-        list = data || [];
-
-        if (page.value === 1) {
-            knowledgeList.value = list;
-        } else {
-            knowledgeList.value = [...knowledgeList.value, ...list];
-        }
-
-        // 如果返回数量小于页大小,认为没有更多数据了
-        if (list.length < pageSize.value) {
-            listFinished.value = true;
-        } else {
-            page.value += 1;
-        }
-    } catch (error) {
-        console.error("获取知识列表失败:", error);
-        listFinished.value = true;
-    } finally {
-        listLoading.value = false;
-    }
-};
-
-const formatDate = (dateStr) => {
-    if (!dateStr) return "";
-    // 将 2026-01-06T00:00:00 格式转换为 2026-01-06
-    return dateStr.split("T")[0];
-};
-
-const handleItemClick = (item) => {
-    router.push(`/warning_detail?id=${item.id}&showImage=true`);
-};
-</script>
-<style lang="scss" scoped>
-.service-records-page {
-    width: 100%;
-    background: #f5f5f5;
-    height: 100vh;
-
-    .record-list {
-        padding: 10px 12px;
-        display: flex;
-        flex-direction: column;
-        gap: 10px;
-        height: calc(100% - 60px);
-        overflow-y: auto;
-    }
-
-    .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: 112px;
-            height: 74px;
-            border-radius: 8px;
-            object-fit: cover;
-            flex: none;
-        }
-
-        .card-body {
-            flex: 1;
-            height: 100%;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-
-            .card-body-left {
-                width: 100%;
-                height: 95%;
-                display: flex;
-                flex-direction: column;
-                justify-content: space-between;
-
-                .date {
-                    font-size: 13px;
-                    color: #86909c;
-                    margin-top: 4px;
-                }
-            }
-        }
-    }
-
-    .record-card+.record-card {
-        margin-top: 10px;
-    }
-
-    .empty-wrap {
-        padding-top: 40px;
-        text-align: center;
-
-        .empty-text {
-            font-size: 14px;
-            color: #86909c;
-        }
-    }
-}
-</style>

+ 260 - 0
src/views/old_mini/interaction/index.vue

@@ -0,0 +1,260 @@
+<template>
+    <div class="interaction-page">
+        <custom-header name="农情互动" :showClose="false" :isGoBack="false" />
+        <div class="interaction-content">
+            <!-- 顶部说明 -->
+            <div class="intro-card">
+                完善作物品种以及物候信息,精准匹配种植方案,实现精细化管理
+            </div>
+
+            <!-- 作物块 -->
+            <div v-for="crop in crops" :key="crop.id" class="crop-section">
+                <div class="crop-header">
+                    <div class="crop-tag">{{ crop.name }}</div>
+                    <div class="add-btn" @click="addVariety(crop)">+ 新增品种</div>
+                </div>
+
+                <div v-for="variety in crop.varieties" :key="variety.id" class="variety-card">
+                    <div class="field-row">
+                        <div class="field-value">
+                            <el-select v-model="variety.variety" class="variety-input" placeholder="选择品种">
+                                <el-option v-for="item in varietyOptions" :key="item.value" :label="item.label"
+                                    :value="item.value" />
+                            </el-select>
+                        </div>
+                    </div>
+
+                    <div class="field-row">
+                        <div class="field-label">当下物候期</div>
+                        <div class="field-value">
+                            <el-select v-model="variety.currentStage" class="select-input" placeholder="选择物候期"
+                                >
+                                <el-option v-for="item in stageOptions" :key="item.value" :label="item.label"
+                                    :value="item.value" />
+                            </el-select>
+                        </div>
+                    </div>
+
+                    <div class="field-row">
+                        <div class="field-label">第一批花穗时间</div>
+                        <div class="field-value">
+                            <el-date-picker style="width: 100%" v-model="variety.firstFlowerDate" class="date-picker" type="date"
+                                placeholder="选择时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { ref } from "vue";
+import customHeader from "@/components/customHeader.vue";
+
+// 简单示例数据,后续可替换为接口返回
+const crops = ref([
+    {
+        id: 1,
+        name: "荔枝",
+        varieties: [
+            {
+                id: 1,
+                variety: "",
+                currentStage: "花穗期",
+                firstFlowerDate: "",
+            },
+        ],
+    },
+    {
+        id: 2,
+        name: "水稻",
+        varieties: [
+            {
+                id: 1,
+                variety: "",
+                currentStage: "花穗期",
+                firstFlowerDate: "",
+            },
+        ],
+    },
+]);
+
+const addVariety = (crop) => {
+    const nextId = crop.varieties.length + 1;
+    crop.varieties.push({
+        id: nextId,
+        variety: "",
+        currentStage: "花穗期",
+        firstFlowerDate: "",
+    });
+};
+
+// 品种下拉选项(示例)
+const varietyOptions = ref([
+    { label: "桂味", value: "桂味" },
+    { label: "糯米糍", value: "糯米糍" },
+    { label: "妃子笑", value: "妃子笑" },
+    { label: "井岗红糯", value: "井岗红糯" },
+]);
+
+// 物候期选项(示例)
+const stageOptions = ref([
+    { label: "花穗期", value: "花穗期" },
+    { label: "萌芽期", value: "萌芽期" },
+    { label: "抽梢期", value: "抽梢期" },
+    { label: "坐果期", value: "坐果期" },
+]);
+</script>
+
+<style lang="scss" scoped>
+.interaction-page {
+    height: 100vh;
+    box-sizing: border-box;
+    background: #F2F4F5;
+    font-size: 14px;
+    color: #1d2129;
+}
+
+.interaction-content {
+    height: calc(100% - 40px);
+    overflow: auto;
+    padding: 10px;
+    box-sizing: border-box;
+}
+
+.intro-card {
+    padding: 10px;
+    border-radius: 6px;
+    background: #ffffff;
+    color: #666666;
+    box-shadow: 0 2px 8px rgba(15, 35, 52, 0.06);
+    margin-bottom: 12px;
+    line-height: 17px;
+}
+
+.crop-section {
+    background: #ffffff;
+    border-radius: 6px;
+    padding: 10px;
+    box-shadow: 0 2px 8px rgba(15, 35, 52, 0.04);
+    margin-bottom: 10px;
+}
+
+.crop-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 10px;
+
+    .crop-tag {
+        padding: 0 16px;
+        border-radius: 2px;
+        background: #2199F8;
+        color: #ffffff;
+        font-size: 14px;
+        height: 26px;
+        line-height: 26px;
+    }
+
+    .add-btn {
+        padding: 0 12px;
+        border-radius: 4px;
+        height: 26px;
+        line-height: 26px;
+        box-sizing: border-box;
+        border: 0.5px solid rgba(33, 153, 248, 0.5);
+        color: #0B84E4;
+    }
+}
+
+.variety-card {
+    margin-top: 8px;
+    padding: 10px;
+    border-radius: 5px;
+    background: rgba(33, 153, 248, 0.05);
+    border: 1px solid rgba(33, 153, 248, 0.2);
+}
+
+.field-row {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+
+    &:last-child {
+        margin-bottom: 0;
+    }
+}
+
+.field-label {
+    width: 118px;
+    flex: none;
+    font-size: 14px;
+    color: #1D2129;
+}
+
+.field-value {
+    flex: 1;
+}
+
+.select-input,
+.date-picker {
+    width: 100%;
+}
+
+.variety-input {
+    width: 110px;
+    ::v-deep {
+        .el-select__wrapper {
+            box-shadow: none;
+            background-color: rgba(33, 153, 248, 0.1);
+            // box-shadow: 0 0 0 1px var(--el-border-color) inset;
+        }
+        .el-select__placeholder {
+            color: #2199F8;
+        }
+        .el-select__caret {
+            color: #2199F8;
+        }
+    }
+}
+
+.fake-select {
+    height: 32px;
+    border-radius: 4px;
+    border: 1px solid rgba(0, 0, 0, 0.08);
+    background: #ffffff;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 0 8px;
+    box-sizing: border-box;
+
+    .text {
+        color: #1d2129;
+        font-size: 14px;
+    }
+
+    .arrow {
+        font-size: 10px;
+        color: #c0c4cc;
+    }
+
+    &.fake-select--plain {
+        background: #ffffff;
+    }
+}
+
+.date-input {
+    height: 32px;
+    border-radius: 4px;
+    border: 1px dashed rgba(33, 153, 248, 0.6);
+    background: #ffffff;
+    display: flex;
+    align-items: center;
+    padding: 0 8px;
+    box-sizing: border-box;
+    color: #c0c4cc;
+    font-size: 14px;
+}
+</style>

+ 0 - 2476
src/views/old_mini/modify_work/modify.vue

@@ -1,2476 +0,0 @@
-<template>
-    <div class="new-farming-page" ref="pageRef">
-        <custom-header :name="isEdit ? (onlyPrice ? '编辑报价' : '编辑方案') : '查看详情'"></custom-header>
-        <div class="new-farming-content" :class="{ 'no-permission': !hasPlanPermission }">
-            <el-form
-                ref="formRef"
-                style="max-width: 600px"
-                label-position="left"
-                :rules="rules"
-                :model="dynamicValidateForm"
-                class="demo-dynamic"
-            >
-                <div class="farm-card">
-                    <div class="card-title between common-inputs">
-                        <div>{{ detailData?.name }}<span class="type-tag">标准农事</span></div>
-                        <el-select v-if="isEdit" size="small" v-model="tagName" placeholder="标记为" style="width: 94px">
-                            <el-option
-                                v-for="item in tagList"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
-                        </el-select>
-                        <div class="edit-tag tag-text" v-else>{{ statusMap[tagName] }}</div>
-                        <!-- <el-tooltip
-                            effect="dark"
-                            placement="left"
-                        >
-                            <template #content>
-                                <div class="tag-item">全托管</div>
-                                <div class="tag-item">飞防托管</div>
-                                <div class="tag-item">营养托管</div>
-                            </template>
-                            <div class="title-tag add-tag">托管用户</div>
-                        </el-tooltip> -->
-                    </div>
-                    <div class="info-content">
-                        <el-form-item label-width="70px" class="form-item text-item" label="农事编号">
-                            <div class="info-text">
-                                {{ detailData?.code }}
-                            </div>
-                        </el-form-item>
-                        <el-form-item v-if="!noPrice" label-width="70px" class="form-item text-item" label="服务亩数">
-                            <div class="info-text">
-                                {{ detailData?.farm?.mianji ? formatArea(detailData?.farm?.mianji) + "亩" : "--" }}
-                            </div>
-                        </el-form-item>
-                        <el-form-item v-if="!noPrice" label-width="70px" class="form-item text-item" label="服务区域">
-                            <div class="info-text">
-                                {{ detailData?.farm?.address || "--" }}
-                            </div>
-                        </el-form-item>
-                        <el-form-item
-                            v-if="isEdit"
-                            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="选择日期"
-                                :editable="false"
-                            />
-                        </el-form-item>
-                        <el-form-item v-else label-width="70px" class="form-item text-item" label="执行时间">
-                            <div class="info-text">
-                                {{ detailData?.executeDate }}
-                            </div>
-                        </el-form-item>
-                    </div>
-                </div>
-
-                <div class="farm-card" v-if="!onlyPrice">
-                    <!-- 农情互动 -->
-                    <div class="card-title border-bottom between">
-                        <div>农情互动</div>
-                        <!-- <span class="del-tag">删除互动</span> -->
-                    </div>
-                    <div v-if="isEdit" class="interact-form">
-                        <div class="interact-form-item" data-interact-field="phenologyId">
-                            <div class="form-label">
-                                互动阶段
-                            </div>
-                            <div class="form-input-wrapper two-select">
-                                <div class="select-item">
-                                    <el-select
-                                        style="width: 100%"
-                                        v-model="interactFormData.phenologyId"
-                                        placeholder="请选择物候期"
-                                        @change="handlePhenologyChange"
-                                        :editable="false">
-                                        <el-option
-                                            v-for="item in phenologyList"
-                                            :key="item.id"
-                                            :label="item.name"
-                                            :value="item.id"
-                                        ></el-option>
-                                    </el-select>
-                                </div>
-                                <div class="select-item">
-                                    <el-select style="width: 100%" v-model="interactFormData.reproductiveId" placeholder="请选择物候期" :editable="false">
-                                        <el-option
-                                            v-for="item in reproductiveList"
-                                            :key="item.id"
-                                            :label="item.name"
-                                            :value="item.id"
-                                        ></el-option>
-                                    </el-select>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="interact-form-item" data-interact-field="interactionTime">
-                            <div class="form-label">
-                                互动日期
-                            </div>
-                            <div class="form-input-wrapper">
-                                <el-date-picker
-                                    v-model="interactFormData.interactionTime"
-                                    disabled
-                                    style="width: 100%"
-                                    type="date"
-                                    placeholder="请选择日期"
-                                    :editable="false"
-                                />
-                            </div>
-                        </div>
-                        <div class="interact-form-item" data-interact-field="interactionQuestion">
-                            <div class="form-label">
-                                互动问题
-                            </div>
-                            <el-input
-                                v-model="interactFormData.interactionQuestion"
-                                type="textarea"
-                                :rows="3"
-                                show-word-limit
-                                maxlength="35"
-                                placeholder="请设置互动问题"
-                                class="question-textarea"
-                            />
-                        </div>
-                    </div>
-                    <div v-else class="interact-content">
-                        {{ interactFormData?.interactionQuestion }}
-                        <!-- <span class="edit-tag" @click="handleEditInteract(detailData)">点击编辑</span> -->
-                    </div>
-                </div>
-
-                <template v-if="isEdit">
-                    <div class="farm-card prescription-content common-inputs">
-                        <div class="card-title pb-12 between">
-                            药物处方
-                            <div class="add-tag" @click="addDomain()">
-                                <el-icon color="#2199F8"><Plus /></el-icon>新增药物
-                            </div>
-                        </div>
-                        <el-form-item label-width="82px" class="form-item" prop="usageMode" label="施用方式">
-                            <el-select
-                                v-model="dynamicValidateForm.prescription.usageMode"
-                                placeholder="请选择施用方式"
-                                style="width: 100%"
-                            >
-                                <el-option
-                                    v-for="(usage, uId) in allUsageModeList"
-                                    :key="uId"
-                                    :label="usage"
-                                    :value="usage"
-                                />
-                            </el-select>
-                        </el-form-item>
-                        <el-form-item label-width="82px" class="form-item" prop="executeStyle" label="执行方式">
-                            <el-select
-                                    class="select-item"
-                                    v-model="dynamicValidateForm.executeStyle"
-                                    placeholder="执行方式"
-                                    @change="handleExecutionMethodChange"
-                                >
-                                    <el-option
-                                        v-for="(item, index) in modeList"
-                                        :key="index"
-                                        :label="item.name"
-                                        :value="item.value"
-                                    />
-                                </el-select>
-                        </el-form-item>
-                        
-                        <div v-if="dynamicValidateForm.prescription.usageMode !== '人工'">
-                            <el-form-item
-                                v-for="(domain, index) in dynamicValidateForm.prescription.pesticideFertilizerList"
-                                :key="index"
-                                :prop="'prescription.pesticideFertilizerList.' + index + '.value'"
-                                class="prescription-item"
-                            >
-                                <div class="recipe-item">
-                                    <div class="recipe-form">
-                                            <div class="form-box">
-                                                <div class="form-index">药肥{{ index + 1 }}</div>
-                                                <div class="box-item" v-if="domain.typeName">
-                                                    <div class="form-l">药肥类型</div>
-                                                    <div class="form-r r-text">
-                                                        {{ domain.typeName }}
-                                                    </div>
-                                                </div>
-                                                <div class="box-item">
-                                                    <div class="form-l">药肥名称</div>
-                                                    <div class="form-r">
-                                                        <el-select
-                                                            filterable
-                                                            @change="
-                                                                handlePesticideFertilizerChange(index)
-                                                            "
-                                                            v-model="domain.code"
-                                                            placeholder="请选择"
-                                                            style="width: 150px"
-                                                        >
-                                                            <el-option
-                                                                v-for="item in pesticideFertilizersOptions"
-                                                                :key="item.pesticideFertilizerCode"
-                                                                :label="item.defaultName || item.name"
-                                                                :value="item.pesticideFertilizerCode"
-                                                            />
-                                                        </el-select>
-                                                    </div>
-                                                </div>
-
-                                                <div class="mt-8">
-                                                    <div class="box-item sub-item" :data-ratio-index="index">
-                                                        <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"
-                                                                type="number"
-                                                                step="0.01"
-                                                                style="width: 150px"
-                                                                :placeholder="domain.placeholderRatio || '请输入'"
-                                                            >
-                                                                <template #append>倍</template>
-                                                            </el-input>
-                                                        </div>
-                                                    </div>
-                                                    <div class="box-item sub-item" :data-dosage-index="index">
-                                                        <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.dosage"
-                                                                type="number"
-                                                                step="0.01"
-                                                                style="width: 150px"
-                                                                :placeholder="domain.placeholderDosage || '请输入'"
-                                                            >
-                                                                <template #append>{{ domain.unit }}</template>
-                                                            </el-input>
-                                                        </div>
-                                                    </div>
-
-                                                    
-                                                    <div class="box-item">
-                                                        <div class="form-l">药肥品牌</div>
-                                                        <div class="form-r">
-                                                            <el-input
-                                                                v-model="domain.brand"
-                                                                placeholder="药肥品牌"
-                                                                style="width: 150px"
-                                                            />
-                                                        </div>
-                                                    </div>
-                                                    <div class="box-item">
-                                                        <div class="form-l">药肥单价</div>
-                                                        <div class="form-r">
-                                                            <el-input
-                                                                style="width: 150px"
-                                                                v-model="domain.price"
-                                                                type="number"
-                                                                step="0.01"
-                                                                placeholder="单价"
-                                                            >
-                                                                <template #append>元/{{ domain.unit }}</template>
-                                                            </el-input>
-                                                        </div>
-                                                    </div>
-
-                                                    
-
-                                                    <div v-if="!noPrice" class="medicine-item">
-                                                        <div class="item-total">总计:</div>
-                                                        <div class="item-price">
-                                                            {{ getPesticideTotal(domain) }}<span class="item-unit">元</span>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                                <!-- <div class="input-box mark-box">
-                                                    <el-input
-                                                        v-model="domain.remark"
-                                                        style="width: 100%"
-                                                        type="textarea"
-                                                        :rows="2"
-                                                        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="farm-card prescription-content">
-                        <div class="medicine-box">
-                                <div class="form-index">服务报价</div>
-                                <div class="box-wrap">
-                                    <div class="medicine-item mt-8">
-                                        <div class="item-name">单亩价格</div>
-                                        <div class="item-val common-inputs">
-                                            <el-input
-                                                style="width: 150px"
-                                                v-model="servicePricePerMu"
-                                                type="number"
-                                                step="0.01"
-                                                placeholder="服务单价"
-                                            >
-                                                <template #append>元/亩</template>
-                                            </el-input>
-                                        </div>
-                                    </div>
-                                    <div v-if="!noPrice" class="medicine-item">
-                                        <div class="item-total">总计:</div>
-                                        <div class="item-price">
-                                            {{ getServiceTotal() }}<span class="item-unit">元</span>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                    </div>
-
-                    <div class="submit-btn" :class="{ 'center-btn': onlyPrice || defaultTagName === 0 }">
-                        <!-- <div v-if="!onlyPrice" class="btn second" @click.prevent="cancelEdit">取消编辑</div> -->
-                        <div v-if="!onlyPrice && defaultTagName !== 0" class="btn second" @click.prevent="handleCancelAttention">取消关注</div>
-                        <div class="btn" :style="{ opacity: isSaving ? 0.8 : 1 }" @click.prevent="submitForm(formRef)">{{ isSaving ? '保存中...' : '保存' }}</div>
-                    </div>
-                </template>
-
-                <template v-else>
-                    <div class="farm-card prescription-content">
-                        <div class="card-title">药物处方</div>
-                        <div class="table-item">
-                            <div class="form-item">
-                                <div class="item-name">施用方式</div>
-                                <div class="item-text">{{ dynamicValidateForm?.prescription?.usageMode }}</div>
-                            </div>
-                            <div class="form-item">
-                                <div class="item-name">执行方式</div>
-                                <div class="item-text">
-                                    {{ dynamicValidateForm?.prescription?.pesticideFertilizerList[0]?.executeStyle === 1 ? '无人机' : dynamicValidateForm?.prescription?.pesticideFertilizerList[0]?.executeStyle === 3 ? '无人机+人工' : '人工' }}
-                                </div>
-                            </div>
-                        </div>
-                        <div class="new-wrap" v-if="detailData?.prescription?.pesticideFertilizerList?.length">
-                            <div class="new-title">
-                                <div class="title-1"><div class="table-name">使用功效</div></div>
-                                <div class="title-2"><div class="table-name">药肥名称</div></div>
-                                <div class="title-4"><div class="table-name">药肥配比</div></div>
-                                <div class="title-5"><div class="table-name">单亩用量</div></div>
-                            </div>
-                            <div
-                                class="new-table-wrap"
-                                v-for="(subP, prescriptionI) in detailData?.prescription?.pesticideFertilizerList || []"
-                                :key="prescriptionI"
-                            >
-                                <!-- <div
-                                    class="new-prescription"
-                                    v-for="(subP, subI) in prescriptionItem.pesticideFertilizerList"
-                                    :key="subI"
-                                > -->
-                                    <div class="new-table">
-                                        <div class="line-l">
-                                            <div class="line-1 title-1">{{ subP.typeName || '--' }}</div>
-                                            <div class="line-2">
-                                                {{ subP.name || subP.pesticideFertilizerName }}
-                                            </div>
-                                        </div>
-                                        <div class="line-r">
-                                            <div class="line-3">
-                                                <div class="sub-line title-4">{{ subP.ratio ? (subP.ratio + '倍') : '--' }}</div>
-                                                <div class="sub-line title-5">{{ subP.dosage ? (subP.dosage + subP.unit) : '--' }}</div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                    <div class="note-text" v-if="subP.remark">{{ subP.remark }}</div>
-                                <!-- </div> -->
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="farm-card prescription-content">
-                        <div class="card-title">处方报价</div>
-
-                        <div class="price-bottom" v-if="!noPrice">
-                            <div class="info-title-wrap">
-                                <div class="sub-title font-bold">药肥费用</div>
-                                <div class="info-more">
-                                    {{ pesticideCostTotal ? formatArea(pesticideCostTotal) : "--" }}<span class="unit-text">元</span>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="info-content-wrap pt-8">
-                            <price-table :prescriptionData="dynamicValidateForm.prescription" :area="detailData?.farm?.mianji">
-                                <template #bottomContent>
-                                    <div class="price-bottom">
-                                        <div class="info-title-wrap">
-                                            <div class="sub-title font-bold">服务费用</div>
-                                            <div class="info-more" v-if="!noPrice">
-                                                {{ detailData?.serviceMuPrice ? serviceCostTotal : '--' }}
-                                                <span class="unit-text">元</span>
-                                            </div>
-                                        </div>
-                                        <div class="price-info">
-                                            <div class="info-l">
-                                                单亩价格<span class="main-text">{{
-                                                    detailData?.serviceMuPrice
-                                                        ? detailData?.serviceMuPrice + "元/亩"
-                                                        : "--"
-                                                }}</span>
-                                            </div>
-                                        </div>
-                                        <div class="price-total" v-if="!noPrice">
-                                            报价合计:<span class="main-val">{{
-                                                totalCost ? formatArea(totalCost) : "--"
-                                            }}</span
-                                            >元
-                                        </div>
-                                    </div>
-                                </template>
-                            </price-table>
-                        </div>
-                    </div>
-                    <template v-if="!isDefault">
-                        <div class="submit-btn" :class="{ 'center-btn': defaultTagName === 0 }" v-has-permission="'农事规划'">
-                            <div v-if="defaultTagName !== 0" class="btn second" @click.prevent="handleCancelAttention">取消关注</div>
-                            <div class="btn" @click.prevent="toEditPrescription">编辑处方</div>
-                        </div>
-                    </template>
-                </template>
-            </el-form>
-        </div>
-    </div>
-
-    <!-- 服务报价单 -->
-    <price-sheet-popup ref="priceSheetPopupRef"></price-sheet-popup>
-
-    <!-- 互动设置弹窗 -->
-    <interact-popup
-        ref="interactPopupRef"
-        @handleSaveSuccess="handleSaveInteractSuccess"
-        @handleDeleteInteract="handleDeleteInteract"
-    ></interact-popup>
-
-    <!-- 取消关注提示 -->
-    <tip-popup
-        v-model:show="showTipPopup"
-        type="warning"
-        text="您确定要取消关注"
-        text2="农事吗?系统将不再为您推送该农事"
-        :highlightText="detailData.name"
-        :overlayStyle="{ 'z-index': 9999 }"
-        buttonText="确认取消关注"
-        @confirm="handleBtn"
-        :hasClose="true"
-        :closeOnClickOverlay="false"
-    />
-    <!-- 完善信息弹窗 -->
-    <popup 
-        v-model:show="showCompletePopup" 
-        round 
-        class="complete-tip-popup"
-        closeable
-    >
-    <img class="tip-icon success-icon" src="@/assets/img/home/right.png" alt="" />
-    <div class="tip-text success-text">
-        农事信息已完善
-    </div>
-        <div class="complete-content">
-        </div>
-        <div class="btn-wrap">
-            <div class="btn-item second" @click="handleViewDetail">查看详情</div>
-            <div class="btn-item primary" v-if="!allDone" @click="handleCompleteNext">完善下一个农事</div>
-            <div class="btn-item primary" v-else @click="handleBackToPlan">回到种植方案</div>
-        </div>
-    </popup>
-</template>
-
-<script setup>
-import { onActivated, ref, reactive, onDeactivated, onBeforeUnmount, computed, onMounted, nextTick } 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 { formatArea } from "@/common/commonFun";
-import priceSheetPopup from "@/components/popup/priceSheetPopup.vue";
-import interactPopup from "@/components/popup/interactPopup.vue";
-import priceTable from "../agri_work/components/priceTable.vue";
-import tipPopup from "@/components/popup/tipPopup.vue";
-import dayjs from "dayjs";
-const store = useStore();
-const pageRef = ref(null);
-const router = useRouter();
-const route = useRoute();
-
-// 检查是否有"农事规划"权限
-const hasPlanPermission = computed(() => {
-    try {
-        const userInfoStr = localStorage.getItem("localUserInfo");
-        if (!userInfoStr) return false;
-        const userInfo = JSON.parse(userInfoStr);
-        const permissions = userInfo.agriculturalPermissions || [];
-        return permissions.includes("农事规划");
-    } catch (error) {
-        console.error("解析用户信息失败:", error);
-        return false;
-    }
-});
-
-const tagList = ref([
-    { label: "托管农事", value: 2 },
-    { label: "特别关注", value: 1 },
-    // { label: "取消关注", value: 0 },
-]);
-
-const tagName = ref("");
-const defaultTagName = ref("");
-
-// 互动表单数据
-const interactFormData = ref({
-    phenologyId: "",
-    reproductiveId: "",
-    interactionTime: "",
-    interactionQuestion: "",
-});
-const phenologyList = ref([]);
-const reproductiveList = ref([]);
-// 是否编辑
-const isEdit = ref(false);
-// 是否只显示价格,不需要农情互动
-const onlyPrice = ref(false);
-// 是否不显示价格,种植方案没有价格
-const noPrice = ref(false);
-// 是否标注方案
-const isDefault = ref(false);
-// 是否在完善信息弹窗中
-const isDoingComplete = ref(false);
-// 是否正在保存
-const isSaving = ref(false);
-
-const showCompletePopup = ref(false);
-onActivated(() => {
-    isDefault.value = route.query.isDefault == 'true' ? true : false;
-    isEdit.value = route.query.isEdit == 'true' ? true : false;
-    onlyPrice.value = route.query.onlyPrice == 'true' ? true : false;
-    noPrice.value = route.query.noPrice == 'true' ? true : false;
-    // enabled为0时,方案不可用,需要完善
-    isDoingComplete.value = route.query.enabled == 0 ? true : false;
-    // 方案列表中的ids数组
-    if (route.query.farmWorkId) {
-        getDetail();
-    }
-    if (isDoingComplete.value) {
-        let farmWorkAndArrangeIdIdsArray = (() => {
-                const stored = sessionStorage.getItem("farmWorkAndArrangeIds");
-                return stored ? JSON.parse(stored) : [];
-            })();
-        ids.value = farmWorkAndArrangeIdIdsArray;
-        if (ids.value.length === 0 || ids.value.length === 1) {
-            allDone.value = true;
-        }
-    }
-    nextTick(() => {
-        if (pageRef.value) {
-            pageRef.value.scrollTop = 0;
-        } else {
-            window.scrollTo(0, 0);
-        }
-    });
-    // 初始化 prescription 对象
-    if (!route.query.farmWorkId) {
-        dynamicValidateForm.prescription = {
-            usageMode: "",
-            pesticideFertilizerList: [
-                {
-                    code: "",
-                    name: "",
-                    dosage: "",
-                    ratio: "",
-                    typeName: "",
-                    muPrice: 0,
-                    executeStyle: 1,
-                    unit: "",
-                },
-            ],
-        };
-    }
-});
-
-const priceSheetPopupRef = ref(null);
-const showPriceSheetPopup = () => {
-    priceSheetPopupRef.value.handleShowPopup(detailData.value);
-};
-
-const handlePhenologyChange = async (val) => {
-    interactFormData.value.reproductiveId = "";
-    const { data } = await VE_API.farm.listByPhenologyId({ phenologyId: val });
-    if (!data || !Array.isArray(data)) return;
-    reproductiveList.value = data;
-};
-
-const statusMap = ref({
-    0: "",
-    1: "特别关注",
-    2: "托管农事",
-});
-const detailData = ref({});
-const userInfo = localStorage.getItem('localUserInfo');
-const userInfoObj = userInfo ? JSON.parse(userInfo) : {};
-const getDetail = async () => {
-    const { data, code } = await VE_API.farm.getFarmWorkLib({ id: route.query.farmWorkId, farmId: route.query.farmId, agriculturalId: userInfoObj?.agriculturalId });
-    if(code === 0) {
-        detailData.value = data;
-        dynamicValidateForm.executeDate = data.executeDate;
-        dynamicValidateForm.prescription.usageMode = data?.prescription?.usageMode === '其他' ? '根部施' : data?.prescription?.usageMode;
-        // 从 prescription 获取数据
-        dynamicValidateForm.prescription = data.prescription || {
-            usageMode: "",
-            pesticideFertilizerList: [],
-        };
-        dynamicValidateForm.executeStyle = data?.prescription?.pesticideFertilizerList[0]?.executeStyle;
-        servicePricePerMu.value = detailData.value.serviceMuPrice || null;
-        if (!isDefault.value) {
-            data?.prescription?.pesticideFertilizerList.forEach(item => {
-                item.placeholderRatio = item.ratio || '';
-                item.placeholderDosage = item.dosage || '';
-                if (isNaN(item.ratio)) {
-                    item.ratio = null;
-                }
-                if (isNaN(item.dosage)) {
-                    item.dosage = null;
-                }
-            });
-        }
-        const pesticideFertilizerCodes = data?.prescription?.pesticideFertilizerList.map(item => item.code);
-        getPriceList(data.schemeId, pesticideFertilizerCodes);
-        
-        // 加载互动表单数据
-        if (data.id) {
-            // 重置互动表单数据
-            interactFormData.value = {
-                phenologyId: "",
-                reproductiveId: "",
-                interactionTime: "",
-                interactionQuestion: "",
-            };
-            // 按照 interactPopup.vue 的方式获取数据
-            await getPhenologyList(data.containerSpaceTimeId || route.query.containerSpaceTimeId);
-            await getFarmWorkArrangeDetail(route.query.id || route.query.arrangeId);
-        }
-    }
-};
-
-const getPriceList = async (schemeId, pesticideFertilizerCodes) => {
-    const { data } = await VE_API.farm.getPriceList({ schemeId, pesticideFertilizerCodes });
-    if (!data || !Array.isArray(data)) return;
-
-    dynamicValidateForm.prescription.pesticideFertilizerList.forEach((item) => {
-        const priceInfo = data.find((p) => p.pesticideFertilizerCode === item.code);
-        if (!priceInfo) return;
-        item.price = priceInfo.price ?? item.price;
-        item.brand = priceInfo.brand ?? item.brand;
-    });
-
-    quotationData.value = {...detailData.value, ...dynamicValidateForm};
-};
-
-const showTipPopup = ref(false);
-// 取消关注弹窗
-const handleCancelAttention = () => {
-    showTipPopup.value = true;
-};
-
-const handleBtn = () => {
-    showTipPopup.value = false;
-    // 切换标记
-    VE_API.container_farm_work_arrange.toggleFollow({ id: route.query.id, isFollow: 0 }).then((res) => {
-        if (res.code === 0) {
-            ElMessage.success("操作成功");
-            router.back();
-        }
-    });
-};
-
-const toEditPrescription = () => {
-    isEdit.value = true;
-    if (tagName.value === 0) {
-        tagName.value = 1;
-    }
-    nextTick(() => {
-        if (pageRef.value) {
-            pageRef.value.scrollTo({ top: 0, behavior: "auto" });
-        } else {
-            window.scrollTo(0, 0);
-        }
-    });
-};
-
-const quotationData = ref({});
-
-
-// 计算单个药肥的总计:单价 * 单亩用量 * 亩数
-const getPesticideTotal = (pesticide) => {
-    const price = Number(pesticide.price || 0);
-    const dosage = Number(pesticide.dosage || 0); // 单亩用量
-    const area = Number(detailData.value.farm?.mianji || 0); // 农场面积
-    if (!price || !dosage || !area) return "--";
-    const total = (price * dosage * area).toFixed(2);
-    return total;
-};
-
-function getServiceCost(cost, area) {
-    if (!cost || !area) return "--";
-    return (parseFloat(cost) * parseFloat(area)).toFixed(2);
-}
-
-const handleViewDetail = () => {
-    showCompletePopup.value = false;
-    isEdit.value = false;
-    nextTick(() => {
-        if (pageRef.value) {
-            pageRef.value.scrollTo({ top: 0, behavior: "auto" });
-        } else {
-            window.scrollTo(0, 0);
-        }
-    });
-};
-const allDone = ref(false);
-const handleBackToPlan = () => {
-    router.back();
-};
-
-const ids = ref([]);
-const handleCompleteNext = () => {
-    showCompletePopup.value = false;
-    
-    // 如果数组为空,说明已经全部完成
-    if (!ids.value || ids.value.length === 0) {
-        allDone.value = true;
-        return;
-    }
-    
-    // 找到当前 farmWorkId 在数组中的索引
-    const currentFarmWorkId = route.query.farmWorkId;
-    const currentIndex = ids.value.findIndex(item => String(item.farmWorkId) === String(currentFarmWorkId));
-    
-    if (currentIndex === -1) {
-        // 如果找不到当前项,说明可能已经被删除或不存在
-        allDone.value = true;
-        console.log('未找到当前farmWorkId');
-        return;
-    }
-    
-    // 如果数组只剩一个(最后一个),标记为全部完成
-    if (ids.value.length === 1) {
-        // 从数组中删除当前项(已经完成的)
-        ids.value.splice(currentIndex, 1);
-        // 更新 sessionStorage
-        sessionStorage.setItem("farmWorkAndArrangeIds", JSON.stringify(ids.value));
-        allDone.value = true;
-        return;
-    }
-    
-    // 判断是否是最后一个
-    const isLast = currentIndex === ids.value.length - 1;
-    
-    // 如果是最后一个
-    if (isLast) {
-        // 从数组中删除当前项(已经完成的)
-        ids.value.splice(currentIndex, 1);
-        // 更新 sessionStorage
-        sessionStorage.setItem("farmWorkAndArrangeIds", JSON.stringify(ids.value));
-        
-        // 如果删除后数组为空,标记为全部完成
-        if (ids.value.length === 0) {
-            allDone.value = true;
-            return;
-        }
-        
-        // 如果删除后数组不为空,从第一个开始获取
-        const firstItem = ids.value[0];
-        if (firstItem && firstItem.farmWorkId && firstItem.arrangeId) {
-            router.replace({
-                path: "/modify",
-                query: {
-                    id: firstItem.arrangeId,
-                    farmWorkId: firstItem.farmWorkId,
-                    farmId: route.query.farmId,
-                    containerSpaceTimeId: route.query.containerSpaceTimeId,
-                    schemeId: route.query.schemeId,
-                    isEdit: route.query.isEdit,
-                    onlyPrice: route.query.onlyPrice,
-                },
-            });
-            return;
-        }
-        
-        // 如果第一个项无效,标记为全部完成
-        allDone.value = true;
-        return;
-    }
-    
-    // 获取下一个农事:取当前索引+1位置的值
-    const nextItem = ids.value[currentIndex + 1];
-    
-    if (nextItem && nextItem.farmWorkId && nextItem.arrangeId) {
-        // 从数组中删除当前项(已经完成的)
-        ids.value.splice(currentIndex, 1);
-        // 更新 sessionStorage
-        sessionStorage.setItem("farmWorkAndArrangeIds", JSON.stringify(ids.value));
-        
-        router.replace({
-            path: "/modify",
-            query: {
-                id: nextItem.arrangeId,
-                farmWorkId: nextItem.farmWorkId,
-                farmId: route.query.farmId,
-                containerSpaceTimeId: route.query.containerSpaceTimeId,
-                schemeId: route.query.schemeId,
-                enabled: 0,
-                isEdit: true,
-                onlyPrice: false,
-                noPrice: true,
-                isDefault: false,
-            },
-        });
-        setTimeout(() => {
-            window.location.reload();
-        }, 500);
-    } else {
-        // 从数组中删除当前项(已经完成的)
-        ids.value.splice(currentIndex, 1);
-        // 更新 sessionStorage
-        sessionStorage.setItem("farmWorkAndArrangeIds", JSON.stringify(ids.value));
-        allDone.value = true;
-        console.log('没有下一个农事需要完善');
-    }
-};
-const resetForm = (formEl) => {
-    if (!formEl) return;
-    formEl.resetFields();
-};
-
-// 清空所有数据
-const clearData = () => {
-    // 清空表单
-    resetForm(formRef.value);
-
-    // 清空详情数据
-    detailData.value = {};
-
-    // 清空表单数据
-    dynamicValidateForm.farmWorkName = "";
-    dynamicValidateForm.conditionRate = "";
-    dynamicValidateForm.purpose = "";
-    dynamicValidateForm.executeDate = dayjs().format("YYYY-MM-DD");
-    dynamicValidateForm.prescription = {
-        id: "",
-        usageMode: "",
-        farmWorkLibCode: "",
-        expertId: "",
-        phenology: "",
-        soil: "",
-        speed: null,
-        pesticideFertilizerList: [
-            {
-                code: "",
-                name: "",
-                dosage: "",
-                ratio: "",
-                typeName: "",
-                muPrice: 0,
-                executeStyle: 1,
-                unit: "",
-            },
-        ],
-    };
-};
-
-onDeactivated(() => {
-    clearData();
-});
-
-onBeforeUnmount(() => {
-    clearData();
-});
-
-const cancelEdit = () => {
-    ElMessageBox.confirm("确认要取消编辑吗?", "提示", {
-        confirmButtonText: "确认",
-        cancelButtonText: "取消",
-        type: "warning",
-    })
-        .then(() => {
-            isEdit.value = false;
-            nextTick(() => {
-                if (pageRef.value) {
-                    pageRef.value.scrollTop = 0;
-                } else {
-                    window.scrollTo(0, 0);
-                }
-            });
-        })
-        .catch(() => {
-            console.log("取消编辑");
-        });
-};
-
-const modeList = ref([
-    { name: "无人机", value: 1 },
-    { name: "人工", value: 2 },
-    { name: "无人机+人工", value: 3 },
-]);
-
-const handleExecutionMethodChange = (index, val) => {
-    // if (val == 1) {
-    //     servicePricePerMu.value = detailData.value.uavServicePrice;
-    // } else {
-    //     servicePricePerMu.value = detailData.value.manualServicePrice;
-    // }
-};
-
-// 表单
-const formRef = ref();
-const dynamicValidateForm = reactive({
-    farmWorkName: "",
-    conditionRate: "",
-    purpose: "",
-    executeDate: dayjs().format("YYYY-MM-DD"),
-    usageMode: "",
-    executeStyle: 2,
-    executionMethod: 2,
-    prescription: {
-        id: "",
-        usageMode: "",
-        farmWorkLibCode: "",
-        expertId: "",
-        phenology: "",
-        soil: "",
-        speed: null,
-        pesticideFertilizerList: [
-            {
-                code: "",
-                id: "",
-                name: "",
-                dosage: "",
-                ratio: "",
-                brand: "",
-                price: "",
-                typeName: "",
-                muPrice: 0,
-                executeStyle: 1,
-                unit: "",
-            },
-        ],
-    },
-});
-
-const rules = {
-    farmWorkName: [
-        {
-            required: true,
-            message: "请输入农事名称",
-            trigger: "blur",
-        },
-    ],
-    conditionRate: [
-        {
-            required: false,
-            message: "请输入触发条件",
-            trigger: "blur",
-        },
-    ],
-    executeDate: [
-        {
-            required: false,
-            message: "请选择执行时间",
-            trigger: "blur",
-        },
-    ],
-};
-
-const addDomain = () => {
-    if (!dynamicValidateForm.prescription.pesticideFertilizerList) {
-        dynamicValidateForm.prescription.pesticideFertilizerList = [];
-    }
-    dynamicValidateForm.prescription.pesticideFertilizerList.unshift({
-        code: "",
-        name: "",
-        dosage: "",
-        ratio: "",
-        brand: "",
-        price: "",
-        typeName: "",
-        muPrice: 0,
-        id: "",
-        executeStyle: 2,
-        unit: "",
-    });
-};
-
-let pesticideFertilizersOptions = ref([]);
-VE_API.z_farm_work_order.pesticideFertilizersList().then(({ data }) => {
-    pesticideFertilizersOptions.value = data;
-});
-
-const allUsageModeList = ["树冠+内膛", "地面喷施", "树冠喷施", "根部施", "叶面施", "内膛喷施", "其他"];
-
-/**
- * 选择药肥的时候修改订单中药肥pesticideFertilizerId 以外其他数据
- * @param index
- */
-const handlePesticideFertilizerChange = (index) => {
-    const currentItem = dynamicValidateForm.prescription.pesticideFertilizerList[index];
-    let obj = pesticideFertilizersOptions.value.filter(
-        (item) => currentItem.code === item.pesticideFertilizerCode
-    )[0];
-    if (obj) {
-        dynamicValidateForm.prescription.pesticideFertilizerList[index] = {
-            ...currentItem,
-            code: obj.pesticideFertilizerCode,
-            id: obj.id,
-            name: obj.name || obj.defaultName,
-            typeName: obj.typeName,
-            unit: obj.unit,
-            ratio: "", // 清空亩兑水量
-            dosage: "", // 清空单亩用量
-            executeStyle: obj.executionMethod || 1,
-        };
-    }
-};
-
-const removeDomain = (index) => {
-    if (index !== -1 && dynamicValidateForm.prescription.pesticideFertilizerList) {
-        dynamicValidateForm.prescription.pesticideFertilizerList.splice(index, 1);
-    }
-};
-
-const resetItemForm = (index) => {
-    if (dynamicValidateForm.prescription.pesticideFertilizerList) {
-        dynamicValidateForm.prescription.pesticideFertilizerList[index] = {
-            code: "",
-            id: "",
-            name: "",
-            dosage: "",
-            ratio: "",
-            brand: "",
-            price: "",
-            typeName: "",
-            muPrice: 0,
-            executeStyle: 1,
-            unit: "",
-        };
-    }
-};
-
-const servicePricePerMu = ref(null);
-
-// 服务费用总计(数值):亩单价 * 亩数
-const serviceCostTotal = computed(() => {
-    const price = Number(servicePricePerMu.value || 0);
-    const area = Number(detailData.value?.farm?.mianji || detailData.value?.area || 0);
-    if (!price || !area) return 0;
-    return Number((price * area).toFixed(2));
-});
-
-// 显示用的服务费用(字符串或 "--")
-const getServiceTotal = () => {
-    const total = serviceCostTotal.value;
-    return total ? total.toFixed(2) : "--";
-};
-
-// 药肥费用总计:∑(单价 * 单亩用量 * 亩数)
-const pesticideCostTotal = computed(() => {
-    const list = dynamicValidateForm.prescription?.pesticideFertilizerList || [];
-    const area = Number(detailData.value?.farm?.mianji || detailData.value?.area || 0);
-    if (!list.length || !area) return 0;
-
-    const sum = list.reduce((acc, item) => {
-        const price = Number(item?.price || 0);
-        const dosage = Number(item?.dosage || 0);
-        if (!price || !dosage) return acc;
-        return acc + price * dosage * area;
-    }, 0);
-
-    return Number(sum.toFixed(2));
-});
-
-// 报价合计 = 药肥费用 + 服务费用
-const totalCost = computed(() => {
-    const pesticide = Number(pesticideCostTotal.value || 0);
-    const service = Number(serviceCostTotal.value || 0);
-    if (!pesticide && !service) return '--';
-    return Number((pesticide + service).toFixed(2));
-});
-
-const submitForm = (formEl) => {
-    if (!formEl) return;
-    formEl.validate(async (valid) => {
-        if (valid) {
-            // 校验标记是否已选择
-            if (!validateTagName()) return;
-
-            // 校验施用方式是否已选择
-            if (!validateUsageMode()) return;
-
-            // 校验农情互动,不通过,直接返回失败
-            if (!onlyPrice.value && !validateInteractForm()) return false;
-
-            // 校验药肥的亩兑水量和单亩用量是否填写
-            if (!validatePesticideDosage()) return;
-
-            // 保存报价信息前先校验是否填写完整
-            if (!validatePriceInfos()) return;
-
-            // 检验服务报价是否填写
-            if (!validateServicePrice()) return;
-            submit();
-        } else {
-            console.log("error submit!");
-        }
-    });
-};
-
-// 校验标记是否已选择
-const validateTagName = () => {
-    if (tagName.value !== 1 && tagName.value !== 2) {
-        ElMessage.warning("请选择标记类型");
-        return false;
-    }
-    return true;
-};
-
-// 校验施用方式是否已选择
-const validateUsageMode = () => {
-    if (!dynamicValidateForm.prescription?.usageMode || dynamicValidateForm.prescription.usageMode === "") {
-        ElMessage.warning("请选择施用方式");
-        return false;
-    }
-    return true;
-};
-
-// 检验服务报价是否填写
-const validateServicePrice = () => {
-    if (!servicePricePerMu.value) {
-        ElMessage.warning("请完善服务报价信息");
-        return false;
-    }
-    return true;
-};
-
-// 校验药肥的亩兑水量和单亩用量是否填写
-const validatePesticideDosage = () => {
-    const list = dynamicValidateForm.prescription?.pesticideFertilizerList || [];
-    if (!list.length) return true; // 没有药肥就不校验
-
-    // 找到第一个未填写完整的药肥
-    for (let i = 0; i < list.length; i++) {
-        const item = list[i];
-        // 如果选择了药肥(有 code),就必须填写亩兑水量和单亩用量
-        if (item.code) {
-            const hasRatio = item.ratio !== undefined && item.ratio !== null && item.ratio !== "";
-            const hasDosage = item.dosage !== undefined && item.dosage !== null && item.dosage !== "";
-            
-            if (!hasRatio || !hasDosage) {
-                ElMessage.warning("请完善药物处方信息");
-                return false;
-            }
-        }
-    }
-    return true;
-};
-
-// 校验报价信息是否填写完整
-const validatePriceInfos = () => {
-    const list = dynamicValidateForm.prescription?.pesticideFertilizerList || [];
-    if (!list.length) return true; // 没有药肥就不校验
-
-    // 找到第一个未填写完整的药肥
-    const invalidIndex = list.findIndex((item) => {
-        // 只要选择了药肥(有 id),就必须填写单价和品牌
-        if (!item.id) return false; // 没选择药肥不校验
-        const hasPrice = item.price !== undefined && item.price !== null && item.price !== "";
-        const hasBrand = !!item.brand;
-        return !hasPrice || !hasBrand;
-    });
-
-    if (invalidIndex !== -1) {
-        ElMessage.warning("请先完善报价信息");
-        return false;
-    }
-    return true;
-};
-
-const submit = async () => {
-    // 设置保存状态
-    isSaving.value = true;
-    
-    try {
-        const data = {
-            id: route.query.farmWorkId,
-            ...dynamicValidateForm,
-            serviceMuPrice: servicePricePerMu.value,
-            prescription: dynamicValidateForm.prescription
-        };
-        await VE_API.monitor.saveFarmWorkLib(data);
-        
-        if (!onlyPrice.value) {
-            await handleSaveInteract();
-        }
-
-        // 保存报价信息
-        const priceList = {
-            schemeId: detailData.value.schemeId,
-            pesticideFertilizerInfos: dynamicValidateForm.prescription.pesticideFertilizerList.map(item => {
-                return {
-                    pesticideFertilizerId: item.id,
-                    price: item.price,
-                    brand: item.brand,
-                }
-            }),
-        }
-        const res = await VE_API.farm.updateBatchByScheme(priceList);
-        
-        // 切换标记
-        await VE_API.container_farm_work_arrange.toggleFollow({ id: route.query.id, isFollow: tagName.value });
-        
-        if (res.code === 0) {
-            await getDetail();
-            if (isDoingComplete.value) {
-                // 更新 sessionStorage(不删除当前项,保持数组完整)
-                sessionStorage.setItem("farmWorkAndArrangeIds", JSON.stringify(ids.value));
-                
-                showCompletePopup.value = true;
-                return;
-            }
-            ElMessage.success("保存成功");
-            if (onlyPrice.value) {
-                // router.push(`/task_condition?noReload=true`);
-                router.back();
-                return;
-            }
-            isEdit.value = false;
-            nextTick(() => {
-                if (pageRef.value) {
-                    pageRef.value.scrollTop = 0;
-                } else {
-                    window.scrollTo(0, 0);
-                }
-            });
-        } else {
-            // 不需要处方报价信息的农事
-            if (priceList.pesticideFertilizerInfos.length === 0) {
-                if (onlyPrice.value) {
-                    // router.push(`/task_condition?noReload=true`);
-                    router.back();
-                    return;
-                }
-                isEdit.value = false;
-                getDetail();
-                nextTick(() => {
-                    if (pageRef.value) {
-                        pageRef.value.scrollTop = 0;
-                    } else {
-                        window.scrollTo(0, 0);
-                    }
-                });
-            }
-        }
-    } catch (error) {
-        console.error("保存失败:", error);
-        ElMessage.error("保存失败,请重试");
-    } finally {
-        // 无论成功或失败,都要关闭保存状态
-        isSaving.value = false;
-    }
-};
-
-const handleSaveInteractSuccess = () => {
-    getDetail();
-};
-
-const interactPopupRef = ref(null);
-const handleEditInteract = (item) => {
-    if (interactPopupRef.value) {
-        interactPopupRef.value.showPopup({...item, containerSpaceTimeId: route.query.containerSpaceTimeId,id:route.query.id});
-    }
-};
-
-// 获取物候期列表
-const getPhenologyList = async (containerSpaceTimeId) => {
-    if (!containerSpaceTimeId) {
-        phenologyList.value = [];
-        return;
-    }
-    const res = await VE_API.monitor.listPhenology({ containerSpaceTimeId });
-    if (res.code === 0) {
-        phenologyList.value = res.data || [];
-    }
-};
-
-// 获取互动设置详情
-const getFarmWorkArrangeDetail = async (id) => {
-    if (!id) return;
-    const { data, code } = await VE_API.farm.getFarmWorkArrangeDetail({ id });
-    if(code === 0) {
-        tagName.value = data.isFollow;
-        defaultTagName.value = data.isFollow;
-        await handlePhenologyChange(data.phenologyId);
-        interactFormData.value = {
-            phenologyId: data.phenologyId || "",
-            reproductiveId: data.reproductiveId || "",
-            interactionTime: data.interactionTime || "",
-            interactionQuestion: data.interactionQuestion || "",
-        };
-    }
-};
-
-// 格式化日期
-const formatInteractDate = (date) => {
-    // 如果已经是字符串格式 YYYY-MM-DD,直接返回
-    if (typeof date === "string" && /^\d{4}-\d{2}-\d{2}$/.test(date)) {
-        return date;
-    }
-    // 如果是 Date 对象,进行转换
-    if (date instanceof Date) {
-        let year = date.getFullYear();
-        let month = String(date.getMonth() + 1).padStart(2, "0");
-        let day = String(date.getDate()).padStart(2, "0");
-        return `${year}-${month}-${day}`;
-    }
-    // 其他情况返回原值
-    return date;
-};
-
-// 验证互动表单
-const validateInteractForm = () => {
-    if (!interactFormData.value.phenologyId) {
-        ElMessage.warning("请选择互动阶段");
-        return false;
-    }
-    if (!interactFormData.value.reproductiveId) {
-        ElMessage.warning("请选择互动阶段");
-        return false;
-    }
-    if (!interactFormData.value.interactionTime) {
-        ElMessage.warning("请选择互动时间");
-        return false;
-    }
-    if (!interactFormData.value.interactionQuestion?.trim()) {
-        ElMessage.warning("请设置互动问题");
-        return false;
-    }
-    return true;
-};
-
-// 保存互动设置
-const handleSaveInteract = async () => {
-
-    const paramsObj = {
-        id: route.query.id,
-        ...interactFormData.value,
-        interactionTime: formatInteractDate(interactFormData.value.interactionTime),
-    };
-
-    try {
-        const res = await VE_API.monitor.updateFarmWorkArrange(paramsObj);
-        if (res.code !== 0) {
-            ElMessage.error(res.message || "保存农情互动信息失败");
-            return false;
-        }
-        return true;
-    } catch (error) {
-        console.error("保存互动设置失败:", error);
-        ElMessage.error("保存失败,请重试");
-        return false;
-    }
-};
-
-// 删除互动设置
-const handleDeleteInteract = () => {
-    ElMessageBox.confirm("确定要删除该互动设置吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-    })
-        .then(async () => {
-            if (!detailData.value.id) return;
-            const res = await VE_API.monitor.deleteFarmWorkArrange({ id: detailData.value.id });
-            if (res.code === 0) {
-                ElMessage.success("删除成功");
-                // 清空表单数据
-                interactFormData.value = {
-                    phenologyId: "",
-                    interactionTime: "",
-                    interactionQuestion: "",
-                };
-                await getDetail(); // 重新获取详情
-            } else {
-                ElMessage.error(res.message || "删除失败");
-            }
-        })
-        .catch(() => {
-            // 用户取消,不做任何操作
-        });
-};
-</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: 20px 10px 10px;
-        border-radius: 6px;
-    }
-    .new-farming-content {
-        margin: 41px 0 62px 0;
-        padding: 4px 12px 8px 12px;
-        width: 100%;
-        box-sizing: border-box;
-        &.no-permission{
-            margin-bottom: 12px;
-        }
-
-        // ::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);
-            &.center-btn {
-                justify-content: center;
-            }
-            .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;
-        &.between {
-            justify-content: space-between;
-            .del-tag {
-                color: #e04c4c;
-                border: 1px solid #e04c4c;
-                border-radius: 5px;
-                padding: 4px 14px;
-                font-size: 12px;
-                font-weight: normal;
-            }
-            .title-tag {
-                padding: 2px 10px;
-                height: 26px;
-                line-height: 26px;
-            }
-        }
-        // justify-content: space-between;
-        .add-tag {
-            font-size: 12px;
-            color: #2199f8;
-            padding: 0px 11px;
-            border: 1px solid #2199F8;
-            border-radius: 5px;
-            font-weight: normal;
-            height: 28px;
-            line-height: 28px;
-        }
-        .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;
-            display: inline-block;
-        }
-    }
-    .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;
-        }
-        .border-bottom {
-            padding-bottom: 7px;
-            border-bottom: 1px solid rgba(245, 245, 245, 0.99);
-        }
-    }
-
-    .table-item {
-        padding: 6px 0 10px 0;
-        .form-item {
-            display: flex;
-            align-items: center;
-            font-size: 14px;
-            color: #767676;
-            height: 24px;
-            .item-name {
-                width: 80px;
-                color: rgba(0, 0, 0, 0.2);
-            }
-        }
-    }
-
-    .new-wrap {
-        border-radius: 5px;
-        text-align: center;
-        border: 1px solid rgba(225, 225, 225, 0.5);
-        .new-title {
-            background: rgba(241, 241, 241, 0.4);
-            border-radius: 5px 5px 0 0;
-            border-bottom: 1px solid rgba(225, 225, 225, 0.5);
-            display: flex;
-            color: #767676;
-            // justify-content: space-around;
-            padding: 3px 0px;
-            font-size: 12px;
-            .table-name {
-                width: 24px;
-                font-size: 12px;
-                margin: 0 auto;
-            }
-        }
-
-        .title-1 {
-            width: 46px;
-        }
-        .title-2 {
-            flex: 1;
-        }
-        .title-3 {
-            width: 52px;
-        }
-        .title-4 {
-            width: 56px;
-        }
-        .title-5 {
-            width: 52px;
-        }
-        .new-table-wrap {
-            padding: 5px 0;
-            .new-prescription + .new-prescription {
-                border-top: 1px solid rgba(225, 225, 225, 0.8);
-            }
-            // .new-prescription {
-                .new-table {
-                    display: flex;
-                    align-items: center;
-                    // border: 1px solid rgba(225, 225, 225, 0.8);
-                    background: #fff;
-                    border-radius: 5px;
-                    color: rgba(0, 0, 0, 0.6);
-                    font-size: 11px;
-                    .line-l {
-                        display: flex;
-                        flex: 1;
-                        .line-2 {
-                            flex: 1;
-                            padding: 0 2px;
-                        }
-                    }
-                    .line-r {
-                        &.has-border {
-                            border-left: 1px solid rgba(225, 225, 225, 0.8);
-                        }
-                        .line-3 {
-                            display: flex;
-                            align-items: center;
-                        }
-                        .sub-line {
-                            padding: 10px 0;
-                        }
-                        .line-4 {
-                            display: flex;
-                            align-items: center;
-                            border-top: 1px solid rgba(225, 225, 225, 0.8);
-                        }
-                        .execute-line {
-                            border-right: 1px solid rgba(225, 225, 225, 0.8);
-                        }
-                    }
-                }
-                .note-text {
-                    margin: 8px 0 4px 0;
-                    color: rgba(0, 0, 0, 0.4);
-                    background: #fff;
-                    padding: 6px 8px;
-                    border-radius: 5px;
-                    text-align: left;
-                    font-size: 11px;
-                }
-            // }
-            // .new-prescription + .new-prescription {
-            //     padding-top: 8px;
-            // }
-        }
-    }
-
-    .info-content-wrap {
-        ::v-deep {
-            .new-table-wrap {
-                padding: 5px 0;
-                .new-prescription + .new-prescription {
-                    border-top: 1px solid rgba(225, 225, 225, 0.8);
-                }
-            }
-        }
-    }
-    .price-bottom {
-        padding-top: 8px;
-
-        .info-title-wrap {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            color: #000;
-            .info-more {
-                font-size: 18px;
-            }
-            .unit-text {
-                font-size: 12px;
-            }
-        }
-        .price-info {
-            padding: 8px 0;
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            color: rgba(0, 0, 0, 0.2);
-            .main-text {
-                padding-left: 20px;
-                color: rgba(0, 0, 0, 0.8);
-            }
-            .info-c {
-                flex: 1;
-                text-align: center;
-            }
-        }
-        .price-total {
-            height: 38px;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            border: 1px solid rgba(33, 153, 248, 0.5);
-            background: rgba(33, 153, 248, 0.1);
-            color: #000000;
-            border-radius: 4px;
-            .main-val {
-                font-size: 20px;
-                font-weight: bold;
-                color: #2199f8;
-                padding-right: 2px;
-            }
-        }
-    }
-    .pt-8 {
-        padding-top: 8px;
-    }
-    .pb-8 {
-        padding-bottom: 8px;
-    }
-
-    .common-inputs {
-        ::v-deep {
-            .el-input__wrapper {
-                box-shadow: none;
-            }
-            .el-input-group__append {
-                padding: 0 10px;
-                background: none;
-                box-shadow: none;
-            }
-            .el-input-group__append {
-                color: rgba(33, 153, 248, 0.5);
-            }
-            .el-input {
-                border: 1px solid rgba(33, 153, 248, 0.3);
-                border-radius: 5px;
-                height: 30px;
-                box-sizing: border-box;
-            }
-            .el-input__wrapper {
-                padding: 0 2px 0 10px;
-                height: 28px;
-                line-height: 28px;
-                min-height: 28px;
-            }
-            .el-input__inner {
-                --el-input-inner-height: 28px;
-                height: 28px;
-                line-height: 28px;
-                min-height: 28px;
-                color: #2199f8;
-                --el-input-placeholder-color: rgba(33, 153, 248, 0.43);
-            }
-
-            .el-select__wrapper {
-                box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
-            }
-            .el-select__placeholder,
-            .el-select__caret {
-                color: #2199f8;
-            }
-        }
-    }
-
-    .medicine-item {
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        height: 32px;
-        .item-name {
-            color: rgba(0, 0, 0, 0.4);
-        }
-        .item-val {
-            min-width: 142px;
-            text-align: center;
-            color: #302f2f;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            gap: 4px;
-            .price-unit {
-                font-size: 12px;
-                color: rgba(0, 0, 0, 0.4);
-                white-space: nowrap;
-            }
-        }
-        .item-total {
-            font-size: 16px;
-            color: #000;
-        }
-        .item-price {
-            color: #2199f8;
-            font-size: 20px;
-            font-weight: bold;
-            .item-unit {
-                font-size: 14px;
-                font-weight: normal;
-                padding-left: 2px;
-                color: #474747;
-            }
-        }
-    }
-    .medicine-box {
-        // padding-top: 10px;
-        border: 1px solid rgba(33, 153, 248, 0.8);
-        position: relative;
-        border-radius: 6px;
-        .item-title {
-            padding-left: 5px;
-            font-size: 16px;
-            color: #000000;
-            font-weight: 500;
-            padding-bottom: 10px;
-        }
-        .medicine-item + .medicine-item {
-            padding-top: 2px;
-        }
-        .mt-8 {
-            margin-top: 8px;
-        }
-    }
-
-    .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;
-        }
-    }
-    .interact-content {
-        padding: 10px 0;
-        line-height: 20px;
-        color: #919191;
-        font-size: 14px;
-    }
-    .interact-form {
-        padding: 8px 0 20px 0px;
-
-        .interact-form-item {
-            display: flex;
-            align-items: baseline;
-            margin-bottom: 12px;
-
-            &:last-child {
-                margin-bottom: 0;
-            }
-
-            .form-label {
-                width: 70px;
-                color: rgba(0, 0, 0, 0.4);
-                font-weight: normal;
-                margin-right: 10px;
-                font-size: 14px;
-                flex: none;
-            }
-
-            .form-input-wrapper {
-                position: relative;
-                width: calc(100% - 70px);
-                &.two-select {
-                    display: flex;
-                    gap: 10px;
-                    .select-item {
-                        flex: 1;
-                    }
-                }
-                ::v-deep {
-                    .el-input__inner {
-                        caret-color: transparent;
-                        padding-right: 40px;
-                    }
-
-                    .el-input__suffix {
-                        display: none;
-                    }
-                }
-            }
-
-            .question-textarea {
-                ::v-deep {
-                    .el-textarea__inner {
-                        resize: none;
-                        line-height: 1.5;
-                        min-height: 80px;
-                    }
-                }
-            }
-        }
-
-        .interact-buttons {
-            display: flex;
-            gap: 12px;
-            padding-top: 16px;
-
-            .btn-delete,
-            .btn-save {
-                flex: 1;
-                padding: 8px;
-                border-radius: 25px;
-                font-size: 16px;
-                text-align: center;
-                cursor: pointer;
-                transition: all 0.3s;
-                user-select: none;
-            }
-
-            .btn-delete {
-                background: #ffffff;
-                border: 1px solid #ff4d4f;
-                color: #ff4d4f;
-
-                &:hover {
-                    background: #fff5f5;
-                }
-
-                &:active {
-                    opacity: 0.8;
-                    transform: scale(0.98);
-                }
-            }
-
-            .btn-save {
-                background: #2199f8;
-                color: #fff;
-                border: none;
-
-                &:hover:not(.disabled) {
-                    background: #1a8ae6;
-                }
-
-                &:active:not(.disabled) {
-                    opacity: 0.9;
-                    transform: scale(0.98);
-                }
-
-                &.disabled {
-                    opacity: 0.6;
-                    cursor: not-allowed;
-                    pointer-events: none;
-                }
-            }
-        }
-    }
-    .edit-tag {
-        padding-left: 4px;
-        color: #2199f8;
-    }
-    .tag-text {
-        font-size: 12px;
-        font-weight: normal;
-    }
-    .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;
-        }
-    }
-    .font-bold {
-        font-weight: 500;
-        color: #000000;
-    }
-    .form-index {
-        position: absolute;
-        left: 0;
-        top: 0;
-        padding: 0 6px;
-        background: #2199f8;
-        border-radius: 5px 0 4px 0;
-        height: 18px;
-        line-height: 18px;
-        font-size: 12px;
-        color: #fff;
-    }
-    .recipe-item {
-        width: 100%;
-        .recipe-form {
-            padding-top: 8px;
-            ::v-deep {
-                .el-form-item {
-                    &:last-child {
-                        margin-bottom: 0;
-                    }
-                }
-            }
-        }
-
-        .mt-8 {
-            margin-top: 8px;
-        }
-
-        .box-item {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-            color: rgba(0, 0, 0, 0.4);
-            .r-text {
-                color: #302f2f;
-                width: 150px;
-                text-align: center;
-            }
-            .form-r {
-                width: 150px;
-                min-width: 140px;
-                max-width: 240px;
-            }
-        }
-        .form-box {
-            border: 1px solid rgba(33, 153, 248, 0.8);
-            border-radius: 6px;
-            padding: 20px 10px;
-            width: 100%;
-            box-sizing: border-box;
-            position: relative;
-            // background: rgb(209, 235, 255, 0.3);
-            // margin-bottom: 12px;
-            .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 {
-                margin-top: 12px;
-                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;
-    }
-}
-
-.complete-tip-popup {
-    width: 80%;
-    min-width: 294px;
-    padding: 28px 20px 20px;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    .tip-icon {
-        margin-bottom: 12px;
-        &.create-icon {
-            width: 40px;
-            height: 40px;
-        }
-        &.success-icon {
-            width: 68px;
-            height: 68px;
-        }
-    }
-    .tip-text {
-        margin-bottom: 32px;
-        text-align: center;
-        &.success-text {
-            font-size: 24px;
-            font-weight: 400;
-        }
-    }
-    .btn-wrap {
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        gap: 10px;
-        width: 100%;
-        .btn-item {
-            height: 40px;
-            line-height: 40px;
-            border-radius: 20px;
-            font-size: 16px;
-            color: #2199F8;
-            text-align: center;
-            &.second {
-                flex: none;
-                width: 92px;
-                border: 1px solid #2199F8;
-            }
-            &.primary {
-                flex: 1;
-                background: #2199f8;
-                color: #fff;
-            }
-        }
-    }
-}
-</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 - 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>