lxf před 2 týdny
rodič
revize
225a4f6ca8

+ 2 - 1
src/components/popup/qrCodePopup.vue

@@ -4,8 +4,9 @@
             <div class="qr-code-title">
                 <slot name="success"></slot>
                 <div class="title-text">
+                    <slot name="text"></slot>
                     <div class="text-item">扫码进入 <span class="blue">飞鸟管家</span> 小程序</div>
-                    <div class="text-item">查看农场更多详细信息</div>
+                    <slot name="text2"></slot>
                 </div>
             </div>
             <div class="qr-code-img">

+ 6 - 1
src/components/popup/tipPopup.vue

@@ -20,7 +20,9 @@
         <template v-else-if="type === 'success'">
             <img class="tip-icon success-icon" src="@/assets/img/home/right.png" alt="" />
             <slot name="default"></slot>
-            <div class="tip-text success-text" :class="{pmzd:font}">{{ text }} <span class="highlight-text">{{ highlightText }}</span></div>
+            <div class="tip-text success-text" :class="{pmzd:font}">{{ text }} <span class="highlight-text">{{ highlightText }}</span>
+                <div class="text2">{{ text2 }}</div>
+            </div>
         </template>
         <template v-else>
             <img class="tip-icon success-icon" src="@/assets/img/home/create-farm-icon.png" alt="" />
