瀏覽代碼

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

lxf 4 天之前
父節點
當前提交
e5cdbf6cc4

+ 6 - 1
src/api/modules/home.js

@@ -82,5 +82,10 @@ module.exports = {
     listUnansweredFarms:{
         url: config.base_dev_url + "work_code/phenology/quest/listUnansweredFarms/{page}/{limit}",
         type: "get",
-    }
+    },
+    //查询未来农事预警
+    listFutureFarmWorkWarning:{
+        url: config.base_dev_url + "container_farm_work_arrange/futureFarmWorkWarning",
+        type: "get",
+    },
 }

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

@@ -36,4 +36,9 @@ module.exports = {
         url: config.base_dev_url + "farm_broadcast/latestByServiceFarm",
         type: "post",
     },
+    //查询农场当前问卷问题接口
+    listWithAnswer: {
+        url: config.base_dev_url + "work_code/phenology/quest/listWithAnswer",
+        type: "get",
+    },
 }

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

@@ -185,6 +185,7 @@ import { useStore } from "vuex";
 import { convertPointToArray } from "@/utils/index";
 import { ElMessage } from "element-plus";
 import { Checkbox } from "vant";
+import wx from "weixin-js-sdk";
 import { transformFromGCJToWGS, transformFromWGSToGCJ } from "@/utils/WSCoordinate.js";
 
 const route = useRoute();
