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

Merge branch 'farmer' of http://www.sysuimars.cn:3000/feiniao/feiniao-farm-h5 into farmer

wangsisi 4 napja
szülő
commit
0e0ca92a18

+ 5 - 5
src/views/old_mini/create_farm/index.vue

@@ -39,7 +39,7 @@
                                         </div>
                                     </el-form-item>
                                     <el-form-item label="种植作物" prop="speciesItem">
-                                        <div class="select-wrap specie-wrap">
+                                        <div class="select-wrap client-wrap">
                                             <el-select v-model="ruleForm.speciesItem" filterable class="select-item specie-select"
                                                 multiple :max-collapse-tags="3" collapse-tags placeholder="种植作物(可多选)" @change="changeSpecie">
                                                 <el-option v-for="(item, index) in specieList" :key="index"
@@ -72,12 +72,12 @@
                                         <el-input placeholder="请输入您的农场名称" v-model="ruleForm.name" autocomplete="off"
                                             @input="handleFarmNameInput" />
                                     </el-form-item>
-                                    <el-form-item label="基地类别" prop="baseType" class="select-wrap client-wrap">
+                                    <!-- <el-form-item label="基地类别" prop="baseType" class="select-wrap client-wrap">
                                         <el-select placeholder="请选择" v-model="ruleForm.baseType" autocomplete="off">
                                             <el-option v-for="(item, index) in baseTypeList" :key="index"
                                                 :label="item.name" :value="item.id" />
                                         </el-select>
-                                    </el-form-item>
+                                    </el-form-item> -->
                                 </el-form>
                             </div>
                             <div class="create-btn">
