Browse Source

fix: 对接农事详情

lxf 4 days ago
parent
commit
95a7f6f2f1

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

@@ -16,4 +16,9 @@ module.exports = {
         url: config.base_dev_url + "container/reproductiveReport/listLatestByFarmRegion",
         type: "get",
     },
+    // 添加执行图片并完成任务
+    addExecuteImgAndComplete: {
+        url: config.base_dev_url + "v2/z_farm_work_record/addExecuteImgAndComplete",
+        type: "post",
+    }
 }

+ 13 - 1
src/components/pageComponents/ArchivesFarmTimeLine.vue

@@ -162,6 +162,11 @@ const props = defineProps({
         type: [Number, String],
         default: null,
     },
+    // 类型ID
+    typeId: {
+        type: [Number, String],
+        default: null,
+    },
 });
 
 const farmWorkType = {
@@ -807,9 +812,16 @@ watch(
 );
 
 const handleStatusDetail = (fw) => {
+    console.log('fw', fw);
     router.push({
         path: props.pageType === 'agri_plan' ? "/agricultural_detail" : "/work_detail",
-        query: { farmId: props.farmId, regionId: props.regionId,date: fw?.createTime?.slice(0,10),farmWorkLibId: fw?.farmWorkLibId },
+        query: {
+            farmId: props.farmId,
+            regionId: props.regionId,
+            date: fw?.createTime?.slice(0,10),
+            farmWorkLibId: fw?.farmWorkLibId,
+            recordId: fw?.farmWorkRecordId,
+            typeId: props.typeId },
     });
 };
 

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

@@ -33,7 +33,7 @@
             </template>
             <div class="archives-time-line-content">
                 <archives-farm-time-line :farmId="farmIdData" :regionId="regionData" :containerId="containerData"
-                    pageType="agri_record"></archives-farm-time-line>
+                    pageType="agri_record" :typeId="currentVariety?.typeId"></archives-farm-time-line>
             </div>
         </div>
     </div>

+ 9 - 22
src/views/old_mini/work_detail/components/areaMap.js

@@ -34,7 +34,7 @@ class AreaMap {
                 let style3 = new Style({
                     text: new Text({
                         font: "14px sans-serif",
-                        text: f.get("mianji") + "亩",
+                        text: f.get("mianji") ? `${f.get("mianji")}亩` : "",
                         // offsetX: 28,
                         offsetY: 10,
                         fill: new Fill({ color: "#fff" }), // 字体颜色
@@ -82,30 +82,17 @@ class AreaMap {
         this.kmap.addLayer(this.clickPointLayer.layer);
     }
 
-    initLayer(item) {
-        // this.gardenPolygonLayer.refresh()
+    initLayer(rangeWkt) {
         if (this.gardenPolygonLayer.source) {
-            this.gardenPolygonLayer.source.clear()
+            this.gardenPolygonLayer.source.clear();
         }
-        if (item.pointWkt) {
-            let f = newPoint(item, "pointWkt")
-            f.set("name", item.name)
-            this.clickPointLayer.source.addFeature(f)
-        }
-        console.log('initLayer', item)
-        if (item.geomWkt) {
-            // let f = new Feature({
-            //     organId: item.organId, // 用于查找点击选中地块的编辑,有多个地块时用id筛选
-            //     geometry: new WKT().readGeometry(item.geomWkt)
-            // })
-            // let geometry = new WKT().readGeometry(item.geomWkt)
-            // geometry.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"))
-            let f = newAreaFeature(item, "geomWkt")
-            //   let area = getArea(geometry)
-            //   area = (area + area / 2) / 1000;
-            f.set("mianji", item.mianji)
-            this.gardenPolygonLayer.source.addFeature(f)
+        if (this.clickPointLayer.source) {
+            this.clickPointLayer.source.clear();
         }
+        if (!rangeWkt) return;
+
+        let f = newAreaFeature({ geomWkt: rangeWkt }, "geomWkt");
+        this.gardenPolygonLayer.source.addFeature(f);
         this.fitView()
     }
 

+ 21 - 12
src/views/old_mini/work_detail/components/executePopup.vue

@@ -14,7 +14,7 @@
             <div class="upload-wrap" :class="{ 'upload-cont': fileList.length }">
                 <div class="name">农事凭证</div>
                 <div class="sub-name">肥料使用照片或者执行照片</div>
-                <div class="tips-text">由于系统审核,您照片拍摄位置与农场相差超 3 公里,请在农场现场使用水印相机重新拍摄上传,谢谢配合</div>
+                <div class="tips-text" v-if="failImgs">由于系统审核,您照片拍摄位置与农场相差超 3 公里,请在农场现场使用水印相机重新拍摄上传,谢谢配合</div>
                 <uploader class="uploader" v-model="fileList" multiple :max-count="5" :after-read="afterRead"
                     @click="handleClick('rg')">
                     <img class="img" v-show="!fileList.length" src="@/assets/img/home/example-4.png" alt="" />
@@ -65,6 +65,7 @@ const props = defineProps({
 });
 
 const showValue = ref(false);
+const failImgs = ref(false);
 
 const fileList = ref([]);
 const fileArr = ref([]);
@@ -99,20 +100,27 @@ const afterRead = (file) => {
 
 function closeTask() {
     // stepIndex.value = 2
-    if (!fileArr.value.length) return ElMessage.warning('请上传至少两张图片')
+    if (!fileArr.value.length) return ElMessage.warning('请上传农事凭证')
     if (!executeTime.value) return ElMessage.warning('请选择实际执行时间')
-    console.log(fileArr.value, executeTime.value)
+    if (!serviceInput.value) return ElMessage.warning('请输入农资机构名称')
+    
     const params = {
-        // recordId: executionData.value.id,
+        recordId: recordId.value,
+        executorOrganizationName: serviceInput.value,
         executeDate: executeTime.value,
         executeEvidence: fileArr.value,
     }
-    // VE_API.z_farm_work_record.addExecuteImgAndComplete(params).then((res) => {
-    //     if (res.code === 0) {
-    //         ElMessage.success('上传成功')
-    //         showValue.value = false
-    //     }
-    // })
+    console.log('params', params)
+    VE_API.report.addExecuteImgAndComplete(params).then((res) => {
+        if (res.code === 0) {
+            ElMessage.success('操作成功')
+        } else {
+            ElMessage.error(res.msg)
+        }
+    }).catch((err) => {
+        console.log('err', err)
+        ElMessage.error('操作失败')
+    })
 }
 
 const handleClick = () => {
@@ -133,12 +141,13 @@ function showRemindPopup() {
 
 function handleRemind() {
     if (!remindTime.value) return ElMessage.warning('请选择下次提醒时间')
-    console.log(remindTime.value)
     showRemindValue.value = false;
 }
 
-function openPopup() {
+const recordId = ref(null);
+function openPopup(id) {
     showValue.value = true;
+    recordId.value = id;
 }
 
 defineExpose({

+ 7 - 11
src/views/old_mini/work_detail/components/mapInfo.vue

@@ -13,7 +13,7 @@ import IndexMap from "@/views/old_mini/home/map/index.js";
 import AreaMap from "./areaMap.js";
 
 const props = defineProps({
-    farmId: {
+    rangeWkt: {
         type: [Number, String],
         default: null,
     },
@@ -29,22 +29,18 @@ const areaMap = new AreaMap();
 
 // 加载农场地图信息
 const loadFarmMap = async () => {
-    // if (!props.farmId) return;
+    if (!props.rangeWkt) return;
 
     try {
-        const res = await VE_API.farm.getFarmDetail({ farmId: 98230 });
-        if (res.code !== 0 || !res.data) return;
-
-        const farmInfo = res.data;
-        const point = farmInfo.pointWkt;
+        const point = props.rangeWkt;
 
         nextTick(() => {
             // 如果地图已经初始化,则更新中心点和地块;否则初始化地图
             if (areaMap.kmap) {
-                areaMap.initLayer(farmInfo);
+                areaMap.initLayer(point);
             } else if (point && mapContainer.value) {
                 areaMap.initMap(point, mapContainer.value);
-                areaMap.initLayer(farmInfo);
+                areaMap.initLayer(point);
             }
         });
     } catch (e) {
@@ -56,9 +52,9 @@ onMounted(() => {
     loadFarmMap();
 });
 
-// farmId 变化时重新加载地图
+// rangeWkt 变化时重新加载地图
 watch(
-    () => props.farmId,
+    () => props.rangeWkt,
     () => {
         loadFarmMap();
     }

+ 30 - 37
src/views/old_mini/work_detail/index.vue

@@ -7,13 +7,13 @@
             <div class="content-status" :class="'status-' + detail?.flowStatus">
                 <div class="status-l">
                     <div class="status-title">{{ handleTagType(detail?.flowStatus) }}</div>
-                    <div class="status-sub" v-if="triggerDateText && detail?.flowStatus === 0">
+                    <div class="status-sub" v-if="triggerDateText && detail?.flowStatus == -1">
                         执行时间已经过去 {{ daysDiff }} 天了
                     </div>
-                    <div class="status-sub" v-if="detail?.flowStatus === 1">
+                    <div class="status-sub" v-if="detail?.flowStatus === 3">
                         距离执行时间还差 {{ daysDiff }} 天
                     </div>
-                    <div class="status-sub" v-if="!detail?.flowStatus || detail?.flowStatus === 2">
+                    <div class="status-sub" v-if="!detail?.flowStatus || detail?.flowStatus === 0">
                         预计触发时间 {{ detail?.activateTime ? formatDate(detail.activateTime) : "--" }}
                     </div>
                 </div>
@@ -21,9 +21,9 @@
 
             <div class="work-wrap">
                 <!-- 农事组信息 -->
-                <div class="box-wrap group-info group-box">
+                <div class="box-wrap group-info group-box" v-if="detail?.executionLimitDays">
                     <div class="group-name">
-                        该农事为 <span class="light-text">限时溯源农事</span> ,请在 <span class="light-text">3天内</span>
+                        该农事为 <span class="light-text">限时溯源农事</span> ,请在 <span class="light-text">{{detail?.executionLimitDays}}天内</span>
                         完成溯源认证上传,如果逾期未认证,该农事将不可溯源认证,且不计入飞鸟有味平台
                     </div>
                 </div>
@@ -39,21 +39,21 @@
                             <div class="form-item">
                                 <div class="item-name">农事目的</div>
                                 <div class="item-text">
-                                    {{ detail.purpose || prescription.name || "--" }}
+                                    {{ prescription.purpose || prescription.purposeName || "--" }}
                                 </div>
                             </div>
                             <div class="form-item">
                                 <div class="item-name">农事时间</div>
                                 <div class="item-text">
-                                    {{ detail.intervelTime ? `间隔 ${detail.intervelTime} 天后 执行` : "--" }}
+                                    {{ detail.executeDate || "--" }}
                                 </div>
                             </div>
                             <div class="form-item">
                                 <div class="item-name">执行区域</div>
                                 <div class="item-text light-text area-text">
-                                    桂味种植区域
-                                    <!-- <div class="area-btn" @click="handleViewArea">查看区域</div> -->
-                                    <div class="area-btn area-btn-right" @click="toDraw">建议勾选<el-icon><ArrowRight /></el-icon></div>
+                                    {{ detail?.executionRegion?.regionName }}种植区域
+                                    <div class="area-btn" v-if="detail?.executionRegion?.regionRange" @click="handleViewArea">查看区域</div>
+                                    <div class="area-btn area-btn-right" v-else @click="toDraw">建议勾选<el-icon><ArrowRight /></el-icon></div>
                                 </div>
                             </div>
                             <div class="form-item">
@@ -135,7 +135,7 @@
                     </div>
                 </div>
 
-                <div class="fixed-btn-wrap execute-action" v-if="info?.appType === 1 && detail?.flowStatus === 1">
+                <div class="fixed-btn-wrap execute-action" v-if="info?.appType === 1 && detail?.flowStatus === null">
                     <div class="action-item second" @click="handleConvert">转发农事</div>
                     <div class="action-item primary" @click="handleExecute">溯源认证</div>
                 </div>
@@ -149,7 +149,7 @@
     </div>
     <!-- 执行区域地图弹窗 -->
     <popup v-model:show="showMapPopup" closeable class="map-popup">
-        <map-info :farmId="detail.farmId" />
+        <map-info :rangeWkt="detail?.executionRegion?.regionRange" />
     </popup>
 </template>
 
@@ -173,7 +173,7 @@ const router = useRouter();
 // const info = JSON.parse(localStorage.getItem("localUserInfo") || "{}");
 const info = { appType: 1 };
 
-/** 接口根级与 detail 合并后的详情(兼容旧 groupList / 新 pesticideList、prescriptionList) */
+/** 接口根级与 detail 合并后的详情(pesticideList、prescriptionList) */
 const detail = ref({
     farmId: null,
     farmWorkLibId: null,
@@ -187,7 +187,6 @@ const detail = ref({
     remark: "",
     pesticideList: [],
     prescriptionList: [],
-    groupList: [],
     confirmPicture: [],
     executeEvidence: [],
     expertName: "",
@@ -214,7 +213,7 @@ const normalizeCropAlbum = (album) => {
 };
 
 /**
- * prescriptionList.pesticideFertilizerList → 与旧 groupList.pesticideList 一致(含 params 三行执行方式
+ * prescriptionList.pesticideFertilizerList → 含 params 三行执行方式
  */
 const mapFertilizerToPesticideItem = (f) => {
     if (!f || typeof f !== "object") return null;
@@ -282,6 +281,7 @@ const getDetail = () => {
             detail.value = {
                 ...inner,
                 post: data?.post ?? null,
+                executionRegion: data?.executionRegion ?? null,
                 expertNameFromFarmBasicInfo:
                     data?.expertNameFromFarmBasicInfo ?? "",
                 rangeWkt: data?.rangeWkt ?? null,
@@ -329,20 +329,17 @@ const triggerDateText = computed(() => {
 });
 
 /**
- * 展示用「分段」列表:旧数据用 groupList;新接口用 detail.pesticideList 或 prescriptionList 推导
+ * 展示用「分段」列表:detail.pesticideList 或 prescriptionList 推导
  */
 const stageList = computed(() => {
     const d = detail.value;
+    console.log("d", d);
     if (!d) return [];
 
-    if (Array.isArray(d.groupList) && d.groupList.length) {
-        return d.groupList;
-    }
-
     if (Array.isArray(d.pesticideList) && d.pesticideList.length) {
         return [
             {
-                name: d.farmWorkName || "",
+                ...d,
                 pesticideList: d.pesticideList,
                 cropAlbum: normalizeCropAlbum(
                     d.confirmPicture?.length
@@ -353,16 +350,6 @@ const stageList = computed(() => {
         ];
     }
 
-    if (Array.isArray(d.prescriptionList) && d.prescriptionList.length) {
-        return d.prescriptionList.map((p) => ({
-            name: p.name || "",
-            pesticideList: (p.pesticideFertilizerList || [])
-                .map(mapFertilizerToPesticideItem)
-                .filter(Boolean),
-            cropAlbum: normalizeCropAlbum(p.cropAlbum),
-        }));
-    }
-
     return [];
 });
 
@@ -378,10 +365,10 @@ const hasRemark = (prescription, stageIndex) => {
 };
 
 const handleTagType = (tagType) => {
-    if (tagType === 0) return "已过期";
-    if (tagType === 1) return "待认证";
-    if (tagType === 2) return "待触发";
-    if (tagType === 3) return "已完成";
+    if (tagType == 0) return "待触发";
+    if (tagType == -1) return "已过期";
+    if (tagType == 3) return "待认证";
+    if (tagType == 5) return "已完成";
     return "待触发"
 }
 
@@ -390,7 +377,7 @@ const handleExecute = () => {
     // wx.miniProgram.navigateTo({
     //     url: `/pages/subPages/location_check/index?lng=113.264435&lat=23.129163`,
     // });
-    executePopupRef.value.openPopup();
+    executePopupRef.value.openPopup(route.query.recordId);
 };
 
 
@@ -401,7 +388,13 @@ const handleViewArea = () => {
 }
 
 const toDraw = () => {
-    router.push("/draw_region");
+    router.push({
+        path: "/draw_area",
+        query: {
+            subjectId: localStorage.getItem('selectedFarmId'),
+            varietyId: route.query.typeId,
+        },
+    });
 }
 
 const handleBack = () => {