2 Commits 9cee321cad ... 99258ff409

Autor SHA1 Mensagem Data
  lxf 99258ff409 Merge branch 'farmer' of http://www.sysuimars.cn:3000/feiniao/feiniao-farm-h5 into farmer 5 dias atrás
  lxf ee3a9e225f fix: 对接长势报告,新增流程 5 dias atrás

+ 30 - 26
src/App.vue

@@ -23,7 +23,7 @@
 
     <Tabbar class="tabbar" route fixed v-show="showTab" active-color="#2199F8" inactive-color="#898989">
         <!-- 托管农户:首页、作物档案、农事记录 -->
-        <template v-if="userType == 2">
+        <!-- <template v-if="userType == 2"> -->
             <tabbar-item replace to="/home">
                 <span>首页</span>
                 <template #icon="props">
@@ -60,10 +60,10 @@
                     />
                 </template>
             </tabbar-item>
-        </template>
+        <!-- </template> -->
 
         <!-- 普通农户:首页、农事服务、用户管理、个人中心(保留原逻辑) -->
-        <template v-else-if="userType == 1">
+        <!-- <template v-else-if="userType == 1">
             <tabbar-item replace to="/home" v-if="curRole == 0 || curRole == 2">
                 <span>首页</span>
                 <template #icon="props">
@@ -112,7 +112,7 @@
                     />
                 </template>
             </tabbar-item>
-        </template>
+        </template> -->
     </Tabbar>
 
     <!-- 开启底部安全区适配 -->
@@ -135,32 +135,36 @@ const showTab = ref(false);
 // 0: 农户, 1: 专家, 2:农资农服
 const curRole = ref(0);
 // USER_TYPE: 1 普通农户,2 托管农户
-const userType = ref(localStorage.getItem("USER_TYPE") || "1");
+const userType = ref("2");
 
 // 获取用户是否为托管农户,并缓存 USER_TYPE(与 dev_login.vue 逻辑一致)
 const fetchUserType = async () => {
-    // 检查是否有 token,没有 token 则不调用接口
-    const token = store.state.app.token || localStorage.getItem("token");
-    if (!token) {
-        // 没有 token 时使用缓存的值
-        userType.value = localStorage.getItem("USER_TYPE") || "1";
-        return;
-    }
+    
+    userType.value = "2";
+    localStorage.setItem("USER_TYPE", "2");
 
-    try {
-        const { data } = await VE_API.farm.userFarmSelectOption({ userType: 2 });
-        if (Array.isArray(data) && data.length > 0) {
-            // 有托管农户数据
-            userType.value = "2";
-            localStorage.setItem("USER_TYPE", "2");
-        } else {
-            userType.value = "1";
-            localStorage.setItem("USER_TYPE", "1");
-        }
-    } catch (error) {
-        // 请求失败时保留默认值
-        userType.value = localStorage.getItem("USER_TYPE") || "1";
-    }
+    // // 检查是否有 token,没有 token 则不调用接口
+    // const token = store.state.app.token || localStorage.getItem("token");
+    // if (!token) {
+    //     // 没有 token 时使用缓存的值
+    //     userType.value = localStorage.getItem("USER_TYPE") || "1";
+    //     return;
+    // }
+
+    // try {
+    //     const { data } = await VE_API.farm.userFarmSelectOption({ userType: 2 });
+    //     if (Array.isArray(data) && data.length > 0) {
+    //         // 有托管农户数据
+    //         userType.value = "2";
+    //         localStorage.setItem("USER_TYPE", "2");
+    //     } else {
+    //         userType.value = "1";
+    //         localStorage.setItem("USER_TYPE", "1");
+    //     }
+    // } catch (error) {
+    //     // 请求失败时保留默认值
+    //     userType.value = localStorage.getItem("USER_TYPE") || "1";
+    // }
 };
 
 let tabBarHeight = 0;

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

@@ -81,4 +81,9 @@ module.exports = {
         url: config.base_dev_url + "v2/farm/farmBaseTypeOptions",
         type: "get",
     },
+    // 长势报告
+    growthReport: {
+        url: config.base_dev_url + "container/growthReport/generate/result",
+        type: "get",
+    },
 }

