Преглед на файлове

fix: 已完成,待复核

lxf преди 1 ден
родител
ревизия
a4f6d7a1f3

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

@@ -80,4 +80,9 @@ module.exports = {
         url: url + "/updateExpectedExecuteDate",
         type: "get",
     },
+    // resultReport
+    resultReport: {
+        url: url + "/resultReport",
+        type: "get",
+    },
 }

+ 5 - 1
src/components/album_compoents/albumCarousel.vue

@@ -1,5 +1,5 @@
 <template>
-    <album-carousel-item v-if="images" :labelText="labelText" :images="images" :isAchievementImgs="isAchievementImgs"></album-carousel-item>
+    <album-carousel-item v-if="images" :labelText="labelText" :imgData="imgData" :images="images" :isAchievementImgs="isAchievementImgs"></album-carousel-item>
 </template>
 
 <script setup>
@@ -20,6 +20,10 @@ const props =defineProps({
     type: Boolean,
     default: false,
   },
+  imgData:{
+    type: Object,
+    default: () => {},
+  },
 })
 const { images } = toRefs(props);
 

+ 69 - 15
src/components/album_compoents/albumCarouselItem.vue

@@ -12,7 +12,6 @@
             </photo-provider> -->
             <div
                 class="carousel-img"
-                :class="{ noFit: isAchievementImgs }"
                 v-for="(photo, index) in images"
                 :key="index"
             >
@@ -21,23 +20,31 @@
                 <div class="carousel-img-mask" v-if="!isAchievementImgs">
                     <div class="mask-content">
                         <div class="mask-line line-top">
-                            <span class="date-text">2025.12.05</span>
+                            <span class="date-text">{{ imgData?.executeDate }}</span>
                             <span class="line-separator">|</span>
-                            <span class="executor-text">执行人:张某某、张某某</span>
+                            <span class="executor-text">执行人:{{  }}</span>
                         </div>
                         <div class="mask-line line-middle">
-                            <span class="work-name">梢期杀虫</span>
+                            <span class="work-name">{{ imgData?.farmWorkName }}</span>
                             <span class="line-separator">|</span>
-                            <span class="prescription-text">药物处方:乙烯利乙烯利</span>
+                            <span class="prescription-text">药物处方:{{ prescriptionText }}</span>
                         </div>
                         <div class="mask-line line-bottom">
                             <span class="location-text">
                                 <img src="@/assets/watermark/address.png" alt="location" class="location-icon" />
-                                荔博园(广东省广州市从化区思想街道思)
+                                {{ imgData?.farmName }}({{ imgData?.serviceRegion }})
                             </span>
                         </div>
                     </div>
                 </div>
+                <div class="carousel-img-mask" v-if="isAchievementImgs && imgData?.reCheckText">
+                    <div class="mask-content">
+                        <div class="review-effect-text">复核成效</div>
+                        <div class="review-effect-content">
+                            <span class="review-effect-content-text">{{ imgData?.reCheckText }}</span>
+                        </div>
+                    </div>
+                </div>
             </div>
         </div>
 
@@ -56,23 +63,31 @@
                 <div class="carousel-img-mask" v-if="!isAchievementImgs">
                     <div class="mask-content">
                         <div class="mask-line line-top">
-                            <span class="date-text">2025.12.05</span>
+                            <span class="date-text">{{ imgData?.executeDate }}</span>
                             <span class="line-separator">|</span>
-                            <span class="executor-text">执行人:张某某、张某某</span>
+                            <span class="executor-text">执行人:{{ imgData?.executeName }}</span>
                         </div>
                         <div class="mask-line line-middle">
-                            <span class="work-name">梢期杀虫</span>
+                            <span class="work-name">{{ imgData?.farmWorkName }}</span>
                             <span class="line-separator">|</span>
-                            <span class="prescription-text">药物处方:乙烯利乙烯利</span>
+                            <span class="prescription-text">药物处方:{{ prescriptionText }}</span>
                         </div>
                         <div class="mask-line line-bottom">
                             <span class="location-text">
                                 <img src="@/assets/watermark/address.png" alt="location" class="location-icon" />
-                                荔博园(广东省广州市从化区思想街道思)
+                                {{ imgData?.farmName }}({{ imgData?.serviceRegion }})
                             </span>
                         </div>
                     </div>
                 </div>
