Browse Source

fix: 新增品种

lxf 1 week ago
parent
commit
027a4e017d

+ 5 - 0
src/api/modules/farm_v3.js

@@ -14,4 +14,9 @@ module.exports = {
         url: url + "confirmReproductivePhenology",
         type: "post",
     },
+    // 获取主题下全部农场的品种列表与物候期选项
+    farmTypeIdAndPhenologyList: {
+        url: url + "farmTypeIdAndPhenologyList",
+        type: "get",
+    }
 }

+ 5 - 1
src/components/popup/startInteractPopup.vue

@@ -55,6 +55,8 @@ const showValue = ref(false);
 
 // 开始采集
 const handleExecuted = () => {
+    
+    showValue.value = false;
     router.push("/interaction?subjectId=" + localStorage.getItem("selectedFarmId"));
 };
 
@@ -64,14 +66,16 @@ onActivated(() => {
 });
 
 onDeactivated(() => {
-    showValue.value = false;
+    console.log("onDeactivated");
 });
 
 const getPhenologyInitOrConfirmStatus = async () => {
     const { data } = await VE_API.farm_v3.phenologyInitOrConfirmStatus({ subjectId: localStorage.getItem("selectedFarmId") });
     if (!data?.farms ||!data.farms.length) {
+        // showValue.value = false;
         return;
     }
+    console.log("getPhenologyInitOrConfirmStatus", data);
     popupData.value = data.farms[0];
     showValue.value = true;
 }

+ 124 - 77
src/views/old_mini/interaction/index.vue

@@ -11,24 +11,21 @@
             <div v-for="(crop, cropIndex) in farmData.farms" :key="cropIndex" class="crop-section">
                 <div class="crop-header">
                     <div class="crop-tag">{{ crop.speciesName }}</div>
-                    <div class="add-btn" v-if="farmData.status === 'INIT'" @click="addVariety(crop)">+ 新增品种</div>
+                    <div class="add-btn" v-if="farmData.status === 'INIT' || isAddVariety" @click="addVariety(crop)">+
+                        新增品种</div>
                 </div>
 
                 <div v-for="(region, regionIndex) in crop.regions" :key="regionIndex" class="variety-card">
                     <div class="field-row">
-                        <div class="field-value" v-if="farmData.status === 'INIT'">
-                            <el-select 
-                                v-model="region.regionId" 
-                                class="variety-input" 
-                                placeholder="选择品种"
-                            >
+                        <div class="field-value" v-if="farmData.status === 'INIT' || isAddVariety">
+                            <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 class="tag-val" v-else>
@@ -39,13 +36,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>
@@ -53,13 +46,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>
@@ -74,7 +63,8 @@
         </div>
     </div>
 
-    <tip-popup v-model:show="showTipPopup" type="success" text="您的农情报告已生成" text2="请查看" buttonText="点击查看" @confirm="handleTipConfirm" />
+    <tip-popup v-model:show="showTipPopup" type="success" text="您的农情报告已生成" text2="请查看" buttonText="点击查看"
+        @confirm="handleTipConfirm" />
 
 
     <popup class="add-tag-popup" :z-index="2500" round v-model:show="showAddPopup" @update:show="handlePopupClose">
@@ -89,18 +79,12 @@
     </popup>
 
     <!-- 勾选区域引导弹窗 -->
-    <select-region-popup
-        v-model:show="showSelectRegionPopup"
-        :image="selectRegionImage"
-        :title="selectRegionTitle"
-        sub-title="精准匹配农情信息,高效管理分区"
-        @confirm="handleGoSelectRegion"
-        @skip="handleSkipSelectRegion"
-    />
+    <select-region-popup v-model:show="showSelectRegionPopup" :image="selectRegionImage" :title="selectRegionTitle"
+        sub-title="精准匹配农情信息,高效管理分区" @confirm="handleGoSelectRegion" @skip="handleSkipSelectRegion" />
 </template>
 
 <script setup>
