Quellcode durchsuchen

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

wangsisi vor 2 Tagen
Ursprung
Commit
c2289efbb0

+ 8 - 1
src/common/commonFun.js

@@ -91,6 +91,13 @@ function throttle(func, wait) {
     };
 }
 
+// 处理亩数
+function formatArea(val) {
+    const num = typeof val === 'number' ? val : parseFloat(val);
+    if (Number.isNaN(num)) return val;
+    return Number.isInteger(num) ? num : num.toFixed(2);
+}
+
 // 下载图片的函数
 async function downloadImage(downDom) {
     if (downDom) {
@@ -175,4 +182,4 @@ function convertImage(imgUrl) {
     });
 }
 
-export { deepClone, extractCoordinates, throttle, downloadImage, convertImage, detectRuntimeEnvironment };
+export { deepClone, extractCoordinates, throttle, downloadImage, convertImage, detectRuntimeEnvironment, formatArea };

+ 18 - 1
src/components/popup/priceSheetPopup.vue

@@ -127,7 +127,7 @@
 
 <script setup>
 import { Popup } from "vant";
-import { ref, computed, onActivated } from "vue";
+import { ref, computed, onActivated, watch } from "vue";
 import { useRouter } from "vue-router";
 import { ElMessage } from "element-plus";
 import wx from "weixin-js-sdk";
@@ -221,6 +221,10 @@ function fetchPriceData() {
 }
 
 const handleShare = () => {
+    if (!priceData.value.itemsList || priceData.value.itemsList.length === 0) {
+        ElMessage.warning('暂无报价数据,无法分享')
+        return;
+    }
     const userId = quotationData.value.users[0]?.userId;
     const parmasPage = {
         farmWorkOrderId:quotationData.value.orderId,
@@ -328,6 +332,19 @@ const handleEdit = () => {
     });
 };
 
+// 清空数据
+const clearData = () => {
+    quotationData.value = {};
+    priceData.value = {};
+};
+
+// 监听弹窗关闭,清空数据
+watch(showPopup, (newVal) => {
+    if (!newVal) {
+        clearData();
+    }
+});
+
 const handleCancel = () => {
     showPopup.value = false;
 };

+ 10 - 11
src/components/taskItem.vue

@@ -59,7 +59,7 @@
                         <div class="farm-addr">{{ itemData?.address }}</div>
                     </div>
                 </div>
-                <div class="right-wrap">特别关注</div>
+                <!-- <div class="right-wrap">特别关注</div> -->
             </div>
             <slot name="footer"></slot>
         </div>
@@ -81,17 +81,17 @@
                     <div class="review-image-item" v-if="triggerImg.length">
                         <div class="review-image-item-title">农事前</div>
                         <photo-provider :photo-closable="true">
-                                <photo-consumer v-for="src in [triggerImg[triggerImg.length - 1].cloudFilename]" intro="执行照片" :key="src" :src="base_img_url2 + src">
+                                <photo-consumer v-for="src in [triggerImg[triggerImg.length - 1].cloudFilename]" intro="农事前照片" :key="src" :src="base_img_url2 + src">
                                     <div class="img-item">
                                         <img :src="base_img_url2 + src" class="view-box">
                                     </div>
                                 </photo-consumer>
                         </photo-provider>
                     </div>
-                    <div class="review-image-item" v-if="detailItem?.executeEvidence?.length">
+                    <div class="review-image-item" v-if="detailItem?.reviewImage?.length">
                         <div class="review-image-item-title">农事后</div>
                         <photo-provider :photo-closable="true">
-                                <photo-consumer v-for="src in [detailItem.executeEvidence[detailItem.executeEvidence.length - 1]]" intro="执行照片" :key="src" :src="base_img_url2 + src">
+                                <photo-consumer v-for="src in [detailItem.reviewImage[detailItem.reviewImage.length - 1]]" intro="农事后照片" :key="src" :src="base_img_url2 + src">
                                     <div class="img-item">
                                         <img :src="base_img_url2 + src" class="view-box">
                                     </div>
@@ -125,10 +125,10 @@
                     来自<span class="name-text">{{ itemData.farmName || '未知农场' }}</span>
                 </div>
                 <div class="footer-r">