+                <div class="carousel-img-mask" v-if="isAchievementImgs && imgData?.reCheckText">
+                    <div class="mask-content">
+                        <div class="review-effect-text">复核成效</div>
+                        <div class="review-effect-content">
+                            <span class="review-effect-content-text">{{ imgData?.reCheckText }}</span>
+                        </div>
+                    </div>
+                </div>
             </div>
         </div>
 
@@ -104,7 +119,7 @@
 
 <script setup>
 import { Popup } from "vant";
-import { toRefs, ref, computed, onMounted, onUnmounted, nextTick } from "vue";
+import { toRefs, ref, computed, onMounted, onUnmounted, nextTick, watch } from "vue";
 import AlbumDrawBox from "./albumDrawBox.vue";
 import html2canvas from "html2canvas";
 import { base_img_url2 } from "@/api/config";
@@ -122,6 +137,10 @@ const props = defineProps({
         type: Boolean,
         default: false,
     },
+    imgData: {
+        type: Object,
+        default: () => {},
+    },
 });
 const { images, labelText, isAchievementImgs } = toRefs(props);
 let timer = null;
@@ -130,11 +149,37 @@ const currentIndex = ref(0);
 onMounted(() => {
     updateImagePosition();
     clearAndRestartTimer();
+    prescriptionText.value = buildPrescriptionText(props.imgData.prescriptionList);
 });
 onUnmounted(() => {
     clearInterval(timer);
 });
 
+
+watch(() => props.imgData, (newVal) => {
+    if (newVal && newVal.prescriptionList) {
+        prescriptionText.value = buildPrescriptionText(newVal.prescriptionList);
+    }
+});
+
+
+const prescriptionText = ref("");
+function buildPrescriptionText(list) {
+    try {
+        return list
+            .map((group) =>
+                (group.pesticideFertilizerList || [])
+                    .map((p) => p.defaultName || p.pesticideFertilizerName || "")
+                    .filter(Boolean)
+                    .join("+")
+            )
+            .filter(Boolean)
+            .join("+");
+    } catch {
+        return "";
+    }
+}
+
 const updateImagePosition = () => {
     carouselStyle.value.transform = `translateX(-${currentIndex.value * 100}%)`;
 };
@@ -230,9 +275,9 @@ function downloadImage(dataUrl, filename) {
 }
 
 const getPhotoSrc = (photo) => {
-    if (isAchievementImgs.value) {
-        return photo;
-    }
+    // if (isAchievementImgs.value) {
+    //     return photo;
+    // }
     return base_img_url2 + (photo.cloudFilename ? photo.cloudFilename : photo);
 };
 </script>
@@ -322,6 +367,15 @@ const getPhotoSrc = (photo) => {
             font-size: 10px;
             line-height: 15px;
         }
+        .review-effect-text {
+            font-family: "PangMenZhengDao";
+            font-size: 16px;
+            margin-bottom: 4px;
+        }
+        .review-effect-content {
+            font-size: 10px;
+            line-height: 15px;
+        }
         .mask-line {
             display: flex;
             align-items: center;

+ 169 - 19
src/components/album_compoents/albumDrawBox.vue

@@ -83,6 +83,14 @@ const props = defineProps({
         type: Number,
         required: true,
     },
+    isAchievementImgs: {
+        type: Boolean,
+        default: false,
+    },
+    imgData: {
+        type: Object,
+        default: () => ({}),
+    },
 });
 let img = null;
 let ctx = null;