@@ -464,11 +464,11 @@ const rules = reactive({
     name: [{ required: true, message: "请输入您的农场名称", trigger: ["blur", "change"] }],
     fzr: [{ required: true, message: "请输入联系人姓名", trigger: ["blur", "change"] }],
     tel: [
-        { required: true, message: "请输入联系人电话", trigger: ["blur", "change"] },
+        { required: true, message: "请输入联系人电话", trigger: ["blur"] },
         {
             pattern: /^1[3-9]\d{9}$/,
             message: "请输入正确的手机号码",
-            trigger: ["blur", "change"],
+            trigger: ["blur"],
         },
     ],
     defaultFarm: [{ required: true, message: "请选择是否为默认农场", trigger: "blur" }],

+ 15 - 1
src/views/old_mini/growth_report/index.vue

@@ -160,7 +160,7 @@
 <script setup>
 import wx from "weixin-js-sdk";
 import weatherInfo from "@/components/weatherInfo.vue";
-import { ref, onActivated, onDeactivated, onUnmounted, computed } from "vue";
+import { ref, onActivated, onDeactivated, onUnmounted, computed, nextTick } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { useStore } from "vuex";
 import { Swipe, SwipeItem, Badge } from 'vant';
@@ -350,6 +350,20 @@ const getRegions = async () => {
             getTodayPatrolFocus();
             getPendingFarmWork();
             getDetail();
+            // 如果是新增品种后跳转过来的,等待 Swipe 实例挂载后再定位
+            if (route.query.addVarietyCount) {
+                const targetIndex = Number(route.query.addVarietyCount);
+                if (!Number.isNaN(targetIndex) && targetIndex >= 0) {
+                    const safeIndex = Math.min(targetIndex, regionsData.value.length - 1);
+                    const reverseIndex = Math.min(
+                        regionsData.value.length - 1,
+                        Math.max(0, regionsData.value.length - safeIndex)
+                    );
+                    nextTick(() => {
+                        swipeRef.value?.swipeTo?.(reverseIndex, { immediate: true });
+                    });
+                }
+            }
         } else {
             hasReport.value = false;
         }

+ 201 - 171
src/views/old_mini/home/subPages/prescriptionPage.vue

@@ -1,69 +1,73 @@
 <template>
     <div class="prescription-page">
-        <div class="prescription-title">
-            <img @click="goBack" src="@/assets/img/home/back.png" alt="" />
-            <div class="title-name">农场基本信息</div>
-            <div class="title-desc">请认真核对一下内容</div>
-        </div>
-        <div class="prescription-box" v-loading="loadingPage">
-            <!-- <div class="box-title">
+        <custom-header name="基本信息" @close="goBack"></custom-header>
+        <div class="page-content">
+            <div class="prescription-title">
+                <!-- <img @click="goBack" src="@/assets/img/home/back.png" alt="" /> -->
+                <div class="title-name">农场基本信息</div>
+                <div class="title-desc">请认真核对一下内容</div>
+            </div>
+            <div class="prescription-box" v-loading="loadingPage">
+                <!-- <div class="box-title">
                 <img src="@/assets/img/home/label-icon.png" />
                 农场情况
             </div> -->
-            <div class="box-content">
-                <div class="box-item">
-                    <div class="item-name">
-                        <span>请选择您的果园土壤类型</span>
-                    </div>
-                    <div class="tips">土壤类型确认最佳施肥策略</div>
-                    <div class="item-checkbox">
-                        <el-radio-group v-model="basicForm.soilTypes">
-                            <el-radio-button v-for="(item, index) in basicFarmFormData.soilTypes" :key="index"
-                                :label="item.name" :value="item.code" />
-                        </el-radio-group>
-                    </div>
-                </div>
-                <div class="box-item">
-                    <div class="item-name">
-                        <span>请选择您的灌溉方式</span>
-                        <span class="sub-name"> (可多选)</span>
+                <div class="box-content">
+                    <div class="box-item">
+                        <div class="item-name">
+                            <span>请选择您的果园土壤类型</span>
+                        </div>
+                        <div class="tips">土壤类型确认最佳施肥策略</div>
+                        <div class="item-checkbox">
+                            <el-radio-group v-model="basicForm.soilTypes">
+                                <el-radio-button v-for="(item, index) in basicFarmFormData.soilTypes" :key="index"
+                                    :label="item.name" :value="item.code" />
+                            </el-radio-group>
+                        </div>
                     </div>
-                    <div class="tips">灌溉方式确认药肥最佳配比</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('irrigationMethods', idx, item.custom)"
-                                v-for="(item, idx) in basicFarmFormData.irrigationMethods" :key="'ce-' + idx">
-                                <span class="text">{{ item.name }}</span>
+                    <div class="box-item">
+                        <div class="item-name">
+                            <span>请选择您的灌溉方式</span>
+                            <span class="sub-name"> (可多选)</span>
+                        </div>
+                        <div class="tips">灌溉方式确认药肥最佳配比</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('irrigationMethods', idx, item.custom)"
+                                    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">
+                                        <Plus />
+                                    </el-icon>其它方式</div>
                             </div>
-                            <div class="tag-item last-add" @click="handleAdd('irrigationMethods')"><el-icon class="add-icon">
-                                    <Plus />
-                                </el-icon>其它方式</div>
                         </div>
                     </div>
-                </div>
-                <div class="box-item">
-                    <div class="item-name">
-                        <span>请选择您的农机设备</span>
-                        <span class="sub-name"> (可多选)</span>
-                    </div>
-                    <div class="tips">农闲时可将闲置农机加入农事服务联盟,获取额外服务收益</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="handleMachinerySelect('machinery', idx, item)"
-                                v-for="(item, idx) in basicFarmFormData.machinery" :key="'nj-' + idx">
-                                <span class="text">{{ item.name }}</span>
-                                <span class="quantity-text" v-show="item.quantity">{{ item.quantity }}</span>
+                    <div class="box-item">
+                        <div class="item-name">
+                            <span>请选择您的农机设备</span>
+                            <span class="sub-name"> (可多选)</span>
+                        </div>
+                        <div class="tips">农闲时可将闲置农机加入农事服务联盟,获取额外服务收益</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="handleMachinerySelect('machinery', idx, item)"
+                                    v-for="(item, idx) in basicFarmFormData.machinery" :key="'nj-' + idx">
+                                    <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">
+                                        <Plus />
+                                    </el-icon>其它设备</div>
                             </div>
-                            <div class="tag-item last-add" @click="handleMachineryAdd('machinery', item)"><el-icon class="add-icon">
-                                    <Plus />
-                                </el-icon>其它设备</div>
                         </div>
                     </div>
-                </div>
-                <!-- 农场规模 -->
-                <!-- <div class="farm-scale-header">
+                    <!-- 农场规模 -->
+                    <!-- <div class="farm-scale-header">
                     <div class="farm-scale-title">请填写您的农场规模</div>
                     <div class="farm-scale-desc">农闲时可以提供农事服务,获取额外收益</div>
                 </div>
@@ -75,58 +79,59 @@
                         </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> -->
-                <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)"
-                                v-for="(item, idx) in basicFarmFormData.improvementAreas" :key="'wt-' + idx">
-                                <span class="text">{{ item.name }}</span>
+</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)"
+                                    v-for="(item, idx) in basicFarmFormData.improvementAreas" :key="'wt-' + idx">
+                                    <span class="text">{{ item.name }}</span>
+                                </div>
                             </div>
                         </div>
                     </div>
