lxf пре 2 недеља
родитељ
комит
abcb27bcfe

+ 1 - 1
src/views/old_mini/agri_record/components/mapInfo.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="map-info">
-        <div class="popup-title" v-if="showTitle">执行区域</div>
+        <!-- <div class="popup-title" v-if="showTitle">执行区域</div> -->
         <div class="map-box">
             <div class="map" ref="mapContainer"></div>
         </div>

+ 367 - 21
src/views/old_mini/agri_record/subPages/statusDetail.vue

@@ -8,7 +8,9 @@
                 <div class="status-left">
                     <div class="status-text">
                         <div class="status-icon">
-                            <el-icon :size="24" color="#fff"><Warning /></el-icon>
+                            <el-icon :size="24" color="#fff">
+                                <Warning />
+                            </el-icon>
                         </div>
                         <span v-show="status === 0">未执行</span>
                         <span v-show="status === 1">等待执行</span>
@@ -45,9 +47,62 @@
                     </div>
 
                     <div class="card-actions">
-                        <div class="action-btn" @click="handleViewPrescription">查看药物处方</div>
-                        <div class="action-btn" @click="handleViewArea">查看执行区域</div>
+                        <div class="action-btn" @click="handleViewPrescription">
+                            {{ showPrescription ? '收起药物处方' : '查看药物处方' }}
+                        </div>
+                        <div class="action-btn" @click="handleViewArea">
+                            {{ showMapArea ? '收起执行区域' : '查看执行区域' }}
+                        </div>
                     </div>
+
+                    <transition name="prescription-slide">
+                        <div class="new-wrap"
+                            v-show="showPrescription && detailData?.prescriptionList?.length && detailData?.prescriptionList[0]?.pesticideFertilizerList?.length > 0">
+                            <div class="new-title">
+                                <div class="title-1">
+                                    <div class="table-name">药肥类型</div>
+                                </div>
+                                <div class="title-2">
+                                    <div class="table-name">药肥名称</div>
+                                </div>
+                                <div class="title-4">
+                                    <div class="table-name">药肥配比</div>
+                                </div>
+                                <div class="title-5">
+                                    <div class="table-name">单亩用量</div>
+                                </div>
+                            </div>
+                            <div class="new-table-wrap"
+                                v-for="(prescriptionItem, prescriptionI) in detailData?.prescriptionList"
+                                :key="prescriptionI">
+                                <div class="new-prescription"
+                                    v-for="(subP, subI) in prescriptionItem.pesticideFertilizerList" :key="subI">
+                                    <div class="new-table">
+                                        <div class="line-l">
+                                            <div class="line-1 title-1">{{ subP.typeName }}</div>
+                                            <div class="line-2">{{ subP.defaultName || subP.pesticideFertilizerName }}
+                                            </div>
+                                        </div>
+                                        <div class="line-r">
+                                            <div class="line-3">
+                                                <div class="sub-line title-4">{{ quotationData.executionMethod === 1 ?
+                                                    subP.ratio2 : subP.ratio }}倍</div>
+                                                <div class="sub-line title-5">{{ quotationData.executionMethod === 1 ?
+                                                    subP.muUsage2 : subP.muUsage }}{{ subP.unit }}</div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    <div class="note-text" v-if="subP.remark">{{ subP.remark }}</div>
+                                </div>
+                            </div>
+                        </div>
+                    </transition>
+
+                    <transition name="prescription-slide">
+                        <div v-if="showMapArea" class="map-info-wrap">
+                            <map-info :key="`map-${farmId}`" :farm-id="farmId" />
+                        </div>
+                    </transition>
                 </div>
 
                 <div class="card-box action-video">
@@ -58,15 +113,9 @@
                         <div class="forward-link" @click="handleForward">转发操作指南</div>
                     </div>
                     <div class="video-wrap">
-                        <video
-                            src="https://birdseye-img-ali-cdn.sysuimars.com/bbs_post/video/1767872309467.mp4"
-                            controls
-                            style="width: 100%; max-width: 100%; height: auto; border-radius: 8px"
-                            preload="metadata"
-                            playsinline
-                            webkit-playsinline
-                            x5-playsinline
-                        ></video>
+                        <video src="https://birdseye-img-ali-cdn.sysuimars.com/bbs_post/video/1767872309467.mp4"
+                            controls style="width: 100%; max-width: 100%; height: auto; border-radius: 8px"
+                            preload="metadata" playsinline webkit-playsinline x5-playsinline></video>
                     </div>
                 </div>
 
