Parcourir la source

feat:添加农户新增农场功能和专家对话聊天

wangsisi il y a 2 semaines
Parent
commit
6a1c97f4ea

+ 199 - 121
src/views/old_mini/chat_frame/consult.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="consult">
-        <custom-header name="咨询专家"></custom-header>
+        <custom-header name="咨询专家" @goback="handleBack"></custom-header>
         <div class="consult-content">
             <!-- 聊天消息区域 -->
             <div class="chat-messages" ref="messagesContainer">
@@ -8,48 +8,47 @@
                     <!-- 对方消息 -->
                     <template v-if="msg.sender === 'received'">
                         <!-- <div class="avatar">{{ msg.receiverName.charAt(0) }}</div> -->
-                        <el-avatar
-                            class="avatar"
-                            :size="40"
-                            :src="
-                                msg.receiverIcon ||
-                                'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'
-                            "
-                        />
-                        <div class="bubble" :class="{ 'no-bubble': msg.messageType === 'image' ,'card-bubble': msg.messageType === 'card'}">
+                        <el-avatar class="avatar" :size="40" :src="msg.receiverIcon ||
+                            'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'
+                            " />
+                        <div class="bubble"
+                            :class="{ 'no-bubble': msg.messageType === 'image', 'card-bubble': msg.messageType === 'card' }">
                             <!-- 文本消息 -->
                             <div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
 
                             <!-- 图片消息 -->
                             <div v-if="msg.messageType === 'image'" class="image-message">
-                                <img
-                                    :src="msg.content + resize"
-                                    @click="showImagePreview(msg.content)"
-                                    @load="handleImageLoad"
-                                    alt="图片"
-                                />
+                                <img :src="msg.content + resize" @click="showImagePreview(msg.content)"
+                                    @load="handleImageLoad" alt="图片" />
                             </div>
 
                             <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'report'" class="dialog-message" @click="handleReportClick(msg)">
+                            <div v-if="msg.messageType === 'report'" class="dialog-message"
+                                @click="handleReportClick(msg)">
                                 <template v-if="(msg.reportType || msg.content.reportType) === 'farm_report'">
-                                    <div class="report-title">{{ msg.title ||msg.content.title }}</div>
-                                    <div class="dialog-title">这是{{curRole == 2 ? '该农场' : '我'}}的果园情况,请查看~</div>
-                                    <img src="https://birdseye-img.sysuimars.com/birdseye-look-mini/share-report-bg.png" alt="" class="monitor-image" />
+                                    <div class="report-title">{{ msg.title || msg.content.title }}</div>
+                                    <div class="dialog-title">这是{{ curRole == 2 ? '该农场' : '我' }}的果园情况,请查看~</div>
+                                    <img src="https://birdseye-img.sysuimars.com/birdseye-look-mini/share-report-bg.png"
+                                        alt="" class="monitor-image" />
                                 </template>
                                 <template v-else>
-                                    <div class="dialog-title">{{ msg.title || msg.content.title}}</div>
+                                    <div class="dialog-title">{{ msg.title || msg.content.title }}</div>
                                     <img src="@/assets/img/monitor/image.png" alt="" class="monitor-image" />
                                 </template>
                             </div>
 
-                             <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'question'" class="question-message" @click="handleCardClick(msg)">
-                                <div class="question-title">{{ msg.content }}</div>
+                            <!-- 对话样式消息 -->
+                            <div v-if="msg.messageType === 'card'" class="question-message">
+                                <div class="question-title">{{ msg.title || msg.content.title }}</div>
                                 <div class="image-wrap">
-                                    <img src="@/assets/img/monitor/image.png" alt="" />
-                                    <img src="@/assets/img/monitor/image.png" alt="" />
-                                    <img src="@/assets/img/monitor/image.png" alt="" />
+                                    <!-- coverUrl 为 JSON 字符串的数组时,解析后遍历 -->
+                                    <template
+                                        v-if="msg.content && msg.content.coverUrl && Array.isArray(msg.content.coverUrl)">
+                                        <img v-for="item in msg.content.coverUrl" :key="item" :src="handleImgUrl(item)"
+                                            alt="" />
+                                    </template>
+                                    <!-- 否则当作普通字符串 URL 使用 -->
+                                    <img v-else :src="handleImgUrl(msg.content.coverUrl)" alt="">
                                 </div>
                                 <div class="btn-detail" @click="handleDetailClick">查看详情</div>
                             </div>