-                </div>
-                <div class="box-item">
-                    <div class="item-name">
-                        <span>您最希望得到哪位荔枝专家的农事处方</span>
-                    </div>
-                    <div class="item-checkbox">
+                    <div class="box-item">
+                        <div class="item-name">
+                            <span>您最希望得到哪位荔枝专家的农事处方</span>
+                        </div>
+                        <div class="item-checkbox">
                             <el-radio-group v-model="basicForm.expertCode">
                                 <el-radio-button v-for="(item, index) in basicFarmFormData.expertOptions" :key="index"
                                     :label="item.name" :value="item.code" />
                             </el-radio-group>
+                        </div>
                     </div>
                 </div>
             </div>
@@ -135,19 +140,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 +157,8 @@
                 <span class="name-text" v-show="!isMachineSelf">{{ popupInputVal }}</span>
                 <span class="ml-2">数量</span>
             </div>
-            <el-input type="number" class="popup-input" v-model="popupInputNum" :placeholder="'请输入' + formNameObj[addTypeKey]+'数量'" size="large">
+            <el-input type="number" class="popup-input" v-model="popupInputNum"
+                :placeholder="'请输入' + formNameObj[addTypeKey] + '数量'" size="large">
                 <template #append>{{ machineryUnit || '辆' }}</template>
             </el-input>
         </div>
@@ -163,7 +166,7 @@
             <div class="delete" v-if="isEditPopup && isMachineSelf" @click="handleDelete">删除</div>
             <div class="delete" v-else-if="isEditPopup && !isMachineSelf" @click="handleCancelSelect">取消选中</div>
             <div class="cancel" v-else @click="showAddPopup = false">取消</div>
-            <div @click="handleConfirm">确认</div>
+            <div :class="{ disabled: isPopupConfirmDisabled() }" @click="handleConfirm">确认</div>
         </div>
     </popup>
 
@@ -181,18 +184,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>
@@ -203,19 +198,13 @@
         </div>
     </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>
@@ -226,6 +215,7 @@ import { ref, onActivated, onBeforeUnmount, onDeactivated, onMounted } from "vue
 import { ElMessage } from "element-plus";
 import { useRouter, useRoute } from "vue-router";
 import tipPopup from "@/components/popup/tipPopup.vue";
+import customHeader from "@/components/customHeader.vue";
 import { Popup } from "vant";
 import { useStore } from "vuex";
 const router = useRouter();
