Kaynağa Gözat

feat: 新增农事,分享弹窗,专家主页

lxf 5 gün önce
ebeveyn
işleme
5f07a4e635

+ 1 - 1
src/App.vue

@@ -138,7 +138,7 @@ const router = useRouter();
 // 首页loading加载完才显示底部导航栏
 const showTab = ref(false);
 // 0: 农户, 1: 专家, 2:农资农服
-const curRole = ref(2);
+const curRole = ref(1);
 
 let tabBarHeight = 0;
 onMounted(() => {

BIN
src/assets/img/home/box-bg.png


BIN
src/assets/img/home/garden-title.png


BIN
src/assets/img/home/man.png


+ 158 - 4
src/components/reportPopup.vue

@@ -1,7 +1,46 @@
 <template>
     <Popup v-model:show="show" class="report-popup">
         <div class="popup-content-box">
-            <div class="popup-title">报告</div>
+            <div class="report-bg">
+                <img class="box-bg" src="@/assets/img/home/box-bg.png" alt="">
+            </div>
+            <div class="report-content">
+                <div class="report-garden">
+                    <img class="garden-icon" src="https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png" alt="">
+                    荔枝博览园
+                </div>
+                <div class="report-time">2025.02.15农场报告</div>
+                <div class="report-address">广东省广州市从化区</div>
+                <div class="report-img">
+                    <img class="report-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" alt="">
+                </div>
+                <div class="report-line"></div>
+                <div class="report-desc">
+                    当前位于广州市从化区荔枝博览园,共 <span class="main-text">12000棵</span>树,有 <span class="main-text">7659棵</span> 树触发了农事。
+                </div>
+                <div class="report-info">
+                    <div class="info-item">
+                        <span class="item-dotted"></span>
+                        物候进程
+                        <span class="item-text">花期短暂,果期集中,成熟迅速</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="item-dotted"></span>
+                        生长异常
+                        <span class="item-text">花而不实,落果严重,品质下降</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="item-dotted"></span>
+                        病虫异常
+                        <span class="item-text">虫蛀果裂,病斑密布,落叶早衰</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+        
+        <div class="bottom-btn">
+            <div class="btn-item secondary-btn" @click="toPage">分享给</div>
+            <div class="btn-item primary-btn" @click="triggerClick">保存图片</div>
         </div>
     </Popup>
 </template>
@@ -16,8 +55,6 @@ const handleShow = () => {
     show.value = true;
 };
 
-defineExpose({handleShow});
-
 const handleClose = () => {
     show.value = false;
 };
@@ -27,6 +64,123 @@ defineExpose({handleClose,handleShow});
 
 <style lang="scss" scoped>
 .report-popup {
-    width: 100%;
+    width: 343px;
+    border-radius: 12px;
+    background: transparent;
+    .popup-content-box {
+        position: relative;
+        background: #FFFFFF;
+        border-radius: 12px;
+        .report-bg {
+            .box-bg {
+                position: absolute;
+                top: 0;
+                left: 0;
+                z-index: 0;
+                width: 100%;
+                height: 203px;
+            }
+        }
+        .report-content {
+            position: relative;
+            z-index: 2;
+            padding: 12px 12px 20px 12px;
+            .report-garden {
+                background: rgba(0, 0, 0, 0.6);
+                color: #fff;
+                height: 28px;
+                display: flex;
+                align-items: center;
+                width: fit-content;
+                padding: 0 8px 0 2px;
+                border-radius: 20px;
+                font-size: 14px;
+                .garden-icon {
+                    width: 24px;
+                    height: 24px;
+                    border-radius: 50%;
+                    box-sizing: border-box;
+                    // border: 1px solid #fff;
+                    margin-right: 6px;
+                }
+            }
+            .report-time {
+                padding-top: 42px;
+                font-size: 22px;
+                color: #000000;
+                font-weight: bold;
+            }
+            .report-address {
+                font-size: 16px;
+                color: rgba(0, 0, 0, 0.5);
+            }
+            .report-img {
+                padding: 16px 0 12px 0;
+                .report-img-dom {
+                    width: 100%;
+                    height: 152px;
+                    border-radius: 12px;
+                    object-fit: cover;
+                }
+            }
+            .report-line {
+                border-bottom: 1px dotted rgba(0, 0, 0, 0.1);
+            }
+            .report-desc {
+                padding: 17px 10px 8px 10px;
+                font-size: 14px;
+                color: #333333;
+                .main-text {
+                    color: #2199F8;
+                }
+            }
+            .report-info {
+                padding: 5px 8px;
+                font-size: 14px;
+                .info-item {
+                    display: flex;
+                    align-items: center;
+                    color: #999999;
+                    padding-bottom: 2px;
+                    .item-dotted {
+                        width: 4px;
+                        height: 4px;
+                        border-radius: 50%;
+                        background: #BBBBBB;
+                        margin-right: 8px;
+                    }
+                    .item-text {
+                        padding-left: 12px;
+                        color: #000000;
+                    }
+                }
+            }
+        }
+    }
+    .bottom-btn {
+        width: 100%;
+        text-align: center;
+        margin-top: 20px;
+        display: flex;
+        .btn-item {
+            flex: 1;
+            text-align: center;
+            height: 38px;
+            line-height: 38px;
+            border-radius: 30px;
+            font-size: 14px;
+            &.secondary-btn {
+                background: #FFFFFF;
+                color: #000000;
+            }
+            &.primary-btn {
+                background: linear-gradient(180deg, #76C3FF, #2199F8);
+                color: #FFFFFF;
+            }
+        }
+        .btn-item + .btn-item {
+            margin-left: 12px;
+        }
+    }
 }
 </style>

+ 7 - 0
src/router/globalRoutes.js

@@ -164,4 +164,11 @@ export default [
         name: "ReportDetail",
         component: () => import("@/views/old_mini/report_detail/index.vue"),
     },
+    // 专家-我的主页
+    {
+        path: "/expert_detail",
+        name: "ExpertDetail",
+        component: () => import("@/views/old_mini/expert_detail/index.vue"),
+    },
+    
 ];

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

@@ -0,0 +1,310 @@
+<template>
+    <div class="farm-page">
+        <custom-header name="我的主页"></custom-header>
+        <div class="farm-list">
+            <div class="box-wrap expert-info">
+                <div class="expert-top">
+                    <div class="top-l">
+                        <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="">
+                        专家简介
+                    </div>
+                    <div class="list-one">
+                        <div class="one-info">
+                            <div class="one-name">职称:</div>广州荔博园种业有限公司董事长
+                        </div>
+                        <div class="one-info">
+                            <div class="one-name">单位:</div>广州市从化区荔枝文化博览园
+                        </div>
+                        <div class="one-info">
+                            <div class="one-name">擅长:</div>擅长:荔枝的病虫害防治、生长异常调节、物候期调 节等等...
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="box-wrap list-wrap">
+                <div class="list-title">
+                    <div class="page-title">
+                        <img class="title-icon" src="@/assets/img/home/man.png" alt="">
+                        定点基地
+                    </div>
+                </div>
+                <div class="list-item" v-for="item in 3" :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" alt="">
+                            </div>
+                            <div class="left-content">
+                                <div class="content-title">
+                                    <span>荔枝博览园</span>
+                                </div>
+                                <div class="content-desc">
+                                    <div>服务作物:荔枝-妃子笑、桂味</div>
+                                    <div>农场位置:广东省广州市从化区</div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="item-btn">查看详情</div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import customHeader from "@/components/customHeader.vue";
+import { ref } from "vue";
+
+const tagList = [{name: "荔枝"}, {name: "龙眼"}]
+</script>
+
+<style scoped lang="scss">
+.farm-page {
+    width: 100%;
+    height: 100vh;
+    .farm-list {
+        width: 100%;
+        height: calc(100% - 40px);
+        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;
+            }
+        }
+        .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;
+                    }
+                    .info-name {
+                        display: flex;
+                    }
+                    .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;
+                    }
+                    .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: 16px 0;
+                    font-size: 14px;
+                    .list-one {
+                        padding-top: 8px;
+                        .one-info {
+                            display: flex;
+                            color: #666666;
+                            line-height: 18px;
+                            padding-bottom: 2px;
+                            .one-name {
+                                color: rgba(102, 102, 102, 0.5);
+                            }
+                        }
+                    }
+                }
+            }
+            &.list-wrap {
+                margin-top: 12px;
+            }
+        }
+        .list-item {
+            background-color: #fff;
+            border-radius: 10px;
+            padding: 10px;
+            display: flex;
+            justify-content: space-between;
+            .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: #a8a8a8;
+            }
+        }
+        .list-item + .list-item {
+            margin-top: 12px;
+        }
+    }
+}
+</style>