@@ -171,8 +179,15 @@ async function generateImageWithQRCode() {
         drawImageCoverByNatural(tempCtx, cachedSourceImg, w, h);
         
         // 绘制底部遮罩和文字
-        drawBottomMask(tempCtx, w, h);
-        drawBottomTextOverlay(tempCtx, w, h);
+        if (props.isAchievementImgs) {
+            if (props.imgData?.reCheckText) {
+                drawBottomMask(tempCtx, w, h);
+                drawReviewEffectText(tempCtx, w, h);
+            }
+        } else {
+            drawBottomMask(tempCtx, w, h);
+            drawBottomTextOverlay(tempCtx, w, h);
+        }
         
         // 二维码尺寸和位置(参考 albumCarouselItem 的样式)
         const qrSize = 40;
@@ -255,8 +270,15 @@ function drawWatermark2(sourceImg, displayImg) {
     // ✅ 用「原始像素图」做 cover
     drawImageCoverByNatural(ctx, sourceImg, w, h);
 
-    drawBottomMask(ctx, w, h);
-    drawBottomTextOverlay(ctx, w, h);
+    if (props.isAchievementImgs) {
+        if (props.imgData?.reCheckText) {
+            drawBottomMask(ctx, w, h);
+            drawReviewEffectText(ctx, w, h);
+        }
+    } else {
+        drawBottomMask(ctx, w, h);
+        drawBottomTextOverlay(ctx, w, h);
+    }
 
     watermark.value = canvas.toDataURL("image/jpeg", 0.85);
 }
@@ -303,7 +325,7 @@ function drawImageCover(ctx, img, w, h) {
 }
 function drawBottomTextOverlay(ctx, w, h) {
     const paddingX = 12;
-    const paddingBottom = 8;
+    const paddingBottom = 12;
     const lineHeight = 16;
 
     ctx.textBaseline = "alphabetic";
@@ -316,33 +338,145 @@ function drawBottomTextOverlay(ctx, w, h) {
 
     // 第三行(最底)
     ctx.font = "10px sans-serif";
-    console.log("paddingX", paddingX, y);
     ctx.drawImage(imageCache.get("address"), paddingX, y - 9, 9, 10);
     ctx.fillText("荔博园(广东省广州市从化区)", paddingX + 12, y);
 
-    // 第二行
-    y -= 15;
-    ctx.font = "16px PangMenZhengDao";
-    const workNameText = "梢期杀虫";
-    const prescriptionText = "药物处方:乙烯利";
-    ctx.fillText(workNameText, paddingX, y);
+    // 第二行:农事名称 + 药物处方(处方过长时向下换行,整体块仍贴近底部)
+    // 单行基准位置(仅一行时的 baseline)
+    const singleLineY = y - 15;
+
+    // 计算处方文本(长度大于 30 时才自动换行)
     ctx.font = "10px sans-serif";
-    ctx.fillText(prescriptionText, paddingX + workNameText.length * 20, y);
+    const workNameText = props.imgData?.farmWorkName || "";
+    const prescriptionFull =
+        "药物处方:" + (buildPrescriptionText(props.imgData?.prescriptionList) || "");
+
+    const maxWidth = w - paddingX * 2;
+
+    let firstLineY = singleLineY;
+
+    if (prescriptionFull.length <= 30) {
+        // 不足 30 个字符,保持一行:名称 + 处方在同一 baseline
+        firstLineY = singleLineY;
+
+        // 农事名称
+        ctx.font = "16px PangMenZhengDao";
+        ctx.fillText(workNameText, paddingX, firstLineY);
+
+        // 处方文本紧跟在名称后面
+        ctx.font = "10px sans-serif";
+        const nameWidth = ctx.measureText(workNameText).width;
+        const gap = 8;
+        ctx.fillText(prescriptionFull, paddingX + nameWidth + gap + 28, firstLineY);
+    } else {
+        // 超过 30 个字符,自动换行显示(处方整体从左对齐)
+        const prescriptionLines = [];
+        let line = "";
+        for (let i = 0; i < prescriptionFull.length; i++) {
+            const testLine = line + prescriptionFull[i];
+            const testWidth = ctx.measureText(testLine).width;
+            if (testWidth > maxWidth && line !== "") {
+                prescriptionLines.push(line);
+                line = prescriptionFull[i];
+            } else {
+                line = testLine;
+            }
+        }
+        if (line) {
+            prescriptionLines.push(line);
+        }
+
+        const blockLines = 1 + prescriptionLines.length; // 1 行名称 + N 行处方
+        // 整个“第二行块”的第一行 baseline,使最后一行仍然靠近 singleLineY
+        firstLineY = singleLineY - (blockLines - 1) * lineHeight;
+
+        // 农事名称(第一行,靠左)
+        ctx.font = "16px PangMenZhengDao";
+        ctx.fillText(workNameText, paddingX, firstLineY);
+
+        // 处方文本,从下一行开始,全部从左侧对齐
+        ctx.font = "10px sans-serif";
+        let textY = firstLineY + lineHeight;
+        prescriptionLines.forEach((text) => {
+            ctx.fillText(text, paddingX, textY);
+            textY += lineHeight;
+        });
+    }
 
-    // 第一行(最上)
-    y -= 17;
+    // 第一行(最上)的 baseline 在整个“第二行块”之上 17px
+    y = firstLineY - 17;
     ctx.font = "12px PangMenZhengDao";
-    const timeText = "2025.12.25";
+    const timeText = props.imgData?.executeDate;
     ctx.fillText(timeText, paddingX, y);
-    const executorText = "执行人:张三李四";
+    const executorText = "执行人:" + props.imgData?.executeName;
     ctx.font = "10px sans-serif";
-    ctx.fillText(executorText, paddingX + 80, y);
+    ctx.fillText(executorText, paddingX + 90, y);
+
+    ctx.shadowBlur = 0;
+}
+
+// 成果复核文案(水印文字版本)
+// 参考 UI:「复核成效」标题 + 一段说明文字,整体靠底部显示
+function drawReviewEffectText(ctx, w, h) {
+    const paddingX = 12;
+    const paddingBottom = 8; // 底部留白
+
+    ctx.textBaseline = "top";
+    ctx.fillStyle = "#ffffff";
+    ctx.shadowColor = "rgba(0,0,0,0.45)";
+    ctx.shadowBlur = 4;
+
+    // 文案内容
+    const content =
+        props.imgData?.reCheckText;
+
+    // 按宽度自动换行,先得到所有行
+    ctx.font = "10px sans-serif";
+    const lineHeight = 15;
+    const maxWidth = w - paddingX * 2; // 文本最大宽度
+    const lines = [];
+    let line = "";
+    for (let i = 0; i < content.length; i++) {
+        const testLine = line + content[i];
+        const testWidth = ctx.measureText(testLine).width;
+        if (testWidth > maxWidth && line !== "") {
+            lines.push(line);
+            line = content[i];
+        } else {
+            line = testLine;
+        }
+    }
+    if (line) {
+        lines.push(line);
+    }
+
+    // 计算整体高度:标题高度 + 间距 + 正文行高
+    const titleFontSize = 16;
+    const titleGap = 4;
+    const textBlockHeight = lines.length * lineHeight;
+    const totalHeight = titleFontSize + titleGap + textBlockHeight;
+
+    // 从底部往上布局,使整体块贴近底部
+    const baseY = h - paddingBottom - totalHeight;
+
+    // 标题
+    ctx.font = "16px PangMenZhengDao";
+    const titleText = "复核成效";
+    ctx.fillText(titleText, paddingX, baseY);
+
+    // 正文
+    ctx.font = "10px sans-serif";
+    let textY = baseY + titleFontSize + titleGap;
+    lines.forEach((ln) => {
+        ctx.fillText(ln, paddingX, textY);
+        textY += lineHeight;
+    });
 
     ctx.shadowBlur = 0;
 }
 
 function drawBottomMask(ctx, w, h) {
-    const maskHeight = 60; // 和 3 行文字 + padding 精确匹配
+    const maskHeight = 66; // 和 3 行文字 + padding 精确匹配
 
     ctx.fillStyle = "rgba(0,0,0,0.45)";
     ctx.fillRect(
@@ -353,6 +487,22 @@ function drawBottomMask(ctx, w, h) {
     );
 }
 
+function buildPrescriptionText(list) {
+    try {
+        return list
+            .map((group) =>
+                (group.pesticideFertilizerList || [])
+                    .map((p) => p.defaultName || p.pesticideFertilizerName || "")
+                    .filter(Boolean)
+                    .join("+")
+            )
+            .filter(Boolean)
+            .join("+");
+    } catch {
+        return "";
+    }
+}
+
 const showTagBox = ref(true); // 控制 tag-box 的显示状态
 const hideTagBox = (event) => {
     event.stopPropagation();

+ 1 - 1
src/components/recordItem.vue

@@ -37,7 +37,7 @@
                     <div class="info-val">
                         {{
                             recordItemData.reCheckText ||
-                            "促进分蘖芽萌发、加快分蘖生长,同时补充氮素等关键养分,增强植株长势,为形成足够穗数、提高群体产量打基础。"
+                            "--"
                         }}
                     </div>
                 </div>

+ 2 - 2
src/components/taskItem.vue

@@ -73,11 +73,11 @@
                         >
                     </div>
                 </div>
-                <div class="review-image" v-if="itemData?.executeEvidence?.length">
+                <div class="review-image" v-if="itemData?.executeEvidenceList?.length">
                     <div class="review-image-item">
                         <photo-provider :photo-closable="true">
                             <photo-consumer
-                                v-for="src in JSON.parse(itemData.executeEvidence)"
+                                v-for="src in itemData.executeEvidenceList"
                                 :key="src"
                                 :src="base_img_url2 + src"
                             >

+ 27 - 24
src/views/old_mini/achievement_report/index.vue

@@ -30,11 +30,11 @@
                         <div class="item-title">作业面积</div>
                     </div>
                     <div class="report-box-item">
-                        <div class="item-content">{{ workItem?.reviewDate || "--" }}</div>
+                        <div class="item-content">{{ reportData?.workCycle ? (reportData?.workCycle + '天') : "--" }}</div>
                         <div class="item-title">作业周期</div>
                     </div>
                     <div class="report-box-item">
-                        <div class="item-content">{{ workItem?.usageMode || "--" }}</div>
+                        <div class="item-content">{{ reportData?.deviceName || "--" }}</div>
                         <div class="item-title">使用设备</div>
                     </div>
                 </div>
@@ -42,27 +42,29 @@
                 <div class="report-box">
                     <div class="box-title">精准施治,智慧护航</div>
                     <div class="box-text">
-                        我们凭借时机精准的判断与定制化方案的核心能力,结合***高效产品与专业设备,病虫害防治率95%
-                        ,落果减少30%
+                        {{ reportData?.resultInfo || "--" }}
                     </div>
                 </div>
 
                 <div class="report-excute" v-for="(item, index) in workItem?.executeEvidence" :key="index">
-                    <!-- <album-carousel
-                        :key="index"
-                        labelText="执行照片"
-                        :images="[item]"
-                    ></album-carousel> -->
                     <div class="tag-label">执行照片</div>
-                    <album-draw-box :isShowNum="0" :photo="item" :current="index" :index="index" :length="workItem?.executeEvidence?.length"></album-draw-box>
+                    <album-draw-box :isShowNum="0" :imgData="workItem" :photo="item" :current="index" :index="index" :length="workItem?.executeEvidence?.length"></album-draw-box>
                 </div>
-                <div class="report-excute">
+                <div class="report-excute" v-for="(item, index) in workItem?.reviewImage" :key="index">
+                    <div class="tag-label">复核照片</div>
+                    <album-draw-box :isShowNum="0" :isAchievementImgs="true" :imgData="workItem" :photo="item" :current="index" :index="index" :length="workItem?.reviewImage?.length"></album-draw-box>
+                </div>
+                <!-- <div class="report-excute" v-for="(item, index) in workItem?.reviewImage" :key="index">
+                    <div class="tag-label">复核照片</div>
+                    <album-draw-box :isShowNum="0" :photo="item" :current="index" :index="'review'+index" :length="workItem?.reviewImage?.length"></album-draw-box>
+                </div> -->
+                <!-- <div class="report-excute">
                     <album-carousel
                         :key="93"
                         :isAchievementImgs="true"
                         :images="combinedReviewImages"
                     ></album-carousel>
-                </div>
+                </div> -->
             </div>
 
             <div class="bottom-btn">
@@ -77,7 +79,7 @@
                 <div class="review-mask">
                     <div class="review-text">复核成效</div>
                     <div class="review-content">
-                        促进分蘖芽萌发、加快分蘖生长,同时补充氮素等关键养分,增强植株长势,为形成足够穗数、提高群体产量打基础。
+                        {{ workItem?.reCheckText }}
                     </div>
                 </div>
                 <div class="vs-wrap" v-if="workItem?.reviewImage && workItem?.reviewImage?.length">
@@ -85,11 +87,6 @@
                 </div>
                 <div class="review-image-item" v-if="workItem?.executeEvidence?.length">
                     <div class="review-image-item-title">复核照片</div>
-                    <!-- <img
-                            class="review-image-item-img left-img"
-                            :src="base_img_url2 + triggerImg[triggerImg.length - 1].cloudFilename"
-                            alt=""
-                        /> -->
                     <img
                         class="review-image-item-img left-img"
                         :src="leftCoverImg"
@@ -97,11 +94,6 @@
                     />
                 </div>
                 <div class="review-image-item" v-if="workItem?.reviewImage?.length">
-                    <!-- <img
-                            class="review-image-item-img right-img"
-                            :src="base_img_url2 + workItem.reviewImage[workItem.reviewImage.length - 1]"
-                            alt=""
-                        /> -->
                     <img
                         class="review-image-item-img right-img"
                         :src="rightCoverImg"
@@ -138,8 +130,18 @@ onActivated(() => {
     window.scrollTo(0, 0);
     paramsPage.value = route.query.miniJson ? JSON.parse(route.query.miniJson) : {};
     getDetail();
+    getResultReport();
 });
 
+const reportData = ref({});
+const getResultReport = () => {
+    VE_API.z_farm_work_record.resultReport({ recordId: paramsPage.value.id }).then((res) => {
+        if (res.code === 0) {
+            reportData.value = res.data;
+        }
+    });
+};
+
 const getDetail = () => {
     if (!paramsPage.value.id) return;
     loading.value = true;
@@ -192,7 +194,7 @@ async function handleDownload() {
                 //     }
                 // });
             } else {
-                downloadImage(image, "果报告");
+                downloadImage(image, "果报告");
             }
             isDowload.value = true;
         } catch (error) {
@@ -326,6 +328,7 @@ watch(
         box-sizing: border-box;
         position: relative;
         .bottom-btn {
+            z-index: 2;
             position: fixed;
             bottom: 0;
             left: 0;

+ 29 - 2
src/views/old_mini/agri_work/components/priceTable.vue

@@ -9,11 +9,34 @@
                 <div class="title-5"><div class="table-name">用量</div></div>
                 <div class="title-6"><div class="table-name">总价</div></div>
             </div>
-            <div
+            
+            <template v-if="isArrList">
+                <div
                 class="new-table-wrap"
+                v-for="(prescriptionItem, prescriptionI) in prescriptionData"
+                :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 class="title-3">{{ subP.brand }}</div>
+                            <div class="title-4">{{ subP.price }}</div>
+                            <div class="title-5">{{ subP.dosage }}</div>
+                            <div class="title-6">{{ subP.total }}元</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            </template>
+            <template v-else>
+                <div
+                    class="new-prescription"
                     v-for="(subP, subI) in prescriptionData.pesticideFertilizerList"
                     :key="subI"
                 >
@@ -28,7 +51,7 @@
                         </div>
                     </div>
                 </div>
-            </div>
+            </template>
         </div>
 
         <slot name="bottomContent"></slot>
@@ -45,6 +68,10 @@ const props = defineProps({
         type: [Number, String],
         default: null,
     },
+    isArrList: {
+        type: Boolean,
+        default: false,
+    },
 });
 
 // 计算单个药肥的总价:单价 * 用量 * 面积

+ 1 - 1
src/views/old_mini/modify_work/completedWork.vue

@@ -85,7 +85,7 @@
                                 </div>
                             </div>
                             <div class="info-content-wrap">
-                                <price-table :prescriptionData="quotationData.prescriptionList">
+                                <price-table :prescriptionData="quotationData.prescriptionList" :isArrList="true">
                                     <template #bottomContent>
                                         <div class="price-bottom">
                                             <div class="info-title-wrap">

+ 9 - 6
src/views/old_mini/modify_work/reviewWork.vue

@@ -90,22 +90,25 @@
                                     class="execute-img"
                                     :key="1"
                                     labelText="执行照片"
+                                    :imgData="workItem"
                                     :images="workItem.executeEvidence"
                                 ></album-carousel>
                             </div>
-                            <!-- <div
+                            <div
                                 class="img-list over-img-box"
                                 v-if="workItem.reviewImage && workItem.reviewImage.length"
                             >
                                 <album-carousel
                                     :key="2"
-                                    labelText="农事后"
+                                    labelText="复核照片"
+                                    :isAchievementImgs="true"
+                                    :imgData="workItem"
                                     :images="workItem.reviewImage"
                                 ></album-carousel>
-                            </div> -->
-                            <div class="img-list over-img-box" v-if="combinedReviewImages.length">
-                                <album-carousel :key="3" :isAchievementImgs="true" :images="combinedReviewImages"></album-carousel>
                             </div>
+                            <!-- <div class="img-list over-img-box" v-if="combinedReviewImages.length">
+                                <album-carousel :key="3" :isAchievementImgs="true" :images="combinedReviewImages"></album-carousel>
+                            </div> -->
                             <div class="img-list" v-if="!workItem.reviewImage || !workItem.reviewImage.length">
                                 <div
                                     class="recheck-text-wrap active"
@@ -261,7 +264,7 @@
                     <div class="review-mask">
                         <div class="review-text">复核成效</div>
                         <div class="review-content">
-                            促进分蘖芽萌发、加快分蘖生长,同时补充氮素等关键养分,增强植株长势,为形成足够穗数、提高群体产量打基础。
+                            {{ workItem?.reCheckText }}
                         </div>
                     </div>
                     <div class="vs-wrap" v-if="workItem?.reviewImage && workItem?.reviewImage?.length">

+ 5 - 5
src/views/old_mini/task_condition/components/calendar.vue

@@ -105,9 +105,9 @@ function getTaskByDate(dateStr) {
     }
     // 查找匹配日期的农事
     const matchedTasks = taskListData.value.filter(task => {
-        if (!task.executeDate) return false;
+        if (!task.expectedExecuteDate && !task.executeDeadlineDate) return false;
         // 格式化日期字符串进行比较(确保格式一致)
-        const taskDate = formatDate(new Date(task.executeDate));
+        const taskDate = formatDate(new Date(task.expectedExecuteDate || task.executeDeadlineDate));
         return taskDate === dateStr;
     });
 
@@ -126,9 +126,9 @@ function setSolarTerm(taskList) {
     // 存储任务列表数据
     taskListData.value = taskList || [];
     // 为每个任务计算节气
-    for (let item of taskListData.value) {
-        if (item.executeDate) {
-            item.solarTerm = getSolarTerm(new Date(item.executeDate));
+    for (let task of taskListData.value) {
+        if (task.expectedExecuteDate || task.executeDeadlineDate) {
+            task.solarTerm = getSolarTerm(new Date(task.expectedExecuteDate || task.executeDeadlineDate));
         }
     }
 }

+ 36 - 34
src/views/old_mini/task_condition/components/task.vue

@@ -15,7 +15,7 @@
                     已完成({{ taskCounts[1] || 0 }})
                 </div>
                 <div class="filter-item" :class="{ active: activeIndex === 2 }" @click="handleActiveFilter(2)">
-                    复核({{ taskCounts[2] || 0 }})
+                    复核({{ taskCounts[2] || 0 }})
                 </div>
             </div>
             <div class="select-group">
@@ -50,21 +50,21 @@
                     >
                         <template #footer>
                             <div class="item-footer" v-if="activeIndex === 2">
-                                <div
-                                        class="footer-l farm-name-text van-ellipsis"
-                                    >
-                                        来自<span class="name-text">{{ item.farmName || "--" }}</span>
-                                    </div>
-                                <div class="footer-r">
+                                <div class="footer-l farm-name-text van-ellipsis">
+                                    来自<span class="name-text">{{ item.farmName || "--" }}</span>
+                                </div>
+                                
+                                <div class="footer-r" v-if="item.reviewImage && item.reviewImage.length">
+                                    <div class="btn warning" @click="generateReport(item)">生成成果报告</div>
+                                </div>
+                                <div class="footer-r" v-else>
                                     <div class="btn primary" @click="handleAction(item)">上传复核照片</div>
                                 </div>
                             </div>
                             <div v-else-if="activeIndex === 1" class="item-footer">
-                                <div
-                                        class="footer-l farm-name-text van-ellipsis"
-                                    >
-                                        来自<span class="name-text">{{ item.farmName || "--" }}</span>
-                                    </div>
+                                <div class="footer-l farm-name-text van-ellipsis">
+                                    来自<span class="name-text">{{ item.farmName || "--" }}</span>
+                                </div>
                                 <div class="footer-r">
                                     <div class="btn warning" @click="generateReport(item)">生成成果报告</div>
                                 </div>
@@ -72,14 +72,10 @@
                             <div v-else-if="activeIndex === 0" class="item-footer">
                                 <div class="footer-l" @click="toDetail(item)">查看详情</div>
                                 <div class="footer-r" v-if="item.expectedExecuteDate">
-                                    <div class="btn primary" @click="showUploadExecutePopup(item)">
-                                        上传照片
-                                    </div>
+                                    <div class="btn primary" @click="showUploadExecutePopup(item)">上传照片</div>
                                 </div>
                                 <div class="footer-r" v-else>
-                                    <div class="btn warning" @click="selectExecuteTime(item)">
-                                        确认执行时间
-                                    </div>
+                                    <div class="btn warning" @click="selectExecuteTime(item)">确认执行时间</div>
                                 </div>
                             </div>
                         </template>
@@ -96,7 +92,13 @@
     <offer-popup ref="offerPopupRef" @uploadSuccess="handleUploadSuccess"></offer-popup>
 
     <!-- 确认执行时间 -->
-    <calendar teleport="#app" v-model:show="showCalendar" @confirm="onConfirmExecuteTime" :min-date="minDate" :max-date="maxDate" />
+    <calendar
+        teleport="#app"
+        v-model:show="showCalendar"
+        @confirm="onConfirmExecuteTime"
+        :min-date="minDate"
+        :max-date="maxDate"
+    />
 </template>
 
 <script setup>
@@ -281,10 +283,10 @@ function getSimpleList() {
         .then(({ data }) => {
             loading.value = false;
             // 假设返回的数据结构是 { list: [], total: 0 } 或者直接是数组
-            let filteredData = data
+            let filteredData = data;
 
             // 保存完整数据(用于日历显示)
-            if (activeIndex.value === 2) {
+            if (activeIndex.value === 0) {
                 // 如果是"待完成"状态,保存完整数据用于日历
                 fullTaskList.value = Array.isArray(data) ? data : [];
             }
@@ -305,11 +307,12 @@ function getSimpleList() {
                 if (activeIndex.value === 0) {
                     // 传递给日历的数据应该是完整的未筛选数据
                     const calendarData = filterDate.value ? fullTaskList.value : taskList.value;
+                    console.log('calendarData', calendarData);
                     calendarRef.value && calendarRef.value.setSolarTerm(calendarData);
                     // 地图使用筛选后的数据
                     indexMap.initData(taskList.value);
                 }
-            }else{
+            } else {
                 noData.value = true;
                 taskList.value = [];
                 taskCounts.value[activeIndex.value] = 0;
@@ -366,8 +369,8 @@ const handleDateSelect = (date) => {
 function handleActiveFilter(i) {
     activeIndex.value = i;
     // watch 会自动处理清除日期筛选和日历选中状态
-    selectParma.value.districtCode = cityCode.value
-    selectParma.value.farmWorkTypeId = null
+    selectParma.value.districtCode = cityCode.value;
+    selectParma.value.farmWorkTypeId = null;
 }
 
 function toPage(item) {
@@ -393,7 +396,6 @@ const showUploadExecutePopup = (item) => {
     offerPopupRef.value.openPopup(item);
 };
 
-
 const generateReport = (item) => {
     router.push({
         path: "/achievement_report",
@@ -424,15 +426,16 @@ const selectExecuteTime = (item) => {
 
 const onConfirmExecuteTime = (date) => {
     showCalendar.value = false;
-    VE_API.z_farm_work_record.updateExpectedExecuteDate({ recordId: executeItem.value.id, expectedExecuteDate: formatDate(date) }).then((res) => {
-        if (res.code === 0) {
-            ElMessage.success("操作成功");
-            getSimpleList();
-        }
-    });
+    VE_API.z_farm_work_record
+        .updateExpectedExecuteDate({ recordId: executeItem.value.id, expectedExecuteDate: formatDate(date) })
+        .then((res) => {
+            if (res.code === 0) {
+                ElMessage.success("操作成功");
+                getSimpleList();
+            }
+        });
 };
 
-
 const priceSheetPopupRef = ref(null);
 const showPriceSheetPopup = (item) => {
     VE_API.z_farm_work_record.getDetail({ id: item.id }).then(({ data }) => {
@@ -641,8 +644,7 @@ function handleForward(item) {
 </style>
 
 <style lang="scss">
-
 .van-calendar__popup {
     z-index: 9999 !important;
 }
-</style>
+</style>

+ 1 - 1
src/views/old_mini/task_condition/components/uploadExecute.vue

@@ -67,7 +67,7 @@ function handleConfirm() {
         recordId: farmWorkRecordId.value,
         executeEvidence: images.value,
     };
-    VE_API.z_farm_work_record.addExecuteImg(params).then((res) => {
+    VE_API.monitor.addReviewImg(params).then((res) => {
         if (res.code === 0) {
             ElMessage.success('您已上传成功');
             show.value = false;