@@ -58,54 +57,52 @@
 
                     <!-- 我方消息 -->
                     <template v-else>
-                        <div class="bubble" :class="{ 'no-bubble': msg.messageType === 'image','card-bubble': msg.messageType === 'card' || msg.messageType === 'report' }">
+                        <div class="bubble"
+                            :class="{ 'no-bubble': msg.messageType === 'image', 'card-bubble': msg.messageType === 'card' || msg.messageType === 'report' }">
                             <!-- 文本消息 -->
                             <div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
 
                             <!-- 图片消息 -->
                             <div v-if="msg.messageType === 'image'" class="image-message">
-                                <img
-                                    :src="msg.content + resize"
-                                    @click="showImagePreview(msg.content)"
-                                    @load="handleImageLoad"
-                                    alt="图片"
-                                />
+                                <img :src="msg.content + resize" @click="showImagePreview(msg.content)"
+                                    @load="handleImageLoad" alt="图片" />
                             </div>
 
                             <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'report'" class="dialog-message" @click="handleReportClick(msg)">
+                            <div v-if="msg.messageType === 'report'" class="dialog-message"
+                                @click="handleReportClick(msg)">
                                 <template v-if="(msg.reportType || msg.content.reportType) === 'farm_report'">
-                                    <div class="report-title">{{ msg.title ||msg.content.title }}</div>
-                                    <div class="dialog-title">这是{{curRole == 2 ? '该农场' : '我'}}果园情况,请查看~</div>
-                                    <img src="https://birdseye-img.sysuimars.com/birdseye-look-mini/share-report-bg.png" alt="" class="monitor-image" />
+                                    <div class="report-title">{{ msg.title || msg.content.title }}</div>
+                                    <div class="dialog-title">这是{{ curRole == 2 ? '该农场' : '我' }}果园情况,请查看~</div>
+                                    <img src="https://birdseye-img.sysuimars.com/birdseye-look-mini/share-report-bg.png"
+                                        alt="" class="monitor-image" />
                                 </template>
                                 <template v-else>
-                                    <div class="dialog-title">{{ msg.title || msg.content.title}}</div>
+                                    <div class="dialog-title">{{ msg.title || msg.content.title }}</div>
                                     <img src="@/assets/img/monitor/image.png" alt="" class="monitor-image" />
                                 </template>
                             </div>
 
                             <!-- 对话样式消息 -->
-                            <div v-if="msg.messageType === 'card'" class="card-message" @click="handleCardClick(msg)">
-                                <template v-if="(msg.cardType || msg.content.cardType) === 'quotation'">
-                                    <div class="card-title">向您发送了一张 服务报价单</div>
-                                    <img src="https://birdseye-img.sysuimars.com/temp/price.png" alt="" />
-                                </template>
-                                <template v-else>
-                                    <div class="card-title">{{ msg.title || msg.content.title }}</div>
-                                    <img :src="handleImgUrl(msg.coverUrl || msg.content.coverUrl)" alt="" />
-                                </template>
+                            <div v-if="msg.messageType === 'card'" class="question-message">
+                                <div class="question-title">{{ msg.title || msg.content.title }}</div>
+                                <div class="image-wrap">
+                                    <!-- coverUrl 为 JSON 字符串的数组时,解析后遍历 -->
+                                    <template
+                                        v-if="msg.content && msg.content.coverUrl && Array.isArray(msg.content.coverUrl)">
+                                        <img v-for="item in msg.content.coverUrl" :key="item" :src="handleImgUrl(item)"
+                                            alt="" />
+                                    </template>
+                                    <!-- 否则当作普通字符串 URL 使用 -->
+                                    <img v-else :src="handleImgUrl(msg.content.coverUrl)" alt="">
+                                </div>
+                                <div class="btn-detail" @click="handleDetailClick">查看详情</div>
                             </div>
                         </div>
                         <!-- <div class="avatar avatar-r">{{ msg.senderName.charAt(0) }}</div> -->
-                        <el-avatar
-                            class="avatar avatar-r"
-                            :size="40"
-                            :src="
-                                msg.senderIcon ||
-                                'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'
-                            "
-                        />
+                        <el-avatar class="avatar avatar-r" :size="40" :src="msg.senderIcon ||
+                            'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png'
+                            " />
                     </template>
                 </div>
             </div>