+ 29 - 15
src/views/old_mini/farm_manage/components/farmManage.vue

@@ -1,19 +1,21 @@
 <template>
-    <div class="farm-manage-content">
-        <el-input class="search" v-model="searchValue" placeholder="搜索位置" @search="search" :prefix-icon="Search" />
-        <div class="select-group">
-            <el-select class="select-item" v-model="dateValue" placeholder="Select">
-                <el-option v-for="item in dateOptions" :key="item.value" :label="item.label" :value="item.value" />
-            </el-select>
-            <el-select class="select-item" v-model="areaValue" placeholder="Select">
-                <el-option v-for="item in areaOptions" :key="item.value" :label="item.label" :value="item.value" />
-            </el-select>
-            <el-select class="select-item" v-model="areaValue1" placeholder="Select">
-                <el-option v-for="item in areaOptions1" :key="item.value" :label="item.label" :value="item.value" />
-            </el-select>
+    <div class="farm-manage-content" :style="{ height: `calc(100vh - ${tabBarHeight}px - 50px)` }">
+        <div class="manage-top">
+            <el-input class="search" v-model="searchValue" placeholder="搜索位置" @search="search" :prefix-icon="Search" />
+            <div class="select-group">
+                <el-select class="select-item" v-model="dateValue" placeholder="Select">
+                    <el-option v-for="item in dateOptions" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+                <el-select class="select-item" v-model="areaValue" placeholder="Select">
+                    <el-option v-for="item in areaOptions" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+                <el-select class="select-item" v-model="areaValue1" placeholder="Select">
+                    <el-option v-for="item in areaOptions1" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+            </div>
         </div>
         <div class="farm-list">