@@ -265,9 +255,9 @@ const basicFarmFormData = ref({});
 const getBasicFarmFormData = (options = {}) => {
     const machineryMerge = options.machineryMerge;
     loadingPage.value = true;
-    VE_API.basic_farm.fetchBasicFarmFormData({subjectId: route.query?.subjectId}).then(({ data }) => {
+    VE_API.basic_farm.fetchBasicFarmFormData({ subjectId: route.query?.subjectId }).then(({ data }) => {
         basicFarmFormData.value = data;
-        
+
         // 根据返回的数据进行默认赋值
         // 1. 土壤类型 - 找到 selected: true 的项
         if (data.soilTypes && Array.isArray(data.soilTypes)) {
@@ -276,7 +266,7 @@ const getBasicFarmFormData = (options = {}) => {
                 basicForm.value.soilTypes = selectedSoilType.code;
             }
         }
-        
+
         // 2. 专家选项 - 找到 selected: true 的项
         if (data.expertOptions && Array.isArray(data.expertOptions)) {
             const selectedExpert = data.expertOptions.find(item => item.selected);
@@ -285,7 +275,7 @@ const getBasicFarmFormData = (options = {}) => {
                 basicForm.value.expertInfo = selectedExpert;
             }
         }
-        
+
         // 3. 农场规模数据
         if (data.farmScale) {
             farmScale.value = {
@@ -296,7 +286,7 @@ const getBasicFarmFormData = (options = {}) => {
                 graftingWorkerCount: data.farmScale.graftingWorkerCount || "",
             };
         }
-        
+
         // 4. irrigationMethods, improvementAreas, machinery 的 selected 状态已经在 data 中设置好了
         // 这些数据会直接显示在页面上,因为页面是通过 basicFarmFormData 来渲染的
 
@@ -395,7 +385,26 @@ function handleMachinerySelect(type, index, item) {
     currentEditIndex.value = index;
 }
 
+function isPopupConfirmDisabled() {
+    const nameFilled = String(popupInputVal.value ?? "").trim().length > 0;
+    const quantityFilled = String(popupInputNum.value ?? "").trim().length > 0;
+
+    // 仅需名称:非农机场景
+    if (addTypeKey.value !== "machinery") {
+        return !nameFilled;
+    }
+    // 仅需数量:选择已有农机(非自定义)
+    if (!isMachineSelf.value) {
+        return !quantityFilled;
+    }
+    // 名称 + 数量都必填:自定义农机
+    return !(nameFilled && quantityFilled);
+}
+
 function handleConfirm() {
+    if (isPopupConfirmDisabled()) {
+        return;
+    }
     if (addTypeKey.value === 'machinery') {
         if (isMachineSelf.value && !isEditPopup.value) {
             if (!popupInputVal.value.trim()) {
@@ -501,7 +510,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])
         : [];
 
@@ -603,12 +612,12 @@ async function submit() {
         // }
         // const res = await VE_API.basic_farm.saveBasicFarmInfoByExpert(params);
         let paramsData = null
-        if(route.query.subjectId) {
+        if (route.query.subjectId) {
             paramsData = {
                 ...draftData,
                 subjectId: route.query.subjectId,
             }
-        }else{
+        } else {
             paramsData = {
                 ...route.query,
                 expertMiniUserId: '81881',
@@ -621,9 +630,9 @@ async function submit() {
         apiCall.then((res) => {
             if (res.code === 0) {
                 // showSuccessPopup.value = true;
-                if(route.query.subjectId) {
+                if (route.query.subjectId) {
                     router.go(-1);
-                }else{
+                } else {
                     // 设置选中当前新增的农场
                     localStorage.setItem("selectedFarmId", res.data.id);
                     localStorage.setItem("selectedFarmName", res.data.name);
@@ -649,15 +658,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();
@@ -668,7 +677,7 @@ const handlePage = async () => {
         if (!validateForm()) {
             return;
         }
-        
+
         // 安全解析 typeNames
         // let typeNames = [];
         // try {
@@ -683,13 +692,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,
@@ -697,7 +706,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);
@@ -705,7 +714,7 @@ const handlePage = async () => {
                 basicForm.value.expertInfo = selectedExpert;
             }
         }
-        
+
         showPeriodPopup.value = true;
     } catch (error) {
         console.error('handlePage 执行失败:', error);
@@ -742,7 +751,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(),
         });
@@ -764,7 +773,7 @@ const handlePeriodConfirm = async () => {
         ElMessage.warning('请选择时间');
         return;
     }
-    
+
     // 关闭弹窗并提交表单
     showPeriodPopup.value = false;
     loadingPage.value = true;
@@ -774,7 +783,7 @@ const handlePeriodConfirm = async () => {
     if (!success) {
         return;
     }
-    
+
     // 提交成功后跳转
     // if (route.query.type === 'farmer') {
     //     router.push('/agri_record')
@@ -814,10 +823,16 @@ const handlePeriodConfirm = async () => {
     box-sizing: border-box;
     background: linear-gradient(to left, #e6f2ff, #8fc5fe);
 
+    .page-content {
+        height: calc(100% - 40px);
+        overflow: auto;
+        box-sizing: border-box;
+    }
+
     .prescription-title {
-        padding: 16px 14px;
-        background: url("@/assets/img/home/page-bg.png") no-repeat bottom right / 149px 116px;
-        background-position-y: 30px;
+        padding: 26px 14px 10px 14px;
+        background: url("@/assets/img/home/page-bg.png") no-repeat bottom right / 141px 116px;
+        background-position-y: 7px;
 
         img {
             width: 24px;
@@ -828,7 +843,7 @@ const handlePeriodConfirm = async () => {
             color: #2e2e2e;
             text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
             font-weight: 500;
-            padding: 21px 0 4px 6px;
+            padding: 0 0 4px 6px;
         }
 
         .title-desc {
@@ -916,6 +931,7 @@ const handlePeriodConfirm = async () => {
                             line-height: 40px;
                             cursor: pointer;
                             transition: all 0.3s;
+
                             .quantity-text {
                                 font-size: 10px;
                                 color: #fff;
@@ -958,6 +974,7 @@ const handlePeriodConfirm = async () => {
                                 border: 1px solid #2199F8;
                                 background: #E8F5FF;
                                 color: #2199F8;
+
                                 &::after {
                                     content: "";
                                     position: absolute;
@@ -982,6 +999,7 @@ const handlePeriodConfirm = async () => {
                                     border: 1px solid #2199F8;
                                     background: #E8F5FF;
                                     color: #2199F8;
+
                                     &::after {
                                         content: "";
                                         position: absolute;
@@ -1130,6 +1148,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);
@@ -1180,7 +1199,8 @@ const handlePeriodConfirm = async () => {
         font-weight: 400;
         margin-bottom: 12px;
         color: #000000;
-        .name-text{
+
+        .name-text {
             font-weight: 500;
             color: #2199F8;
             padding: 0 2px;
@@ -1215,6 +1235,12 @@ const handlePeriodConfirm = async () => {
             background: #fff;
             border: 1px solid #999999;
         }
+
+        .disabled {
+            opacity: 0.5;
+            cursor: not-allowed;
+        }
+
         .delete {
             margin-right: 13px;
             color: #FF3D3D;
@@ -1223,11 +1249,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;
@@ -1235,10 +1262,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);
@@ -1246,11 +1273,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;
@@ -1260,19 +1287,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;
@@ -1280,7 +1307,7 @@ const handlePeriodConfirm = async () => {
                         flex-shrink: 0;
                         padding-right: 10px;
                     }
-                    
+
                     .label-item-value {
                         border-radius: 2px;
                         flex: 1;
@@ -1290,6 +1317,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);
@@ -1300,7 +1328,7 @@ const handlePeriodConfirm = async () => {
             }
         }
     }
-    
+
     .period-footer {
         .period-footer-btn {
             width: 100%;
@@ -1313,19 +1341,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;
@@ -1339,7 +1369,7 @@ const handlePeriodConfirm = async () => {
 .custom-bottom-fixed-btns {
     z-index: 99 !important; // 提高 z-index,确保不被其他元素遮挡
     pointer-events: auto; // 确保可以接收点击事件
-    
+
     .bottom-btn {
         cursor: pointer;
         user-select: none; // 防止文本选择
@@ -1347,13 +1377,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;

+ 24 - 2
src/views/old_mini/interaction/index.vue

@@ -328,7 +328,20 @@ const handleSkipSelectRegion = () => {
 
 const handleGoSelectRegion = () => {
     showSelectRegionPopup.value = false;
-    router.push("/draw_area?targetUrl=growth_report&showTipPopup=true&subjectId=" + route.query.subjectId + '&varietyId=' + varietyItemData.value.id);
+    
+    const addVarietyCount = (farmData.value.farms || []).reduce((count, farm) => {
+            return count + ((farm?.regions || []).length || 0);
+        }, 0);
+    router.push({
+        path: "/draw_area",
+        query: {
+            targetUrl: "growth_report",
+            showTipPopup: "true",
+            subjectId: route.query.subjectId,
+            varietyId: varietyItemData.value.id,
+            addVarietyCount: addVarietyCount,
+        },
+    });
 };
 
 // 大物候期转换所需参数// 组装为后端所需的 farmDataList 结构
@@ -412,7 +425,16 @@ const handlePopupClose = (show) => {
 }
 
 const handleTipConfirm = () => {
-    router.push("/growth_report?hideInteraction=true");
+    const query = {
+        hideInteraction: "true",
+    };
+    if (isAddVariety.value) {
+        const addVarietyCount = (farmData.value.farms || []).reduce((count, farm) => {
+            return count + ((farm?.regions || []).length || 0);
+        }, 0);
+        query.addVarietyCount = String(addVarietyCount);
+    }
+    router.push({ path: "/growth_report", query });
 }
 
 // 离开页面/失活时清空本页状态,避免返回后数据复用导致异常

+ 13 - 4
src/views/old_mini/monitor/subPages/darwArea.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="edit-map">
-        <custom-header :name="viewOnly ? '查看区域' : '勾选地块'"></custom-header>
+        <custom-header @goback="goBack" :isGoBack="true" :name="viewOnly ? '查看区域' : '勾选地块'"></custom-header>
         <div class="region-type-tabs">
             <div
                 v-for="item in regionTypeTabs"
@@ -361,8 +361,11 @@ onDeactivated(() => {
     drawRegionMap.destroyMap?.();
 })
 const goBack = () => {
-    // drawRegionMap.clearLayer()
-    router.back()
+    if (route.query.targetUrl) {
+        router.replace(route.query.targetUrl);
+        return;
+    }
+    router.go(-1);
 };
 
 const resetPolygon = () => {
@@ -563,7 +566,13 @@ const handleEditRegion = () => {
 
 const showTipPopup = ref(false);
 const handleTipConfirm = () => {
-    router.push("/growth_report?hideInteraction=true");
+    const query = {
+        hideInteraction: "true",
+    };
+    if (route.query.addVarietyCount) {
+        query.addVarietyCount = String(route.query.addVarietyCount);
+    }
+    router.push({ path: "/growth_report", query });
 }
 </script>