+ 1 - 1
src/components/pageComponents/ArchivesFarmTimeLine.vue

@@ -770,7 +770,7 @@ const handleStatusDetail = (fw) => {
     if(props.pageType === 'agri_record'){
         router.push({
             path: "/status_detail",
-            query: { miniJson: JSON.stringify({ id: fw.id }) },
+            query: { miniJson: JSON.stringify({ farmWorkLibId: fw.farmWorkLibId, farmWorkRecordId: fw.farmWorkRecordId, farmId: props.farmId }) },
         });
     }
 };

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

@@ -8,7 +8,7 @@
         teleport="body"
         :close-on-click-overlay="closeOnClickOverlay"
         @click-overlay="handleClickOverlay"
-        @@closed="handleClosed"
+        @closed="handleClosed"
         :z-index="zIndex"
     >
         <template v-if="type === 'create'">

+ 5 - 3
src/views/old_mini/agri_record/components/areaMap.js

@@ -57,7 +57,7 @@ class AreaMap {
                 let nameText = new Style({
                     text: new Text({
                         font: "14px sans-serif",
-                        text: f.get("name")+';3123',
+                        text: f.get("name"),
                         offsetY: 10,
                         fill: new Fill({ color: "#fff" }), // 字体颜色
                         stroke: new Stroke({
@@ -114,8 +114,10 @@ class AreaMap {
    */
     fitView() {
         let extent = this.gardenPolygonLayer.source.getExtent()
-        // 地图自适应到区域可视范围
-        this.kmap.getView().fit(extent, { duration: 50, padding: [80, 80, 80, 80] });
+        if (extent) {
+            // 地图自适应到区域可视范围
+            this.kmap.getView().fit(extent, { duration: 50, padding: [80, 80, 80, 80] });
+        }
     }
 
     fitByGardenId(gardenId, hasMapAnimate) {

+ 29 - 12
src/views/old_mini/agri_record/subPages/statusDetail.vue

@@ -59,12 +59,12 @@
 
                     <div class="card-actions">
                         <div class="action-btn" @click="handleViewPrescription">
-                            <el-icon class="action-btn-icon" :class="{ 'rotate': showPrescription }" :size="16"><DArrowRight /></el-icon>
                             药物处方
+                            <el-icon class="action-btn-icon" :class="{ 'rotate': showPrescription }" :size="16"><DArrowRight /></el-icon>
                         </div>
                         <div class="action-btn" @click="handleViewArea">
-                            <el-icon class="action-btn-icon" :class="{ 'rotate': showMapArea }" :size="16"><DArrowRight /></el-icon>
                             执行区域
+                            <el-icon class="action-btn-icon" :class="{ 'rotate': showMapArea }" :size="16"><DArrowRight /></el-icon>
                         </div>
                     </div>
 
@@ -259,7 +259,7 @@
 import { useRouter, useRoute } from "vue-router";
 import { showSuccessToast } from 'vant';
 import { ElMessage } from "element-plus";
-import { ref, onActivated } from "vue";
+import { ref, onActivated, onDeactivated } from "vue";
 import customHeader from "@/components/customHeader.vue";
 import { Warning } from "@element-plus/icons-vue";
 import upload from "@/components/upload";
@@ -341,7 +341,7 @@ const showMapArea = ref(false);
 
 const detailData = ref({});
 
-const farmId = ref(94500);
+const farmId = ref();
 
 const handleViewArea = () => {
     // 收起药物处方
@@ -371,17 +371,29 @@ const handleShowQrCodePopup = (type) => {
 
 const isLocked = ref(false);
 
+const miniJson = ref(null);
+
 onActivated(() => {
-    const id = route.query.miniJson ? JSON.parse(route.query.miniJson).id : null;
-    if (id) {
-        getDetail(id);
+    miniJson.value = route.query.miniJson ? JSON.parse(route.query.miniJson) : null;
+    farmId.value = miniJson.value?.farmId;
+    if (miniJson.value?.farmWorkLibId) {
+        getDetail(miniJson.value.farmWorkLibId);
     }
 });
 
-const getDetail = async (id) => {
-    const { data } = await VE_API.z_farm_work_record.getDetailById({ id });
+onDeactivated(() => {
+    
+    // 收起执行区域地图
+    showMapArea.value = false;
+    // 收起药物处方
+    showPrescription.value = false;
+})
+
+
+const getDetail = async (farmWorkLibId) => {
+    const { data } = await VE_API.z_farm_work_record.getDetailById({ farmWorkLibId, farmWorkRecordId: miniJson.value.farmWorkRecordId, farmId: farmId.value });
     detailData.value = data;
-    status.value = data.detail?.flowStatus;
+    status.value = data?.detail?.flowStatus;
     guideSrc.value = data?.post?.media ? JSON.parse(data?.post?.media)[0] : null;
 };
 </script>
@@ -419,7 +431,7 @@ const getDetail = async (id) => {
         left: 0;
         top: 0;
         height: 144px;
-        background: #2199f8;
+        background: #C7C7C7;
         width: 100%;
     }
 
@@ -566,7 +578,7 @@ const getDetail = async (id) => {
             font-size: 14px;
             cursor: pointer;
             .action-btn-icon {
-                margin-right: 4px;
+                margin-left: 4px;
                 transform: rotate(270deg);
                 transition: transform 0.3s ease;
                 &.rotate {
@@ -792,6 +804,11 @@ const getDetail = async (id) => {
 }
 .map-info-wrap {
     padding-top: 12px;
+    ::v-deep {
+        .map-box {
+            height: 180px;
+        }
+    }
 }
 
 .bottom-btn-wrap {

+ 7 - 3
src/views/old_mini/create_farm/index.vue

@@ -282,7 +282,11 @@ onActivated(() => {
     getLocationName(`${arr[1]},${arr[0]}`);
     // 仅在携带 isReload 标记、且不是编辑/小程序回流场景时,认为是一次全新创建,重置表单和地块,
     // 避免破坏原有自动生成农场名称等逻辑
+    console.log('route.query.isReload', route.query.isReload)
+    console.log('paramsType.value', paramsType.value)
+    console.log('route.query.miniJson', route.query.miniJson)
     if (route.query.isReload && paramsType.value !== "edit" && !route.query.miniJson) {
+        console.log('重置表单和地块')
         // 重置表单字段到初始值
         ruleFormRef.value && ruleFormRef.value.resetFields();
         // 重置与地块绘制相关的内部状态
@@ -334,7 +338,7 @@ function handleMapUpdate() {
         polygonArr.value = null;
         ruleForm.mu = "";
         ruleForm.typeIds = [];
-        ruleForm.defaultFarm = false;
+        ruleForm.defaultFarm = 0;
 
         return; // 直接返回,不执行下面的逻辑
     }
@@ -375,7 +379,7 @@ function handleMapUpdate() {
             ruleForm.mu = "";
             isFromEditMap.value = false;
             hasDefaultPolygon.value = false;
-            ruleForm.defaultFarm = false;
+            ruleForm.defaultFarm = 0;
         }
     } else if (route.query.type === "edit" && store.state.home.editFarmData) {
         // 如果是编辑模式且没有从编辑地图返回的数据,回填原始编辑数据
@@ -858,7 +862,7 @@ function populateEditData() {
     ruleForm.fzr = editData.fzr || "";
     ruleForm.tel = editData.tel || "";
     ruleForm.baseType = editData.baseType || null;
-    ruleForm.defaultFarm = editData.defaultOption || false;
+    ruleForm.defaultFarm = editData.defaultOption || 0;
     ruleForm.mu = editData.mianji || "";
     ruleForm.address = editData.address || "";
 

+ 7 - 3
src/views/old_mini/dev_login.vue

@@ -16,7 +16,7 @@ let userId = route.query.userId;
 
 onMounted(async () => {
     const token = route.query.token
-    const targetUrl = route.query.targetUrl ? route.query.targetUrl : '/home';
+    let targetUrl = route.query.targetUrl ? route.query.targetUrl : '/home';
     
     // 先从 session 获取保存的角色
     let savedRole = null;
@@ -62,7 +62,9 @@ onMounted(async () => {
     }
     // 进入首页时请求接口,确定是否为托管农户
     await fetchUserType();
-    await getFarmList();
+    await getFarmList(() => {
+        targetUrl = '/create_farm?type=farmer&expertMiniUserId=81881&isReload=true';
+    });
     
     localStorage.setItem("MINI_USER_LOCATION", route.query.point)
     localStorage.setItem("MINI_USER_LOCATION_POINT", `POINT(${pointXy[0]} ${pointXy[1]})`)
@@ -72,7 +74,7 @@ onMounted(async () => {
     router.push(`${targetUrl}?miniJson=${JSON.stringify(route.query)}`);
 })
 
-const getFarmList = async () => {
+const getFarmList = async (callback) => {
     localStorage.removeItem('selectedFarmId');
     localStorage.removeItem('selectedFarmName');
     const { data } = await VE_API.farm.userFarmSelectOption();
@@ -80,6 +82,8 @@ const getFarmList = async () => {
         const defalutFarm = data[0]
         localStorage.setItem('selectedFarmId', defalutFarm.id);
         localStorage.setItem('selectedFarmName', defalutFarm.name);
+    } else {
+        callback();
     }
 }
 

+ 17 - 18
src/views/old_mini/growth_report/index.vue

@@ -7,12 +7,12 @@
                     <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?.executeDate }}</div>
+                    <div class="time-tag">{{ workItem?.reportDate }}</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="" />
-                            <span class="info-text">{{ workItem?.farmName }}</span>
+                            <span class="info-text">{{ workItem?.orchardName }}</span>
                         </div>
                     </div>
                 </div>
@@ -20,7 +20,7 @@
                 <div class="report-box">
                     <div class="box-title">农情总结</div>
                     <div class="box-text">
-                        {{ workItem?.resultInfo || "--" }}
+                        {{ workItem?.summaryAgricultural || "--" }}
                     </div>
                 </div>
 
@@ -29,15 +29,13 @@
                     <div class="box-text">
                         <div class="box-bg">
                             <span class="box-subtitle">背景描述:</span>
-                            {{ workItem?.growthInfo?.description || "--" }}
+                            <div v-html="workItem?.phenologyBackground"></div>
                         </div>
                         <div class="box-advice">
                             <span class="box-subtitle">对策建议:</span>
-                            {{ workItem?.growthInfo?.advice || "--" }}
-                        </div>
-                        <div class="box-sum">
-                            总结,该问题解决好了,可以达到什么效果。
+                            <div v-html="workItem?.phenologySuggestion"></div>
                         </div>
+                        <div class="box-sum" v-html="workItem?.phenologySummary"></div>
                     </div>
                 </div>
 
@@ -46,14 +44,14 @@
                     <div class="box-text">
                         <div class="box-bg">
                             <span class="box-subtitle">背景描述:</span>
-                            {{ workItem?.growthInfo?.description || "--" }}
+                            <div v-html="workItem?.pestBackground"></div>
                         </div>
                         <div class="box-advice">
                             <span class="box-subtitle">对策建议:</span>
-                            {{ workItem?.growthInfo?.advice || "--" }}
+                            <div v-html="workItem?.pestSuggestion"></div>
                         </div>
                         <div class="box-sum">
-                            总结,该问题解决好了,可以达到什么效果。
+                            <div v-html="workItem?.pestSummary"></div>
                         </div>
                     </div>
                 </div>
@@ -63,11 +61,11 @@
                     <div class="box-text">
                         <div class="box-bg">
                             <span class="box-subtitle">背景描述:</span>
-                            {{ workItem?.futureInfo?.description || "--" }}
+                            <div v-html="workItem?.forecastBackground"></div>
                         </div>
                         <div class="box-advice">
                             <span class="box-subtitle">对策建议:</span>
-                            {{ workItem?.futureInfo?.advice || "--" }}
+                            <div v-html="workItem?.forecastSuggestion"></div>
                         </div>
                     </div>
                 </div>
@@ -76,7 +74,7 @@
                     <div class="box-text next-info">
                         <div class="box-bg">
                             <span class="box-subtitle">下一次农情互动预告:</span>
-                            {{ workItem?.nextInfo?.advice || "--" }}
+                            <div v-html="workItem?.nextInteractionPreview"></div>
                         </div>
                     </div>
                 </div>
@@ -117,17 +115,18 @@ const paramsPage = ref({});
 onActivated(() => {
     window.scrollTo(0, 0);
     paramsPage.value = route.query.miniJson ? JSON.parse(route.query.miniJson) : {};
-    // getDetail();
+    getDetail();
     // getResultReport();
 });
 
 const getDetail = () => {
     if (!paramsPage.value.id) return;
     loading.value = true;
-    VE_API.z_farm_work_record
-        .getDetail({ id: paramsPage.value.id })
+    VE_API.farm
+        // .growthReport({ reportId: paramsPage.value.id })
+        .growthReport({ reportId: 1 })
         .then(({ data }) => {
-            workItem.value = data[0];
+            workItem.value = data;
         })
         .finally(() => {
             loading.value = false;

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

@@ -17,6 +17,7 @@
                 <div class="expert-desc">
                     <img class="expert-desc-icon" src="@/assets/img/home/expert-text.png" alt="">
                     <!-- <div class="desc-text"><span class="dotted"></span>您有一条长势报告,请查看</div> -->
+                    <div class="desc-text"><span class="dotted"></span>点击查看农情互动采集</div>
                 </div>
             </div>
         </div>

+ 13 - 7
src/views/old_mini/home/subPages/prescriptionPage.vue

@@ -5,7 +5,7 @@
             <div class="title-name">农场基本信息</div>
             <div class="title-desc">请认真核对一下内容</div>
         </div>
-        <div class="prescription-box">
+        <div class="prescription-box" v-loading="loadingPage">
             <!-- <div class="box-title">
                 <img src="@/assets/img/home/label-icon.png" />
                 农场情况
@@ -226,7 +226,8 @@
     >
         <template #default>
             <div class="expert-info">
-                <img class="expert-img" src="@/assets/img/home/zj-1.png" alt="">
+                <!-- <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 }}  专家的
             </div>
         </template>
@@ -272,6 +273,7 @@ onMounted(() => {
     getCurrentAndNextPhenology();
 });
 
+const loadingPage = ref(false);
 const basicForm = ref({
     soilTypes: "",
     irrigationMethods: [],
@@ -283,6 +285,7 @@ const basicForm = ref({
 
 const basicFarmFormData = ref({});
 const getBasicFarmFormData = () => {
+    loadingPage.value = true;
     VE_API.basic_farm.fetchBasicFarmFormData().then(({ data }) => {
         basicFarmFormData.value = data;
         
@@ -317,6 +320,8 @@ const getBasicFarmFormData = () => {
         
         // 4. irrigationMethods, improvementAreas, machinery 的 selected 状态已经在 data 中设置好了
         // 这些数据会直接显示在页面上,因为页面是通过 basicFarmFormData 来渲染的
+    }).finally(() => {
+        loadingPage.value = false;
     });
 }
 
@@ -703,9 +708,10 @@ const handlePeriodConfirm = async () => {
     
     // 关闭弹窗并提交表单
     showPeriodPopup.value = false;
-    
+    loadingPage.value = true;
     // 正式提交
     const success = await submit();
+    loadingPage.value = false;
     if (!success) {
         return;
     }
@@ -1262,10 +1268,10 @@ const handlePeriodConfirm = async () => {
     font-size: 20px;
     line-height: 36px;
     .expert-img {
-        width: 26px;
-        height: 26px;
-        border-radius: 50%;
-        object-fit: cover;
+        // width: 26px;
+        // height: 26px;
+        // border-radius: 50%;
+        // object-fit: cover;
         margin-right: 5px;
     }
 }

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

@@ -54,7 +54,7 @@ import ArchivesFarmTimeLine from "@/components/pageComponents/ArchivesFarmTimeLi
 import agriExecutePopup from "@/components/popup/agriExecutePopup.vue";
 
 const handleJump = () =>{
-    router.push('/create_farm?type=farmer&expertMiniUserId=81881')
+    router.push('/create_farm?type=farmer&expertMiniUserId=81881&isReload=true')
 }
 
 const showAgriExecutePopup = ref(false); // 农事执行弹窗