@@ -166,6 +168,9 @@ const handleClosed = () => {
         &.pmzd{
             font-family: 'PangMenZhengDao';
         }
+        .text2 {
+            padding-top: 4px;
+        }
     }
     .tip-btn {
         width: 100%;

+ 97 - 19
src/views/old_mini/growth_report/index.vue

@@ -4,11 +4,11 @@
         <div class="report-content-wrap" v-loading="loading">
             <div class="report-content" ref="reportDom">
                 <!-- <img src="@/assets/img/home/qrcode.png" alt="" class="code-icon" /> -->
-                    <img class="header-img" src="@/assets/img/home/report.png" alt="" />
+                <img class="header-img" src="@/assets/img/home/report.png" alt="" />
                 <div class="report-header">
                     <!-- <img class="header-book" src="@/assets/img/home/book.png" alt="" /> -->
                     <div class="time-tag">{{ workItem?.reportDate }}</div>
-                    <div class="report-title">长势报告</div>
+                    <div class="report-title">桂味长势报告</div>
                     <div class="report-info">
                         <div class="info-item">
                             <img class="info-icon" src="@/assets/img/home/farm.png" alt="" />
@@ -17,12 +17,12 @@
                     </div>
                 </div>
 
-                <div class="report-box">
+                <!-- <div class="report-box">
                     <div class="box-title">农情总结</div>
                     <div class="box-text">
                         {{ workItem?.summaryAgricultural || "--" }}
                     </div>
-                </div>
+                </div> -->
 
                 <div class="report-box">
                     <div class="box-title">物候与长势</div>
@@ -39,7 +39,7 @@
                     </div>
                 </div>
 
-                <div class="report-box">
+                <!-- <div class="report-box">
                     <div class="box-title">病虫害问题</div>
                     <div class="box-text">
                         <div class="box-bg">
@@ -77,19 +77,41 @@
                             <div v-html="workItem?.nextInteractionPreview"></div>
                         </div>
                     </div>
+                </div> -->
+            </div>
+
+            <!-- 底部按钮 -->
+            <div class="bottom-btn center-btn">
+                <div class="btn-item warning" @click="showQrCodePopup">
+                    解锁详细报告
                 </div>
             </div>
         </div>
     </div>
+
+    <qr-code-popup ref="qrCodePopupRef" :close-on-click-overlay="true">
+        <template #text>
+            <div class="text-item">
+                解锁完整详细内容
+            </div>
+        </template>
+    </qr-code-popup>
 </template>
 
 <script setup>
 import CustomHeader from "@/components/customHeader.vue";
 import { ref, onActivated, onDeactivated, onUnmounted } from "vue";
 import { useRoute } from "vue-router";
+import qrCodePopup from "@/components/popup/qrCodePopup.vue";
 
 const route = useRoute();
 const loading = ref(false);
+const qrCodePopupRef = ref(null);
+
+const showQrCodePopup = () => {
+    qrCodePopupRef.value.showPopup();
+}
+
 const workItem = ref({
     executeDate: '2026-02-02',
     farmName: '荔枝博览园',
@@ -121,7 +143,7 @@ onActivated(() => {
 
 
 const setReadStatus = (id) => {
-    VE_API.farm.readReportByFarm({ id,isRead:1 }).then(({ data }) => {
+    VE_API.farm.readReportByFarm({ id, isRead: 1 }).then(({ data }) => {
         console.log(data);
     });
 }
@@ -168,6 +190,7 @@ onUnmounted(() => {
         overflow: auto;
         box-sizing: border-box;
         position: relative;
+
         .bottom-btn {
             z-index: 2;
             position: fixed;
@@ -175,56 +198,73 @@ onUnmounted(() => {
             left: 0;
             width: 100%;
             background: #fff;
-            height: 60px;
+            // height: 70px;
             display: flex;
             align-items: center;
             justify-content: space-between;
-            padding: 0 12px;
+            padding: 10px 12px 20px 12px;
             box-sizing: border-box;
             box-shadow: 2px 2px 4.5px 0px rgba(0, 0, 0, 0.4);
+
+            &.center-btn {
+                justify-content: center;
+            }
+
             .btn-item {
                 height: 40px;
                 line-height: 40px;
                 padding: 0 24px;
                 border-radius: 20px;
                 font-size: 14px;
+
                 &.second {
                     color: #666666;
                     border: 1px solid rgba(153, 153, 153, 0.5);
                 }
+
                 &.primay {
                     padding: 0 34px;
                     background: linear-gradient(180deg, #76c3ff, #2199f8);
                     color: #fff;
                 }
+
+                &.warning {
+                    padding: 0 34px;
+                    background: linear-gradient(90deg, #FFBC85 0%, #FF953D 100%);
+                    color: #fff;
+                }
             }
         }
     }
-    
+
     .code-icon {
         position: absolute;
         right: 10px;
         top: 12px;
         width: 48px;
     }
+
     .report-content {
         // background: url("@/assets/img/home/report_bg.png") no-repeat center center;
         background: linear-gradient(0deg, #9BCCFF, #9BCCFF),
-        linear-gradient(160deg, rgba(255, 255, 255, 0.16) 30%, rgba(255, 255, 255, 0) 72%);
+            linear-gradient(160deg, rgba(255, 255, 255, 0.16) 30%, rgba(255, 255, 255, 0) 72%);
         background-size: 100% auto;
         background-position: top center;
-        padding: 24px 16px 16px;
+        padding: 24px 16px 76px 16px;
         box-sizing: border-box;
         position: relative;
         min-height: 100%;
+
         .header-img {
             position: absolute;
             top: 0;
             left: 0;
             width: 100%;
         }
+
         .report-header {
             position: relative;
+
             .header-book {
                 position: absolute;
                 right: 0;
@@ -232,6 +272,7 @@ onUnmounted(() => {
                 height: 88px;
                 z-index: 10;
             }
+
             .time-tag {
                 background: linear-gradient(137.86deg, #9fd5ff 5.87%, #2199f8 82.98%);
                 border-radius: 5px 0 5px 0;
@@ -243,14 +284,17 @@ onUnmounted(() => {
                 padding: 0 9px;
                 width: fit-content;
             }
+
             .report-title {
                 font-family: "PangMenZhengDao";
                 font-size: 34px;
                 line-height: 38px;
                 color: #000000;
             }
+
             .report-info {
                 padding: 10px 0 16px 0;
+
                 .info-item {
                     width: fit-content;
                     display: flex;
@@ -261,18 +305,21 @@ onUnmounted(() => {
                     border-radius: 20px;
                     border: 0.5px solid rgba(33, 153, 248, 0.35);
                     gap: 6px;
+
                     .info-icon {
                         width: 26px;
                         height: 26px;
                         object-fit: cover;
                         border-radius: 50%;
                     }
+
                     .info-text {
                         font-size: 14px;
                         color: #2199f8;
                     }
                 }
-                .info-item + .info-item {
+
+                .info-item+.info-item {
                     margin-top: 5px;
                 }
             }
@@ -287,6 +334,7 @@ onUnmounted(() => {
             border-radius: 8px;
             gap: 5px;
             position: relative;
+
             .report-box-item {
                 flex: 1;
                 background: rgba(33, 153, 248, 0.1);
@@ -297,11 +345,13 @@ onUnmounted(() => {
                 display: flex;
                 flex-direction: column;
                 justify-content: center;
+
                 .item-content {
                     color: #2199f8;
                     font-size: 14px;
                     text-align: center;
                 }
+
                 .item-title {
                     color: #000000;
                     font-size: 10px;
@@ -322,21 +372,26 @@ onUnmounted(() => {
                 color: #ffffff;
                 background: url("@/assets/img/home/title-bg.png") no-repeat center center / 100% 100%;
             }
+
             .box-text {
                 padding: 22px 0 8px 0;
                 font-weight: 350;
                 line-height: 21px;
+
                 .box-subtitle {
                     color: #000;
                 }
+
                 .box-bg {
                     font-weight: 400;
                     color: rgba(0, 0, 0, 0.5);
                 }
+
                 .box-advice {
                     color: rgba(0, 0, 0, 0.5);
                     padding-top: 10px;
                 }
+
                 .box-sum {
                     margin-top: 10px;
                     background: rgba(33, 153, 248, 0.1);
@@ -345,17 +400,21 @@ onUnmounted(() => {
                     line-height: 20px;
                     color: #2199F8;
                 }
+
                 &.next-info {
                     padding: 8px 0 8px 0;
                 }
             }
         }
-        .report-box + .report-box {
+
+        .report-box+.report-box {
             margin-top: 20px;
         }
+
         .report-excute {
             position: relative;
             margin-top: 12px;
+
             .tag-label {
                 position: absolute;
                 top: 0;
@@ -367,6 +426,7 @@ onUnmounted(() => {
                 border-radius: 8px 0 8px 0;
                 z-index: 1;
             }
+
             ::v-deep {
                 .carousel-container .carousel-wrapper .carousel-img {
                     min-width: calc(100vw - 32px);
@@ -375,6 +435,7 @@ onUnmounted(() => {
             }
         }
     }
+
     .download-btn {
         position: fixed;
         bottom: 20px;
@@ -403,6 +464,7 @@ onUnmounted(() => {
         margin: 12px;
         background: #fff;
         border-radius: 8px;
+
         .review-mask {
             z-index: 1;
             pointer-events: none;
@@ -412,12 +474,10 @@ onUnmounted(() => {
             width: 100%;
             height: 100%;
             border-radius: 8px;
-            background: linear-gradient(
-                360deg,
-                rgba(0, 0, 0, 0.78) 0%,
-                rgba(0, 0, 0, 0.437208) 19.87%,
-                rgba(0, 0, 0, 0) 33.99%
-            );
+            background: linear-gradient(360deg,
+                    rgba(0, 0, 0, 0.78) 0%,
+                    rgba(0, 0, 0, 0.437208) 19.87%,
+                    rgba(0, 0, 0, 0) 33.99%);
             display: flex;
             flex-direction: column;
             align-items: baseline;
@@ -425,16 +485,19 @@ onUnmounted(() => {
             padding: 12px;
             box-sizing: border-box;
             color: #fff;
+
             .review-text {
                 font-family: "PangMenZhengDao";
                 font-size: 16px;
                 margin-bottom: 1px;
             }
+
             .review-content {
                 font-size: 10px;
                 line-height: 15px;
             }
         }
+
         .vs-wrap {
             position: absolute;
             left: 50%;
@@ -443,15 +506,18 @@ onUnmounted(() => {
             width: 40px;
             height: 40px;
             z-index: 10;
+
             img {
                 width: 100%;
                 height: 100%;
                 object-fit: cover;
             }
         }
+
         .review-image-item {
             position: relative;
             flex: 1;
+
             .review-image-item-title {
                 position: absolute;
                 top: 0;
@@ -463,6 +529,7 @@ onUnmounted(() => {
                 font-size: 12px;
                 color: #fff;
             }
+
             // .review-image-item-img {
             //     width: 100%;
             //     height: 250px;
@@ -474,9 +541,11 @@ onUnmounted(() => {
                 object-fit: cover;
                 object-position: center;
             }
+
             .left-img {
                 border-radius: 8px 0 0 8px;
             }
+
             .right-img {
                 border-radius: 0 8px 8px 0;
             }
@@ -484,6 +553,11 @@ onUnmounted(() => {
     }
 }
 
+.text-item {
+    font-size: 20px;
+    color: #000;
+    line-height: 32px;
+}
 
 .cavans-popup {
     width: 100%;
@@ -495,11 +569,13 @@ onUnmounted(() => {
     display: flex;
     flex-direction: column;
     backdrop-filter: 4px;
+
     .cavans-content {
         text-align: center;
         padding: 0 12px;
         height: fit-content;
         overflow: auto;
+
         .current-img {
             width: 100%;
         }
@@ -519,6 +595,7 @@ onUnmounted(() => {
                 flex-direction: column;
                 align-items: center;
                 cursor: pointer;
+
                 &.text-btn {
                     font-size: 12px;
                     color: rgba(255, 255, 255, 0.7);
@@ -537,6 +614,7 @@ onUnmounted(() => {
                     .el-icon {
                         color: #fff;
                     }
+
                     img {
                         width: 50px;
                     }

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

@@ -227,7 +227,8 @@ const handleMoreClick = () => {
 };
 
 const handleTitleTagClick = (farmId) => {
-    router.push(`/weather_detail?farmId=${farmId}`);
+    // router.push(`/weather_detail?farmId=${farmId}`);
+    router.push(`/work_detail?id=${farmId}`);
 };
 
 const handleInviteClick = (subjectId) => {

+ 100 - 94
src/views/old_mini/home/subPages/prescriptionPage.vue

@@ -36,7 +36,8 @@
                                 v-for="(item, idx) in basicFarmFormData.irrigationMethods" :key="'ce-' + idx">
                                 <span class="text">{{ item.name }}</span>
                             </div>
-                            <div class="tag-item last-add" @click="handleAdd('irrigationMethods')"><el-icon class="add-icon">
+                            <div class="tag-item last-add" @click="handleAdd('irrigationMethods')"><el-icon
+                                    class="add-icon">
                                     <Plus />
                                 </el-icon>其它方式</div>
                         </div>
@@ -56,7 +57,8 @@
                                 <span class="text">{{ item.name }}</span>
                                 <span class="quantity-text" v-show="item.quantity">{{ item.quantity }}</span>
                             </div>
-                            <div class="tag-item last-add" @click="handleMachineryAdd('machinery', item)"><el-icon class="add-icon">
+                            <div class="tag-item last-add" @click="handleMachineryAdd('machinery', item)"><el-icon
+                                    class="add-icon">
                                     <Plus />
                                 </el-icon>其它设备</div>
                         </div>
@@ -75,40 +77,40 @@
                         </div>
                         <el-input v-model="farmScale.regularWorkerCount" placeholder="请输入人数" class="farm-scale-input">
                             <template #append>人</template>
-                        </el-input>
-                    </div>
-                    <div class="farm-scale-item">
-                        <label class="farm-scale-label">无人机植保人员</label>
-                        <el-input v-model="farmScale.plantProtectionWorkerCount" placeholder="请输入人数" class="farm-scale-input">
-                            <template #append>人</template>
-                        </el-input>
-                    </div>
-                    <div class="farm-scale-item">
-                        <label class="farm-scale-label">专业树形修剪人员</label>
-                        <el-input v-model="farmScale.pruningWorkerCount" placeholder="请输入人数" class="farm-scale-input">
-                            <template #append>人</template>
-                        </el-input>
-                    </div>
-                    <div class="farm-scale-item">
-                        <label class="farm-scale-label">专业嫁接换种人员</label>
-                        <el-input v-model="farmScale.graftingWorkerCount" placeholder="请输入人数" class="farm-scale-input">
-                            <template #append>人</template>
-                        </el-input>
-                    </div>
-                    <div class="farm-scale-item">
-                        <label class="farm-scale-label">农忙可调度人员</label>
-                        <el-input v-model="farmScale.tempDispatchWorkerCount" placeholder="请输入人数" class="farm-scale-input">
-                            <template #append>人</template>
-                        </el-input>
-                    </div>
-                </div> -->
+</el-input>
+</div>
+<div class="farm-scale-item">
+    <label class="farm-scale-label">无人机植保人员</label>
+    <el-input v-model="farmScale.plantProtectionWorkerCount" placeholder="请输入人数" class="farm-scale-input">
+        <template #append>人</template>
+    </el-input>
+</div>
+<div class="farm-scale-item">
+    <label class="farm-scale-label">专业树形修剪人员</label>
+    <el-input v-model="farmScale.pruningWorkerCount" placeholder="请输入人数" class="farm-scale-input">
+        <template #append>人</template>
+    </el-input>
+</div>
+<div class="farm-scale-item">
+    <label class="farm-scale-label">专业嫁接换种人员</label>
+    <el-input v-model="farmScale.graftingWorkerCount" placeholder="请输入人数" class="farm-scale-input">
+        <template #append>人</template>
+    </el-input>
+</div>
+<div class="farm-scale-item">
+    <label class="farm-scale-label">农忙可调度人员</label>
+    <el-input v-model="farmScale.tempDispatchWorkerCount" placeholder="请输入人数" class="farm-scale-input">
+        <template #append>人</template>
+    </el-input>
+</div>
+</div> -->
                 <div class="box-item">
                     <div class="item-name">
                         <span>希望专家帮助解决的种植难题</span>
                         <span class="sub-name"> (可多选)</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('improvementAreas', idx, item.custom)"
@@ -135,19 +137,16 @@
         <!-- 按钮 -->
         <div class="custom-bottom-fixed-btns">
             <!-- <div class="bottom-btn secondary-btn" @click="handlePage">跳过</div> -->
-            <div 
-                class="bottom-btn primary-btn" 
-                @click.stop="submit"
-                @touchstart.stop
-                @touchend.stop
-            >确认信息</div>
+            <div class="bottom-btn primary-btn" @click.stop="submit" @touchstart.stop @touchend.stop>确认信息</div>
         </div>
     </div>
 
     <popup class="add-tag-popup" round v-model:show="showAddPopup">
         <div class="tag-item" v-if="addTypeKey !== 'machinery' || (addTypeKey === 'machinery' && isMachineSelf)">
-            <div class="popup-title">编辑<span class="name-text">{{ formNameObj[addTypeKey] }}</span><span class="ml-2">名称</span></div>
-            <el-input class="popup-input" v-model="popupInputVal" :placeholder="'请输入' + formNameObj[addTypeKey]" size="large" />
+            <div class="popup-title">编辑<span class="name-text">{{ formNameObj[addTypeKey] }}</span><span
+                    class="ml-2">名称</span></div>
+            <el-input class="popup-input" v-model="popupInputVal" :placeholder="'请输入' + formNameObj[addTypeKey]"
+                size="large" />
         </div>
         <div class="device-item" v-if="addTypeKey === 'machinery'">
             <div class="popup-title">编辑
@@ -155,7 +154,8 @@
                 <span class="name-text" v-show="!isMachineSelf">{{ popupInputVal }}</span>
                 <span class="ml-2">数量</span>
             </div>
-            <el-input class="popup-input" v-model="popupInputNum" :placeholder="'请输入' + formNameObj[addTypeKey]+'数量'" size="large">
+            <el-input class="popup-input" v-model="popupInputNum" :placeholder="'请输入' + formNameObj[addTypeKey] + '数量'"
+                size="large">
                 <template #append>{{ machineryUnit || '辆' }}</template>
             </el-input>
         </div>
@@ -181,18 +181,10 @@
                     <div class="label-item-group">
                         <div class="label-item">{{ item.startDateLabel || '起始时间' }}</div>
                         <div class="label-item-value">
-                            <el-date-picker
-                                v-model="item.phenologyStartDate"
-                                type="date"
-                                :default-value="new Date(2026, 1, 1)"
-                                placeholder="选择时间"
-                                :disabled-date="disabledDate"
-                                :clearable="false"
-                                :editable="false"
-                                format="YYYY-MM-DD"
-                                value-format="YYYY-MM-DD"
-                                style="width: 100%"
-                            />
+                            <el-date-picker v-model="item.phenologyStartDate" type="date"
+                                :default-value="new Date(2026, 1, 1)" placeholder="选择时间" :disabled-date="disabledDate"
+                                :clearable="false" :editable="false" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
+                                style="width: 100%" />
                         </div>
                     </div>
                 </div>
@@ -204,6 +196,9 @@
     </popup>
 
     <qr-code-popup ref="qrCodePopupRef" :close-on-click-overlay="false">
+        <template #text2>
+            <div class="text-item">查看农场更多详细信息</div>
+        </template>
         <template #success>
             <div class="success-text">
                 <img class="success-icon" src="@/assets/img/home/right.png" alt="">
@@ -212,19 +207,13 @@
         </template>
     </qr-code-popup>
 
-    <tip-popup
-        v-model:show="showSuccessPopup"
-        type="success"
-        text="专属处方已经生成"
-        buttonText="点击查看"
-        @closedPopup="handleSuccessConfirm"
-        @confirm="handleSuccessConfirm"
-    >
+    <tip-popup v-model:show="showSuccessPopup" type="success" text="专属处方已经生成" buttonText="点击查看"
+        @closedPopup="handleSuccessConfirm" @confirm="handleSuccessConfirm">
         <template #default>
             <div class="expert-info">
                 <!-- <img class="expert-img" src="@/assets/img/home/zj-1.png" alt=""> -->
                 <el-avatar class="expert-img" :size="26" :src="basicForm?.expertInfo?.avatar" />
-                {{ basicForm?.expertInfo?.name }}  专家的
+                {{ basicForm?.expertInfo?.name }} 专家的
             </div>
         </template>
     </tip-popup>
@@ -276,7 +265,7 @@ const getBasicFarmFormData = () => {
     loadingPage.value = true;
     VE_API.basic_farm.fetchBasicFarmFormData().then(({ data }) => {
         basicFarmFormData.value = data;
-        
+
         // 根据返回的数据进行默认赋值
         // 1. 土壤类型 - 找到 selected: true 的项
         if (data.soilTypes && Array.isArray(data.soilTypes)) {
@@ -285,7 +274,7 @@ const getBasicFarmFormData = () => {
                 basicForm.value.soilTypes = selectedSoilType.code;
             }
         }
-        
+
         // 2. 专家选项 - 找到 selected: true 的项
         if (data.expertOptions && Array.isArray(data.expertOptions)) {
             const selectedExpert = data.expertOptions.find(item => item.selected);
@@ -294,7 +283,7 @@ const getBasicFarmFormData = () => {
                 basicForm.value.expertInfo = selectedExpert;
             }
         }
-        
+
         // 3. 农场规模数据
         if (data.farmScale) {
             farmScale.value = {
@@ -305,7 +294,7 @@ const getBasicFarmFormData = () => {
                 graftingWorkerCount: data.farmScale.graftingWorkerCount || "",
             };
         }
-        
+
         // 4. irrigationMethods, improvementAreas, machinery 的 selected 状态已经在 data 中设置好了
         // 这些数据会直接显示在页面上,因为页面是通过 basicFarmFormData 来渲染的
     }).finally(() => {
@@ -394,7 +383,7 @@ function handleConfirm() {
             return;
         }
         if (isMachineSelf.value && !isEditPopup.value) {
-            
+
             saveCustomOption(popupInputVal.value);
         } else {
             const option = basicFarmFormData.value[addTypeKey.value][currentEditIndex.value]
@@ -476,7 +465,7 @@ const goBack = () => {
 
 function handleSubmit() {
     // 收集土壤类型(转换为数组)
-    const soilTypes = basicForm.value.soilTypes 
+    const soilTypes = basicForm.value.soilTypes
         ? (Array.isArray(basicForm.value.soilTypes) ? basicForm.value.soilTypes : [basicForm.value.soilTypes])
         : [];
 
@@ -590,7 +579,7 @@ async function submit() {
             // 设置选中当前新增的农场
             localStorage.setItem("selectedFarmId", res.data.id);
             localStorage.setItem("selectedFarmName", res.data.name);
-            if(route.query.invite){
+            if (route.query.invite) {
                 qrCodePopupRef.value.showPopup();
                 return;
             }
@@ -613,15 +602,15 @@ const disabledDate = (time) => {
     // 获取今天的开始时间(00:00:00)
     const today = new Date();
     today.setHours(0, 0, 0, 0);
-    
+
     // 获取明天的开始时间(00:00:00)
     const tomorrow = new Date(today);
     tomorrow.setDate(tomorrow.getDate() + 1);
-    
+
     // 设置最小日期为 2025-01-01
     const minDate = new Date(2025, 10, 1); // 月份从0开始,0表示1月
     minDate.setHours(0, 0, 0, 0);
-    
+
     // 如果时间 < 2025-10-01 或 >= 明天的开始时间,则禁用
     // 只能选择 2025-10-01 到今天的日期范围
     return time.getTime() < minDate.getTime() || time.getTime() >= tomorrow.getTime();
@@ -632,7 +621,7 @@ const handlePage = async () => {
         if (!validateForm()) {
             return;
         }
-        
+
         // 安全解析 typeNames
         // let typeNames = [];
         // try {
@@ -647,13 +636,13 @@ const handlePage = async () => {
         //     ElMessage.warning('参数格式错误,请重新进入页面');
         //     return;
         // }
-        
+
         // // 检查 firstPhenology 是否已初始化
         // if (!firstPhenology.value || !firstPhenology.value.phenologyId) {
         //     ElMessage.warning('物候期数据未加载完成,请稍候再试');
         //     return;
         // }
-        
+
         // phenologyList.value = typeNames.map(item => ({
         //     typeName: item,
         //     phenologyId: firstPhenology.value.phenologyId,
@@ -661,7 +650,7 @@ const handlePage = async () => {
         //     phenologyName: firstPhenology.value.phenologyName,
         //     phenologyStartDate: '2026-01-01',
         // }));
-        
+
         // 如果有选择的专家,添加 preferredExpertCode
         if (basicForm.value.expertCode) {
             const selectedExpert = basicFarmFormData.value.expertOptions?.find(item => item.code === basicForm.value.expertCode);
@@ -669,7 +658,7 @@ const handlePage = async () => {
                 basicForm.value.expertInfo = selectedExpert;
             }
         }
-        
+
         showPeriodPopup.value = true;
     } catch (error) {
         console.error('handlePage 执行失败:', error);
@@ -706,7 +695,7 @@ const tryParse = (str) => {
 // 获取当前和下一个物候期
 const getCurrentAndNextPhenology = async () => {
     try {
-        const { data } = await VE_API.home.getCurrentAndNextPhenology({ 
+        const { data } = await VE_API.home.getCurrentAndNextPhenology({
             expertMiniUserId: '81881',
             containerId: getContainerIdFromQuery(),
         });
@@ -728,7 +717,7 @@ const handlePeriodConfirm = async () => {
         ElMessage.warning('请选择时间');
         return;
     }
-    
+
     // 关闭弹窗并提交表单
     showPeriodPopup.value = false;
     loadingPage.value = true;
@@ -738,7 +727,7 @@ const handlePeriodConfirm = async () => {
     if (!success) {
         return;
     }
-    
+
     // 提交成功后跳转
     // if (route.query.type === 'farmer') {
     //     router.push('/agri_record')
@@ -880,6 +869,7 @@ const handlePeriodConfirm = async () => {
                             line-height: 40px;
                             cursor: pointer;
                             transition: all 0.3s;
+
                             .quantity-text {
                                 font-size: 10px;
                                 color: #fff;
@@ -922,6 +912,7 @@ const handlePeriodConfirm = async () => {
                                 border: 1px solid #2199F8;
                                 background: #E8F5FF;
                                 color: #2199F8;
+
                                 &::after {
                                     content: "";
                                     position: absolute;
@@ -946,6 +937,7 @@ const handlePeriodConfirm = async () => {
                                     border: 1px solid #2199F8;
                                     background: #E8F5FF;
                                     color: #2199F8;
+
                                     &::after {
                                         content: "";
                                         position: absolute;
@@ -1094,6 +1086,7 @@ const handlePeriodConfirm = async () => {
                     color: rgba(0, 0, 0, 0.9);
                     // text-align: right;
                     margin-right: 10px;
+
                     .sub-label {
                         font-size: 10px;
                         color: rgba(0, 0, 0, 0.4);
@@ -1144,7 +1137,8 @@ const handlePeriodConfirm = async () => {
         font-weight: 400;
         margin-bottom: 12px;
         color: #000000;
-        .name-text{
+
+        .name-text {
             font-weight: 500;
             color: #2199F8;
             padding: 0 2px;
@@ -1179,6 +1173,7 @@ const handlePeriodConfirm = async () => {
             background: #fff;
             border: 1px solid #999999;
         }
+
         .delete {
             margin-right: 13px;
             color: #FF3D3D;
@@ -1187,11 +1182,12 @@ const handlePeriodConfirm = async () => {
         }
     }
 }
+
 .period-popup {
     width: 90%;
     padding: 24px 16px 20px 16px;
     background: linear-gradient(360deg, #FFFFFF 74.2%, #D1EBFF 100%);
-    
+
     .period-header {
         font-size: 16px;
         font-weight: 400;
@@ -1199,10 +1195,10 @@ const handlePeriodConfirm = async () => {
         color: #121212;
         line-height: 22px;
     }
-    
+
     .period-content {
         margin-bottom: 16px;
-        
+
         .period-item {
             background: rgba(33, 153, 248, 0.05);
             border: 1px solid rgba(33, 153, 248, 0.2);
@@ -1210,11 +1206,11 @@ const handlePeriodConfirm = async () => {
             padding: 10px;
             margin-bottom: 16px;
             position: relative;
-            
+
             &:last-child {
                 margin-bottom: 0;
             }
-            
+
             .period-item-name {
                 background: rgba(33, 153, 248, 0.1);
                 font-size: 12px;
@@ -1224,19 +1220,19 @@ const handlePeriodConfirm = async () => {
                 font-weight: 400;
                 width: fit-content;
             }
-            
+
             .period-item-label {
                 margin-top: 10px;
-                
+
                 .label-item-group {
                     display: flex;
                     align-items: center;
                     margin-bottom: 12px;
-                    
+
                     &:last-child {
                         margin-bottom: 0;
                     }
-                    
+
                     .label-item {
                         font-size: 14px;
                         color: #1D2129;
@@ -1244,7 +1240,7 @@ const handlePeriodConfirm = async () => {
                         flex-shrink: 0;
                         padding-right: 10px;
                     }
-                    
+
                     .label-item-value {
                         border-radius: 2px;
                         flex: 1;
@@ -1254,6 +1250,7 @@ const handlePeriodConfirm = async () => {
                         line-height: 31px;
                         display: flex;
                         align-items: center;
+
                         &.period-display {
                             background: #FFFFFF;
                             border: 0.5px solid rgba(0, 0, 0, 0.2);
@@ -1264,7 +1261,7 @@ const handlePeriodConfirm = async () => {
             }
         }
     }
-    
+
     .period-footer {
         .period-footer-btn {
             width: 100%;
@@ -1277,19 +1274,21 @@ const handlePeriodConfirm = async () => {
             border-radius: 4px;
             cursor: pointer;
             font-weight: 500;
-            
+
             &:active {
                 opacity: 0.8;
             }
         }
     }
 }
+
 .expert-info {
     display: flex;
     align-items: center;
     justify-content: center;
     font-size: 20px;
     line-height: 36px;
+
     .expert-img {
         // width: 26px;
         // height: 26px;
@@ -1303,7 +1302,7 @@ const handlePeriodConfirm = async () => {
 .custom-bottom-fixed-btns {
     z-index: 99 !important; // 提高 z-index,确保不被其他元素遮挡
     pointer-events: auto; // 确保可以接收点击事件
-    
+
     .bottom-btn {
         cursor: pointer;
         user-select: none; // 防止文本选择
@@ -1311,13 +1310,13 @@ const handlePeriodConfirm = async () => {
         -webkit-tap-highlight-color: transparent; // 移除移动端点击高亮
         position: relative; // 确保点击区域正确
         z-index: 1;
-        
+
         // 添加点击反馈效果
         &:active {
             opacity: 0.8;
             transform: scale(0.98);
         }
-        
+
         &.primary-btn {
             // 确保按钮可点击
             pointer-events: auto;
@@ -1325,12 +1324,19 @@ const handlePeriodConfirm = async () => {
     }
 }
 
+.text-item {
+    font-size: 20px;
+    color: #000;
+    line-height: 32px;
+}
+
 .success-text {
     display: flex;
     align-items: center;
     justify-content: center;
     font-size: 24px;
     color: #000;
+
     .success-icon {
         width: 28px;
         height: 28px;

+ 40 - 43
src/views/old_mini/interaction/index.vue

@@ -17,18 +17,14 @@
                 <div v-for="(region, regionIndex) in crop.regions" :key="regionIndex" class="variety-card">
                     <div class="field-row">
                         <div class="field-value">
-                            <el-select 
-                                v-model="region.regionId" 
-                                class="variety-input" 
-                                placeholder="选择品种"
-                            >
+                            <el-select v-model="region.regionId" class="variety-input" placeholder="选择品种">
                                 <el-option v-for="(item, index) in crop.typeIdItems" :key="index" :label="item.name"
                                     :value="item.id" />
-                                    <template #footer>
-                                        <el-button text bg @click="onAddOption(region)">
-                                            + 增加品种
-                                        </el-button>
-                                    </template>
+                                <template #footer>
+                                    <el-button text bg @click="onAddOption(region)">
+                                        + 增加品种
+                                    </el-button>
+                                </template>
                             </el-select>
                         </div>
                     </div>
@@ -36,13 +32,9 @@
                     <div class="field-row">
                         <div class="field-label">当下物候期</div>
                         <div class="field-value">
-                            <el-select
-                                v-model="region.phenologyId"
-                                class="select-input"
-                                placeholder="选择物候期"
-                            >
-                                <el-option v-for="(item, index) in crop.phenologyOptions" :key="index" :label="item.phenologyName"
-                                    :value="item.phenologyId" />
+                            <el-select v-model="region.phenologyId" class="select-input" placeholder="选择物候期">
+                                <el-option v-for="(item, index) in crop.phenologyOptions" :key="index"
+                                    :label="item.phenologyName" :value="item.phenologyId" />
                             </el-select>
                         </div>
                     </div>
@@ -50,13 +42,9 @@
                     <div class="field-row" v-if="region.phenologyId">
                         <div class="field-label">{{ getPhenologyLabel(crop, region.phenologyId) }}</div>
                         <div class="field-value">
-                            <el-date-picker
-                                :editable="false"
-                                style="width: 100%"
-                                v-model="region.phenologyStartDate"
-                                class="date-picker"
-                                type="date"
-                                placeholder="选择时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+                            <el-date-picker :editable="false" style="width: 100%" v-model="region.phenologyStartDate"
+                                class="date-picker" type="date" placeholder="选择时间" format="YYYY-MM-DD"
+                                value-format="YYYY-MM-DD" />
                         </div>
                     </div>
                 </div>
@@ -71,14 +59,7 @@
         </div>
     </div>
 
-    <qr-code-popup ref="qrCodePopupRef">
-        <template #success>
-            <div class="success-text">
-                <img class="success-icon" src="@/assets/img/home/right.png" alt="">
-                您的作物信息已完善
-            </div>
-        </template>
-    </qr-code-popup>
+    <tip-popup v-model:show="showTipPopup" type="success" @confirm="handleTipConfirm" buttonText="点击查看" text="您的农情报告已生成" text2="请查看" />
 
 
     <popup class="add-tag-popup" :z-index="2500" round v-model:show="showAddPopup" @update:show="handlePopupClose">
@@ -94,14 +75,16 @@
 </template>
 
 <script setup>
-import { ref, nextTick, onActivated } from "vue";
+import { ref, nextTick, onActivated, onDeactivated } from "vue";
+import { useRouter } from "vue-router";
 import { ElMessage } from "element-plus";
 import { Popup } from "vant";
 import customHeader from "@/components/customHeader.vue";
-import qrCodePopup from "@/components/popup/qrCodePopup.vue";
+import tipPopup from "@/components/popup/tipPopup.vue";
 import { useRoute } from "vue-router";
 
 const route = useRoute();
+const router = useRouter();
 
 onActivated(() => {
     const subjectId = route.query.subjectId;
@@ -110,7 +93,7 @@ onActivated(() => {
 
 const farmData = ref([])
 const getPhenologyInitOrConfirmStatus = async (subjectId) => {
-    const {data} = await VE_API.farm_v3.phenologyInitOrConfirmStatus({subjectId});
+    const { data } = await VE_API.farm_v3.phenologyInitOrConfirmStatus({ subjectId });
     farmData.value = data.farms;
     farmData.value.forEach(item => {
         addVariety(item);
@@ -137,7 +120,7 @@ const getPhenologyLabel = (farm, phenologyId) => {
     return found?.startDateLabel || "选择时间";
 };
 
-const qrCodePopupRef = ref(null);
+const showTipPopup = ref(false);
 
 const handleConfirm = async () => {
     // 组装为 initFarmData 接口所需的 farmDataList 结构
@@ -182,7 +165,7 @@ const handleConfirm = async () => {
 
     const { code, msg } = await VE_API.farm_v3.initFarmData(params);
     if (code === 0) {
-        qrCodePopupRef.value.showPopup();
+        showTipPopup.value = true;
     } else {
         ElMessage.error(msg || "提交失败");
     }
@@ -208,7 +191,7 @@ const handleConfirm = async () => {
     //     .filter((item) => item.regionPhenologyItems.length > 0);
 
     // console.log("farmDataList", farmDataList);
-    
+
     // const params = {
     //     farmDataList,
     //     expertMiniUserId: 81881,
@@ -221,6 +204,10 @@ const handleConfirm = async () => {
     // }
 };
 
+onDeactivated(() => {
+    showTipPopup.value = false;
+})
+
 const showAddPopup = ref(false);
 const newVarietyName = ref("");
 const currentVariety = ref(null); // 记录当前正在添加品种的 variety 对象
@@ -229,12 +216,12 @@ const handleAddVariety = () => {
     if (!newVarietyName.value.trim()) {
         return;
     }
-    
+
     // 如果当前有正在添加品种的 variety,则自动选中新增的品种
     if (currentVariety.value) {
         currentVariety.value.variety = newVarietyName.value;
     }
-    
+
     newVarietyName.value = "";
     showAddPopup.value = false;
     currentVariety.value = null;
@@ -245,10 +232,10 @@ const onAddOption = async (region) => {
     if (document.activeElement) {
         document.activeElement.blur();
     }
-    
+
     // 等待下拉菜单关闭后再显示弹窗
     await nextTick();
-    
+
     // 记录当前 region
     currentVariety.value = region;
     showAddPopup.value = true;
@@ -267,6 +254,10 @@ const handlePopupClose = (show) => {
         currentVariety.value = null;
     }
 }
+
+const handleTipConfirm = () => {
+    router.push(`/growth_report?farmId=${route.query.subjectId}`);
+}
 </script>
 
 <style lang="scss" scoped>
@@ -366,15 +357,18 @@ const handlePopupClose = (show) => {
 
 .variety-input {
     width: 110px;
+
     ::v-deep {
         .el-select__wrapper {
             box-shadow: none;
             background-color: rgba(33, 153, 248, 0.1);
             // box-shadow: 0 0 0 1px var(--el-border-color) inset;
         }
+
         .el-select__placeholder {
             color: #2199F8;
         }
+
         .el-select__caret {
             color: #2199F8;
         }
@@ -452,6 +446,7 @@ const handlePopupClose = (show) => {
     justify-content: center;
     font-size: 24px;
     color: #000;
+
     .success-icon {
         width: 28px;
         height: 28px;
@@ -470,7 +465,8 @@ const handlePopupClose = (show) => {
         font-weight: 400;
         margin-bottom: 12px;
         color: #000000;
-        .name-text{
+
+        .name-text {
             font-weight: 500;
             color: #2199F8;
             padding: 0 2px;
@@ -505,6 +501,7 @@ const handlePopupClose = (show) => {
             background: #fff;
             border: 1px solid #999999;
         }
+
         .delete {
             margin-right: 13px;
             color: #FF3D3D;

+ 11 - 0
src/views/old_mini/interactionList/index.vue

@@ -201,6 +201,8 @@
 
     <!-- 查看更多弹窗 -->
     <more-popup ref="morePopupRef" />
+
+    <tip-popup v-model:show="showTipPopup" type="success" @confirm="handleTipConfirm" buttonText="点击查看" text="您的农情报告已生成" text2="请查看" />
 </template>
 <script setup>
 import { ref, onActivated, computed, onUnmounted } from "vue";
@@ -217,6 +219,7 @@ import DrawRegionMap from "./map/drawRegionMap.js";
 import UploadFile from "@/utils/upliadFile";
 import { getFileExt } from "@/utils/util";
 import MorePopup from "./components/morePopup.vue";
+import tipPopup from "@/components/popup/tipPopup.vue";
 
 const interactionListRef = ref(null);
 const SCROLL_KEY = 'interactionListScrollTop';
@@ -235,6 +238,7 @@ const router = useRouter();
 const listData = ref([]);
 const query = ref(useRoute().query);
 const morePopupRef = ref(null);
+const showTipPopup = ref(false);
 //照片上传进度
 const showUploadProgressPopup = ref(false);
 // 上传进度统计
@@ -548,11 +552,18 @@ const handleConfirm = async (item, isConfirm) => {
         await refreshList();
         sessionStorage.removeItem("drawRegionPolygonData");
         sessionStorage.removeItem("drawRegionInteractionId");
+
+        // 生成农情报告弹窗
+        showTipPopup.value = true;
     } else {
         ElMessage.error(msg || '上传失败');
     }
 };
 
+const handleTipConfirm = () => {
+    router.push(`/growth_report?farmId=${localStorage.getItem("selectedFarmId")}`);
+}
+
 const handleConfirmUpload = async () => {
     // 校验是否有上传图片
     if (!uploadData.value || uploadData.value.length === 0) {

+ 22 - 3
src/views/old_mini/work_detail/components/executePopup.vue

@@ -2,7 +2,7 @@
     <popup v-model:show="showValue" class="execute-popup" closeable>
         <div class="popup-content">
             <div class="time-wrap">
-                <div class="name">
+                <div class="name pb-10">
                     请选择实际执行时间
                 </div>
                 <div class="time-input">
@@ -12,12 +12,16 @@
                 </div>
             </div>
             <div class="upload-wrap" :class="{ 'upload-cont': fileList.length }">
-                <div class="name">执行照片</div>
+                <div class="name">农事凭证</div>
+                <div class="sub-name">肥料使用照片或者执行照片</div>
                 <uploader class="uploader" v-model="fileList" multiple :max-count="5" :after-read="afterRead"
                     @click="handleClick('rg')">
                     <img class="img" v-show="!fileList.length" src="@/assets/img/home/example-4.png" alt="" />
                     <img class="plus" src="@/assets/img/home/plus.png" alt="" />
                 </uploader>
+                <div class="service-input">
+                    <el-input v-model="serviceInput" placeholder="请输入农资机构名称" />
+                </div>
             </div>
             <div class="button-wrap">
                 <div @click="closeTask" class="button primary">确认上传</div>
@@ -64,6 +68,7 @@ const showValue = ref(false);
 const fileList = ref([]);
 const fileArr = ref([]);
 const executeTime = ref("");
+const serviceInput = ref("");
 const uploadFileObj = new UploadFile();
 
 const afterRead = (file) => {
@@ -153,11 +158,15 @@ defineExpose({
     }
 }
 
+.pb-10 {
+    padding-bottom: 12px;
+}
+
 .name {
     color: #000000;
     font-size: 16px;
     font-weight: 500;
-    padding-bottom: 12px;
+    // padding-bottom: 12px;
 
     .required {
         color: #ff4d4f;
@@ -165,6 +174,16 @@ defineExpose({
     }
 }
 
+.sub-name {
+    font-size: 12px;
+    color: rgba(0, 0, 0, 0.4);
+    padding-bottom: 12px;
+}
+
+.service-input {
+    padding-top: 12px;
+}
+
 .upload-wrap {
 
     &.upload-cont {

+ 158 - 121
src/views/old_mini/work_detail/index.vue

@@ -5,122 +5,119 @@
         <div class="work-detail-content">
             <!-- 顶部状态 -->
             <div class="content-status" :class="'status-' + detail?.flowStatus">
-                <div class="status-l" v-if="userInfo?.appType === 2">
-                    <div class="status-title">{{ statusText }}</div>
+                <div class="status-l">
+                    <div class="status-title">{{ handleTagType(detail?.flowStatus) }}</div>
                     <div class="status-sub" v-if="triggerDateText && detail?.flowStatus === 0">
-                        预计触发时间 {{ triggerDateText }}
-                    </div>
-                    <div class="status-sub" v-if="detail?.flowStatus === 1">
-                        任务进度:1/2
-                    </div>
-                </div>
-                <div class="status-l" v-else>
-                    <div class="status-title">{{ statusText }}</div>
-                    <div class="status-sub" v-if="triggerDateText && detail?.flowStatus === 0">
-                        预计触发时间 {{ triggerDateText }}
+                        执行时间已经过去 {{ daysDiff }} 天了 
                     </div>
                     <div class="status-sub" v-if="detail?.flowStatus === 1">
                         距离执行时间还差 {{ daysDiff }} 天
                     </div>
+                    <div class="status-sub" v-if="detail?.flowStatus === 2">
+                        预计触发时间 2025.06.07
+                    </div>
                 </div>
             </div>
 
             <div class="work-wrap">
                 <!-- 农事组信息 -->
-                <!-- <div class="box-wrap group-info group-box">
+                <div class="box-wrap group-info group-box">
                     <div class="group-name">
-                        农事组:
-                        <span class="group-name-text">{{ detail.farmWorkName || detail.farmWorkLibName || "--" }}</span>
+                        该农事为 <span class="light-text">限时溯源农事</span> ,请在 <span class="light-text">3天内</span>
+                        完成溯源认证上传,如果逾期未认证,该农事将不可溯源认证,且不计入飞鸟有味平台
                     </div>
-                </div> -->
+                </div>
 
                 <!-- 每一段农事 -->
                 <div v-for="(prescription, index) in stageList" :key="index" class="box-wrap stage-card">
-                    <div class="stage-header">
-                        <div class="stage-title">{{ detail.farmWorkName }}</div>
-                        <div class="title-tag" :class="'tag-' + prescription.tagType">{{ prescription.tagType === 0 ?
-                            "待完成" : "已完成" }}</div>
-                    </div>
+                    <div class="work-info">
+                        <div class="stage-header">
+                            <div class="stage-title">{{ detail.farmWorkName }}</div>
+                        </div>
 
-                    <div class="stage-info">
-                        <div class="form-item">
-                            <div class="item-name">农事目的</div>
-                            <div class="item-text">
-                                {{ detail.purpose || prescription.name || "--" }}
+                        <div class="stage-info">
+                            <div class="form-item">
+                                <div class="item-name">农事目的</div>
+                                <div class="item-text">
+                                    {{ detail.purpose || prescription.name || "--" }}
+                                </div>
                             </div>
-                        </div>
-                        <div class="form-item">
-                            <div class="item-name">农事时间</div>
-                            <div class="item-text">
-                                {{ detail.intervelTime ? `间隔 ${detail.intervelTime} 天后 执行` : "--" }}
+                            <div class="form-item">
+                                <div class="item-name">农事时间</div>
+                                <div class="item-text">
+                                    {{ detail.intervelTime ? `间隔 ${detail.intervelTime} 天后 执行` : "--" }}
+                                </div>
                             </div>
-                        </div>
-                        <div class="form-item">
-                            <div class="item-name">执行区域</div>
-                            <div class="item-text light-text">
-                                桂味种植区域
+                            <div class="form-item">
+                                <div class="item-name">执行区域</div>
+                                <div class="item-text light-text">
+                                    桂味种植区域
+                                </div>
+                                <div class="area-btn">建议勾选</div>
+                                <!-- <div class="area-btn">查看区域</div> -->
                             </div>
-                        </div>
-                        <div class="form-item">
-                            <div class="item-name">注意事项</div>
-                            <div class="item-text">
-                                {{ detail.remark || "--" }}
+                            <div class="form-item">
+                                <div class="item-name">注意事项</div>
+                                <div class="item-text">
+                                    {{ detail.remark || "--" }}
+                                </div>
+                            </div>
+                            <div class="form-item">
+                                <div class="item-name">药肥处方</div>
                             </div>
                         </div>
-                        <div class="form-item">
-                            <div class="item-name">药肥处方</div>
-                        </div>
-                    </div>
-
-                    <!-- 执行方式 -->
-                    <div class="stage-tabs">
-                        <div v-for="tab in executionTabs" :key="tab.value" class="tab-pill"
-                            :class="{ active: getStageExecutionMethod(index) === tab.value }"
-                            @click="changeExecutionMethod(index, tab.value)">
-                            {{ tab.label }}
-                        </div>
-                    </div>
 
-                    <!-- 药物处方表 -->
-                    <div class="prescription-wrap"
-                        v-if="prescription.pesticideList && prescription.pesticideList.length">
-                        <div class="prescription-table">
-                            <div class="table-header">
-                                <div class="col col-type">使用功效</div>
-                                <div class="col col-name">药肥名称</div>
-                                <div class="col col-ratio">药肥配比</div>
+                        <!-- 执行方式 -->
+                        <div class="stage-tabs">
+                            <div v-for="tab in executionTabs" :key="tab.value" class="tab-pill"
+                                :class="{ active: getStageExecutionMethod(index) === tab.value }"
+                                @click="changeExecutionMethod(index, tab.value)">
+                                {{ tab.label }}
                             </div>
+                        </div>
 
-                            <div v-for="(item, i) in prescription.pesticideList" :key="i" class="table-row">
-                                <div class="col col-type">
-                                    {{ item.typeName || "--" }}
-                                </div>
-                                <div class="col col-name">
-                                    {{ item.name || item.pesticideFertilizerName || "--" }}
+                        <!-- 药物处方表 -->
+                        <div class="prescription-wrap"
+                            v-if="prescription.pesticideList && prescription.pesticideList.length">
+                            <div class="prescription-table">
+                                <div class="table-header">
+                                    <div class="col col-type">使用功效</div>
+                                    <div class="col col-name">药肥名称</div>
+                                    <div class="col col-ratio">药肥配比</div>
                                 </div>
-                                <div class="col col-ratio">
-                                    {{ getPesticideParam(item, index)?.ratio || "--" }}倍
+
+                                <div v-for="(item, i) in prescription.pesticideList" :key="i" class="table-row">
+                                    <div class="col col-type">
+                                        {{ item.typeName || "--" }}
+                                    </div>
+                                    <div class="col col-name">
+                                        {{ item.name || item.pesticideFertilizerName || "--" }}
+                                    </div>
+                                    <div class="col col-ratio">
+                                        {{ getPesticideParam(item, index)?.ratio || "--" }}倍
+                                    </div>
                                 </div>
                             </div>
-                        </div>
 
-                        <div v-if="hasRemark(prescription, index)" class="prescription-remark">
-                            <span v-for="(item, idx) in [prescription.pesticideList[0]]" :key="idx">
-                                <template v-if="getParamRemark(item, index)">
-                                    {{ getParamRemark(item, index) }}
-                                    <br />
-                                </template>
-                            </span>
+                            <div v-if="hasRemark(prescription, index)" class="prescription-remark">
+                                <span v-for="(item, idx) in [prescription.pesticideList[0]]" :key="idx">
+                                    <template v-if="getParamRemark(item, index)">
+                                        {{ getParamRemark(item, index) }}
+                                        <br />
+                                    </template>
+                                </span>
+                            </div>
                         </div>
                     </div>
 
 
-                    <!-- 执行照片 -->
-                    <div class="photo-box" v-if="prescription.cropAlbum && prescription.cropAlbum.length">
-                        <div class="photo-title">执行照片</div>
+                    <!-- 农事凭证 -->
+                    <div class="work-info photo-box" v-if="prescription.cropAlbum && prescription.cropAlbum.length">
+                        <div class="photo-title">农事凭证</div>
+                        <div class="photo-sub-title" v-if="info?.appType === 1">来自于 某某某农资机构</div>
                         <div class="photo-img-wrap">
                             <photo-provider :photo-closable="true">
-                                <photo-consumer v-for="(src, index) in prescription.cropAlbum" intro="执行照片" :key="index"
+                                <photo-consumer v-for="(src, index) in prescription.cropAlbum" intro="农事凭证" :key="index"
                                     :src="base_img_url2 + src.filename">
                                     <div class="photo-img">
                                         <img :src="base_img_url2 + src.filename" />
@@ -132,15 +129,15 @@
                 </div>
 
                 <!-- 底部按钮 -->
-                <div class="fixed-btn-wrap" v-if="info?.appType === 2">
+                <div class="fixed-btn-wrap center-btn" v-if="info?.appType === 2">
                     <div class="fixed-btn" @click="handleConvert">
                         转发农事
                     </div>
                 </div>
 
-                <div class="fixed-btn-wrap execute-action" v-if="info?.appType === 1">
-                    <div class="action-item second" @click="handleRemind">稍后执行</div>
-                    <div class="action-item primary" @click="handleExecute">我已完成</div>
+                <div class="fixed-btn-wrap execute-action" v-if="info?.appType === 1 && detail?.flowStatus === 1">
+                    <div class="action-item second" @click="handleConvert">转发农事</div>
+                    <div class="action-item primary" @click="handleExecute">溯源认证</div>
                 </div>
             </div>
         </div>
@@ -374,12 +371,7 @@ const executionTabs = [
 // 每一段农事的当前执行方式(索引 -> 执行方式),默认 1:植保机
 const stageExecutionMethods = ref({});
 const executePopupRef = ref(null);
-const statusText = computed(() => {
-    // 简单根据 flowStatus 判断,默认“待触发”
-    if (detail.value.flowStatus === 1) return "待完成";
-    if (detail.value.flowStatus === 2) return "已完成";
-    return "待触发";
-});
+
 
 const triggerDateText = computed(() => {
     if (!detail.value.executeDate) return "";
@@ -400,13 +392,21 @@ const hasRemark = (prescription, stageIndex) => {
     });
 };
 
+const handleTagType = (tagType) => {
+    if(tagType === 0) return "已过期";
+    if(tagType === 1) return "待认证";
+    if(tagType === 2) return "待触发";
+    if(tagType === 3) return "已完成";
+    return "--"
+}
+
 const handleExecute = () => {
-    executePopupRef.value.openPopup();
+    wx.miniProgram.navigateTo({
+        url: `/pages/subPages/location_check/index?lng=113.264435&lat=23.129163`,
+    });
+    // executePopupRef.value.openPopup();
 };
 
-const handleRemind = () => {
-    executePopupRef.value.showRemindPopup();
-};
 
 const handleBack = () => {
     router.back();
@@ -468,7 +468,7 @@ const changeExecutionMethod = (stageIndex, value) => {
 
 .content-status {
     position: relative;
-    padding: 21px 12px 0 12px;
+    padding: 16px 12px 0 12px;
     color: #fff;
     z-index: 1;
     height: 100px;
@@ -486,11 +486,27 @@ const changeExecutionMethod = (stageIndex, value) => {
         width: 100%;
     }
 
+    &.status-0 {
+        &::after {
+            background: #FF4F4F;
+        }
+    }
     &.status-1 {
         &::after {
             background: #FF953D;
         }
     }
+    &.status-2 {
+        &::after {
+            background: #C7C7C7;
+        }
+    }
+    &.status-3 {
+        padding-top: 30px;
+        &::after {
+            background: #2199F8;
+        }
+    }
 
     .status-l {
         .status-title {
@@ -512,34 +528,46 @@ const changeExecutionMethod = (stageIndex, value) => {
 }
 
 .box-wrap {
-    background: #ffffff;
-    border-radius: 8px;
-    padding: 14px 10px 10px 10px;
-    box-shadow: 0 2px 8px rgba(15, 35, 52, 0.06);
-    border: 1px solid transparent;
-}
-
-.photo-box {
-    margin-top: 10px;
-    border: 0.5px dashed #2199F8;
-    border-radius: 5px;
-    padding: 11px 10px;
-    .photo-title {
+    // background: #ffffff;
+    // border-radius: 8px;
+    // padding: 14px 10px 10px 10px;
+    // box-shadow: 0 2px 8px rgba(15, 35, 52, 0.06);
+    .work-info {
+        background: #ffffff;
+        border-radius: 8px;
+        padding: 14px 10px 10px 10px;
+        box-shadow: 0 2px 8px rgba(15, 35, 52, 0.06);
+    }
+    .photo-box {
+        margin-top: 10px;
+        padding: 11px 10px;
         font-size: 14px;
-        color: #000;
-        padding-bottom: 8px;
+    
+        .photo-title {
+            color: #000;
+            padding-bottom: 9px;
+        }
+        .photo-sub-title {
+            padding-bottom: 9px;
+            color: #767676;
+        }
     }
 }
 
+
 .group-info {
     margin-bottom: 10px;
+    background: #ffffff;
+    border-radius: 8px;
+    padding: 14px 10px 10px 10px;
+    box-shadow: 0 2px 8px rgba(15, 35, 52, 0.06);
 
     &.group-box {
-        padding: 16px 10px;
+        padding: 10px;
 
         .group-name {
-            font-size: 16px;
-            color: #000;
+            font-size: 14px;
+            color: #767676;
 
             .group-name-text {
                 color: #000;
@@ -625,6 +653,10 @@ const changeExecutionMethod = (stageIndex, value) => {
     }
 }
 
+.light-text {
+    color: #2199F8;
+}
+
 .stage-tabs {
     display: inline-flex;
     gap: 8px;
@@ -750,14 +782,15 @@ const changeExecutionMethod = (stageIndex, value) => {
 .execute-action {
     display: flex;
     align-items: center;
-    justify-content: center;
+    // justify-content: center;
+    justify-content: space-between;
     gap: 16px;
 
     .action-item {
-        padding: 0 16px;
-        height: 32px;
-        line-height: 32px;
-        border-radius: 16px;
+        padding: 0 26px;
+        height: 40px;
+        line-height: 40px;
+        border-radius: 26px;
         box-sizing: border-box;
         font-size: 14px;
 
@@ -776,7 +809,11 @@ const changeExecutionMethod = (stageIndex, value) => {
 
 .fixed-btn-wrap {
     display: flex;
-    justify-content: center;
+    // justify-content: center;
+    justify-content: space-between;
+    &.center-btn {
+        justify-content: center;
+    }
     position: fixed;
     bottom: 0px;
     left: 0;