-import { ref, nextTick, onActivated } from "vue";
+import { ref, nextTick, onActivated, onDeactivated, onBeforeUnmount } from "vue";
 import { ElMessage } from "element-plus";
 import { Popup } from "vant";
 import customHeader from "@/components/customHeader.vue";
@@ -112,7 +96,15 @@ const router = useRouter();
 
 const route = useRoute();
 
+const isAddVariety = ref(false);
 onActivated(() => {
+    isAddVariety.value = route.query.addVariety ? true : false;
+
+    if (isAddVariety.value) {
+        getFarmTypeIdAndPhenologyList();
+        // console.log("farmData", farmData.value);
+        return;
+    }
     const subjectId = route.query.subjectId;
     getPhenologyInitOrConfirmStatus(subjectId);
 });
@@ -122,7 +114,7 @@ const farmData = ref({
     status: "",
 })
 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;
     if (data.status === 'INIT') {
         data.farms.forEach(item => {
@@ -137,6 +129,31 @@ const getPhenologyInitOrConfirmStatus = async (subjectId) => {
             });
         });
     }
+    // console.log("farmData", farmData.value);
+}
+
+const getFarmTypeIdAndPhenologyList = async () => {
+    const { data } = await VE_API.farm_v3.farmTypeIdAndPhenologyList({ subjectId: route.query.subjectId });
+    // farmData.value.farms.forEach(item => {
+    //     item.phenologyOptions = data.phenologyOptions;
+    //     item.typeIdItems = data.typeIdItems;
+    // });
+
+
+    farmData.value.farms.push({
+        phenologyOptions: data[0].phenologyOptions,
+        typeIdItems: data[0].typeIdItems,
+        speciesId: data[0].speciesId,
+        farmId: data[0].farmId,
+        speciesName: data[0].speciesName,
+        regions: [
+            {
+                regionId: null,
+                phenologyId: null,
+                phenologyStartDate: "",
+            }
+        ]
+    });
 }
 
 const addVariety = (crop) => {
@@ -194,7 +211,7 @@ const handleConfirm = async () => {
                     (r) => r.regionId && r.phenologyId && r.phenologyStartDate
                 )
                 .map((r) => {
-                    if (status === 'INIT') {
+                    if (status === 'INIT' || isAddVariety.value) {
                         const origin =
                             (farm.typeIdItems || []).find(
                                 (t) => String(t.id) === String(r.regionId)
@@ -214,7 +231,7 @@ const handleConfirm = async () => {
                     }
                 })
                 .filter((item) => {
-                    if (status === 'INIT') {
+                    if (status === 'INIT' || isAddVariety.value) {
                         return item.id;
                     } else {
                         return item.regionId;
@@ -239,7 +256,7 @@ const handleConfirm = async () => {
         farmDataList,
     };
 
-    const { code, msg } = await VE_API.farm_v3[status === 'INIT' ? 'initFarmData' : 'confirmReproductivePhenology'](params);
+    const { code, msg } = await VE_API.farm_v3[status === 'INIT' || isAddVariety.value ? 'initFarmData' : 'confirmReproductivePhenology'](params);
     if (code === 0) {
         // 从点击新增品种进来的才需要勾选区域
         if (route.query.from === 'addVariety') {
@@ -267,38 +284,38 @@ const handleGoSelectRegion = () => {
     router.push("/draw_area?subjectId=" + route.query.subjectId);
 };
 
-    // 大物候期转换所需参数// 组装为后端所需的 farmDataList 结构
-    // const farmDataList = farmData.value
-    //     .map((farm) => {
-    //         const regionPhenologyItems = (farm.regions || [])
-    //             .filter(
-    //                 (r) => r.regionId && r.phenologyId && r.phenologyStartDate
-    //             )
-    //             .map((r) => ({
-    //                 regionId: r.regionId,
-    //                 phenologyId: r.phenologyId,
-    //                 phenologyStartDate: r.phenologyStartDate,
-    //             }));
-
-    //         return {
-    //             farmId: farm.farmId,
-    //             regionPhenologyItems,
-    //         };
-    //     })
-    //     .filter((item) => item.regionPhenologyItems.length > 0);
-
-    // console.log("farmDataList", farmDataList);
-    
-    // const params = {
-    //     farmDataList,
-    //     expertMiniUserId: 81881,
-    // }
-    // const {code, msg} = await VE_API.farm_v3.confirmReproductivePhenology(params);
-    // if(code === 0) {
-    //     qrCodePopupRef.value.showPopup();
-    // } else {
-    //     ElMessage.error(msg);
-    // }
+// 大物候期转换所需参数// 组装为后端所需的 farmDataList 结构
+// const farmDataList = farmData.value
+//     .map((farm) => {
+//         const regionPhenologyItems = (farm.regions || [])
+//             .filter(
+//                 (r) => r.regionId && r.phenologyId && r.phenologyStartDate
+//             )
+//             .map((r) => ({
+//                 regionId: r.regionId,
+//                 phenologyId: r.phenologyId,
+//                 phenologyStartDate: r.phenologyStartDate,
+//             }));
+
+//         return {
+//             farmId: farm.farmId,
+//             regionPhenologyItems,
+//         };
+//     })
+//     .filter((item) => item.regionPhenologyItems.length > 0);
+
+// console.log("farmDataList", farmDataList);
+
+// const params = {
+//     farmDataList,
+//     expertMiniUserId: 81881,
+// }
+// const {code, msg} = await VE_API.farm_v3.confirmReproductivePhenology(params);
+// if(code === 0) {
+//     qrCodePopupRef.value.showPopup();
+// } else {
+//     ElMessage.error(msg);
+// }
 
 const showAddPopup = ref(false);
 const newVarietyName = ref("");
@@ -308,12 +325,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;
@@ -324,10 +341,10 @@ const onAddOption = async (region) => {
     if (document.activeElement) {
         document.activeElement.blur();
     }
-    
+
     // 等待下拉菜单关闭后再显示弹窗
     await nextTick();
-    
+
     // 记录当前 region
     currentVariety.value = region;
     showAddPopup.value = true;
@@ -350,6 +367,30 @@ const handlePopupClose = (show) => {
 const handleTipConfirm = () => {
     router.push("/growth_report");
 }
+
+// 离开页面/失活时清空本页状态,避免返回后数据复用导致异常
+const clearPageState = () => {
+    isAddVariety.value = false;
+    farmData.value = { farms: [], status: "" };
+
+    showTipPopup.value = false;
+    showSelectRegionPopup.value = false;
+    selectRegionImage.value = "";
+    selectRegionTitle.value = "勾选 区域";
+
+    newVarietyName.value = "";
+    currentVariety.value = null;
+    // 清空当前下拉记录,避免返回后仍处在“添加品种”上下文
+    // 如果后续你给 currentVariety.variety 赋值,也会随 currentVariety 置空一起释放
+};
+
+onDeactivated(() => {
+    clearPageState();
+});
+
+onBeforeUnmount(() => {
+    clearPageState();
+});
 </script>
 
 <style lang="scss" scoped>
@@ -460,15 +501,18 @@ const handleTipConfirm = () => {
 
 .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;
         }
@@ -546,6 +590,7 @@ const handleTipConfirm = () => {
     justify-content: center;
     font-size: 24px;
     color: #000;
+
     .success-icon {
         width: 28px;
         height: 28px;
@@ -564,7 +609,8 @@ const handleTipConfirm = () => {
         font-weight: 400;
         margin-bottom: 12px;
         color: #000000;
-        .name-text{
+
+        .name-text {
             font-weight: 500;
             color: #2199F8;
             padding: 0 2px;
@@ -599,6 +645,7 @@ const handleTipConfirm = () => {
             background: #fff;
             border: 1px solid #999999;
         }
+
         .delete {
             margin-right: 13px;
             color: #FF3D3D;

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

@@ -120,7 +120,7 @@ const selectRegionImage = ref("");
 
 const handleAddVariety = () => {
     // showSelectRegionPopup.value = true;
-    router.push("/interaction?subjectId=" + gardenId.value);
+    router.push("/interaction?addVariety=true&subjectId=" + gardenId.value);
 };
 
 const handleSkipSelectRegion = () => {