@@ -117,7 +114,7 @@
                     <input type="file" ref="fileInput" accept="image/*" style="display: none" @change="handleImageUpload" />
                 </div> -->
 
-                <input type="text" v-model="inputMessage" placeholder="给 专家 发送消息" @keyup.enter="sendTextMessage" />
+                <input type="text" v-model="inputMessage" placeholder="请输入你想说的话~" @keyup.enter="sendTextMessage" />
                 <div class="send" @click="sendTextMessage">发送</div>
             </div>
 
@@ -131,36 +128,23 @@
 
 <script setup>
 import { ref, nextTick, onDeactivated, onMounted } from "vue";
-import { useRouter ,useRoute} from "vue-router";
+import { useRouter, useRoute } from "vue-router";
 import { base_img_url2 } from "@/api/config";
 import { getFileExt } from "@/utils/util";
 import UploadFile from "@/utils/upliadFile";
 import MqttClient from "@/plugins/MqttClient";
 import customHeader from "@/components/customHeader.vue";
-
+import { useStore } from "vuex";
+const store = useStore();
 const resize = "?x-oss-process=image/resize,p_120/format,webp/quality,q_100";
 const router = useRouter();
 const route = useRoute();
 
-const props = defineProps({
-    text: {
-        type: String,
-        defalut: "",
-    },
-    img: {
-        type: String,
-        defalut: "",
-    },
-    userId: {
-        type: [String, Number],
-        defalut: "",
-    },
-});
 
 const curUserId = Number(localStorage.getItem("MINI_USER_ID"));
+const storeFarmId = ref(store.state.home.gardenId)
 const senderIcon = ref("");
 const receiverIcon = ref("");