@@ -125,9 +174,9 @@
         </popup>
 
         <!-- 执行区域地图弹窗 -->
-        <popup v-model:show="showMapPopup" closeable class="map-popup">
+        <!-- <popup v-model:show="showMapPopup" closeable class="map-popup">
             <map-info :farm-id="farmId" />
-        </popup>
+        </popup> -->
 
         <!-- 处方卡片 -->
         <detail-dialog ref="detailDialogRef" />
@@ -136,7 +185,9 @@
         <popup v-model:show="showExamplePopup" overlay-class="example-overlay" class="example-popup">
             <div class="example-content">
                 <!-- <img src="@/assets/img/home/example-4.png" alt="" /> -->
-                <img class="example-img" src="https://birdseye-img-ali-cdn.sysuimars.com/birdseye-look-mini/94379/1768801082504.png" alt="" />
+                <img class="example-img"
+                    src="https://birdseye-img-ali-cdn.sysuimars.com/birdseye-look-mini/94379/1768801082504.png"
+                    alt="" />
                 <div class="example-tips">
                     拍摄要求:请采集代表农场作物物候期的照片,请采集代表农场作物物候期的照片。
                 </div>
@@ -202,19 +253,154 @@ const handleForward = async () => {
 };
 
 const detailDialogRef = ref(null);
+// 控制处方列表展开/收起
+const showPrescription = ref(false);
+
 const handleViewPrescription = () => {
-    // 查看药物处方
-    detailDialogRef.value.showDialog('801074109092990976', "", false);
+    // 收起执行区域地图
+    showMapArea.value = false;
+    // 切换处方列表展开/收起状态
+    showPrescription.value = !showPrescription.value;
 };
 
-// 执行区域地图
-const showMapPopup = ref(false);
+// 控制执行区域地图展开/收起
+const showMapArea = ref(false);
+
+const detailData = ref(
+    {
+        "consequenceText": "",
+        "id": "280962",
+        "reCheckText": "",
+        "orderId": "801082980008202240",
+        "farmWorkArrangeId": "11272",
+        "farmName": "荔枝博览园",
+        "farmPoint": "POINT(113.61702297075017 23.584863449735067)",
+        "area": 300,
+        "expert": "739294587868155904",
+        "orderStatus": 0,
+        "activeStatus": null,
+        "flowStatus": 5,
+        "farmId": 766,
+        "regionId": null,
+        "farmMiniUserId": 90739,
+        "farmMiniUserName": "",
+        "speciesId": "1",
+        "speciesName": "荔枝",
+        "agriculturalId": 214,
+        "agriculturalIcon": "",
+        "farmWorkId": "801074109092990976",
+        "farmWorkLibId": "801074109092990976",
+        "farmWorkLibName": "冬季防治(地面)",
+        "farmWorkName": "冬季防治(地面)",
+        "expertName": "飞鸟种植助手",
+        "expertUserName": "飞鸟种植助手",
+        "expertIcon": "https://birdseye-img-ali-cdn.sysuimars.com//expert/1757473957076.png",
+        "expertUserIcon": "https://birdseye-img-ali-cdn.sysuimars.com//expert/1757473957076.png",
+        "icon": null,
+        "indexName": "",
+        "indexChart": [],
+        "executeDate": "2026-01-19",
+        "executeDeadlineDate": "2026-01-19",
+        "expectedExecuteDate": "2026-01-19",
+        "finishDate": null,
+        "checkDate": null,
+        "beforeExecuteDate": null,
+        "indexJson": "",
+        "expertPrescription": "",
+        "code": "801074109080408065",
+        "condition": "",
+        "solarName": "",
+        "reCheck": 1,
+        "menu": 1,
+        "num": null,
+        "purpose": "",
+        "type": 1,
+        "farmWorkType": 3,
+        "farmWorkTypeName": "病虫",
+        "execute": 3,
+        "updateDate0": "2026-01-19",
+        "updateDate1": null,
+        "updateDate2": null,
+        "updateDate3": null,
+        "updateDate4": null,
+        "updateDate5": null,
+        "updateDate6": null,
+        "confirmPicture": [],
+        "executeEvidence": [
+            "birdseye-look-mini/94379/1768801082504.png",
+            "birdseye-look-mini/94379/1768801086136.png"
+        ],
+        "reviewImage": [],
+        "reviewImage2": [],
+        "reviewDate": null,
+        "reviewDate2": null,
+        "serviceRegion": "广州市从化区荔枝博览园",
+        "usageMode": "地面喷施",
+        "serviceMain": "数域行",
+        "executeMain": "数域行",
+        "storeShortName": "",
+        "weatherWarningMsg": "",
+        "userEvaluation": null,
+        "executeBlueZones": [],
+        "isMaster": null,
+        "isEdit": 0,
+        "selfExec": null,
+        "defaultFarmWork": 1,
+        "isPublic": 0,
+        "prescriptionList": [
+            {
+                "name": "病虫",
+                "pesticideFertilizerList": [
+                    {
+                        "defaultName": "",
+                        "id": null,
+                        "muPrice": 1,
+                        "muUsage": 20,
+                        "muUsage2": 20,
+                        "price": "",
+                        "ratio": 1000,
+                        "ratio2": 100,
+                        "remark": "",
+                        "usageMode": "",
+                        "usageModeList": [
+                            "叶面施"
+                        ],
+                        "pesticideFertilizerCode": "1522",
+                        "pesticideFertilizerId": "776945747475042304",
+                        "pesticideFertilizerName": "5%高氯·甲维盐微乳剂",
+                        "brand": "默认品牌",
+                        "typeName": "胃毒性",
+                        "unit": "ml"
+                    }
+                ]
+            }
+        ],
+        "needReview": 0,
+        "conditionList": [],
+        "actualAgriculturalInput": null,
+        "actualFarmServiceInput": null,
+        "actualTotalInput": 996,
+        "executeName": "张扬",
+        "executorIcon": "https://birdseye-img.sysuimars.com/dinggou-mini/defalut-icon.png",
+        "executorUserId": 94379
+    }
+);
+
+
+const quotationData = ref(
+    {
+        "executionMethodName": "地面喷施",
+        "executionMethod": 1,
+    }
+);
 // TODO: 根据实际数据来源设置 farmId,比如从接口详情或路由参数中获取
 const farmId = ref(94500);
 
 const handleViewArea = () => {
-    // 查看执行区域:弹出地图信息
-    showMapPopup.value = true;
+    // 收起药物处方
+    showPrescription.value = false;
+    // 切换执行区域地图展开/收起状态
+    showMapArea.value = !showMapArea.value;
 };
 
 const showExamplePopup = ref(false);