@@ -731,11 +732,28 @@ function backgToHome() {
 
     // 根据来源页面决定返回目标
     const fromPage = route.query.from;
-    if (fromPage && fromPage !== "details") {
-        router.replace(`/${fromPage}`);
-        return;
-    } else {
-        router.go(-1);
+    if (route.query.miniJson) {
+        const json = JSON.parse(route.query.miniJson);
+        if(json.isMini) {
+            const dropdownGardenItem = ref({
+                organId: json.farmId,
+                periodId: json.periodId,
+                name: json.name,
+                page: "create_farm",
+                showFarmSelect: true,
+                images: json.images,
+            });
+            wx.miniProgram.reLaunch({
+                url: `/pages/subPages/new_recognize/index?gardenData=${JSON.stringify(dropdownGardenItem.value)}`,
+            });
+        }
+    }else{
+        if (fromPage && fromPage !== "details") {
+            router.replace(`/${fromPage}`);
+            return;
+        } else {
+            router.go(-1);
+        }
     }
 }
 

+ 1 - 5
src/views/old_mini/dev_login.vue

@@ -64,11 +64,7 @@ onMounted(async () => {
     store.commit("home/SET_MINI_USER_LOCATION", route.query.point);
     store.commit("home/SET_MINI_USER_ID", userId);
     store.commit("home/SET_MINI_USER_LOCATION_POINT", `POINT(${pointXy[0]} ${pointXy[1]})`);
-    if(route.query.targetUrl === "/create_farm"){
-        router.push("/create_farm?isReload=true&from=home");
-    }else{
-        router.push(`${targetUrl}?miniJson=${JSON.stringify(route.query)}`);
-    }
+    router.push(`${targetUrl}?miniJson=${JSON.stringify(route.query)}`);
 })
 
 const getFarmList = async () => {

+ 39 - 21
src/views/old_mini/home/components/AgriculturalDynamics.vue

@@ -19,6 +19,8 @@
         <div class="title">农情互动</div>
         <!-- 内容区域 -->
         <div class="agricultural-list">
+        <div v-if="!unansweredList.length" class="empty-block">暂无数据</div>
+        <template v-else>
             <div class="agricultural-item" v-for="(item, index) in unansweredList" :key="index">
                 <!-- 头部区域 -->
                 <div class="header-section">
@@ -35,24 +37,25 @@
                 <div class="warning-block" v-html="item.latestPhenologyProgressBroadcast?.content"></div>
 
                 <div class="timeline">
-                    <div class="timeline-item" v-for="item in timelineList" :key="item.id">
+                    <div class="timeline-item" v-for="timelineItem in item.timelineList" :key="timelineItem.id">
                         <div class="timeline-left">
                             <div class="dot"></div>
                             <div class="line"></div>
                         </div>
                         <div class="timeline-right">
                             <div class="date">
-                                预计{{ item.date }}天后触发<span class="work-name">{{ item.workName }}</span>
+                                预计{{ timelineItem.daysUntilTrigger }}天后触发<span class="work-name">{{ timelineItem.farmWorkName }}</span>
                             </div>
                             <div class="text">
-                                预计报价<span class="price">{{ item.price }}元</span>
+                                预计报价<span class="price">{{ timelineItem.estimatedCost }}元</span>
                                 <span class="action-detail">查看报价单</span>
                             </div>
                         </div>
-                        <div class="timeline-action" @click="handleTimelineAction(item)">转入农事任务</div>
+                        <div class="timeline-action" @click="handleTimelineAction(timelineItem)">转入农事任务</div>
                     </div>
                 </div>
             </div>
+        </template>
         </div>
     </div>
     <offer-popup ref="offerPopupRef"></offer-popup>
@@ -68,19 +71,6 @@ const taskList = ref([
     { id: 2, title: "梢期杀虫", executionTime: "2025.05.06", status: "pending" },
 ]);
 
-const timelineList = ref([
-    {
-        date: "3",
-        workName: "梢期杀虫",
-        price: "1258",
-    },
-    // {
-    //     date: "5",
-    //     workName: "梢期营养",
-    //     price: "1758",
-    // },
-]);
-
 const offerPopupRef = ref(null);
 const handleTaskAction = (item) => {
     const data = {
@@ -123,15 +113,31 @@ onMounted(() => {
     getUnansweredFarms();
 });
 
+//农情互动的农场列表接口(分页)
 const unansweredList = ref([]);
-const getUnansweredFarms = () => {
+const getUnansweredFarms = async () => {
     const params = {
         page: 0,
         limit: 3,
     };
-    VE_API.home.listUnansweredFarms(params).then((res) => {
-        unansweredList.value = res.data || [];
-    });
+    const res = await VE_API.home.listUnansweredFarms(params);
+    unansweredList.value = (res.data || []).map(item => ({
+        ...item,
+        timelineList: []
+    }));
+    
+    // 串行请求,一个完成后再请求下一个
+    if(unansweredList.value.length){
+        for(let i = 0; i < unansweredList.value.length; i++){
+            await getFutureFarmWorkWarning(unansweredList.value[i]);
+        }
+    }
+};
+
+//查询未来农事预警
+const getFutureFarmWorkWarning = async (item) => {
+    const res = await VE_API.home.listFutureFarmWorkWarning({farmId: item.farmId});
+    item.timelineList = res.data || [];
 };
 </script>
 
@@ -212,6 +218,18 @@ const getUnansweredFarms = () => {
     }
 
     .agricultural-list {
+        .empty-block {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            height: 120px;
+            color: #a0a0a0;
+            font-size: 14px;
+            background-color: #ffffff;
+            border-radius: 8px;
+            margin-top: 8px;
+        }
+
         .agricultural-item {
             background-color: #ffffff;
             border-radius: 8px;

+ 17 - 30
src/views/old_mini/home/index.vue

@@ -93,7 +93,7 @@ const monitorCards = ref({
     left: {
         title: "农情采集",
         content: "精准监测  科学决策",
-        route: "/monitor",
+        route: "/pest",
     },
     right: [
         {
@@ -111,36 +111,23 @@ const monitorCards = ref({
 
 // 卡片点击事件
 const handleCardClick = (card) => {
-    if (curRole == 0) {
-        if (!isGarden.value) {
-            showFarmPopup.value = true;
-            return;
-        }
-    }
-    if (card.route === "/pest") {
-        // ElMessage.warning("该功能正在升级中,敬请期待");
-        // if (curRole == 2) {
-        //     ElMessage.warning("该功能正在升级中,敬请期待");
-        // } else {
-            const dropdownGardenItem = ref({
-                organId: 766,
-                periodId: 1,
-                wktVal: "wktVal",
-                address: "address",
-                district: "district",
-                name: "荔博园",
-            });
-            wx.miniProgram.navigateTo({
-                url: `/pages/subPages/new_recognize/index?gardenData=${JSON.stringify(dropdownGardenItem.value)}`,
-            });
-        // }
+    const dropdownGardenItem = ref({
+        organId: 766,
+        periodId: 1,
+        name: "荔博园",
+    });
+    if (card.title === "农情采集") {
+        dropdownGardenItem.value.page = "create_farm";
+        wx.miniProgram.navigateTo({
+            url: `/pages/subPages/new_recognize/index?gardenData=${JSON.stringify(dropdownGardenItem.value)}`,
+        });
+    } else if (card.title === "病虫识别") {
+        dropdownGardenItem.value.page = "album_recognize";
+        wx.miniProgram.navigateTo({
+            url: `/pages/subPages/new_recognize/index?gardenData=${JSON.stringify(dropdownGardenItem.value)}`,
+        });
     } else {
-        if (card.route === "/chat_frame") {
-            router.push("/agri_services?active=1");
-            // router.push(`/chat_frame?userId=${expertInfo.value.appUserId}`);
-        } else {
-            router.push(card.route);
-        }
+        router.push(card.route);
     }
 };
 

+ 28 - 9
src/views/old_mini/home/subPages/warningDetail.vue

@@ -20,13 +20,19 @@
             <div class="article-box">
                 <div class="box-top">
                     <img class="icon" src="@/assets/img/home/ask-icon.png" alt="" />
-                    <div class="title">在白点期,您当前农场是否出现白点?</div>
+                    <div class="title">{{ questInfo.quest }}</div>
                 </div>
                 <div class="box-bottom" :style="{ justifyContent: !isLink ? 'center' : 'flex-end' }">
                     <div class="edit-btn" v-if="!isLink">编辑问题</div>
                     <template v-else>
-                        <div class="edit-btn">否,未出现</div>
-                        <div class="edit-btn primary-btn">是,已出现</div>
+                        <div
+                            class="edit-btn"
+                            :class="{ 'primary-btn': item.value != 0 }"
+                            v-for="item in questInfo.answer"
+                            :key="item.value"
+                        >
+                            {{ item.name }}
+                        </div>
                     </template>
                 </div>
             </div>
@@ -36,32 +42,45 @@
             </div>
 
             <div class="custom-bottom-fixed-btns" v-if="!isLink">
-                <div class="bottom-btn primary-btn" @click="handleForward">转发</div>
+                <div class="bottom-btn primary-btn" @click="showShareSheet = true">转发</div>
             </div>
         </div>
     </div>
+    <fn-share-sheet v-model:show="showShareSheet" :options="shareOptions" @select="handleShareSelect" />
 </template>
 
 <script setup>
 import customHeader from "@/components/customHeader.vue";
 import { ref, onActivated } from "vue";
+import FnShareSheet from "@/components/pageComponents/FnShareSheet.vue";
 import { useRoute } from "vue-router";
 
 const route = useRoute();
 
-const isLink = ref(true);
+const showShareSheet = ref(false);
+const shareOptions = ref([{ name: "微信", icon: "wechat", type: "wechat" }]);
+const handleShareSelect = (option) => {
+    console.log("option", option);
+};
 
+const isLink = ref(true);
+const questInfo = ref({});
 const warningDetail = ref({});
 const showImage = ref(false);
+
 onActivated(() => {
     showImage.value = route.query.showImage === "true" ? true : false;
+    isLink.value = localStorage.getItem("curRole") || 0;
+    if (route.query.questInfo) {
+        const infoObj = JSON.parse(route.query.questInfo);
+        questInfo.value = {
+            quest: infoObj.quest,
+            answer: JSON.parse(infoObj.answer),
+        };
+    }
     getWarningDetail();
 });
 
-const handleForward = () => {
-    console.log("转发");
-};
-
 const getWarningDetail = () => {
     const params = {
         id: route.query.id,

+ 26 - 39
src/views/old_mini/task_condition/components/remindCustomer.vue

@@ -2,37 +2,44 @@
     <div class="service-records-page">
         <custom-header name="提醒客户"></custom-header>
         <div class="record-list">
-            <div v-for="(item, index) in renderList" :key="index" class="record-card">
-                <img class="thumb" :src="item.thumb" alt="农场缩略图" @error="handleImgError" />
-                <div class="card-body" @click="handleItemClick(item.raw)">
+            <div v-for="(item, index) in recordList" :key="index" class="record-card">
+                <img class="thumb" :src="item.postInfo.media && item.postInfo.media[0]" alt="农场缩略图" />
+                <div class="card-body" @click="handleItemClick(item)">
                     <div class="card-body-left">
-                        <div class="title van-multi-ellipsis--l2">{{ item.title }}</div>
-                        <div class="date">{{ item.date }}</div>
+                        <div class="title van-multi-ellipsis--l2">{{ item.postInfo.title }}</div>
+                        <div class="date">{{ formatDate(item.postInfo.createTime) }}</div>
                     </div>
-                    <div class="forward-btn" @click.stop="handleForward(item.raw)">转发</div>
+                    <div class="forward-btn" @click.stop="showShareSheet = true">转发</div>
                 </div>
             </div>
         </div>
     </div>
+    <fn-share-sheet v-model:show="showShareSheet" :options="shareOptions" @select="handleShareSelect" />
 </template>
 <script setup>
-import { ref, onMounted, computed } from "vue";
+import { ref, onMounted } from "vue";
 import customHeader from "@/components/customHeader.vue";
 import { useRouter } from "vue-router";
-import defaultThumb from "@/assets/img/home/farm.png";
+import FnShareSheet from "@/components/pageComponents/FnShareSheet.vue";
 const router = useRouter();
-
 // 服务记录列表数据
 const recordList = ref([]);
+const showShareSheet = ref(false);
+const shareOptions = ref([
+    { name: "微信", icon: "wechat", type: "wechat" },
+]);
+const handleShareSelect = (option) => {
+    console.log("option", option);
+};
 
 onMounted(() => {
-    getUserList();
+    getListWithAnswer();
 });
 
-const getUserList = async () => {
-    const { data } = await VE_API.user.userList();
+const getListWithAnswer = async () => {
+    const { data } = await VE_API.user.listWithAnswer({farmId:'93684'});
     if (data.length) {
-        recordList.value = data.filter((item) => item.serviceCount != 0);
+        recordList.value = data
     }
 };
 const formatDate = (dateStr) => {
@@ -44,34 +51,14 @@ const formatDate = (dateStr) => {
     const d = `${date.getDate()}`.padStart(2, "0");
     return `${y}-${m}-${d}`;
 };
-const renderList = [
-    {
-        title: "湛江出现了高温灼烧气象预警,请注意某某防范!",
-        date: "2025-11-12",
-        thumb: defaultThumb,
-    },
-    {
-        title: "农情互动提醒:",
-        date: "2025-11-12",
-        thumb: defaultThumb,
-    },
-    {
-        title: "农事执行提醒",
-        date: "2025-11-12",
-        thumb: defaultThumb,
-    },
-];
+
 // 处理列表项点击
 const handleItemClick = (data) => {
-    router.push(`/warning_detail?id=782295538706944000&showImage=true`);
-};
-// 处理转发按钮点击
-const handleForward = (data) => {
-    // TODO: 实现转发功能
-    console.log("转发", data);
-};
-const handleImgError = (e) => {
-    e.target.src = defaultThumb;
+    const questInfo = {
+        quest: data.quest,
+        answer: data.answerOptions,
+    }
+    router.push(`/warning_detail?id=${data.postInfo.postId}&questInfo=${JSON.stringify(questInfo)}`);
 };
 </script>
 <style lang="scss" scoped>