-const receiverIdVal = ref(null);
 
 // 本地用户头像
 const localUserInfoIcon = (() => {
@@ -172,13 +156,56 @@ const localUserInfoIcon = (() => {
     }
 })();
 
-// 初始化本地头像为默认发送者头像
-senderIcon.value = localUserInfoIcon;
-
 // mqtt 连接
 const mqttClient = ref(null);
 const messagesContainer = ref(null);
 
+// 初始化 mqtt
+const initMqtt = () => {
+    const topics = [`user/chat/message/${storeFarmId.value}/${curUserId}`]; // 订阅的主题数组
+    mqttClient.value = new MqttClient(topics, (topic, message) => {
+        if (message && message.length > 10) {
+            const obj = JSON.parse(message);
+            console.log("message有值", obj);
+            if (obj.senderId === curUserId) {
+                return;
+            }
+            if (obj.senderId === Number(route.query.userId)) {
+                // 检查是否已存在相同 id 的消息,避免重复添加
+                if (obj.id && messages.value.some(msg => msg.id === obj.id)) {
+                    return;
+                }
+                if (obj.messageType === "image") {
+                    if (obj.image && (obj.image.url || obj.image.originUrl)) {
+                        obj.content = obj.image.url || obj.image.originUrl;
+                    } else if (obj.content) {
+                        try {
+                            const img = JSON.parse(obj.content);
+                            obj.content = img.url || img.originUrl;
+                        } catch (e) {
+                            console.error(e, "e");
+                        }
+                    }
+                } else if (obj.messageType !== 'text') {
+                    obj.content = JSON.parse(obj.content);
+                    // card 类型的 content 中,如果 coverUrl 是数组,则转成字符串(兼容旧格式)
+                    if (obj.messageType === 'card' && obj.content && Array.isArray(obj.content.coverUrl)) {
+                        obj.content.coverUrl = JSON.stringify(obj.content.coverUrl);
+                    }
+                }
+                obj.receiverId = curUserId;
+                (obj.sender = obj.senderId === curUserId ? "sent" : "received"), (obj.senderIcon = senderIcon.value);
+                obj.receiverIcon = receiverIcon.value;
+                messages.value.push(obj);
+
+                scrollToBottom();
+            }
+        }
+    });
+
+    mqttClient.value.connect();
+};
+
 // 消息数据
 const messages = ref([]);
 
@@ -191,14 +218,12 @@ function handleImageLoad() {
 }
 
 const handleDetailClick = () => {
-    router.push('/interaction_list');
+    router.push(`/interaction_list?expertMiniUserId=${route.query.userId}`);
 }
 
 // 图片预览
 const previewImage = ref(null);
 
-const userId = ref(null);
-
 const handleCardClick = (msg) => {
     router.push(msg.linkUrl || msg.content.linkUrl);
 }
@@ -252,11 +277,10 @@ const sendImageMessage = (thumbnailUrl) => {
 //类型 text ,file,image
 const sendMsg = (messageType = "text", content = "", obj = {}) => {
     const params = {
-        farmId: farmVal.value,
-        senderId: curUserId,
-        receiverId: userId.value,
+        farmId: storeFarmId.value,
+        receiverId: route.query.userId,
         content,
-        [messageType]:obj,
+        [messageType]: obj,
         messageType,
     };
     VE_API.bbs.sendMsg(params);
@@ -272,22 +296,22 @@ const sendMessage = (message) => {
     } else if (message.messageType === "report") {
         // 对话样式消息不发送到服务器,只显示在本地
         console.log("发送对话样式消息:", message);
-        if(message.reportType === 'farm_report'){
-            sendMsg('report','',{
+        if (message.reportType === 'farm_report') {
+            sendMsg('report', '', {
                 title: message.title,
                 reportId: message.reportId,
                 reportType: message.reportType,
             });
-        }else{
-            sendMsg('report','',{
+        } else {
+            sendMsg('report', '', {
                 title: message.title,
                 reportId: message.reportId,
                 reportType: message.reportType,
             });
             console.log('其他文件1');
         }
-    }else{
-        sendMsg('card','',{
+    } else {
+        sendMsg('card', '', {
             title: message.title,
             coverUrl: message.coverUrl,
             cardType: message.cardType,
@@ -322,40 +346,75 @@ const scrollToBottom = () => {
     });
 };
 
-const farmVal = ref("");
 const curRole = ref(null);
 
 // 点击农场报告对话框
 const handleReportClick = (msg) => {
-    if(msg.reportType === 'farm_report' || msg.messageType === 'report'){
+    if (msg.reportType === 'farm_report' || msg.messageType === 'report') {
         const params = {
             farmId: msg.reportId || msg.content?.reportId,
             showFilter: true,
         }
         router.push(`/farm_report?miniJson=${JSON.stringify(params)}`);
-    }else{
+    } else {
         console.log('其他文件');
     }
 }
 
+const handleBack = () => {
+    // router.go(-1);
+    router.replace(`/home`);
+}
+
 // 页面加载时自动添加欢迎消息
 onMounted(() => {
-    const welcomeMessage = {
-        sender: "received",
-        messageType: "text",
-        content: "您好,我叫冼继东。我是种植专家,介绍专家介绍专家",
-        receiverIcon: receiverIcon.value || 'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png',
-    };
-    const questionMessage = {
-        sender: "received",
-        messageType: "question",
-        content: "为了更方便分析农场问题,请先采集农情互动信息",
-        receiverIcon: receiverIcon.value || 'https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png',
-    };
-    messages.value.push(welcomeMessage,questionMessage);
+    createSession(route.query.userId);
     scrollToBottom();
 });
 
+//聊天会话
+const createSession = (targetUserId, callback) => {
+    VE_API.bbs.createSession({ farmId: storeFarmId.value, targetUserId }).then(({ data, code }) => {
+        if (code === 0) {
+            senderIcon.value = localUserInfoIcon;
+            receiverIcon.value = data.session.targetUserAvatar;
+            messages.value = data.messages.map((item) => {
+                let content = item.content;
+                if (item.messageType === "image") {
+                    // 优先读取后端的 image 字段,其次兼容旧的 content(JSON)
+                    if (item.image && (item.image.url || item.image.originUrl)) {
+                        content = item.image.url || item.image.originUrl;
+                    } else if (item.content) {
+                        try {
+                            const imgObj = JSON.parse(item.content);
+                            content = imgObj.url || imgObj.originUrl;
+                        } catch (e) {
+                            console.error(e, "e");
+                        }
+                    }
+                } else if (item.messageType !== 'text') {
+                    content = JSON.parse(item.content);
+                }
+                return {
+                    ...item,
+                    content,
+                    sender: item.senderId === curUserId ? "sent" : "received",
+                    senderIcon: item.senderId === curUserId ? localUserInfoIcon : data.session.targetUserAvatar,
+                    receiverIcon: data.session.targetUserAvatar,
+                };
+            });
+
+            setTimeout(() => {
+                scrollToBottom();
+            }, 300);
+            callback && callback();
+
+            // 初始化mqtt
+            initMqtt();
+        }
+    });
+};
+
 onDeactivated(() => {
     mqttClient.value && mqttClient.value.client.end(true);
 });
@@ -366,6 +425,7 @@ onDeactivated(() => {
     width: 100%;
     height: calc(100vh - 40px);
     box-sizing: border-box;
+
     .consult-content {
         width: 100%;
         height: 100%;
@@ -382,29 +442,44 @@ onDeactivated(() => {
     overflow-y: auto;
     background-color: #fff;
     box-sizing: border-box;
+
     .message {
         display: flex;
         margin-bottom: 15px;
     }
+
     .received {
         justify-content: flex-start;
+
         .bubble {
             background-color: #F4F5F8;
             border-radius: 0 10px 10px 10px;
             padding: 10px 12px;
             box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+
+            .content {
+                font-size: 16px;
+                color: #666666;
+            }
         }
     }
+
     .sent {
         justify-content: flex-end;
+
         .bubble {
             background-color: #07c160;
             border-radius: 10px 0 10px 10px;
             padding: 10px 15px;
-            color: #fff;
             box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+
+            .content {
+                font-size: 16px;
+                color: #000;
+            }
         }
     }
+
     .avatar {
         width: 40px;
         height: 40px;
@@ -421,15 +496,13 @@ onDeactivated(() => {
     .avatar-r {
         margin: 0 0 0 10px;
     }
+
     .bubble {
         max-width: 70%;
     }
 }
 
-.content {
-    font-size: 16px;
-    color: #666666;
-}
+
 
 .input-area {
     display: flex;
@@ -440,6 +513,7 @@ onDeactivated(() => {
     position: relative;
     width: 100%;
     box-sizing: border-box;
+
     input {
         flex: 1;
         padding: 10px;
@@ -447,6 +521,7 @@ onDeactivated(() => {
         border-radius: 20px;
         outline: none;
     }
+
     .send {
         margin-left: 10px;
         padding: 8px 20px;
@@ -464,7 +539,6 @@ onDeactivated(() => {
         max-width: 200px;
         max-height: 200px;
         border-radius: 8px;
-        cursor: pointer;
     }
 }
 
@@ -476,14 +550,12 @@ onDeactivated(() => {
     box-shadow: none !important;
     color: inherit !important;
 }
-.card-bubble{
-    background: #fff !important;
-}
 
 /* 工具栏样式 */
 .toolbar {
     display: flex;
     align-items: center;
+
     button {
         background: none;
         border: none;
@@ -492,6 +564,7 @@ onDeactivated(() => {
         cursor: pointer;
         padding: 5px;
     }
+
     .link {
         font-size: 24px;
         margin-right: 10px;
@@ -523,6 +596,7 @@ onDeactivated(() => {
     max-width: 100%;
     background: #fff !important;
     border-radius: 10px;
+
     .report-title {
         font-size: 16px;
         font-weight: 600;
@@ -535,6 +609,7 @@ onDeactivated(() => {
         color: rgba(0, 0, 0, 0.6);
         margin-bottom: 10px;
     }
+
     .monitor-image {
         width: 222px;
         height: 180px;
@@ -543,6 +618,7 @@ onDeactivated(() => {
 
     .farm-report-content,
     .farm-work-content {
+
         .report-details,
         .work-details {
             background: #f8f9fa;
@@ -573,25 +649,27 @@ onDeactivated(() => {
     }
 }
 
-.question-message{
-    .question-title{
+.question-message {
+    .question-title {
         font-size: 16px;
         color: #666666;
         margin-bottom: 6px;
     }
-    .image-wrap{
+
+    .image-wrap {
         display: flex;
         // flex-wrap: wrap;
         gap: 10px;
-        img{
-            flex: 1;
+
+        img {
             width: 75px;
             height: 70px;
             border-radius: 8px;
             object-fit: cover;
         }
     }
-    .btn-detail{
+
+    .btn-detail {
         font-size: 14px;
         margin-top: 8px;
         background: #FFFFFF;

+ 32 - 12
src/views/old_mini/create_farm/index.vue

@@ -86,7 +86,7 @@
                                             </el-select>
                                         </div>
                                     </el-form-item>
-                                    <el-form-item label="联系人" prop="fzr">
+                                    <el-form-item v-if="paramsType !== 'farmer'" label="联系人" prop="fzr">
                                         <div class="area-box">
                                             <el-input
                                                 placeholder="请输入联系人姓名"
@@ -96,7 +96,7 @@
                                             />
                                         </div>
                                     </el-form-item>
-                                    <el-form-item label="联系电话" prop="tel">
+                                    <el-form-item v-if="paramsType !== 'farmer'" label="联系电话" prop="tel">
                                         <div class="area-box">
                                             <el-input
                                                 placeholder="请输入联系人电话"
@@ -123,7 +123,12 @@
                                             <div class="unit">亩</div>
                                         </div>
                                     </el-form-item>
-                                    <el-form-item label="客户类型" prop="userType" class="select-wrap client-wrap">
+                                    <el-form-item
+                                        v-if="paramsType !== 'farmer'"
+                                        label="客户类型"
+                                        prop="userType"
+                                        class="select-wrap client-wrap"
+                                    >
                                         <el-select class="select-item" v-model="ruleForm.userType" placeholder="请选择">
                                             <el-option label="普通用户" :value="1" />
                                             <el-option label="托管用户" :value="2" />
@@ -587,6 +592,17 @@ const submitForm = (formEl) => {
                 return;
             }
 
+            if(route.query.type === "farmer") {
+                VE_API.farm.saveFarm({...params, expertMiniUserId: route.query.expertMiniUserId}).then((res) => {
+                    if (res.code === 0) {
+                        router.go(-1);
+                    } else {
+                        ElMessage.error(res.msg || '创建失败');
+                    }
+                });
+                return;
+            }
+
             const apiCall = route.query.type === "edit" ? VE_API.farm.updateFarm(params) : VE_API.farm.saveFarm(params);
 
             apiCall.then((res) => {
@@ -740,14 +756,14 @@ function getSpecieList() {
 }
 
 async function changeSpecie(v) {
-    const data = await checkExistsEnabledScheme(v.defaultContainerId);
-    if (!data) {
-        ElMessage.warning("该品类暂无可用方案,请选择其他品类");
-        ruleForm.speciesItem = "";
-        ruleForm.typeId = "";
-        fruitsList.value = [];
-        return;
-    }
+    // const data = await checkExistsEnabledScheme(v.defaultContainerId);
+    // if (!data) {
+    //     ElMessage.warning("该品类暂无可用方案,请选择其他品类");
+    //     ruleForm.speciesItem = "";
+    //     ruleForm.typeId = "";
+    //     fruitsList.value = [];
+    //     return;
+    // }
     getFruitsTypeItemList(v.id);
     // 清空品种选择
     ruleForm.typeId = "";
@@ -804,7 +820,11 @@ function backgToHome() {
         }
     } else {
         if (fromPage && fromPage !== "details") {
-            router.replace(`/${fromPage}`);
+            if(route.query.type === "farmer") {
+                router.go(-1);
+            } else {
+                router.replace(`/${fromPage}`);
+            }
             return;
         } else {
             router.go(-1);

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

@@ -291,7 +291,7 @@ const handleMaskClick = () => {
 };
 
 const handleExpertBannerClick = () => {
-    router.push("/consult");
+    router.push("/consult?userId=81881");
 };
 
 const handleBannerClick = () => {

+ 43 - 15
src/views/old_mini/interactionList/index.vue

@@ -1,18 +1,16 @@
 <template>
-    <custom-header name="农情互动" bgColor="#f2f4f5"></custom-header>
+    <custom-header name="农情互动" bgColor="#f2f4f5" @goback="handleBack"></custom-header>
     <div class="interaction-list">
         <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
-            <div
-                class="list-item"
-                v-for="(item, index) in listData"
-                :key="item.id || index"
-                :class="{ 'uploaded-item': item.upload }"
-            >
+            <div class="list-item" v-for="(item, index) in listData" :key="item.id || index"
+                :class="{ 'uploaded-item': item.upload }">
                 <!-- 标题区域 -->
                 <div class="item-header-wrapper" :class="{ 'has-status': item.upload }">
                     <div class="item-header">长势采集: 物候进程</div>
                     <div class="upload-status" v-show="item.upload">
-                        <el-icon class="status-icon"><SuccessFilled /></el-icon>
+                        <el-icon class="status-icon">
+                            <SuccessFilled />
+                        </el-icon>
                         <span class="status-text">上传成功</span>
                     </div>
                 </div>
@@ -59,7 +57,9 @@
                     <span class="proportion-text">当前果园达到物候期的比例: {{ item.proportion || "10%" }}</span>
                     <div class="toggle-btn" @click="toggleExpand(item)">
                         <span>{{ item.expanded ? "收起" : "展开" }}</span>
-                        <el-icon :class="{ rotate: !item.expanded }"><CaretTop /></el-icon>
+                        <el-icon :class="{ rotate: !item.expanded }">
+                            <CaretTop />
+                        </el-icon>
                     </div>
                 </div>
             </div>
@@ -68,21 +68,24 @@
         </van-list>
     </div>
     <!-- 农场信息完善弹窗 -->
-    <farm-info-popup v-model:show="showFarmInfoPopup" @confirm="handleFarmInfoConfirm" />
+    <tip-popup v-model:show="showTipPopup" type="warning" text="暂无农场,请先创建农场" buttonText="去创建"
+        @confirm="handleTipConfirm" />
 </template>
 <script setup>
 import { ref, onMounted } from "vue";
 import { List as VanList } from "vant";
 import { ElMessage } from "element-plus";
 import customHeader from "@/components/customHeader.vue";
-import FarmInfoPopup from "@/components/popup/farmInfoPopup.vue";
 import upload from "@/components/upload.vue";
+import TipPopup from "@/components/popup/tipPopup.vue";
+import { useRouter, useRoute } from "vue-router";
 
-const showFarmInfoPopup = ref(false);
+const showTipPopup = ref(false);
 const loading = ref(false);
+const router = useRouter();
 const finished = ref(false);
 const listData = ref([]);
-
+const query = ref(useRoute().query);
 // 模拟数据,实际应该从接口获取
 const mockData = [
     { id: 1, proportion: "", expanded: false },
@@ -90,6 +93,13 @@ const mockData = [
     { id: 3, proportion: "10%", upload: true, expanded: false },
 ];
 
+const handleBack = () => {
+    console.log(query.value);
+    // router.go(-1);
+    router.push(`/consult?expertMiniUserId=${query.value.expertMiniUserId}`);
+    // router.push(`/consult?userId=81881`);
+}
+
 // 加载数据
 const onLoad = () => {
     loading.value = true;
@@ -112,6 +122,10 @@ const handleNotReached = (item) => {
     // 这里可以处理业务逻辑
 };
 
+const handleTipConfirm = () => {
+    router.push("/create_farm?type=farmer&from=interaction_list&expertMiniUserId=81881");
+}
+
 // 确认上传
 const handleConfirm = (item) => {
     if (!item.proportion) {
@@ -139,7 +153,16 @@ const handleFarmInfoConfirm = (data) => {
 
 onMounted(() => {
     // 初始化加载
+    getFarmList();
 });
+
+const getFarmList = async () => {
+    const { data } = await VE_API.farm.userFarmSelectOption();
+    if(data && data.length === 0) {
+        showTipPopup.value = true;
+    }
+    showTipPopup.value = true;
+}
 </script>
 <style scoped lang="scss">
 .interaction-list {
@@ -187,6 +210,7 @@ onMounted(() => {
                 display: flex;
                 justify-content: space-between;
                 align-items: center;
+
                 .item-header {
                     color: #2199f8;
                     background: rgba(33, 153, 248, 0.1);
@@ -271,13 +295,15 @@ onMounted(() => {
                 font-size: 12px;
                 border-radius: 25px;
                 background: #FFFFFF;
+
                 .rotate {
                     transform: rotate(180deg);
                 }
             }
         }
     }
-    .list-item + .list-item {
+
+    .list-item+.list-item {
         margin-top: 12px;
     }
 
@@ -292,11 +318,13 @@ onMounted(() => {
         display: flex;
         justify-content: center;
         align-items: center;
+
         .example {
             width: 80px;
             height: 80px;
         }
-        .example + .example {
+
+        .example+.example {
             margin-left: 12px;
         }
     }