-            <div :class="['farm-item', { 'is-default': item === 3 }]" v-for="item in 3" :key="item" @click="handleItemClick(item)">
+            <div :class="['farm-item', { 'is-default': item === 3 }]" v-for="item in 10" :key="item" @click="handleItemClick(item)">
                 <div class="item-top"><span class="num">2</span> 条农事待确认</div>
                 <div class="item-title">未命名农场</div>
                 <div class="item-desc">
@@ -41,9 +43,13 @@
 </template>
 
 <script setup>
-import { ref } from "vue";
+import { computed, ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { useRouter } from "vue-router";
+import { useStore } from "vuex";
+
+const store = useStore();
+const tabBarHeight = computed(() => store.state.home.tabBarHeight);
 
 const router = useRouter();
 const searchValue = ref("");
@@ -80,7 +86,8 @@ const handleItemClick = (item) => {
     width: 100%;
     height: calc(100vh - 52px - 50px);
     background: #f5f7fb;
-    padding: 8px 12px;
+    padding: 8px 0 0 12px;
+    overflow: auto;
     box-sizing: border-box;
     .search {
         ::v-deep {
@@ -120,7 +127,14 @@ const handleItemClick = (item) => {
             }
         }
     }
+    .manage-top {
+        padding-right: 12px;
+    }
     .farm-list {
+        height: calc(100% - 74px);
+        padding: 0 12px 26px 0;
+        box-sizing: border-box;
+        overflow: auto;
         .farm-item {
             background: #fff;
             border-radius: 10px;

+ 1 - 1
src/views/old_mini/home/components/homeFloatingPanel.vue

@@ -60,7 +60,7 @@
                 </div>
             </template>
             <div class="floating-panel-content" v-show="activeTab === 0">
-                <record-task></record-task>
+                <record-task :cardContentHeight="cardContentHeight"></record-task>
             </div>
             <div class="floating-panel-content" ref="cardContentRef" v-show="activeTab === 1">
                 <div class="card-content-group" ref="containerRef" :style="{ height: `${cardContentHeight}px` }">

+ 138 - 118
src/views/old_mini/home/components/recordTask.vue

@@ -3,152 +3,163 @@
         <div class="task-top">
             <div class="record-filter">
                 <div
-                        class="filter-item"
-                        v-for="(item, index) in filterType"
-                        :key="index"
-                        @click="handlePlanClick(index)"
-                        :class="{ active: activePlanIndex === index }"
-                        >
-                        {{ item }}
-                    </div>
+                    class="filter-item"
+                    v-for="(item, index) in filterType"
+                    :key="index"
+                    @click="handlePlanClick(index)"
+                    :class="{ active: activePlanIndex === index }"
+                >
+                    {{ item }}
+                </div>
             </div>
             <div class="select-box">
                 <div class="select-item">
                     <el-select v-model="typeVal" placeholder="农事类型">
-                            <el-option
-                                v-for="item in typeOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
+                        <el-option
+                            v-for="item in typeOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        />
                     </el-select>
                 </div>
                 <div class="select-item">
                     <el-select v-model="regionVal" placeholder="执行区域">
-                            <el-option
-                                v-for="item in regionOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
+                        <el-option
+                            v-for="item in regionOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        />
                     </el-select>
                 </div>
                 <div class="select-item">
                     <el-select v-model="levelVal" placeholder="紧急程度">
-                            <el-option
-                                v-for="item in levelOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            />
+                        <el-option
+                            v-for="item in levelOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        />
                     </el-select>
                 </div>
             </div>
         </div>
-        <div class="task-content">
+        <div class="task-content" :style="cardContentHeight ? `height: ${cardContentHeight + (curRole == 0 ? 0 : 40)}px` : ''">
             <div class="plan-menu">
-                    <el-anchor :container="containerRef" direction="vertical" type="default" @click="handleClick">
-                        <el-menu :default-active="defaultActive" class="el-menu-vertical-demo">
-                            <el-sub-menu v-for="(menu, index) in menuData" :key="index" :index="String(menu.id)">
-                                <template #title>
-                                    <img class="menu-icon" :src="require(`@/assets/img/gallery/icon-${index}.png`)" />
-                                    <span class="menu-text">{{ menu.title }}</span>
-                                </template>
-                                <el-menu-item
-                                    v-for="item in menu.children"
-                                    :key="item.id"
-                                    :index="`${menu.id}-${item.id}`"
-                                >
-                                    <el-anchor-link :href="item.href" :title="item.title" />
-                                </el-menu-item>
-                            </el-sub-menu>
-                        </el-menu>
-                    </el-anchor>
-                </div>
-                <div class="expert-content" ref="containerRef">
-                    <div v-for="(section, index) in contentData" :key="index" class="content-section">
-                        <div class="section-id" :id="section.targetId"></div>
-                        <record-item :record-item-data="section" :onlyRecipeName="true" class="recipe-item">
+                <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>
-                                <div class="box-title">
-                                    <div class="title-l">
-                                        {{ section.title }}
-                                        <span class="parent-text">{{ section.parentTitle || "秋梢期" }}</span>
-                                    </div>
-                                    <div class="title-r">
-                                        <span class="r-dot"></span>
-                                        2区
-                                    </div>
-                                </div>
+                                <img class="menu-icon" :src="require(`@/assets/img/gallery/icon-${index}.png`)" />
+                                <span class="menu-text">{{ menu.title }}</span>
                             </template>
-                            <template #footer>
-                                <div class="action-group">
-                                    <div class="action-l">查看详情</div>
-                                    <div class="action-r" v-if="section.orderStatus === 0">
-                                        <div class="action-item second-item">拍照识别</div>
-                                        <div class="action-item primary-item">去确认</div>
-                                    </div>
-                                    <div class="action-r" v-if="section.orderStatus === 1">
-                                        <div class="action-item warning-item">发起需求</div>
-                                        <div class="action-item primary-item">确认完成</div>
-                                    </div>
-                                    <div class="action-r" v-if="section.orderStatus === 2">
-                                        <div class="action-item warning-item">发起需求</div>
-                                        <div class="action-item primary-item">去复核</div>
-                                    </div>
+                            <el-menu-item v-for="item in menu.children" :key="item.id" :index="`${menu.id}-${item.id}`">
+                                <el-anchor-link :href="item.href" :title="item.title" />
+                            </el-menu-item>
+                        </el-sub-menu>
+                    </el-menu>
+                </el-anchor>
+            </div>
+            <div class="expert-content" ref="containerRef">
+                <div v-for="(section, index) in contentData" :key="index" class="content-section">
+                    <div class="section-id" :id="section.targetId"></div>
+                    <record-item :record-item-data="section" :onlyRecipeName="true" class="recipe-item">
+                        <template #title>
+                            <div class="box-title">
+                                <div class="title-l">
+                                    {{ section.title }}
+                                    <span class="parent-text">{{ section.parentTitle || "秋梢期" }}</span>
                                 </div>
-                            </template>
-                        </record-item>
-                    </div>
+                                <div class="title-r">
+                                    <span class="r-dot"></span>
+                                    2区
+                                </div>
+                            </div>
+                        </template>
+                        <template #footer>
+                            <div class="action-group">
+                                <div class="action-l">查看详情</div>
+                                <div class="action-r" v-if="section.orderStatus === 0">
+                                    <div class="action-item second-item">拍照识别</div>
+                                    <div class="action-item primary-item">去确认</div>
+                                </div>
+                                <div class="action-r" v-if="section.orderStatus === 1">
+                                    <div class="action-item warning-item">发起需求</div>
+                                    <div class="action-item primary-item">确认完成</div>
+                                </div>
+                                <div class="action-r" v-if="section.orderStatus === 2">
+                                    <div class="action-item warning-item">发起需求</div>
+                                    <div class="action-item primary-item">去复核</div>
+                                </div>
+                            </div>
+                        </template>
+                    </record-item>
                 </div>
+            </div>
         </div>
     </div>
 </template>
 
 <script setup>
-import { ref } from 'vue';
+import { ref, watch } from "vue";
 import recordItem from "@/components/recordItem.vue";
 
-const filterType = ref(["待触发", "待执行", "已完成", "发起的需求"])
+const props = defineProps({
+    cardContentHeight: {
+        type: Number,
+        default: null,
+    },
+});
+
+// 角色
+// const curRole = store.state.app.curRole
+const curRole = 0
 
-const typeVal = ref(null)
-const regionVal = ref(null)
-const levelVal = ref(null)
+const filterType = ref(["待触发", "待执行", "已完成", "发起的需求"]);
+
+const typeVal = ref(null);
+const regionVal = ref(null);
+const levelVal = ref(null);
 const typeOptions = ref([
     { label: "全部", value: "all" },
     { label: "施肥", value: "1" },
     { label: "用药", value: "2" },
     { label: "修剪", value: "3" },
     { label: "其他", value: "4" },
-])
+]);
 
-const regionOptions = ref([{
-    label: "全部",
-    value: "all"
-}, {
-    label: "区域1",
-    value: "1"
-}, {
-    label: "区域2",
-    value: "2"
-}, {
-    label: "区域3",
-    value: "3"
-}])
+const regionOptions = ref([
+    {
+        label: "全部",
+        value: "all",
+    },
+    {
+        label: "区域1",
+        value: "1",
+    },
+    {
+        label: "区域2",
+        value: "2",
+    },
+    {
+        label: "区域3",
+        value: "3",
+    },
+]);
 
 const levelOptions = ref([
     { label: "全部", value: "all" },
     { label: "紧急", value: "1" },
     { label: "一般", value: "2" },
     { label: "不紧急", value: "3" },
-])
+]);
 
 const activePlanIndex = ref(0);
 const handlePlanClick = (index) => {
     activePlanIndex.value = index;
 };
 