-                    <div class="btn warning" @click="shareResult">
+                    <div class="btn warning" v-if="detailItem?.reviewImage?.length" @click="shareResult">
                         分享成果
                     </div>
-                    <div class="btn secondary-text" @click="remindUser">
+                    <div class="btn secondary-text" v-else @click="remindUser">
                         提醒用户拍照
                     </div>
                 </div>
@@ -149,8 +149,8 @@
 import { onMounted, ref } from 'vue';
 import { useRouter } from "vue-router";
 import { base_img_url2 } from "@/api/config";
-import wx from 'weixin-js-sdk';
 import detailDialog from "@/components/detailDialog.vue";
+import uploadExecute from "@/views/old_mini/task_condition/components/uploadExecute.vue";
 import reviewPopup from "@/views/old_mini/task_condition/components/reviewPopup.vue";
 
 const props = defineProps({
@@ -178,15 +178,15 @@ const toPage = () => {
 }
 
 const shareResult = () => {
-    if (detailItem.value?.executeEvidence?.length) {
+    if (detailItem.value?.reviewImage?.length) {
         const preImg = triggerImg.value.length ? base_img_url2 + triggerImg.value[triggerImg.value.length - 1].cloudFilename : '';
-        const resImg = detailItem.value?.executeEvidence?.length ? base_img_url2 + detailItem.value.executeEvidence[detailItem.value.executeEvidence.length - 1] : '';
+        const resImg = detailItem.value?.reviewImage?.length ? base_img_url2 + detailItem.value.reviewImage[detailItem.value.reviewImage.length - 1] : '';
         reviewPopupRef.value.handleShowPopup(detailItem.value.id, preImg, resImg);
     }
 }
 
 const remindUser = () => {
-    uploadExecuteRef.value.showPopup(props.itemData, 'remindUser');
+    uploadExecuteRef.value.showPopup({...props.itemData, type: 'remindUser'});
 }
 
 onMounted(async () => {
@@ -227,7 +227,6 @@ function buildPrescriptionText(list) {
 async function getItemDetail(id) {
     const { data } = await VE_API.z_farm_work_record.getDetail({ id });
     detailItem.value = data[0];
-    console.log('dddd', detailItem.value)
 }
 
 // 保留方法名以兼容,但同步返回已生成的文案

+ 33 - 18
src/views/old_mini/modify_work/completedWork.vue

@@ -140,13 +140,13 @@
                 </div>
                 <div class="box-wrap farm-photo">
                     <div class="photo-list">
-                        <div class="img-item" v-for="(item, index) in 6" :key="index">
-                            <img
-                                class="photo-item"
-                                src="https://birdseye-img-ali-cdn.sysuimars.com/16926861-1e20-4cbd-8bf2-90208db5a2d0/806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_202509010800_001_806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_20250901080536_0045_V_code-ws0fsmge97gh.jpeg"
-                                alt=""
-                            />
-                        </div>
+                        <photo-provider :photo-closable="true">
+                                <photo-consumer v-for="src in triggerImg" intro="触发照片" :key="src" :src="base_img_url2 + src.cloudFilename">
+                                    <div class="img-item">
+                                        <img :src="base_img_url2 + src.cloudFilename" class="view-box">
+                                    </div>
+                                </photo-consumer>
+                        </photo-provider>
                     </div>
                     <div class="list-text">点击查看更多</div>
                 </div>
@@ -166,7 +166,7 @@
                         </div>
                         <div class="form-item">
                             <div class="item-name">服务亩数</div>
-                            <div class="item-text">{{ detailData?.area ? detailData?.area + '亩' : '--' }}</div>
+                            <div class="item-text">{{ detailData?.area ? formatArea(detailData?.area) + '亩' : '--' }}</div>
                         </div>
                         <div class="form-item">
                             <div class="item-name">服务区域</div>
@@ -328,6 +328,8 @@ import priceTable from "../agri_work/components/priceTable.vue";
 import priceSheetPopup from "@/components/popup/priceSheetPopup.vue";
 import uploadExecute from "@/views/old_mini/task_condition/components/uploadExecute.vue";
 import { base_img_url2 } from "@/api/config";
+import { ElMessage } from "element-plus";
+import { formatArea } from "@/common/commonFun";
 
 const router = useRouter();
 const store = useStore();
@@ -437,11 +439,15 @@ const handleRemindExecute = () => {
 }
 
 const handleForward = () => {
-    onlyShare.value = true;
-    setTimeout(() => {
-        uploadExecuteRef.value.showPopup({...parmasPage.value, type:'quotation'});
-    }, 10);
-    
+    if(quotationData.value.itemsList && quotationData.value.itemsList.length > 0) {
+        onlyShare.value = true;
+        setTimeout(() => {
+            uploadExecuteRef.value.showPopup({...parmasPage.value, type:'quotation'});
+        }, 10);
+    } else {
+        ElMessage.warning('暂无报价数据,无法分享')
+        return;
+    }
 }
 
 const onlyShare = ref(false);
@@ -478,6 +484,7 @@ onActivated(async () => {
     const id = query.value?.id;
     if (id) {
         await getDetail(id);
+        getTriggerImg(id)
     }
     parmasPage.value = {
         farmMiniUserId:detailData.value.users[0]?.userId,
@@ -560,10 +567,11 @@ onActivated(async () => {
     // }
 });
 
-function formatArea(val) {
-    const num = typeof val === 'number' ? val : parseFloat(val);
-    if (Number.isNaN(num)) return val;
-    return Number.isInteger(num) ? num : num.toFixed(2);
+
+const triggerImg = ref([]);
+const getTriggerImg = async (id) => {
+    const { data } = await VE_API.z_farm_work_record.getTriggerImg({ farmWorkRecordId: id });
+    triggerImg.value = data || [];
 }
 const detailData = ref({});
 const getDetail = async (id) => {
@@ -1031,8 +1039,15 @@ const changeRegion = (e) => {
                     border-radius: 8px;
                     object-fit: cover;
                 }
+                
                 .img-item {
-                    margin-right: 12px;
+                    img {
+                        width: 92px;
+                        height: 92px;
+                        border-radius: 8px;
+                        object-fit: cover;
+                        margin-right: 12px;
+                    }
                 }
 
                 .view-box {

+ 26 - 7
src/views/old_mini/modify_work/index.vue

@@ -18,11 +18,15 @@
                         当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标:当前农场指标
                     </div>
                 </div>
-                <div class="box-wrap farm-photo">
+                <div class="box-wrap farm-photo" v-if="triggerImg.length">
                     <div class="photo-list">
-                        <div class="img-item" v-for="(item, index) in 6" :key="index">
-                            <img class="photo-item" src="https://birdseye-img-ali-cdn.sysuimars.com/16926861-1e20-4cbd-8bf2-90208db5a2d0/806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_202509010800_001_806080da-1a30-4b5b-b64b-b22e722c6cb6/DJI_20250901080536_0045_V_code-ws0fsmge97gh.jpeg" alt="">
-                        </div>
+                        <photo-provider :photo-closable="true">
+                                <photo-consumer v-for="src in triggerImg" intro="触发照片" :key="src" :src="base_img_url2 + src.cloudFilename">
+                                    <div class="img-item">
+                                        <img :src="base_img_url2 + src.cloudFilename" class="view-box">
+                                    </div>
+                                </photo-consumer>
+                        </photo-provider>
                     </div>
                     <div class="list-text">点击查看更多</div>
                 </div>
@@ -45,7 +49,7 @@
                         </el-form-item>
                         <el-form-item label-width="70px" class="form-item text-item" label="服务亩数">
                             <div class="info-text">
-                                {{ detailData?.area ? detailData?.area + '亩' : '--' }}
+                                {{ detailData?.area ? formatArea(detailData?.area) + '亩' : '--' }}
                             </div>
                         </el-form-item>
                         <el-form-item label-width="70px" class="form-item text-item" label="服务区域">
@@ -406,6 +410,8 @@ import NewFarmMap from "./newFarmMap";
 import { useStore } from "vuex";
 import { Popup } from "vant";
 import farmSteps from "@/components/farmSteps.vue";
+import { base_img_url2 } from "@/api/config";
+import { formatArea } from "@/common/commonFun";
 import dayjs from "dayjs";
 const store = useStore();
 const router = useRouter();
@@ -429,6 +435,7 @@ onActivated(() => {
     const id = route.query.id;
     if (id) {
         getDetail(id);
+        getTriggerImg(id);
     }
     window.scrollTo(0, 0);
     getFarmWorkNameList();
@@ -465,6 +472,12 @@ onActivated(() => {
     getWarningMsg();
 });
 
+const triggerImg = ref([]);
+const getTriggerImg = async (id) => {
+    const { data } = await VE_API.z_farm_work_record.getTriggerImg({ farmWorkRecordId: id });
+    triggerImg.value = data || [];
+}
+
 const detailData = ref({});
 const getDetail = (id) => {
     VE_API.z_farm_work_record.getDetail({ id }).then(({ data }) => {
@@ -1034,8 +1047,14 @@ const handleExpertDiagnosis = () => {
                     border-radius: 8px;
                     object-fit: cover;
                 }
-                .img-item + .img-item {
-                    margin-left: 12px;
+                .img-item {
+                    img {
+                        width: 92px;
+                        height: 92px;
+                        border-radius: 8px;
+                        object-fit: cover;
+                        margin-right: 12px;
+                    }
                 }
             }
             .list-text {

+ 55 - 44
src/views/old_mini/task_condition/components/reviewPopup.vue

@@ -5,7 +5,7 @@
                 <div class="sheet-content">
                     <div class="review-image">
                         <div class="vs-wrap" v-if="preImg">
-                            <img src="@/assets/img/home/vs.png" alt="">
+                            <img src="@/assets/img/home/vs.png" alt="" />
                         </div>
                         <div class="review-image-item" v-if="preImg">
                             <div class="review-image-item-title">农事前</div>
@@ -20,23 +20,25 @@
                     <div class="quotation-info">
                         <div class="info-item">
                             <span class="info-label">执行农资</span>
-                            <span class="info-value">{{ quotationData.serviceMain || '--' }}</span>
+                            <span class="info-value">{{ quotationData.serviceMain || "--" }}</span>
                         </div>
                         <div class="info-item">
                             <span class="info-label">农事名称</span>
-                            <span class="info-value">{{ quotationData?.farmWorkName || '--' }}</span>
+                            <span class="info-value">{{ quotationData?.farmWorkName || "--" }}</span>
                         </div>
                         <div class="info-item flex-wrap">
                             <div class="info-label">复核成效</div>
-                            <div class="info-value">通过精准农业技术的应用,作物产量实现增长,病虫害的发生率大幅下降</div>
+                            <div class="info-value">
+                                通过精准农业技术的应用,作物产量实现增长,病虫害的发生率大幅下降
+                            </div>
                         </div>
                     </div>
                 </div>
-                
+
                 <div class="bottom-info">
                     <div class="bottom-l">
                         <div class="l-img">
-                            <img src="@/assets/img/home/bird.png" alt="">
+                            <img src="@/assets/img/home/bird.png" alt="" />
                         </div>
                         <div class="l-text">
                             <div class="l-text-title">飞鸟管家</div>
@@ -44,7 +46,7 @@
                         </div>
                     </div>
                     <div class="bottom-r">
-                        <img src="@/assets/img/home/qrcode.png" alt="">
+                        <img src="@/assets/img/home/qrcode.png" alt="" />
                     </div>
                 </div>
             </div>
@@ -88,14 +90,13 @@ import html2canvas from "html2canvas";
 const router = useRouter();
 const showPopup = ref(false);
 const contentEl = ref(null);
-const preImg = ref('');
-const resImg = ref('');
+const preImg = ref("");
+const resImg = ref("");
 // 报价数据
 const quotationData = ref({});
 
-onActivated(() => {
-})
-const recordId = ref('');
+onActivated(() => {});
+const recordId = ref("");
 const handleShowPopup = async (id, preImgVal, resImgVal) => {
     recordId.value = id;
     await getDetail();
@@ -112,19 +113,23 @@ async function getDetail() {
 const handleShare = () => {
     const userId = quotationData.value.users[0]?.userId;
     const parmasPage = {
-        farmWorkOrderId:quotationData.value.orderId,
-        farmMiniUserId:userId,
-        farmMiniUserName:quotationData.value.expertUserName,
-        farmId:quotationData.value.farmId,
-        farmWorkName:quotationData.value.farmWorkName,
-        id:quotationData.value.id,
-        type:'quotation'
+        farmWorkOrderId: quotationData.value.orderId,
+        farmMiniUserId: userId,
+        farmMiniUserName: quotationData.value.expertUserName,
+        farmId: quotationData.value.farmId,
+        farmWorkName: quotationData.value.farmWorkName,
+        id: quotationData.value.id,
+        type: "quotation",
+    };
+    if (userId) {
+        router.push(
+            `/chat_frame?userId=${userId}&name=${parmasPage.farmMiniUserName}&farmId=${
+                parmasPage.farmId
+            }&pageParams=${JSON.stringify(parmasPage)}`
+        );
+    } else {
+        ElMessage.warning("尚未绑定用户,暂时无法分享");
     }
-    if(userId){
-        router.push(`/chat_frame?userId=${userId}&name=${parmasPage.farmMiniUserName}&farmId=${parmasPage.farmId}&pageParams=${JSON.stringify(parmasPage)}`);
-    }else{
-        ElMessage.warning('尚未绑定用户,暂时无法分享')
-    }   
 };
 
 const handleWechat = () => {
@@ -133,9 +138,15 @@ const handleWechat = () => {
     //     path: "/completed_work",
     //     query: { id: quotationData.value.id, farmWorkOrderId: quotationData.value.orderId, isAssign: true },
     // });
+    const query = {
+        askInfo: { title: "农事执行成果", content: "是否分享该农事执行成果给好友" },
+        shareText: "向您分享了农事执行成果",
+        id: recordId.value,
+        postImg: resImg.value,
+    };
 
     wx.miniProgram.navigateTo({
-        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify({ shareText: "向您分享了农事执行成果", id: recordId.value, postImg: resImg.value })}&type=reviewWork`,
+        url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=reviewWork`,
     });
 };
 
@@ -143,7 +154,7 @@ const handleSaveImage = async () => {
     try {
         if (!contentEl.value) return;
         const element = contentEl.value;
-        const scroller = element.querySelector('.sheet-content');
+        const scroller = element.querySelector(".sheet-content");
 
         // 记录原样式
         const prev = {
@@ -156,13 +167,13 @@ const handleSaveImage = async () => {
         };
 
         // 展开内容,去除滚动限制,确保截图包含全部内容
-        element.style.overflow = 'visible';
-        element.style.maxHeight = 'none';
-        element.style.height = 'auto';
+        element.style.overflow = "visible";
+        element.style.maxHeight = "none";
+        element.style.height = "auto";
         if (scroller) {
-            scroller.style.overflow = 'visible';
-            scroller.style.maxHeight = 'none';
-            scroller.style.height = 'auto';
+            scroller.style.overflow = "visible";
+            scroller.style.maxHeight = "none";
+            scroller.style.height = "auto";
         }
 
         // 计算完整尺寸
@@ -170,7 +181,7 @@ const handleSaveImage = async () => {
         const height = element.scrollHeight;
 
         const canvas = await html2canvas(element, {
-            backgroundColor: '#ffffff',
+            backgroundColor: "#ffffff",
             useCORS: true,
             allowTaint: true,
             scale: Math.min(2, window.devicePixelRatio || 2),
@@ -181,10 +192,10 @@ const handleSaveImage = async () => {
             scrollX: 0,
             scrollY: 0,
         });
-        const dataUrl = canvas.toDataURL('image/png');
-        const link = document.createElement('a');
+        const dataUrl = canvas.toDataURL("image/png");
+        const link = document.createElement("a");
         link.href = dataUrl;
-        link.download = '服务报价单.png';
+        link.download = "服务报价单.png";
         document.body.appendChild(link);
         link.click();
         document.body.removeChild(link);
@@ -199,7 +210,7 @@ const handleSaveImage = async () => {
             scroller.style.height = prev.scrollerHeight;
         }
     } catch (e) {
-        console.error('保存图片失败', e);
+        console.error("保存图片失败", e);
     }
 };
 
@@ -380,7 +391,7 @@ defineExpose({
         .total-value {
             font-size: 22px;
             font-weight: bold;
-            color: #2199F8;
+            color: #2199f8;
         }
 
         .total-unit {
@@ -566,7 +577,7 @@ defineExpose({
         .detail-item + .detail-item {
             position: relative;
             &::before {
-                content: '';
+                content: "";
                 position: absolute;
                 left: 0;
                 top: 50%;
@@ -588,7 +599,7 @@ defineExpose({
 }
 .edit-btn {
     background: rgba(33, 153, 248, 0.1);
-    color: #2199F8;
+    color: #2199f8;
     padding: 6px 16px;
     border-radius: 20px;
     font-size: 14px;
@@ -630,15 +641,15 @@ defineExpose({
             }
 
             &.blue-btn .icon-circle {
-                background: #2199F8;
+                background: #2199f8;
             }
 
             &.green-btn .icon-circle {
-                background: #07C160;
+                background: #07c160;
             }
 
             &.orange-btn .icon-circle {
-                background: #FF790B;
+                background: #ff790b;
             }
 
             .btn-label {
@@ -655,4 +666,4 @@ defineExpose({
         cursor: pointer;
     }
 }
-</style>
+</style>

+ 10 - 5
src/views/old_mini/task_condition/components/task.vue

@@ -101,6 +101,7 @@ import calendar from "./calendar.vue"
 import { useRouter } from "vue-router";
 import uploadExecute from "./uploadExecute.vue";
 import priceSheetPopup from "@/components/popup/priceSheetPopup.vue";
+import { ElMessage } from "element-plus";
 
 const store = useStore();
 const router = useRouter();
@@ -315,11 +316,15 @@ function handlePopupBtn() {
 }
 
 function handleForward(item) {
-    onlyShare.value = true;
-    setTimeout(() => {
-        uploadExecuteRef.value.showPopup({...item, type:'quotation', farmWorkOrderId:item.orderId},'share-sheet');
-    }, 10);
-   
+    if (item.quoteCount && item.quoteCount != 0) {
+        onlyShare.value = true;
+        setTimeout(() => {
+            uploadExecuteRef.value.showPopup({...item, type:'quotation', farmWorkOrderId:item.orderId},'share-sheet');
+        }, 10);
+    } else {
+        ElMessage.warning('暂无报价数据,无法分享')
+        return;
+    }
 }
 
 </script>

+ 13 - 2
src/views/old_mini/task_condition/components/uploadExecute.vue

@@ -67,7 +67,17 @@ function handleConfirm() {
             ElMessage.success('请求确认成功');
             show.value = false;
             VE_API.z_farm_work_record.getDetail({ id: farmData.value.id }).then(({ data }) => {
-                farmData.value = data[0];
+                farmData.value = {
+                    farmMiniUserId:data.users[0]?.userId,
+                    farmMiniUserName:data.expertUserName,
+                    farmWorkOrderId:data.orderId,
+                    farmId:data.farmId,
+                    executeEvidence:JSON.stringify(data.executeEvidence),
+                    farmWorkName:data.farmWorkName,
+                    id:data.id,
+                }
+                farmData.value.type = 'confirmExecute'
+                console.log("farmData.value", farmData.value);
                 showShare.value = true;
             });
         }
@@ -101,8 +111,9 @@ const onSelect = async ({type}) => {
             });
         } else if (farmData.value.type === 'remindUser') {
             const query = { askInfo: {title: "提醒拍照", content: "是否分享该提示给好友"}, shareText: " 请您尽快执行" + farmData.value.farmWorkName + "农事", id: farmData.value.id, farmWorkOrderId: farmData.value.orderId, postImg: triggerImg.value.length ? base_img_url2 + triggerImg.value[triggerImg.value.length - 1].cloudFilename : '' }
+            // reviewWork跳转到农事复核
             wx.miniProgram.navigateTo({
-                url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=priceSheet`,
+                url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=reviewWork`,
             });
         } else {
             const img = JSON.parse(farmData.value.executeEvidence);