@@ -247,6 +433,7 @@ const handleShowQrCodePopup = (type) => {
     height: 100vh;
     width: 100%;
     background: #f2f3f5;
+
     .detail-content {
         height: calc(100% - 44px);
         overflow: auto;
@@ -280,11 +467,13 @@ const handleShowQrCodePopup = (type) => {
             background: #ff6666;
         }
     }
+
     &.status-1 {
         &::after {
             background: #ff953d;
         }
     }
+
     &.status-2 {
         &::after {
             background: #2199f8;
@@ -359,9 +548,11 @@ const handleShowQrCodePopup = (type) => {
 .card-wrap {
     padding: 0 12px;
 }
+
 .content-card {
     position: relative;
     z-index: 2;
+    transition: all 0.3s ease;
 
     .card-info {
         padding-top: 12px;
@@ -404,9 +595,119 @@ const handleShowQrCodePopup = (type) => {
     }
 }
 
+.new-wrap {
+    margin-top: 12px;
+    border-radius: 5px;
+    text-align: center;
+    border: 1px solid rgba(225, 225, 225, 0.5);
+
+    .new-title {
+        background: rgba(241, 241, 241, 0.4);
+        border-radius: 5px 5px 0 0;
+        border-bottom: 1px solid rgba(225, 225, 225, 0.5);
+        display: flex;
+        color: #767676;
+        // justify-content: space-around;
+        padding: 5px 6px;
+        font-size: 12px;
+
+        .table-name {
+            width: 24px;
+            font-size: 12px;
+            margin: 0 auto;
+        }
+    }
+
+    .title-1 {
+        width: 46px;
+    }
+
+    .title-2 {
+        flex: 1;
+    }
+
+    .title-3 {
+        width: 52px;
+    }
+
+    .title-4 {
+        width: 56px;
+    }
+
+    .title-5 {
+        width: 52px;
+    }
+
+    .new-table-wrap {
+        .new-prescription {
+            .new-table {
+                height: 45px;
+                display: flex;
+                align-items: center;
+                background: #fff;
+                border-radius: 5px;
+                color: rgba(0, 0, 0, 0.6);
+                font-size: 11px;
+
+                .line-l {
+                    display: flex;
+                    flex: 1;
+
+                    .line-2 {
+                        flex: 1;
+                        padding: 0 2px;
+                    }
+                }
+
+                .line-r {
+                    &.has-border {
+                        border-left: 1px solid rgba(225, 225, 225, 0.8);
+                    }
+
+                    .line-3 {
+                        display: flex;
+                        align-items: center;
+                    }
+
+                    .sub-line {
+                        padding: 10px 0;
+                    }
+
+                    .line-4 {
+                        display: flex;
+                        align-items: center;
+                        border-top: 1px solid rgba(225, 225, 225, 0.8);
+                    }
+
+                    .execute-line {
+                        border-right: 1px solid rgba(225, 225, 225, 0.8);
+                    }
+                }
+            }
+
+            .note-text {
+                margin: 8px 0 4px 0;
+                color: rgba(0, 0, 0, 0.4);
+                background: #fff;
+                padding: 6px 8px;
+                border-radius: 5px;
+                text-align: left;
+                font-size: 11px;
+            }
+        }
+
+        .new-prescription+.new-prescription {
+            .new-table {
+                border-top: 1px solid rgba(0, 0, 0, 0.08);
+            }
+        }
+    }
+}
+
 .action-video {
     margin-top: 10px;
     padding: 10px;
+
     .video-wrap {
         padding-top: 4px;
     }
@@ -436,6 +737,10 @@ const handleShowQrCodePopup = (type) => {
         text-align: center;
         padding: 16px 0 6px 0;
     }
+
+}
+.map-info-wrap {
+    padding-top: 12px;
 }
 
 .code-popup {
@@ -444,18 +749,22 @@ const handleShowQrCodePopup = (type) => {
     padding: 36px 10px 20px 10px;
     box-sizing: border-box;
     background: linear-gradient(360deg, #ffffff 74.2%, #d1ebff 100%);
+
     ::v-deep {
         .van-popup__close-icon {
             color: #333333;
         }
     }
+
     .code-popup-wrap {
         display: flex;
         align-items: center;
         justify-content: center;
         flex-direction: column;
+
         .text-wrap {
             padding: 8px 0 36px 0;
+
             .qr-code-text {
                 font-size: 14px;
                 line-height: 22px;
@@ -463,11 +772,13 @@ const handleShowQrCodePopup = (type) => {
                 text-align: center;
             }
         }
+
         .code-tips {
             color: #666666;
             font-size: 14px;
         }
     }
+
     .qr-code-content {
         .qr-code-img {
             width: 197px;
@@ -489,12 +800,15 @@ const handleShowQrCodePopup = (type) => {
     border-radius: 0;
     background: none;
     max-width: 100%;
+
     .example-content {
         text-align: center;
+
         .example-img {
             width: 100%;
         }
     }
+
     .example-tips {
         margin: 16px 12px 6px 12px;
         background: #3d3d3d;
@@ -507,8 +821,40 @@ const handleShowQrCodePopup = (type) => {
         text-align: left;
     }
 }
+
 .example-overlay {
     background: rgba(0, 0, 0, 0.6);
     backdrop-filter: blur(8px);
 }
+
+// 处方列表展开/收起过渡动画
+.prescription-slide-enter-active,
+.prescription-slide-leave-active {
+    transition: all 0.2s ease;
+    overflow: hidden;
+}
+
+.prescription-slide-enter-from {
+    // opacity: 0;
+    max-height: 0;
+    margin-top: 0;
+}
+
+.prescription-slide-enter-to {
+    // opacity: 1;
+    max-height: 1000px;
+    margin-top: 12px;
+}
+
+.prescription-slide-leave-from {
+    opacity: 1;
+    max-height: 1000px;
+    margin-top: 12px;
+}
+
+.prescription-slide-leave-to {
+    opacity: 0;
+    max-height: 0;
+    margin-top: 0;
+}
 </style>

+ 20 - 20
src/views/old_mini/home/components/knowledgeCard.vue

@@ -30,15 +30,16 @@
                         <div class="expert-name">
                             <el-avatar :size="22" :src="item.icon" />
                             {{ item.name || '专家' }}
+                            <span class="expert-text">发表了回复,点击查看</span>
                         </div>
                         <div class="date">{{ formatDate(item.createTime) }}</div>
                     </div>
-                    <div class="focus-answer">
+                    <!-- <div class="focus-answer">
                         <div class="answer-icon">
                         </div>
                         {{ item.summary }}
-                    </div>
+                    </div> -->
                 </div>
             </div>
             <div class="no-data" v-if="knowledgeList.length === 0">暂无数据</div>
@@ -129,23 +130,14 @@ const formatDate = (dateString) => {
 const getKnowledgeList = async () => {
     try {
         let data = [];
-
-        if (activeKnowledgeId.value === 6) {
-            // 种植知识库:使用新接口
-            const { data: result } = await VE_API.user.listWithAnswer({
-                farmId: store.state.home.gardenId,
-            });
-            data = result || [];
-        } else {
-            // 实战知识库:使用原接口
-            const params = {
-                page: 1,
-                limit: 10,
-                topicId: activeKnowledgeId.value,
-            };
-            const { data: result } = await VE_API.home.warningPageList(params);
-            data = result || [];
-        }
+        // 实战知识库:使用原接口
+        const params = {
+            page: 1,
+            limit: 10,
+            topicId: activeKnowledgeId.value,
+        };
+        const { data: result } = await VE_API.home.warningPageList(params);
+        data = result || [];
 
         knowledgeList.value = data;
         // 按当前 topicId 缓存,后续切换直接读取
@@ -247,16 +239,24 @@ const getKnowledgeList = async () => {
                     padding: 8px 0;
                 }
                 .focus-expert {
-                    padding-bottom: 8px;
+                    padding: 0 5px;
+                    margin-bottom: 5px;
                     display: flex;
                     align-items: center;
                     justify-content: space-between;
                     font-size: 12px;
                     color: #666666;
+                    height: 32px;
+                    border-radius: 5px;
+                    background: rgba(33, 153, 248, 0.05);
                     .expert-name {
                         display: flex;
                         align-items: center;
                         gap: 6px;
+                        .expert-text {
+                            padding-left: 2px;
+                            color: #2199F8;
+                        }
                     }
                 }
                 .focus-answer {

+ 52 - 1
src/views/old_mini/home/subPages/warningDetail.vue

@@ -4,7 +4,10 @@
         <div class="article-content" :class="{ 'is-link': isLink }">
             <div class="article-header">
                 <div class="title">{{ warningDetail.title }}</div>
-                <div class="author-info">
+                <div class="author-info" v-if="warningDetail.source">
+                    <span class="source-name">{{ warningDetail.source }}</span>
+                </div>
+                <div class="author-info" v-else>
                     <el-avatar :size="16" :src="warningDetail.icon" />
                     <span class="author-name">{{ warningDetail.name }}</span>
                     <span class="qa-date">{{
@@ -41,6 +44,17 @@
                 </div>
             </div> -->
 
+            <div class="article-summary" v-if="warningDetail.summary">
+                <div class="summary-writer">
+                    <el-avatar :size="36" :src="warningDetail.icon" />
+                    <div class="writer-info">
+                        <span class="writer-name">{{ warningDetail.name }}</span>
+                        <div class="belong-enterprise">{{ warningDetail.belongEnterprise }}</div>
+                    </div>
+                </div>
+                {{ warningDetail.summary }}
+            </div>
+
             <div class="article-text">
                 <span v-html="processedContent"></span>
             </div>
@@ -374,6 +388,11 @@ const handleEditQuestion = () => {
                     color: #666;
                     font-weight: normal;
                 }
+
+                .source-name {
+                    font-size: 12px;
+                    color: #666;
+                }
             }
         }
 
@@ -388,6 +407,38 @@ const handleEditQuestion = () => {
                 object-fit: cover;
             }
         }
+        .article-summary {
+            padding: 10px;
+            margin: 12px 0;
+            border: 1px solid rgba(33, 153, 248, 0.1);
+            background: rgba(33, 153, 248, 0.05);
+            border-radius: 8px;
+            font-size: 14px;
+            line-height: 22px;
+            color: #333;
+            white-space: pre-line;
+        }
+        .summary-writer {
+            display: flex;
+            align-items: center;
+            gap: 12px;
+            padding-bottom: 8px;
+            .writer-info {
+                display: flex;
+                flex-direction: column;
+                .writer-name {
+                    font-size: 14px;
+                    color: #000;
+                    font-weight: 500;
+                    line-height: 21px;
+                }
+                .belong-enterprise {
+                    font-size: 12px;
+                    color: #666;
+                    line-height: 15px;
+                }
+            }
+        }
         .article-text {
             ::v-deep {
                 img {