-
 const containerRef = ref(null);
 const handleClick = (e) => {
     e.preventDefault();
@@ -1133,6 +1144,14 @@ const contentData = ref([
     },
 ]);
 
+watch(
+    () => props.cardContentHeight,
+    (newValue) => {
+        if (newValue) {
+            // console.log('new', newValue);
+        }
+    }
+);
 </script>
 
 <style lang="scss" scoped>
@@ -1148,19 +1167,19 @@ const contentData = ref([
             justify-content: space-between;
             align-items: center;
             .filter-item {
-                    color: rgba(0, 0, 0, 0.5);
-                    padding: 0 12px;
-                    height: 28px;
-                    line-height: 28px;
-                    border-radius: 20px;
-                    &.active {
-                        background: rgba(33, 153, 248, 0.2);
-                        color: #2199F8;
-                    }
-                }
-                .filter-item + .filter-item {
-                    margin-left: 10px;
+                color: rgba(0, 0, 0, 0.5);
+                padding: 0 12px;
+                height: 28px;
+                line-height: 28px;
+                border-radius: 20px;
+                &.active {
+                    background: rgba(33, 153, 248, 0.2);
+                    color: #2199f8;
                 }
+            }
+            .filter-item + .filter-item {
+                margin-left: 10px;
+            }
         }
         .select-box {
             padding-top: 5px;
@@ -1206,6 +1225,7 @@ const contentData = ref([
         .plan-menu {
             width: 90px;
             height: 100%;
+            overflow: auto;
             padding: 10px 0;
             box-sizing: border-box;
             background: #fff;
@@ -1327,13 +1347,13 @@ const contentData = ref([
                 .title-r {
                     display: flex;
                     align-items: center;
-                    color: #FF8A2A;
+                    color: #ff8a2a;
                     font-size: 12px;
                     .r-dot {
                         width: 6px;
                         height: 6px;
                         border-radius: 50%;
-                        background: #FF8A2A;
+                        background: #ff8a2a;
                         margin-right: 5px;
                     }
                 }
@@ -1345,7 +1365,7 @@ const contentData = ref([
                 justify-content: space-between;
                 padding-top: 8px;
                 margin-top: 8px;
-                border-top: 1px solid #F5F5F5;
+                border-top: 1px solid #f5f5f5;
                 .action-l {
                     font-size: 12px;
                 }
@@ -1359,16 +1379,16 @@ const contentData = ref([
                         border-radius: 14px;
                         font-size: 12px;
                         &.second-item {
-                            border: 1px solid #2199F8;
-                            color: #2199F8;
+                            border: 1px solid #2199f8;
+                            color: #2199f8;
                         }
                         &.primary-item {
-                            background: #2199F8;
+                            background: #2199f8;
                             color: #fff;
                         }
                         &.warning-item {
                             background: rgba(255, 131, 29, 0.1);
-                            color: #FF831D;
+                            color: #ff831d;
                         }
                     }
                     .action-item + .action-item {
@@ -1379,4 +1399,4 @@ const contentData = ref([
         }
     }
 }
-</style>
+</style>

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

@@ -81,7 +81,7 @@ onActivated(() => {
             {
                 title: "我的主页",
                 desc: "查看农场列表",
-                path: "/my_farm",
+                path: "/expert_detail",
             },
             {
                 title: "我的报价",

+ 2 - 2
src/views/old_mini/modify_work/completedWork.vue

@@ -154,10 +154,10 @@ const store = useStore();
 
 // 角色
 // const curRole = store.state.app.curRole
-const curRole = 0
+const curRole = 1
 
 // 0:执行, 1: 复核
-const status = ref(0);
+const status = ref(1);
 
 const prescriptioData = ref({
     prescriptionList: [

+ 95 - 27
src/views/old_mini/modify_work/index.vue

@@ -1,26 +1,28 @@
 <template>
     <div class="new-farming-page">
-        <custom-header name="编辑农事"></custom-header>
+        <custom-header :name="isAdd ? '新增农事' : '编辑农事'"></custom-header>
         <div class="new-farming-content">
-            <div class="box-wrap farm-info">
-                <div class="info-title">
-                    <div class="card-title">农场现状</div>
-                    <div class="info-more">
-                        点击查看更多
-                        <el-icon><ArrowRight /></el-icon>
+            <div v-if="!isAdd">
+                <div class="box-wrap farm-info">
+                    <div class="info-title">
+                        <div class="card-title">农场现状</div>
+                        <div class="info-more">
+                            点击查看更多
+                            <el-icon><ArrowRight /></el-icon>
+                        </div>
+                    </div>
+                    <div class="info-content">
+                        当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标
                     </div>
                 </div>
-                <div class="info-content">
-                    当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标
-                </div>
-            </div>
-            <div class="box-wrap farm-photo">
-                <div class="photo-list">
-                    <div class="img-item" v-for="(item, index) in 6" :key="index">
-                        <img class="photo-item" 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" alt="">
+                <div class="box-wrap farm-photo">
+                    <div class="photo-list">
+                        <div class="img-item" v-for="(item, index) in 6" :key="index">
+                            <img class="photo-item" 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" alt="">
+                        </div>
                     </div>
+                    <div class="list-text">点击查看更多</div>
                 </div>
-                <div class="list-text">点击查看更多</div>
             </div>
             <el-form
                 ref="formRef"
@@ -30,7 +32,7 @@
                 :model="dynamicValidateForm"
                 class="demo-dynamic"
             >
-                <div class="farm-card">
+                <div class="farm-card" v-if="!isAdd">
                     <div class="card-title">秋梢防虫<span class="type-tag">标准农事</span></div>
                     <div class="info-content">
                         <el-form-item label-width="70px" class="form-item text-item" label="农事编号">
@@ -78,9 +80,45 @@
                         </el-form-item>
                     </div>
                 </div>
+                <div class="farm-card" v-else>
+                    <div class="card-title">基本信息</div>
+                    <div class="info-content">
+                            <el-form-item label-width="82px" class="form-item" prop="name" label="农事名称">
+                                <el-select v-model="dynamicValidateForm.name" placeholder="请选择农事名称" style="width: 100%">
+                                    <el-option v-for="(item, index) in farmWorkNameList" :key="index" :value="item" :label="item" />
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item label-width="82px" class="form-item" prop="name" label="农事目的">
+                                <el-input
+                                    v-model="dynamicValidateForm.purpose"
+                                    style="width: 100%"
+                                    :rows="2"
+                                    type="textarea"
+                                    placeholder="请输入农事目的"
+                                />
+                            </el-form-item>
+                            <el-form-item label-width="82px" class="form-item" prop="conditionRate" label="触发条件">
+                                <div class="condition-wrap">
+                                    <el-select v-model="dynamicValidateForm.condition" placeholder="请选择触发条件" style="width: 58%">
+                                        <el-option v-for="(item, index) in farmWorkIndexNameList" :key="index" :value="item" :label="item" />
+                                    </el-select>
+                                    <span class="symbol"></span>
+                                    <el-select v-model="dynamicValidateForm.conditionRate" placeholder="请选择" style="width: 38%">
+                                        <el-option :value="0" label="0%" />
+                                        <el-option :value="5" label="5%" />
+                                        <el-option :value="10" label="10%" />
+                                        <el-option :value="20" label="20%" />
+                                        <el-option :value="40" label="40%" />
+                                        <el-option :value="60" label="60%" />
+                                        <el-option :value="80" label="80%" />
+                                    </el-select>
+                                </div>
+                            </el-form-item>
+                    </div>
+                </div>
                 <div class="farm-card prescription-content">
                     <div class="card-title pb-12">药物处方</div>
-                    <el-form-item label-width="32%" class="form-item" prop="usageMode" label="施用方式">
+                    <el-form-item label-width="82px" class="form-item" prop="usageMode" label="施用方式">
                         <el-select v-model="dynamicValidateForm.usageMode" placeholder="请选择施用方式" style="width: 100%">
                             <el-option
                                 v-for="(usage, uId) in allUsageModeList"
@@ -256,7 +294,7 @@
                                 popper-class="v-select-popper-ns"
                                 v-model="regionId"
                                 placeholder="请选择分区"
-                                style="width: 100px"
+                                style="width: 160px"
                                 @change="changeRegion"
                             >
                                 <el-option
@@ -280,10 +318,14 @@
                         </div>
                     </div>
                 </div>
-                <div class="submit-btn">
+                <div class="submit-btn" v-if="!isAdd">
                     <div class="btn second">驳回</div>
                     <div class="btn" @click.prevent="submitForm(formRef)">立即下发</div>
                 </div>
+                <div class="submit-btn" v-else>
+                    <div class="btn second">取消</div>
+                    <div class="btn" @click.prevent="submitForm(formRef)">新增</div>
+                </div>
             </el-form>
         </div>
     </div>
@@ -304,12 +346,17 @@ const route = useRoute();
 
 const gardenId = ref(null);
 const actionType = ref([]);
+const isAdd = ref(false)
 onMounted(() => {
+    isAdd.value = route.query.isAdd ? true : false
     window.scrollTo(0, 0);
     getFarmWorkNameList();
     getFarmWorkIndexNameList();
-    // actionType.value = JSON.parse(route.query.data);
-    actionType.value = ["生长异常"];
+    if (route.query.data) {
+        actionType.value = JSON.parse(route.query.data);
+    } else {
+        actionType.value = ["生长异常"];
+    }
     dynamicValidateForm.prescriptionList = actionType.value.map((name) => ({
         name,
         pesticideFertilizerList: [
@@ -352,6 +399,7 @@ const formRef = ref();
 const dynamicValidateForm = reactive({
     name: "",
     conditionRate: "",
+    purpose: "",
     executeDate: dayjs().format("YYYY-MM-DD"),
     checkDay: "",
     usageMode: "",
@@ -772,7 +820,7 @@ const getAreaList = (callback) => {
         }
     ]
     areaList.value = data;
-    regionId.value = (data && data.length && data[0].id) || "";
+    // regionId.value = (data && data.length && data[0].id) || "";
     changeRegion(regionId.value);
     callback && callback();
     // VE_API.region.list({ farmId: gardenId.value }).then(({ data, code }) => {
@@ -812,9 +860,6 @@ const handleArea = (e) => {
             padding-bottom: 1px;
         }
     }
-    .prescription-content {
-        padding-top: 12px;
-    }
     .box-wrap {
         background: #fff;
         padding: 10px;
@@ -939,6 +984,9 @@ const handleArea = (e) => {
         &.map-content {
             margin-top: 12px;
         }
+        &.prescription-content {
+            padding: 12px;
+        }
     }
 
     .usage-mode-wrap {
@@ -972,6 +1020,19 @@ const handleArea = (e) => {
             line-height: 30px;
             color: rgba(0, 0, 0, 0.4);
         }
+        .el-textarea__inner {
+            color: #2199f8;
+            box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.3) inset;
+        }
+        .el-textarea {
+            --el-input-placeholder-color: #2199f8;
+        }
+        .el-input {
+            --el-input-placeholder-color: #2199f8;
+        }
+        .el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before {
+            display: none;
+        }
     }
     .info-content {
         padding: 10px 0;
@@ -1080,6 +1141,13 @@ const handleArea = (e) => {
         width: 100%;
         .recipe-form {
             padding-top: 8px;
+            ::v-deep {
+                .el-form-item {
+                    &:last-child {
+                        margin-bottom: 0;
+                    }
+                }
+            }
         }
 
         .box-item {
@@ -1104,7 +1172,7 @@ const handleArea = (e) => {
             width: 100%;
             position: relative;
             // background: rgb(209, 235, 255, 0.3);
-            margin-bottom: 12px;
+            // margin-bottom: 12px;
             .form-index {
                 position: absolute;
                 left: 0;

+ 91 - 2
src/views/old_mini/plan/components/myPrescription.vue

@@ -63,16 +63,48 @@
                     下载处方
                 </div>
             </div>
-            <div class="bottom-r">新增农事</div>
+            <div class="bottom-r" @click="addWork">新增农事</div>
         </div>
     </div>
     <add-group ref="addGroupRef" />
+    <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 { ref } from "vue";
+import { computed, 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: {
@@ -80,7 +112,10 @@ const props = defineProps({
         default: false
     }
 })
+const store = useStore();
+const router = useRouter();
 
+const tabBarHeight = computed(() => store.state.home.tabBarHeight);
 // 菜单
 const defaultActive = ref("1-1");
 
@@ -1089,6 +1124,29 @@ function newPlan() {
     addGroupRef.value.openClientPopup();
 }
 
+
+// -------新增农事-----
+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);
 </script>
 
@@ -1338,4 +1396,35 @@ const containerRef = ref(null);
         }
     }
 }
+
+.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>

+ 11 - 1
src/views/old_mini/report_detail/index.vue

@@ -70,7 +70,7 @@
                     <el-icon color="#666666" class="btn-icon" size="16"><Download /></el-icon>
                     导出报告
                 </div>
-                <div class="l-btn">
+                <div class="l-btn" @click="sharePopup">
                     <Icon color="#666666" name="share-o" size="16" class="btn-icon" />
                     分享报告
                 </div>
@@ -78,12 +78,15 @@
             <div class="bottom-r">推荐农事</div>
         </div>
     </div>
+    <!-- 报告弹窗 -->
+    <report-popup ref="reportPopupRef"></report-popup>
 </template>
 
 <script setup>
 import customHeader from "@/components/customHeader.vue";
 import { Icon, Tab, Tabs } from "vant";
 import { ref } from "vue";
+import reportPopup from "@/components/reportPopup.vue"
 
 const value = ref("");
 
@@ -111,6 +114,11 @@ const options = [
 ];
 
 const active = ref(0);
+
+const reportPopupRef = ref(null)
+function sharePopup() {
+    reportPopupRef.value.handleShow()
+}
 </script>
 
 <style lang="scss" scoped>
@@ -119,6 +127,8 @@ const active = ref(0);
     height: 100vh;
     background-color: #f5f7fb;
     .report-content {
+        height: calc(100% - 40px);
+        overflow: auto;
         padding: 10px 12px;
         box-sizing: border-box;
         .report-header {