Explorar el Código

feat:修改新增农场页面逻辑

wangsisi hace 1 día
padre
commit
02264628c7

+ 0 - 66
src/router/globalRoutes.js

@@ -62,12 +62,6 @@ export default [
         name: "Recognize",
         component: () => import("@/views/old_mini/home/subPages/recognize.vue"),
     },
-    // 农场管理详情
-    {
-        path: "/farm_manage_detail",
-        name: "FarmManageDetail",
-        component: () => import("@/views/old_mini/home/index.vue"),
-    },
     // 编辑农事
     {
         path: "/modify_work",
@@ -89,20 +83,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/modify_work/detailWork.vue"),
     },
-    // 专家-农事方案
-    {
-        path: "/expert_prescription",
-        name: "ExpertPrescription",
-        meta: { showTabbar: true, keepAlive: true },
-        component: () => import("@/views/old_mini/plan/components/myPrescription.vue"),
-    },
-    // 专家-我的主页
-    {
-        path: "/expert_homepage",
-        name: "ExpertHomepage",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/expert_detail/index.vue"),
-    },
     // 农事详情--农户
     {
         path: "/farmer_agri",
@@ -147,26 +127,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/price_detail/index.vue"),
     },
-    // 报价维护
-    {
-        path: "/offer_price",
-        name: "OfferPrice",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/offer_price/index.vue"),
-    },
-    // 报价维护
-    {
-        path: "/edit_price",
-        name: "EditPrice",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/offer_price/component/editPrice.vue"),
-    },
-    // 服务维护
-    {
-        path: "/service_manage",
-        name: "ServiceManage",
-        component: () => import("@/views/old_mini/service_manage/index.vue"),
-    },
     // 气象预警详情/农事预警详情
     {
         path: "/warning_detail",
@@ -174,32 +134,6 @@ export default [
         meta: { keepAlive: true },
         component: () => import("@/views/old_mini/home/subPages/warningDetail.vue"),
     },
-    // 专家问答详情
-    {
-        path: "/expert_detail",
-        name: "ExpertDetail",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/home/subPages/expertDetail.vue"),
-    },
-    // 农事方案
-    {
-        path: "/agricultural_plan",
-        name: "AgriculturalPlan",
-        meta: { keepAlive: true },
-        component: () => import("@/views/old_mini/plan/index.vue"),
-    },
-    // 农场卡片
-    {
-        path: "/farm_card",
-        name: "FarmCard",
-        component: () => import("@/views/old_mini/plan/farmCard.vue"),
-    },
-    // 编辑农事方案
-    {
-        path: "/edit_plan",
-        name: "EditPlan",
-        component: () => import("@/views/old_mini/plan/editPlan.vue"),
-    },
     // 处方页面
     {
         path: "/prescription",

+ 0 - 518
src/views/old_mini/expert_detail/index.vue

@@ -1,518 +0,0 @@
-<template>
-    <div class="farm-page">
-        <custom-header :name="query.isStore ? '查看详情' : '我的主页'"></custom-header>
-        <div class="farm-list">
-            <div class="box-wrap expert-info">
-                <div class="expert-top">
-                    <div class="top-l" v-if="query.isStore">
-                        <img class="expert-icon store-icon" src="@/assets/img/home/nz.png" alt="">
-                        <div class="l-info store-info">
-                            <div class="info-name">
-                                <div class="expert-name">{{ storeDetail?.storeName }}</div>
-                            </div>
-                            <div class="info-bottom">
-                                <el-rate
-                                    v-model="storeDetail.score"
-                                    disabled
-                                    :colors="['#FF953D', '#FF953D', '#FF953D']"
-                                    disabled-void-color="#DDDDDD"
-                                    size="small"
-                                    show-score
-                                    text-color="#FF953D"
-                                    score-template="{value} 分"
-                                />
-                            </div>
-                        </div>
-                    </div>
-                    <div class="top-l" v-else>
-                        <img class="expert-icon" src="https://birdseye-img.sysuimars.com/birdseye-look-vue/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250411150343.png" alt="">
-                        <div class="l-info">
-                            <div class="info-name">
-                                <div class="expert-name">韦帮稳</div>
-                                <span class="expert-tag">
-                                    <img class="expert-img" src="@/assets/img/home/expert-icon.png" alt="">
-                                    专家
-                                </span>
-                            </div>
-                            <div class="info-bottom">
-                                <div
-                                    class="fruit-tag"
-                                    v-for="(ele, eleIndex) in tagList"
-                                    :key="eleIndex"
-                                >
-                                    {{ ele.name }}
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <!-- <div class="top-r">编辑信息</div> -->
-                </div>
-                <div class="expert-list">
-                    <div class="page-title">
-                        <img class="title-icon" src="@/assets/img/home/man.png" alt="">
-                        {{ query.isStore ? '基本简介' : '专家简介' }}
-                    </div>
-                    <div class="list-one" v-if="query.isStore">
-                        <div class="one-info">
-                            <span class="one-name">服务类型:</span>
-                            <span v-for="(item, index) in storeDetail?.serviceTypeJson" :key="index">
-                                {{ item }}
-                                <span v-if="index !== storeDetail?.serviceTypeJson.length - 1">、</span>
-                            </span>
-                            <span v-if="!storeDetail?.serviceTypeJson || storeDetail?.serviceTypeJson.length === 0">--</span>
-                        </div>
-                        <div class="one-info">
-                            <span class="one-name">服务作物:</span>
-                            <span v-for="(item, index) in storeDetail?.serviceCropsJson" :key="index">
-                                {{ item }}
-                                <span v-if="index !== storeDetail?.serviceCropsJson.length - 1">、</span>
-                            </span>
-                            <span v-if="!storeDetail?.serviceCropsJson || storeDetail?.serviceCropsJson.length === 0">--</span>
-                        </div>
-                        <div class="one-info">
-                            <span class="one-name">服务区域:</span>{{ storeDetail?.address || "--" }}
-                        </div>
-                        <div class="one-info">
-                            <span class="one-name">农机设备:</span>
-                            <span v-for="(item, index) in storeDetail?.agriculturalEquipmentJson" :key="index">
-                                {{ item }}
-                                <span v-if="index !== storeDetail?.agriculturalEquipmentJson.length - 1">、</span>
-                            </span>
-                            <span v-if="!storeDetail?.agriculturalEquipmentJson || storeDetail?.agriculturalEquipmentJson.length === 0">--</span>
-                        </div>
-                    </div>
-                    <div class="list-one" v-else>
-                        <div class="one-info">
-                            <span class="one-name">职称:</span>广州荔博园种业有限公司董事长
-                        </div>
-                        <div class="one-info">
-                            <span class="one-name">单位:</span>广州市从化区荔枝文化博览园
-                        </div>
-                        <div class="one-info">
-                            <span class="one-name">擅长:</span>荔枝的病虫害防治、生长异常调节、物候期调 节等等...
-                        </div>
-                        <div class="one-info last-one">
-                            <span class="one-name">服务品类:</span><div class="more">更多<el-icon class="more-icon"><ArrowRightBold /></el-icon></div>
-                        </div>
-                        <div class="one-type">
-                            <div class="type-item" v-for="item in 5" :key="item">
-                                <img class="type-img" src="@/assets/img/gallery/icon-0.png" alt="">
-                                <div class="type-name">荔枝</div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="box-wrap list-wrap">
-                <div class="list-title">
-                    <div class="page-title">
-                        <img class="garden-icon" src="@/assets/img/home/garden-title.png" alt="">
-                        {{ query.isStore ? '服务农场' : '定点基地' }}
-                    </div>
-                    <div class="more" v-if="farmList && farmList.length > 9">更多<el-icon class="more-icon"><ArrowRightBold /></el-icon></div>
-                </div>
-                <div class="list-content">
-                    <div class="list-item" v-for="item in farmList" :key="item">
-                        <div class="item-info">
-                            <div class="item-top">
-                                <div class="left-img">
-                                    <img class="img-dom" src="https://birdseye-img-ali-cdn.sysuimars.com/16926861-1e20-4cbd-8bf2-90208db5a2d0/806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_202509010800_001_806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_20250901080536_0045_V_code-ws0fsmge97gh.jpeg?x-oss-process=image/resize,w_1000" alt="">
-                                </div>
-                                <div class="left-content">
-                                    <div class="content-title">
-                                        <span>{{ item.farmName }}</span>
-                                    </div>
-                                    <div class="content-desc">
-                                        <div>果园面积:{{ item.mianji || "--" }}亩</div>
-                                        <div>服务作物:{{ item.typeName }}</div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="item-btn" v-if="!query.isStore">查看详情</div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="bottom-btn" v-if="query.isStore">
-            <div class="share-btn" @click="handleFreeConsult">免费咨询</div>
-        </div>
-        <div class="bottom-btn" v-else>
-            <div class="share-btn">分享</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { useRouter } from "vue-router";
-import customHeader from "@/components/customHeader.vue";
-import { onActivated, ref } from "vue";
-import { useRoute } from "vue-router";
-
-const router = useRouter();
-let query = ref(useRoute().query);
-
-onActivated(() => {
-    query.value = useRoute().query;
-    if (query.value.id && query.value.isStore) {
-        getStoreDetail();
-        getFarmList();
-    }
-});
-
-const getStoreDetail = () => {
-    const params = {
-        id: query.value.id,
-    };
-    VE_API.z_agricultural_store.getStoreDetail(params).then((res) => {
-        storeDetail.value = res.data || {};
-        storeDetail.value.score = res.data.score || 5;
-    });
-};
-
-const farmList = ref([]);
-const getFarmList = () => {
-    const params = {
-        id: query.value.id,
-    };
-    VE_API.z_agricultural_store.getStoreList(params).then((res) => {
-        farmList.value = res.data || [];
-    });
-};
-const storeDetail = ref({});
-const tagList = [{name: "荔枝"}, {name: "龙眼"}]
-const handleFreeConsult = () => {
-    router.push(`/chat_frame?userId=${storeDetail.value.managers[0].miniUserId}`);
-};
-</script>
-
-<style scoped lang="scss">
-.farm-page {
-    width: 100%;
-    height: 100vh;
-    .farm-list {
-        width: 100%;
-        height: calc(100% - 40px - 52px);
-        overflow: auto;
-        background-color: #f7f7f7;
-        padding: 12px;
-        box-sizing: border-box;
-        .page-title {
-            display: flex;
-            align-items: center;
-            font-size: 16px;
-            color: #000000;
-            font-weight: bold;
-            .title-icon {
-                width: 16px;
-                height: 16px;
-                padding-right: 8px;
-            }
-            .garden-icon {
-                width: 16px;
-                padding-right: 8px;
-            }
-        }
-        
-        .more {
-            display: flex;
-            align-items: center;
-            color: #999999;
-        }
-        .box-wrap {
-            background: #ffffff;
-            border-radius: 12px;
-            padding: 12px;
-            &.expert-info {
-                .expert-top {
-                    display: flex;
-                    align-items: flex-start;
-                    justify-content: space-between;
-                    .top-l {
-                        display: flex;
-                    }
-                    .top-r {
-                        display: flex;
-                        align-items: center;
-                        padding: 4px 10px;
-                        color: #2199F8;
-                        font-size: 12px;
-                        background: rgba(33, 153, 248, 0.12);
-                        border-radius: 20px;
-                    }
-                    .l-info {
-                        padding-left: 7px;
-                        &.store-info {
-                            padding-left: 10px;
-                            .info-bottom {
-                                background: rgba(255, 149, 61, 0.1);
-                                border-radius: 4px;
-                                margin-top: 2px;
-                                padding: 0px 4px 2px 4px;
-                                ::v-deep{
-                                    .el-rate .el-rate__icon {
-                                        margin-right: 2px;
-                                    }
-                                    .el-rate--small {
-                                        height: 20px;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    .info-name {
-                        display: flex;
-                        align-items: center;
-                    }
-                    .info-bottom {
-                        padding-top: 8px;
-                        display: flex;
-                    }
-                    
-                    .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(2) {
-                            background: #eedaff;
-                            color: #ac4dff;
-                        }
-                    }
-                    .expert-icon {
-                        width: 68px;
-                        height: 68px;
-                        border-radius: 8px;
-                        object-fit: cover;
-                        &.store-icon {
-                            width: 50px;
-                            height: 50px;
-                        }
-                    }
-                    .info-flex{
-                        display: flex;
-                        align-items: center;
-                    }
-                    .expert-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);
-                        }
-                    }
-                }
-                .expert-list {
-                    padding-top: 16px;
-                    font-size: 14px;
-                    .list-one {
-                        padding-top: 8px;
-                        .one-info {
-                            // display: flex;
-                            color: #666666;
-                            line-height: 18px;
-                            padding-bottom: 4px;
-                            .one-name {
-                                flex: none;
-                                color: rgba(102, 102, 102, 0.5);
-                            }
-                            &.last-one {
-                                padding-top: 6px;
-                                display: flex;
-                                align-items: center;
-                                justify-content: space-between;
-                            }
-                        }
-                        .one-type {
-                            padding-top: 8px;
-                            display: flex;
-                            justify-content: space-around;
-                            .type-item {
-                                width: 20%;
-                                display: flex;
-                                flex-direction: column;
-                                justify-content: center;
-                                align-items: center;
-                                .type-img {
-                                    width: 48px;
-                                    height: 48px;
-                                    border-radius: 50%;
-                                    border: 1px solid #E5E5E5;
-                                }
-                                .type-name {
-                                    padding-top: 2px;
-                                    color: #666666;
-                                    font-size: 12px;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            &.list-wrap {
-                margin-top: 12px;
-                .list-title {
-                    padding-bottom: 12px;
-                    display: flex;
-                    justify-content: space-between;
-                    align-items: center;
-                    border-bottom: 1px solid #F5F5F5;
-                }
-            }
-        }
-        .list-content {
-            padding: 12px 0;
-        }
-        .list-item {
-            background-color: #fff;
-            border-radius: 10px;
-            // padding: 10px;
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            .item-info {
-                .item-top {
-                    display: flex;
-                    align-items: center;
-                    gap: 12px;
-                    .left-img {
-                        width: 68px;
-                        height: 68px;
-                        border-radius: 8px;
-                        .img-dom {
-                            border-radius: 8px;
-                            width: 100%;
-                            height: 100%;
-                            object-fit: cover;
-                        }
-                    }
-                    .left-content {
-                        .content-title {
-                            display: flex;
-                            align-items: center;
-                            gap: 10px;
-                            margin-bottom: 4px;
-                            font-size: 16px;
-                            font-weight: 500;
-                            .content-tag {
-                                background-color: #2199f8;
-                                color: #fff;
-                                padding: 2px 8px;
-                                border-radius: 15px;
-                                font-size: 12px;
-                                font-weight: 400;
-                            }
-                            .content-text {
-                                font-size: 12px;
-                                color: #2199F8;
-                                font-weight: 400;
-                            }
-                        }
-                        .content-desc {
-                            font-size: 12px;
-                            color: #999999;
-                            line-height: 18px;
-                        }
-                    }
-                }
-                .select {
-                    width: 105px;
-                    margin-left: 80px;
-                    margin-top: 10px;
-                    ::v-deep{
-                        .el-select__wrapper{
-                            border: 1px solid #2199F8;
-                            box-shadow: none;
-                        }
-                        .el-select__placeholder,.el-select__caret{
-                            color: #2199F8;
-                        }
-                        .el-select__selection {
-                            flex: none;
-                            width: fit-content;
-                        }
-                        .el-select__placeholder {
-                            position: static;
-                            transform: none;
-                            width: fit-content;
-                        }
-                    }
-                }
-            }
-            .item-btn {
-                color: #2199F8;
-                padding: 4px 8px;
-                border: 1px solid #2199F8;
-                border-radius: 4px;
-            }
-        }
-        .list-item + .list-item {
-            margin-top: 10px;
-            padding-top: 10px;
-            border-top: 1px solid #F5F5F5;
-        }
-    }
-    .bottom-btn {
-        height: 52px;
-        width: 100%;
-        padding: 6px 32px;
-        box-sizing: border-box;
-        &.flex-between {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            .forward-btn {
-                background: #fff;
-                border: 1px solid rgba(153, 153, 153, 0.5);
-                color: #666666;
-                padding: 8px 20px;
-            }
-            .free-btn {
-                padding: 8px 20px;
-            }
-        }
-        .share-btn {
-            color: #fff;
-            text-align: center;
-            border-radius: 20px;
-            padding: 8px;
-            background: linear-gradient(180deg, #76C3FF, #2199F8);
-        }
-    }
-}
-</style>

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

@@ -127,7 +127,7 @@ const tabs = [
     { key: "farm", label: "农场信息" },
 ];
 
-const activeTab = ref("farm");
+const activeTab = ref("crop");
 
 const farmInfo = {
     name: "从化荔博园",

+ 4 - 23
src/views/old_mini/home/subPages/prescriptionPage.vue

@@ -60,14 +60,10 @@
                                     <Plus />
                                 </el-icon>其它设备</div>
                         </div>
-                        <!-- <el-checkbox-group v-model="basicForm.machineryWithQuantity">
-                            <el-checkbox-button v-for="(item, index) in basicFarmFormData.machinery" :key="index"
-                                :label="item.name" :value="item.code" />
-                        </el-checkbox-group> -->
                     </div>
                 </div>
                 <!-- 农场规模 -->
-                <div class="farm-scale-header">
+                <!-- <div class="farm-scale-header">
                     <div class="farm-scale-title">请填写您的农场规模</div>
                     <div class="farm-scale-desc">农闲时可以提供农事服务,获取额外收益</div>
                 </div>
@@ -105,7 +101,7 @@
                             <template #append>人</template>
                         </el-input>
                     </div>
-                </div>
+                </div> -->
                 <div class="box-item">
                     <div class="item-name">
                         <span>希望专家帮助解决的种植难题</span>
@@ -120,34 +116,19 @@
                                 <span class="text">{{ item.name }}</span>
                             </div>
                         </div>
-                        <!-- <el-checkbox-group v-model="basicForm.improvementAreas">
-                            <el-checkbox-button v-for="(item, index) in basicFarmFormData.improvementAreas" :key="index"
-                                :label="item.name" :value="item.code" />
-                        </el-checkbox-group> -->
                     </div>
                 </div>
-                <div class="box-item">
+                <!-- <div class="box-item">
                     <div class="item-name">
                         <span>您最希望得到哪位荔枝专家的农事处方</span>
                     </div>
                     <div class="item-checkbox">
-                        <!-- <div class="tag-group add-tag-group">
-                            <div class="tag-item" :class="{ self: item.custom === true, selected: item.selected }"
-                                @click="handleSelect('expertOptions', idx, item.custom)"
-                                v-for="(item, idx) in basicFarmFormData.expertOptions" :key="'zj-' + idx">
-                                <span class="text">{{ item.name }}</span>
-                            </div>
-                        </div> -->
                             <el-radio-group v-model="basicForm.expertCode">
                                 <el-radio-button v-for="(item, index) in basicFarmFormData.expertOptions" :key="index"
                                     :label="item.name" :value="item.code" />
                             </el-radio-group>
-                        <!-- <el-checkbox-group v-model="basicForm.improvementAreas">
-                            <el-checkbox-button v-for="(item, index) in basicFarmFormData.improvementAreas" :key="index"
-                                :label="item.name" :value="item.code" />
-                        </el-checkbox-group> -->
                     </div>
-                </div>
+                </div> -->
             </div>
         </div>
 

+ 0 - 743
src/views/old_mini/offer_price/component/editPrice.vue

@@ -1,743 +0,0 @@
-<template>
-    <div class="edit-price">
-        <custom-header name="飞鸟管家"></custom-header>
-        <div class="edit-form">
-            <el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
-                <el-form-item label="药肥名称" prop="id" required>
-                    <el-select v-model="form.id" placeholder="请选择" filterable clearable style="width: 100%">
-                        <el-option v-for="opt in pesticideOptions" :key="opt.id" :label="opt.name" :value="opt.id" />
-                    </el-select>
-                </el-form-item>
-
-                <el-form-item label="药肥品牌" prop="brand" required>
-                    <el-input class="has-border" v-model="form.brand" placeholder="请输入" />
-                </el-form-item>
-
-                <el-form-item label="药肥类型" required prop="typeId">
-                    <div class="row-3-selects">
-                        <field
-                            v-model="fieldValue"
-                            is-link
-                            readonly
-                            label=""
-                            placeholder="请选择药肥类型"
-                            @click="showCascader = true"
-                        />
-                        <popup v-model:show="showCascader" round position="bottom">
-                            <cascader
-                                v-model="cascaderValue"
-                                aria-hidden="false"
-                                title="请选择药肥类型"
-                                :options="typeOptions"
-                                :field-names="cascaderProps"
-                                @close="showCascader = false"
-                                @finish="onFinish"
-                            />
-                        </popup>
-                    </div>
-                </el-form-item>
-
-                <el-form-item label="计量单位" prop="unit" required>
-                    <el-radio-group v-model="form.unit">
-                        <el-radio value="克">克</el-radio>
-                        <el-radio value="千克">千克</el-radio>
-                        <el-radio value="毫升">毫升</el-radio>
-                        <el-radio value="升">升</el-radio>
-                    </el-radio-group>
-                </el-form-item>
-
-                <el-form-item label="施用方式" prop="method" required>
-                    <el-radio-group v-model="form.method">
-                        <el-radio value="1">叶面施</el-radio>
-                        <el-radio value="2">根部施</el-radio>
-                    </el-radio-group>
-                </el-form-item>
-
-                <el-form-item label="药肥成本" prop="cost" required class="input-unit">
-                    <el-input v-model="form.cost" type="number" step="0.01" placeholder="请输入">
-                        <template #append>元/{{ form.unit }}</template>
-                    </el-input>
-                </el-form-item>
-
-                <el-form-item label="药肥报价" prop="price" required class="input-unit">
-                    <el-input v-model="form.price" type="number" step="0.01" placeholder="请输入">
-                        <template #append>元/{{ form.unit }}</template>
-                    </el-input>
-                </el-form-item>
-
-                <el-form-item label="药肥库存" prop="stock" required class="input-unit">
-                    <el-input v-model="form.stock" type="number" step="0.01" placeholder="请输入">
-                        <template #append>{{ form.unit }}</template>
-                    </el-input>
-                </el-form-item>
-
-                <el-form-item label="单位兑水" class="input-unit">
-                    <div class="water-row">
-                        <el-input v-model="form.waterMin" type="number" step="0.01" placeholder="请输入兑水量">
-                            <template #append>{{ form.unit }}</template>
-                        </el-input>
-                        <span>-</span>
-                        <el-input v-model="form.waterMax" type="number" step="0.01" placeholder="请输入兑水量">
-                            <template #append>{{ form.unit }}</template>
-                        </el-input>
-                    </div>
-                </el-form-item>
-
-                <el-form-item label="适用品类">
-                    <el-select
-                        v-model="form.speciesIds"
-                        multiple
-                        placeholder="请选择"
-                        filterable
-                        clearable
-                        style="width: 100%"
-                    >
-                        <el-option v-for="(opt, optI) in specieList" :key="optI" :label="opt.name" :value="opt.id" />
-                    </el-select>
-                </el-form-item>
-            </el-form>
-        </div>
-
-        <div class="page-action">
-            <div class="btn-item del" v-if="!isAdd" @click="openDelete">删除</div>
-            <div class="btn-item cancel" v-if="isAdd" @click="goBack">取消</div>
-            <div class="btn-right">
-                <div class="btn-item cancel" v-if="!isAdd" @click="goBack">取消编辑</div>
-                <div class="btn-item primary" @click="handleSave">{{ isAdd ? "新增报价" : "保存报价" }}</div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import customHeader from "@/components/customHeader.vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import { useRouter, useRoute } from "vue-router";
-import { ref, reactive, onMounted, onActivated, onUnmounted, onDeactivated, watch } from "vue";
-import { Cascader, Popup, Field } from "vant";
-
-const router = useRouter();
-const route = useRoute();
-const isAdd = ref(false);
-const goBack = () => {
-    router.back();
-};
-
-const showCascader = ref(false);
-const fieldValue = ref("");
-const cascaderValue = ref("");
-// 全部选项选择完毕后,会触发 finish 事件
-const onFinish = ({ selectedOptions }) => {
-    showCascader.value = false;
-    fieldValue.value = selectedOptions.map((option) => option.name).join(" / ");
-    form.typeId = selectedOptions[selectedOptions.length - 1].id;
-};
-
-const openDelete = () => {
-    ElMessageBox.confirm("确认要删除该报价吗?", "提示", {
-        confirmButtonText: "确认",
-        cancelButtonText: "取消",
-        type: "warning",
-    })
-        .then(() => {
-            VE_API.z_farm_work_pesticide_fertilizer.deleteFertilizer({ agriculturalStoreId: detailData.value.agriculturalStoreId, pesticideFertilizerId: detailData.value.id }).then((res) => {
-                if (res.code === 0) {
-                    ElMessage.success("删除成功");
-                    router.back();
-                }
-            });
-        })
-        .catch(() => {});
-};
-
-// 表单模型与选项
-const formRef = ref();
-const form = reactive({
-    id: "",
-    typeId: null,
-    brand: "",
-    type1: "",
-    type2: "",
-    type3: "",
-    unit: "克",
-    method: "1",
-    cost: null,
-    price: null,
-    stock: null,
-    waterMin: null,
-    waterMax: null,
-    speciesIds: [],
-});
-
-const rules = {
-    id: [{ required: true, message: "请选择药肥名称", trigger: "change" }],
-    brand: [{ required: true, message: "请选择药肥品牌", trigger: "change" }],
-    typeId: [{ required: true, message: "请选择药肥类型", trigger: "change" }],
-    unit: [{ required: true, message: "请选择计量单位", trigger: "change" }],
-    method: [{ required: true, message: "请选择施用方式", trigger: "change" }],
-    cost: [{ required: true, message: "请输入成本", trigger: "blur" }],
-    price: [{ required: true, message: "请输入报价", trigger: "blur" }],
-    stock: [{ required: true, message: "请输入库存", trigger: "blur" }],
-};
-
-// 单位转换映射
-const unitMap = {
-    kg: "千克",
-    g: "克",
-    ml: "毫升",
-    l: "升",
-    千克: "千克",
-    克: "克",
-    毫升: "毫升",
-    升: "升",
-};
-
-// 施用方式转换映射
-const methodMap = {
-    叶面施: "1",
-    根部施: "2",
-};
-
-const cascaderProps = {
-    value: "id",
-    text: "name",
-    children: "children",
-};
-
-onMounted(() => {
-    getSpecieList();
-    fetchPesticideOptions();
-    fetchTypeOptions();
-    
-    // 首次加载时初始化表单
-    if (isAdd.value) {
-        initForm();
-    } else {
-        getDetail();
-    }
-});
-
-const specieList = ref([]);
-function getSpecieList() {
-    VE_API.farm.fetchSpecieList().then(({ data }) => {
-        specieList.value = data;
-    });
-}
-
-
-// 递归清理空的 children 属性
-const cleanEmptyChildren = (data) => {
-    if (!Array.isArray(data)) {
-        return data;
-    }
-    return data.map((item) => {
-        const newItem = { ...item };
-        if (newItem.children) {
-            if (Array.isArray(newItem.children) && newItem.children.length > 0) {
-                // 递归处理子项
-                newItem.children = cleanEmptyChildren(newItem.children);
-            } else {
-                // 如果 children 为空数组或不存在,删除该属性
-                delete newItem.children;
-            }
-        }
-        return newItem;
-    });
-};
-
-// 用途类型选项
-const typeOptions = ref([]);
-function fetchTypeOptions() {
-    if (typeOptions.value.length === 0) {
-        VE_API.z_farm_work_pesticide_fertilizer.typeList().then((res) => {
-            if (res.code === 0) {
-                // 清理空的 children 属性
-                typeOptions.value = cleanEmptyChildren(res.data || []);
-            }
-        });
-    }
-}
-/**
- * 获取药肥选项
- */
-const pesticideOptions = ref([]);
-function fetchPesticideOptions() {
-    // 每次都重新获取药肥选项,确保数据是最新的
-    VE_API.z_farm_work_pesticide_fertilizer
-        .selectOption()
-        .then((res) => {
-            if (res.code === 0) {
-                pesticideOptions.value = res.data || [];
-            }
-        })
-        .catch(() => {
-            // 获取药肥选项失败
-        });
-}
-
-// 根据 typeId 查找路径数组
-const findPathByTypeId = (options, targetId, path = []) => {
-    for (const option of options) {
-        const currentPath = [...path, option.id];
-        if (option.id === targetId) {
-            return currentPath;
-        }
-        if (option.children && option.children.length > 0) {
-            const found = findPathByTypeId(option.children, targetId, currentPath);
-            if (found) return found;
-        }
-    }
-    return null;
-};
-
-// 根据 typeId 查找显示文本
-const findTextByTypeId = (options, targetId) => {
-    for (const option of options) {
-        if (option.id === targetId) {
-            return option.name;
-        }
-        if (option.children && option.children.length > 0) {
-            const found = findTextByTypeId(option.children, targetId);
-            if (found) return found;
-        }
-    }
-    return "";
-};
-
-// 根据 typeId 设置级联选择器的默认值
-const setCascaderDefaultValue = (typeId) => {
-    if (!typeId || !typeOptions.value.length) {
-        return;
-    }
-    
-    // 查找路径数组
-    const path = findPathByTypeId(typeOptions.value, typeId);
-    if (path && path.length > 0) {
-        cascaderValue.value = path;
-        
-        // 查找显示文本(完整路径)
-        const pathNames = [];
-        let current = typeOptions.value;
-        for (const id of path) {
-            const option = current.find(opt => opt.id === id);
-            if (option) {
-                pathNames.push(option.name);
-                current = option.children || [];
-            }
-        }
-        if (pathNames.length > 0) {
-            fieldValue.value = pathNames.join(" / ");
-        }
-    }
-};
-
-// 监听 typeOptions 变化,当数据加载完成后自动设置默认值
-watch(
-    () => typeOptions.value,
-    (newOptions) => {
-        if (newOptions.length > 0 && form.typeId) {
-            setCascaderDefaultValue(form.typeId);
-        }
-    },
-    { deep: true }
-);
-
-// 获取详情数据
-const detailData = ref({});
-const getDetail = () => {
-    const id = route.query.id;
-    if (!id || isAdd.value) {
-        return;
-    }
-
-    VE_API.z_farm_work_pesticide_fertilizer
-        .fertilizerDetail({ id })
-        .then(({ data }) => {
-            if (data) {
-                detailData.value = data;
-                // 赋值表单数据
-                form.id = data.id || "";
-                form.brand = data.brand || "";
-                form.typeId = data.typeId || null;
-
-                // 转换单位
-                form.unit = unitMap[data.unit] || data.unit || "克";
-
-                // 转换施用方式
-                if (data.usageModeList && data.usageModeList.length > 0) {
-                    const firstMode = data.usageModeList[0];
-                    form.method = methodMap[firstMode] || firstMode;
-                }
-
-                form.cost = data.cost || null;
-                form.price = data.price || null;
-                form.stock = data.stock || null;
-                form.waterMin = data.unitWaterAmount || null;
-                form.waterMax = data.unitWaterAmountMax || null;
-                // 适用品种
-                if (data.speciesList && Array.isArray(data.speciesList) && data.speciesList.length > 0) {
-                    form.speciesIds = data.speciesList.map(item => item.id);
-                } else {
-                    form.speciesIds = [];
-                }
-                console.log("form.speciesIds", form.speciesIds, data.speciesList);
-                // 设置级联选择器的默认值(watch 会自动处理)
-                if (form.typeId && typeOptions.value.length > 0) {
-                    setCascaderDefaultValue(form.typeId);
-                }
-            }
-        })
-        .catch(() => {
-            ElMessage.error("获取详情失败");
-        });
-};
-
-// 重置表单数据
-const resetForm = () => {
-    form.id = "";
-    form.typeId = null;
-    form.brand = "";
-    form.type1 = "";
-    form.type2 = "";
-    form.type3 = "";
-    form.unit = "克";
-    form.method = "1";
-    form.cost = null;
-    form.price = null;
-    form.stock = null;
-    form.waterMin = null;
-    form.waterMax = null;
-    form.speciesIds = [];
-    
-    // 重置级联选择器
-    showCascader.value = false;
-    fieldValue.value = "";
-    cascaderValue.value = "";
-    
-    // 清除表单验证状态
-    if (formRef.value) {
-        formRef.value.resetFields();
-        // formRef.value.clearValidate();
-    }
-};
-
-// 初始化表单数据(新增模式)
-const initForm = () => {
-    resetForm();
-    // 新增模式下的默认值
-    form.unit = "克";
-    form.method = "1";
-};
-
-onActivated(() => {
-    isAdd.value = route.query.isAdd ? true : false;
-    // 进入页面时,如果是新增模式,初始化表单;如果是编辑模式,获取详情
-    if (isAdd.value) {
-        initForm();
-    } else {
-        getDetail();
-    }
-});
-
-onDeactivated(() => {
-    // 离开页面时清除数据
-    resetForm();
-});
-
-onUnmounted(() => {
-    // 组件卸载时也清除数据
-    resetForm();
-});
-
-// 根据路径数组获取三级分类名称
-const getCategoryNamesByPath = (path) => {
-    if (!path || path.length === 0 || !typeOptions.value.length) {
-        return {
-            categoryLevel1Name: "",
-            categoryLevel2Name: "",
-            categoryLevel3Name: "",
-        };
-    }
-    
-    const names = [];
-    let current = typeOptions.value;
-    
-    for (let i = 0; i < path.length && i < 3; i++) {
-        const option = current.find(opt => opt.id === path[i]);
-        if (option) {
-            names.push(option.name);
-            current = option.children || [];
-        } else {
-            break;
-        }
-    }
-    
-    return {
-        categoryLevel1Name: names[0] || "",
-        categoryLevel2Name: names[1] || "",
-        categoryLevel3Name: names[2] || "",
-    };
-};
-
-// 获取选中的药肥信息
-const getSelectedPesticideFertilizer = () => {
-    const selected = pesticideOptions.value.find(opt => opt.id === form.id);
-    if (!selected) {
-        return null;
-    }
-    return selected;
-};
-
-// 单位反向转换(将中文单位转换为英文)
-const reverseUnitMap = {
-    千克: "kg",
-    克: "g",
-    毫升: "ml",
-    升: "l",
-};
-
-// 保存方法
-const handleSave = async () => {
-    // 表单验证
-    try {
-        await formRef.value.validate();
-    } catch (error) {
-        ElMessage.warning("请完善表单信息");
-        return;
-    }
-    
-    // 获取选中的药肥信息
-    const selectedPesticide = getSelectedPesticideFertilizer();
-    if (!selectedPesticide) {
-        ElMessage.warning("请选择药肥名称");
-        return;
-    }
-    
-    // 获取三级分类名称
-    const categoryNames = getCategoryNamesByPath(cascaderValue.value);
-    
-    // 转换施用方式
-    const usageModeList = form.method === "1" ? ["叶面施"] : ["根部施"];
-    
-    // 转换单位(如果需要英文单位)
-    const unit = reverseUnitMap[form.unit] || form.unit;
-    
-    // 转换适用品种(数组转字符串,用逗号分隔)
-    // const speciesIds = Array.isArray(form.crops) 
-    //     ? form.crops.join(",") 
-    //     : (form.crops || "");
-    // 构建请求参数
-    const params = {
-        pesticideFertilizer: {
-            id: selectedPesticide.id || form.id,
-            name: selectedPesticide.name || "",
-            // pesticideFertilizerCode: selectedPesticide.code || "",
-            // typeName: selectedPesticide.typeName || "",
-            typeId: form.typeId,
-            defaultName: selectedPesticide.name || "",
-            unit: unit,
-            // price: selectedPesticide.price || form.price || null,
-            unitWaterAmount: form.waterMin ? Number(form.waterMin) : null,
-            unitWaterAmountMax: form.waterMax ? Number(form.waterMax) : null,
-            speciesIds: form.speciesIds,
-            usageModeList: usageModeList,
-            categoryLevel1Name: categoryNames.categoryLevel1Name,
-            categoryLevel2Name: categoryNames.categoryLevel2Name,
-            categoryLevel3Name: categoryNames.categoryLevel3Name,
-        },
-        price: form.price ? Number(form.price) : null,
-        cost: form.cost ? Number(form.cost) : null,
-        stock: form.stock ? Number(form.stock) : null,
-        remark: selectedPesticide.remark || "",
-        brand: form.brand,
-    };
-    // 调用保存接口
-    VE_API.z_farm_work_pesticide_fertilizer
-        .saveFertilizer(params)
-        .then((res) => {
-            if (res.code === 0) {
-                ElMessage.success(isAdd.value ? "新增报价成功" : "保存报价成功");
-                // 延迟返回,让用户看到成功提示
-                setTimeout(() => {
-                    router.back();
-                }, 1000);
-            } else {
-                ElMessage.error(res.message || "保存失败");
-            }
-        })
-        .catch(() => {
-            ElMessage.error("保存失败,请重试");
-        });
-};
-</script>
-
-<style lang="scss" scoped>
-.edit-price {
-    width: 100%;
-    height: 100vh;
-    background: #f5f7fb;
-    .edit-form {
-        margin: 12px;
-        padding: 12px;
-        background: #ffffff;
-        .row-3-selects {
-            width: 100%;
-            display: flex;
-            gap: 5px;
-            ::v-deep {
-                .van-cell {
-                    padding: 4px 10px;
-                    border: 1px solid rgba(33, 153, 248, 0.3);
-                    border-radius: 5px;
-                    box-sizing: border-box;
-                }
-                .van-field__control {
-                    color: #2199f8;
-                    &::placeholder {
-                        color: rgba(33, 153, 248, 0.43) !important;
-                    }
-                }
-                .van-cell__right-icon {
-                    color: #2199f8;
-                    transform: rotate(90deg);
-                    font-size: 14px;
-                }
-                .el-select__wrapper {
-                    padding: 2px 6px;
-                }
-            }
-            > .el-select {
-                flex: 1;
-            }
-        }
-        .water-row {
-            color: rgba(0, 0, 0, 0.1);
-            display: flex;
-            gap: 2px;
-            > .el-input {
-                flex: 1;
-            }
-        }
-
-        ::v-deep {
-            .el-form-item__label {
-                color: rgba(29, 33, 41, 0.2);
-                font-size: 14px;
-            }
-            .el-form-item--default {
-                margin-bottom: 16px;
-            }
-            .el-select__input {
-                color: #2199f8;
-            }
-            .el-select__wrapper {
-                // height: 30px;
-                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;
-            }
-            .has-border,
-            .el-cascader {
-                .el-input__wrapper {
-                    box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
-                }
-            }
-            .el-tag.el-tag--info {
-                --el-tag-text-color: #2199f8;
-                --el-tag-bg-color: rgba(33, 153, 248, 0.1);
-            }
-            .el-input__wrapper {
-                box-shadow: none;
-            }
-            .el-input__inner {
-                color: #2199f8;
-                --el-input-placeholder-color: rgba(33, 153, 248, 0.43);
-            }
-            .el-input-group__append {
-                padding: 0 6px;
-                background: none;
-                box-shadow: none;
-            }
-            .el-input-group__append {
-                color: rgba(33, 153, 248, 0.5);
-            }
-            .input-unit {
-                .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);
-                }
-            }
-        }
-    }
-
-    .page-action {
-        position: fixed;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        padding: 12px 12px;
-        background: #fff;
-        box-shadow: 2px 2px 4.5px rgba(0, 0, 0, 0.4);
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        .btn-item {
-            height: 40px;
-            line-height: 41px;
-            border-radius: 20px;
-            width: fit-content;
-            padding: 0 20px;
-            color: #666666;
-            font-size: 14px;
-            &.del {
-                color: #ff943d;
-                background: rgba(255, 148, 61, 0.1);
-            }
-            &.cancel {
-                border: 1px solid rgba(153, 153, 153, 0.5);
-            }
-            &.primary {
-                color: #fff;
-                background: linear-gradient(#76c3ff, #2199f8);
-            }
-        }
-        .btn-right {
-            display: flex;
-            gap: 10px;
-        }
-    }
-}
-</style>
-
-<style lang="scss">
-// 针对特定作用域设置
-.edit-price {
-    --van-field-placeholder-text-color: rgba(33, 153, 248, 0.43);
-}
-</style>

+ 0 - 379
src/views/old_mini/offer_price/component/fertilizerPrice.vue

@@ -1,379 +0,0 @@
-<template>
-    <div class="fertilizer-price">
-        <search v-model="searchVal" clearable @clear="handleClear" @change="handleChange" placeholder="搜索药肥" />
-        <div class="record-filter">
-            <div
-                class="filter-item"
-                v-for="(item, index) in filterType"
-                :key="index"
-                @click="handlePlanClick(index, item.id)"
-                :class="{ active: activePlanIndex === index }"
-            >
-                {{ item.name }}
-            </div>
-        </div>
-        <div class="fertilizer-list">
-            <list
-                v-model:loading="loading"
-                :finished="finished"
-                finished-text="没有更多了"
-                @load="onLoad"
-                >
-                <div class="fertilizer-card" @click.stop="handleEdit(item)" v-for="(item, index) in priceList" :key="index">
-                    <div class="card-header">
-                        <div class="title">{{ item.name }}</div>
-                        <div class="action-btn">
-                            <el-icon @click.stop="handleEdit(item)" color="#2199F8" size="18"><Edit /></el-icon>
-                            <!-- <el-icon @click.stop="openDelete" color="#E04C4C" size="18"><Delete /></el-icon> -->
-                        </div>
-                    </div>
-                    <div class="info">
-                        <div class="row">
-                            <span class="label">药物品牌</span>
-                            <span class="value">{{ item.brand || "--" }}</span>
-                        </div>
-                        <div class="row">
-                            <span class="label">药肥类型</span>
-                            <span class="value">{{ item.typeName }}</span>
-                        </div>
-                        <div class="row">
-                            <span class="label">施用方式</span>
-                            <span class="value">{{ getArrText(item.usageModeList) }}</span>
-                        </div>
-                        <transition name="collapse">
-                            <div class="extra-info" v-show="isExpanded(index)">
-                                <div class="row">
-                                    <span class="label">计量单位</span>
-                                    <span class="value">{{ item.unit }}</span>
-                                </div>
-                                <div class="row">
-                                    <span class="label">单位兑水量</span>
-                                    <span class="value">{{ item.unitWaterAmount }}{{ item.unit }}<span>-</span>{{ item.unitWaterAmountMax }}{{ item.unit }}</span>
-                                </div>
-                                <div class="row">
-                                    <span class="label">适用品类</span>
-                                    <span class="value tag-group" v-if="item.speciesList && item.speciesList.length > 0">
-                                        <span class="tag-item">{{ getArrNameText(item.speciesList) }}</span>
-                                    </span>
-                                    <span class="value" v-else>--</span>
-                                </div>
-                            </div>
-                        </transition>
-                    </div>
-                    <div class="expand" @click.stop="toggleExpand(index)">
-                        <span>{{ isExpanded(index) ? '收起' : '展开更多' }}</span>
-                        <el-icon :class="{ rotate: isExpanded(index) }"><ArrowDown /></el-icon>
-                    </div>
-                    <div class="stats">
-                        <div class="col">
-                            <div class="num">{{ item.cost }}<span class="unit">元/{{ item.unit }}</span></div>
-                            <div class="desc">成本</div>
-                        </div>
-                        <div class="col">
-                            <div class="num">{{ item.price }}<span class="unit">元/{{ item.unit }}</span></div>
-                            <div class="desc">报价</div>
-                        </div>
-                        <div class="col">
-                            <div class="num">{{ item.stock }}<span class="unit">{{ item.unit }}</span></div>
-                            <div class="desc">库存</div>
-                        </div>
-                    </div>
-                </div>
-            </list>
-            <div class="page-action">
-                <div class="btn-primary" @click="handleAdd">新增药肥报价</div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, onActivated } from "vue";
-import { Search, List } from 'vant';
-import { useRouter } from "vue-router";
-import { ElMessageBox } from 'element-plus'
-
-const router = useRouter();
-const searchVal = ref("");
-
-const filterType = ref(["全部"]);
-
-const activePlanIndex = ref(0);
-// 记录已展开卡片索引的集合
-const expandedSet = ref(new Set());
-
-const priceList = ref([]);
-
-onMounted(() => {
-    fetchPesticideCount()
-});
-
-onActivated(() => {
-    getFertilizerList();
-});
-
-const fetchPesticideCount = () => {
-    VE_API.z_farm_work_pesticide_fertilizer.firstLevelOptions({}, { skipMessage: true }).then((res) => {
-        if (res.code === 0) {
-            filterType.value = [{ name: "全部", id: null }, ...res.data] || [];
-            getFertilizerList();
-        }
-    });
-};
-
-const handlePlanClick = (index, id) => {
-    activePlanIndex.value = index;
-    getFertilizerList(1, false, id);
-};
-const isExpanded = (index) => expandedSet.value.has(index);
-const toggleExpand = (index) => {
-    const next = new Set(expandedSet.value);
-    if (next.has(index)) {
-        next.delete(index);
-    } else {
-        next.add(index);
-    }
-    expandedSet.value = next;
-};
-const handleEdit = (item) => {
-    router.push({
-        path: "/edit_price",
-        query: { id: item.id }
-    });
-};
-
-const getArrText = (arr) => {
-    return arr && arr.length > 0 ? arr.map(item => item).join('、') : '--';
-}
-
-const getArrNameText = (arr) => {
-    return arr && arr.length > 0 ? arr.map(item => item.name).join('、') : '--';
-}
-
-const openDelete = () => {
-  ElMessageBox.confirm(
-    '确认要删除该报价吗?',
-    '提示',
-    {
-      confirmButtonText: '确认',
-      cancelButtonText: '取消',
-      type: 'warning',
-    }
-  )
-    .then(() => {
-    })
-    .catch(() => {
-    })
-}
-const handleAdd = () => {
-    router.push({
-        path: "/edit_price",
-        query: { isAdd: true }
-    });
-};
-
-// 滚动加载
-const loading = ref(false);
-const finished = ref(false);
-const currentPage = ref(1);
-const pageSize = ref(10);
-const getFertilizerList = (page = 1, isLoadMore = false, id = null) => {
-    loading.value = true;
-    // 首次加载或切换筛选时,需要重置 finished
-    if (!isLoadMore && page === 1) {
-        finished.value = false;
-    }
-    VE_API.z_farm_work_pesticide_fertilizer.fertilizerList({
-        name: searchVal.value,
-        page: page,
-        limit: pageSize.value,
-        typeId: id,
-    }).then(({ data }) => {
-        const list = Array.isArray(data) ? data : (data?.list || []);
-        if (isLoadMore) {
-            priceList.value = [...priceList.value, ...list];
-        } else {
-            priceList.value = list;
-        }
-        // 如果返回为空数组或少于分页大小,标记为已加载完成,避免继续触发请求
-        if (!Array.isArray(list) || list.length === 0 || list.length < pageSize.value) {
-            finished.value = true;
-        }
-        loading.value = false;
-    })
-    .finally(() => {
-        loading.value = false;
-    });
-}
-const onLoad = () => {
-    if (finished.value) return;
-
-    currentPage.value += 1;
-    getFertilizerList(currentPage.value, true);
-};
-const handleClear = () => {
-    currentPage.value = 1;
-    priceList.value = [];
-    getFertilizerList();
-};
-const handleChange = () => {
-    currentPage.value = 1;
-    priceList.value = [];
-    getFertilizerList();
-};
-</script>
-
-<style lang="scss" scoped>
-.fertilizer-price {
-    ::v-deep {
-        .van-search {
-            background: #F5F7FB;
-            .van-search__content {
-                background: #FFFFFF;
-                border-radius: 16px;
-            }
-        }
-    }
-    .record-filter {
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        padding: 5px 0;
-        .filter-item {
-            color: rgba(0, 0, 0, 0.5);
-            padding: 0 16px;
-            height: 32px;
-            line-height: 32px;
-            border-radius: 20px;
-            color: #8B8B8B;
-            &.active {
-                color: #fff;
-                background: #2199F8;
-            }
-        }
-        .filter-item + .filter-item {
-            margin-left: 8px;
-        }
-    }
-    .fertilizer-list {
-        padding: 8px 12px 80px;
-        .fertilizer-card {
-            margin-bottom: 10px;
-            background: #FFFFFF;
-            border-radius: 8px;
-            // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
-            padding: 12px 10px;
-            .card-header {
-                display: flex;
-                align-items: center;
-                justify-content: space-between;
-                .title {
-                    font-size: 16px;
-                    font-weight: 600;
-                    color: #000;
-                }
-                .action-btn {
-                    display: flex;
-                    gap: 10px;
-                }
-            }
-            .info {
-                padding-top: 4px;
-                border-top: 1px solid #F5F5F5;
-                margin-top: 8px;
-                font-size: 14px;
-                .row {
-                    display: flex;
-                    align-items: center;
-                    padding: 4px 0;
-                    .label {
-                        width: 80px;
-                        color: rgba(0, 0, 0, 0.2);
-                        flex-shrink: 0;
-                    }
-                    .value {
-                        color: #767676;
-                    }
-                }
-                .extra-info {
-                    overflow: hidden;
-                }
-            }
-            .tag-group {
-                display: flex;
-                align-items: center;
-                gap: 4px;
-                .tag-item {
-                    font-size: 12px;
-                    color: #2199F8;
-                    background: #E8F3FF;
-                    border-radius: 2px;
-                    padding: 0 8px;
-                    height: 20px;
-                    line-height: 20px;
-                }
-            }
-            .expand {
-                display: flex;
-                align-items: center;
-                justify-content: center;
-                color: rgba(0, 0, 0, 0.2);
-                font-size: 12px;
-                margin: 6px 0 12px;
-                span { margin-right: 4px; }
-                cursor: pointer;
-                .el-icon { transition: transform .3s ease; }
-                .el-icon.rotate { transform: rotate(180deg); }
-            }
-            .stats {
-                display: flex;
-                align-items: stretch;
-                justify-content: space-between;
-                background: rgba(33, 153, 248, 0.1);
-                border: 1px solid rgba(33, 153, 248, 0.2);
-                border-radius: 10px;
-                padding: 10px 8px;
-                font-size: 14px;
-                .col {
-                    flex: 1;
-                    text-align: center;
-                    .num {
-                        color: #2199F8;
-                        font-weight: 600;
-                        font-size: 16px;
-                        .unit { padding-left: 2px; font-size: 12px; font-weight: 400; color: rgba(0, 0, 0, 0.5); }
-                    }
-                    .desc { color: #000; margin-top: 4px; }
-                }
-                .col + .col { border-left: 1px solid rgba(33, 153, 248, 0.4); }
-            }
-        }
-        .page-action {
-            position: fixed;
-            left: 0; right: 0; bottom: 0;
-            padding: 10px 16px;
-            background: #fff;
-            box-shadow: 2px 2px 4.5px rgba(0, 0, 0, 0.4);
-            .btn-primary {
-                margin: 0 auto;
-                height: 40px;
-                line-height: 40px;
-                border-radius: 20px;
-                width: fit-content;
-                padding: 0 20px;
-                color: #fff;
-                font-size: 14px;
-                background: linear-gradient(#76C3FF, #2199F8);
-            }
-        }
-    }
-}
-
-/* 折叠动画:使用 max-height + 透明度 以获得平滑过渡 */
-.collapse-enter-active,
-.collapse-leave-active { transition: max-height .3s cubic-bezier(0.4, 0, 0.2, 1), opacity .3s cubic-bezier(0.4, 0, 0.2, 1); }
-.collapse-enter-from,
-.collapse-leave-to { max-height: 0; opacity: 0; }
-.collapse-enter-to,
-.collapse-leave-from { max-height: 90px; opacity: 1; }
-</style>

+ 0 - 252
src/views/old_mini/offer_price/component/servicePrice.vue

@@ -1,252 +0,0 @@
-<template>
-    <div class="service-price">
-        <div class="service-form">
-            <div class="service-form-title">服务报价</div>
-            <el-form ref="formRef" :model="form" label-width="86px">
-                <el-form-item label="人工服务" prop="manualServicePrice" class="input-unit">
-                    <el-input v-if="isEdit" v-model="form.manualServicePrice" type="number" step="0.01" placeholder="请输入数字">
-                        <template #append>元/亩</template>
-                    </el-input>
-                    <div v-else class="service-form-value">
-                        {{ form.manualServicePrice || "--" }}<span class="unit" v-if="form.manualServicePrice">元/亩</span>
-                    </div>
-                </el-form-item>
-                <el-form-item label="无人机服务" prop="uavServicePrice" class="input-unit">
-                    <el-input v-if="isEdit" v-model="form.uavServicePrice" type="number" step="0.01" placeholder="请输入数字">
-                        <template #append>元/亩</template>
-                    </el-input>
-                    <div v-else class="service-form-value">
-                        {{ form.uavServicePrice || "--" }}<span class="unit" v-if="form.uavServicePrice">元/亩</span>
-                    </div>
-                </el-form-item>
-            </el-form>
-        </div>
-        <div class="page-action" v-if="isEdit">
-            <div class="btn-item cancel" @click="handleCancel">取消</div>
-            <div class="btn-right">
-                <div class="btn-item primary" @click="handleSave">保存服务报价</div>
-            </div>
-        </div>
-        <div class="page-action" v-else>
-            <div class="btn-item primary center-btn" @click="handleEdit">编辑服务报价</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onActivated } from "vue";
-import { ElMessage } from "element-plus";
-
-// 表单模型与选项
-const formRef = ref();
-const form = reactive({
-    manualServicePrice: null,
-    uavServicePrice: null,
-});
-
-// 保存原始值,用于取消编辑时恢复
-const originalForm = reactive({
-    manualServicePrice: null,
-    uavServicePrice: null,
-});
-
-const isEdit = ref(false);
-const loading = ref(false);
-
-// 获取服务报价
-const getServicePrice = () => {
-    loading.value = true;
-    VE_API.z_agricultural_store
-        .service_price()
-        .then((res) => {
-            if (res.code === 0 && res.data) {
-                form.manualServicePrice = res.data.manualServicePrice || null;
-                form.uavServicePrice = res.data.uavServicePrice || null;
-                // 保存原始值
-                originalForm.manualServicePrice = res.data.manualServicePrice || null;
-                originalForm.uavServicePrice = res.data.uavServicePrice || null;
-            }
-        })
-        .catch((error) => {
-            console.error("获取服务报价失败:", error);
-            ElMessage.error("获取服务报价失败");
-        })
-        .finally(() => {
-            loading.value = false;
-        });
-};
-
-// 保存服务报价
-const handleSave = () => {
-    // 表单验证
-    if (form.manualServicePrice === null || form.manualServicePrice === "" || form.uavServicePrice === null || form.uavServicePrice === "") {
-        ElMessage.warning("请填写完整信息");
-        return;
-    }
-
-    if (form.manualServicePrice < 0 || form.uavServicePrice < 0) {
-        ElMessage.warning("价格不能为负数");
-        return;
-    }
-
-    loading.value = true;
-    VE_API.z_agricultural_store
-        .updatePrice({
-            manualServicePrice: form.manualServicePrice,
-            uavServicePrice: form.uavServicePrice,
-        })
-        .then((res) => {
-            if (res.code === 0) {
-                ElMessage.success("保存成功");
-                // 更新原始值
-                originalForm.manualServicePrice = form.manualServicePrice;
-                originalForm.uavServicePrice = form.uavServicePrice;
-                // 退出编辑模式
-                isEdit.value = false;
-            } else {
-                ElMessage.error(res.message || "保存失败");
-            }
-        })
-        .catch((error) => {
-            console.error("保存失败:", error);
-            ElMessage.error("保存失败,请重试");
-        })
-        .finally(() => {
-            loading.value = false;
-        });
-};
-
-// 取消编辑
-const handleCancel = () => {
-    // 恢复原始值
-    form.manualServicePrice = originalForm.manualServicePrice;
-    form.uavServicePrice = originalForm.uavServicePrice;
-    // 退出编辑模式
-    isEdit.value = false;
-};
-
-// 进入编辑模式
-const handleEdit = () => {
-    isEdit.value = true;
-};
-
-onMounted(() => {
-    getServicePrice();
-});
-
-onActivated(() => {
-    // 页面激活时重新获取数据
-    getServicePrice();
-});
-</script>
-
-<style lang="scss" scoped>
-.service-price {
-    width: 100%;
-    height: 100%;
-
-    .service-form {
-        margin: 12px;
-        padding: 12px 12px 2px 12px;
-        background: #ffffff;
-        border-radius: 8px;
-        .service-form-title {
-            font-size: 16px;
-            color: #000000;
-            margin-bottom: 10px;
-        }
-        .service-form-value {
-            border: 1px solid rgba(24, 24, 24, 0.1);
-            border-radius: 5px;
-            padding: 0 10px;
-            width: 100%;
-            height: 30px;
-            line-height: 30px;
-            .unit {
-                color: rgba(0, 0, 0, 0.3);
-                padding-left: 8px;
-            }
-        }
-        ::v-deep {
-            .el-form-item__label {
-                color: rgba(0, 0, 0, 0.4);
-                font-size: 14px;
-            }
-            .el-form-item--default {
-                margin-bottom: 16px;
-            }
-            .el-input__wrapper {
-                box-shadow: none;
-            }
-            .el-input-group__append {
-                padding: 0 10px;
-                background: none;
-                box-shadow: none;
-                color: rgba(0, 0, 0, 0.3);
-            }
-            .input-unit {
-                .el-input {
-                    border: 1px solid rgba(24, 24, 24, 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: #000000;
-                    // --el-input-placeholder-color: rgba(33, 153, 248, 0.43);
-                }
-            }
-        }
-    }
-
-    .page-action {
-        position: fixed;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        padding: 12px 12px;
-        background: #fff;
-        box-shadow: 2px 2px 4.5px rgba(0, 0, 0, 0.4);
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        .btn-item {
-            height: 40px;
-            line-height: 41px;
-            border-radius: 20px;
-            width: fit-content;
-            padding: 0 20px;
-            color: #666666;
-            font-size: 14px;
-            &.del {
-                color: #ff943d;
-                background: rgba(255, 148, 61, 0.1);
-            }
-            &.cancel {
-                border: 1px solid rgba(153, 153, 153, 0.5);
-            }
-            &.primary {
-                color: #fff;
-                background: linear-gradient(#76c3ff, #2199f8);
-            }
-        }
-        .center-btn {
-            margin: 0 auto;
-        }
-        .btn-right {
-            display: flex;
-            gap: 10px;
-        }
-    }
-}
-</style>

+ 0 - 60
src/views/old_mini/offer_price/index.vue

@@ -1,60 +0,0 @@
-<template>
-    <div class="agri-services">
-        <custom-header name="报价维护"></custom-header>
-        <tabs v-model:active="active" class="tabs">
-            <tab title="药肥报价">
-                <fertilizer-price />
-            </tab>
-            <tab title="服务报价">
-                <service-price />
-            </tab>
-        </tabs>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted } from "vue";
-import { Tab, Tabs } from "vant";
-import fertilizerPrice from "./component/fertilizerPrice.vue";
-import servicePrice from "./component/servicePrice.vue";
-import customHeader from "@/components/customHeader.vue";
-const active = ref(0);
-
-</script>
-<style lang="scss" scoped>
-.agri-services {
-    width: 100%;
-    height: 100vh;
-    .farm-dynamics-container {
-        ::v-deep{
-            .task-content{
-                height: calc(100% - 80px);
-            }
-        }
-    }
-    .tabs {
-        height: calc(100% - 40px);
-        ::v-deep {
-            .van-tabs__wrap {
-                margin-bottom: 8px;
-            }
-            .van-tabs__line {
-                width: 24px;
-                height: 4px;
-            }
-            .van-tab {
-                width: 100px;
-                flex: none;
-            }
-            .van-tabs__nav {
-                justify-content: center;
-            }
-            .van-tabs__content {
-                overflow: auto;
-                height: calc(100% - 44px);
-                background: #F5F7FB;
-            }
-        }
-    }
-}
-</style>

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

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

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

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

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

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

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

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

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

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

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

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

+ 0 - 240
src/views/old_mini/service_manage/index.vue

@@ -1,240 +0,0 @@
-<template>
-    <div class="service-manage">
-        <custom-header name="服务维护"></custom-header>
-        <ServiceInfo 
-            ref="serviceInfoRef"
-            v-model:crops="crops"
-            v-model:serviceTypes="serviceTypes"
-            v-model:machines="machines"
-            v-model:isEdit="isEdit"
-        />
-        
-        <div class="page-action" v-if="isEdit">
-            <div class="btn-item cancel" @click="isEdit = false">取消</div>
-            <div class="btn-right">
-                <div class="btn-item primary" @click="handleSave">保存服务类型</div>
-            </div>
-        </div>
-        <div class="page-action" v-else>
-            <div class="btn-item primary center-btn" @click="isEdit = true">编辑服务类型</div>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import { ref, onMounted, onActivated, watch } from "vue";
-import customHeader from "@/components/customHeader.vue";
-import ServiceInfo from "@/components/pageComponents/ServiceInfo.vue";
-import { ElMessage } from "element-plus";
-
-const isEdit = ref(false);
-const serviceInfoRef = ref(null);
-
-// 默认数据
-const defaultCrops = [
-    { name: "荔枝", isSelf: 0 },
-    { name: "水稻", isSelf: 0 },
-    { name: "菠萝", isSelf: 0 },
-    { name: "柚子", isSelf: 0 },
-    { name: "蔬菜", isSelf: 0 },
-    { name: "小麦", isSelf: 0 },
-];
-const defaultServiceTypes = [
-    { name: "嫁接", isSelf: 0 },
-    { name: "施肥打药", isSelf: 0 },
-    { name: "修剪", isSelf: 0 },
-];
-const defaultMachines = [
-    { name: "植保机", isSelf: 0 },
-    { name: "喷药车", isSelf: 0 },
-    { name: "收割机", isSelf: 0 }
-];
-
-// 三类数据:数组对象形式
-const crops = ref([]);
-const serviceTypes = ref([]);
-const machines = ref([]);
-
-// 将接口返回的字符串数组转换为对象数组(默认显示时使用)
-function convertApiDataToItems(apiList) {
-    if (!Array.isArray(apiList)) {
-        return [];
-    }
-    return apiList.map(item => {
-        const name = typeof item === 'string' ? item : (item.name || item);
-        // 检查是否是默认数据中的项
-        const isDefault = defaultCrops.some(d => d.name === name) || 
-                         defaultServiceTypes.some(d => d.name === name) || 
-                         defaultMachines.some(d => d.name === name);
-        return {
-            name: name,
-            isSelf: isDefault ? 0 : 1, // 如果是默认数据中的,isSelf=0,否则是用户自定义的
-            selected: true // 接口返回的都是已保存的,所以都选中
-        };
-    });
-}
-
-// 合并数据:编辑时将默认数据与接口数据合并,name相同的设置为选中
-function mergeDataForEdit(defaultList, apiList) {
-    // 创建 API 返回数据的名称集合(用于判断是否选中)
-    const apiNameSet = new Set(apiList.map(item => typeof item === 'string' ? item : (item.name || item)));
-    
-    // 合并逻辑:默认数据 + API 数据(去重)
-    const merged = [...defaultList];
-    
-    // 标记默认数据中哪些被选中(name 在 API 数据中存在)
-    merged.forEach(item => {
-        if (apiNameSet.has(item.name)) {
-            item.selected = true;
-        } else {
-            item.selected = false;
-        }
-    });
-    
-    // 添加 API 中存在但默认数据中不存在的项(这些是用户自定义的)
-    apiList.forEach(apiItem => {
-        const apiName = typeof apiItem === 'string' ? apiItem : (apiItem.name || apiItem);
-        const exists = merged.some(item => item.name === apiName);
-        if (!exists) {
-            merged.push({
-                name: apiName,
-                isSelf: 1, // 标记为用户自定义
-                selected: true
-            });
-        }
-    });
-    
-    return merged;
-}
-
-// 获取服务详情
-function getServiceDetail() {
-    VE_API.z_agricultural_store.getServiceDetail().then(({ data }) => {
-        if (data) {
-            // 默认情况下,只显示接口返回的数据
-            crops.value = convertApiDataToItems(data.serviceCropsJson || []);
-            serviceTypes.value = convertApiDataToItems(data.serviceTypeJson || []);
-            machines.value = convertApiDataToItems(data.agriculturalEquipmentJson || []);
-        } else {
-            // 如果没有数据,显示空数组
-            crops.value = [];
-            serviceTypes.value = [];
-            machines.value = [];
-        }
-    }).catch(() => {
-        // 获取失败,显示空数组
-        crops.value = [];
-        serviceTypes.value = [];
-        machines.value = [];
-    });
-}
-
-// 监听编辑状态,编辑时合并默认数据
-watch(isEdit, (newVal) => {
-    if (newVal) {
-        // 进入编辑模式,合并默认数据
-        VE_API.z_agricultural_store.getServiceDetail().then(({ data }) => {
-            if (data) {
-                crops.value = mergeDataForEdit(defaultCrops, data.serviceCropsJson || []);
-                serviceTypes.value = mergeDataForEdit(defaultServiceTypes, data.serviceTypeJson || []);
-                machines.value = mergeDataForEdit(defaultMachines, data.agriculturalEquipmentJson || []);
-            } else {
-                // 如果没有数据,使用默认数据(都不选中)
-                crops.value = defaultCrops.map(item => ({ ...item, selected: false }));
-                serviceTypes.value = defaultServiceTypes.map(item => ({ ...item, selected: false }));
-                machines.value = defaultMachines.map(item => ({ ...item, selected: false }));
-            }
-        }).catch(() => {
-            // 获取失败,使用默认数据(都不选中)
-            crops.value = defaultCrops.map(item => ({ ...item, selected: false }));
-            serviceTypes.value = defaultServiceTypes.map(item => ({ ...item, selected: false }));
-            machines.value = defaultMachines.map(item => ({ ...item, selected: false }));
-        });
-    } else {
-        // 退出编辑模式,重新获取数据(只显示接口返回的数据)
-        getServiceDetail();
-    }
-});
-
-// 保存服务类型
-function handleSave() {
-    if (!serviceInfoRef.value) {
-        return;
-    }
-    
-    const serviceInfo = serviceInfoRef.value.getServiceInfo();
-    
-    VE_API.z_agricultural_store.updateService({
-        serviceCropsJson: serviceInfo.serviceCropsJson,
-        serviceTypeJson: serviceInfo.serviceTypeJson,
-        agriculturalEquipmentJson: serviceInfo.agriculturalEquipmentJson
-    }).then(({ code, msg }) => {
-        if (code === 0) {
-            ElMessage.success("保存成功");
-            isEdit.value = false;
-            // 重新获取数据
-            getServiceDetail();
-        } else {
-            ElMessage.error(msg || "保存失败");
-        }
-    }).catch(() => {
-        ElMessage.error("保存失败,请重试");
-    });
-}
-
-onMounted(() => {
-    getServiceDetail();
-});
-
-onActivated(() => {
-    getServiceDetail();
-});
-</script>
-
-<style lang="scss" scoped>
-.service-manage {
-    width: 100%;
-    height: 100vh;
-    background: #F5F7FB;
-    
-    .page-action {
-        position: fixed;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        padding: 12px 12px;
-        background: #fff;
-        box-shadow: 2px 2px 4.5px rgba(0, 0, 0, 0.4);
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        .btn-item {
-            height: 40px;
-            line-height: 41px;
-            border-radius: 20px;
-            width: fit-content;
-            padding: 0 20px;
-            color: #666666;
-            font-size: 14px;
-            &.del {
-                color: #ff943d;
-                background: rgba(255, 148, 61, 0.1);
-            }
-            &.cancel {
-                border: 1px solid rgba(153, 153, 153, 0.5);
-            }
-            &.primary {
-                color: #fff;
-                background: linear-gradient(#76c3ff, #2199f8);
-            }
-        }
-        .center-btn {
-            margin: 0 auto;
-        }
-        .btn-right {
-            display: flex;
-            gap: 10px;
-        }
-    }
-}
-</style>