|
|
@@ -7,25 +7,25 @@
|
|
|
完善作物品种以及物候信息,精准匹配种植方案,实现精细化管理
|
|
|
</div>
|
|
|
|
|
|
- <!-- 作物块 -->
|
|
|
- <div v-for="crop in crops" :key="crop.id" class="crop-section">
|
|
|
+ <!-- 作物块(每个农场一块) -->
|
|
|
+ <div v-for="(crop, cropIndex) in farmData" :key="cropIndex" class="crop-section">
|
|
|
<div class="crop-header">
|
|
|
- <div class="crop-tag">{{ crop.name }}</div>
|
|
|
+ <div class="crop-tag">{{ crop.speciesName }}</div>
|
|
|
<div class="add-btn" @click="addVariety(crop)">+ 新增品种</div>
|
|
|
</div>
|
|
|
|
|
|
- <div v-for="variety in crop.varieties" :key="variety.id" class="variety-card">
|
|
|
+ <div v-for="(region, regionIndex) in crop.regions" :key="regionIndex" class="variety-card">
|
|
|
<div class="field-row">
|
|
|
<div class="field-value">
|
|
|
<el-select
|
|
|
- v-model="variety.variety"
|
|
|
+ v-model="region.regionId"
|
|
|
class="variety-input"
|
|
|
placeholder="选择品种"
|
|
|
>
|
|
|
- <el-option v-for="item in varietyOptions" :key="item.value" :label="item.label"
|
|
|
- :value="item.value" />
|
|
|
+ <el-option v-for="(item, index) in crop.typeIdItems" :key="index" :label="item.name"
|
|
|
+ :value="item.id" />
|
|
|
<template #footer>
|
|
|
- <el-button text bg @click="onAddOption(variety)">
|
|
|
+ <el-button text bg @click="onAddOption(region)">
|
|
|
+ 增加品种
|
|
|
</el-button>
|
|
|
</template>
|
|
|
@@ -36,18 +36,26 @@
|
|
|
<div class="field-row">
|
|
|
<div class="field-label">当下物候期</div>
|
|
|
<div class="field-value">
|
|
|
- <el-select v-model="variety.currentStage" class="select-input" placeholder="选择物候期"
|
|
|
- >
|
|
|
- <el-option v-for="item in stageOptions" :key="item.value" :label="item.label"
|
|
|
- :value="item.value" />
|
|
|
+ <el-select
|
|
|
+ v-model="region.phenologyId"
|
|
|
+ class="select-input"
|
|
|
+ placeholder="选择物候期"
|
|
|
+ >
|
|
|
+ <el-option v-for="(item, index) in crop.phenologyOptions" :key="index" :label="item.phenologyName"
|
|
|
+ :value="item.phenologyId" />
|
|
|
</el-select>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="field-row">
|
|
|
- <div class="field-label">第一批花穗时间</div>
|
|
|
+ <div class="field-row" v-if="region.phenologyId">
|
|
|
+ <div class="field-label">{{ getPhenologyLabel(crop, region.phenologyId) }}</div>
|
|
|
<div class="field-value">
|
|
|
- <el-date-picker :editable="false" style="width: 100%" v-model="variety.firstFlowerDate" class="date-picker" type="date"
|
|
|
+ <el-date-picker
|
|
|
+ :editable="false"
|
|
|
+ style="width: 100%"
|
|
|
+ v-model="region.phenologyStartDate"
|
|
|
+ class="date-picker"
|
|
|
+ type="date"
|
|
|
placeholder="选择时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -86,70 +94,132 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import { ref, nextTick } from "vue";
|
|
|
+import { ref, nextTick, onActivated } from "vue";
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
import { Popup } from "vant";
|
|
|
import customHeader from "@/components/customHeader.vue";
|
|
|
import qrCodePopup from "@/components/popup/qrCodePopup.vue";
|
|
|
+import { useRoute } from "vue-router";
|
|
|
+
|
|
|
+const route = useRoute();
|
|
|
+
|
|
|
+onActivated(() => {
|
|
|
+ const subjectId = route.query.subjectId;
|
|
|
+ getPhenologyInitOrConfirmStatus(subjectId);
|
|
|
+});
|
|
|
|
|
|
-// 简单示例数据,后续可替换为接口返回
|
|
|
-const crops = ref([
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- name: "荔枝",
|
|
|
- varieties: [
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- variety: "",
|
|
|
- currentStage: "花穗期",
|
|
|
- firstFlowerDate: "",
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- name: "水稻",
|
|
|
- varieties: [
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- variety: "",
|
|
|
- currentStage: "花穗期",
|
|
|
- firstFlowerDate: "",
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
-]);
|
|
|
+const farmData = ref([])
|
|
|
+const getPhenologyInitOrConfirmStatus = async (subjectId) => {
|
|
|
+ const {data} = await VE_API.farm_v3.phenologyInitOrConfirmStatus({subjectId});
|
|
|
+ farmData.value = data.farms;
|
|
|
+ farmData.value.forEach(item => {
|
|
|
+ addVariety(item);
|
|
|
+ });
|
|
|
+}
|
|
|
|
|
|
const addVariety = (crop) => {
|
|
|
- const nextId = crop.varieties.length + 1;
|
|
|
- crop.varieties.push({
|
|
|
- id: nextId,
|
|
|
- variety: "",
|
|
|
- currentStage: "花穗期",
|
|
|
- firstFlowerDate: "",
|
|
|
+ if (!Array.isArray(crop.regions)) {
|
|
|
+ crop.regions = [];
|
|
|
+ }
|
|
|
+ crop.regions.push({
|
|
|
+ regionId: null,
|
|
|
+ phenologyId: null,
|
|
|
+ phenologyStartDate: "",
|
|
|
});
|
|
|
};
|
|
|
|
|
|
-// 品种下拉选项(示例)
|
|
|
-const varietyOptions = ref([
|
|
|
- { label: "桂味", value: "桂味" },
|
|
|
- { label: "糯米糍", value: "糯米糍" },
|
|
|
- { label: "妃子笑", value: "妃子笑" },
|
|
|
- { label: "井岗红糯", value: "井岗红糯" },
|
|
|
-]);
|
|
|
-
|
|
|
-// 物候期选项(示例)
|
|
|
-const stageOptions = ref([
|
|
|
- { label: "花穗期", value: "花穗期" },
|
|
|
- { label: "萌芽期", value: "萌芽期" },
|
|
|
- { label: "抽梢期", value: "抽梢期" },
|
|
|
- { label: "坐果期", value: "坐果期" },
|
|
|
-]);
|
|
|
+// 获取物候期对应的时间标签
|
|
|
+const getPhenologyLabel = (farm, phenologyId) => {
|
|
|
+ if (!farm?.phenologyOptions) return "选择时间";
|
|
|
+ const found = farm.phenologyOptions.find(
|
|
|
+ (item) => item.id === phenologyId || item.phenologyId === phenologyId
|
|
|
+ );
|
|
|
+ return found?.startDateLabel || "选择时间";
|
|
|
+};
|
|
|
|
|
|
const qrCodePopupRef = ref(null);
|
|
|
|
|
|
-const handleConfirm = () => {
|
|
|
- qrCodePopupRef.value.showPopup();
|
|
|
-}
|
|
|
+const handleConfirm = async () => {
|
|
|
+ // 组装为 initFarmData 接口所需的 farmDataList 结构
|
|
|
+ const farmDataList = farmData.value
|
|
|
+ .map((farm) => {
|
|
|
+ const typeIdItems = (farm.regions || [])
|
|
|
+ .filter(
|
|
|
+ (r) => r.regionId && r.phenologyId && r.phenologyStartDate
|
|
|
+ )
|
|
|
+ .map((r) => {
|
|
|
+ const origin =
|
|
|
+ (farm.typeIdItems || []).find(
|
|
|
+ (t) => String(t.id) === String(r.regionId)
|
|
|
+ ) || {};
|
|
|
+ return {
|
|
|
+ id: r.regionId,
|
|
|
+ name: origin.name || "",
|
|
|
+ phenologyId: r.phenologyId,
|
|
|
+ phenologyStartDate: r.phenologyStartDate,
|
|
|
+ };
|
|
|
+ })
|
|
|
+ .filter((item) => item.id);
|
|
|
+
|
|
|
+ return {
|
|
|
+ farmId: farm.farmId,
|
|
|
+ speciesId: farm.speciesId,
|
|
|
+ typeIdItems,
|
|
|
+ };
|
|
|
+ })
|
|
|
+ .filter((item) => item.typeIdItems.length > 0);
|
|
|
+
|
|
|
+ if (!farmDataList.length) {
|
|
|
+ ElMessage.warning("请先选择品种、物候期和时间");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ expertMiniUserId: 81881,
|
|
|
+ farmDataList,
|
|
|
+ };
|
|
|
+ console.log("params", params);
|
|
|
+
|
|
|
+ const { code, msg } = await VE_API.farm_v3.initFarmData(params);
|
|
|
+ if (code === 0) {
|
|
|
+ qrCodePopupRef.value.showPopup();
|
|
|
+ } else {
|
|
|
+ ElMessage.error(msg || "提交失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 大物候期转换所需参数// 组装为后端所需的 farmDataList 结构
|
|
|
+ // const farmDataList = farmData.value
|
|
|
+ // .map((farm) => {
|
|
|
+ // const regionPhenologyItems = (farm.regions || [])
|
|
|
+ // .filter(
|
|
|
+ // (r) => r.regionId && r.phenologyId && r.phenologyStartDate
|
|
|
+ // )
|
|
|
+ // .map((r) => ({
|
|
|
+ // regionId: r.regionId,
|
|
|
+ // phenologyId: r.phenologyId,
|
|
|
+ // phenologyStartDate: r.phenologyStartDate,
|
|
|
+ // }));
|
|
|
+
|
|
|
+ // return {
|
|
|
+ // farmId: farm.farmId,
|
|
|
+ // regionPhenologyItems,
|
|
|
+ // };
|
|
|
+ // })
|
|
|
+ // .filter((item) => item.regionPhenologyItems.length > 0);
|
|
|
+
|
|
|
+ // console.log("farmDataList", farmDataList);
|
|
|
+
|
|
|
+ // const params = {
|
|
|
+ // farmDataList,
|
|
|
+ // expertMiniUserId: 81881,
|
|
|
+ // }
|
|
|
+ // const {code, msg} = await VE_API.farm_v3.confirmReproductivePhenology(params);
|
|
|
+ // if(code === 0) {
|
|
|
+ // qrCodePopupRef.value.showPopup();
|
|
|
+ // } else {
|
|
|
+ // ElMessage.error(msg);
|
|
|
+ // }
|
|
|
+};
|
|
|
|
|
|
const showAddPopup = ref(false);
|
|
|
const newVarietyName = ref("");
|
|
|
@@ -159,8 +229,6 @@ const handleAddVariety = () => {
|
|
|
if (!newVarietyName.value.trim()) {
|
|
|
return;
|
|
|
}
|
|
|
- const newOption = { label: newVarietyName.value, value: newVarietyName.value };
|
|
|
- varietyOptions.value.push(newOption);
|
|
|
|
|
|
// 如果当前有正在添加品种的 variety,则自动选中新增的品种
|
|
|
if (currentVariety.value) {
|
|
|
@@ -172,7 +240,7 @@ const handleAddVariety = () => {
|
|
|
currentVariety.value = null;
|
|
|
}
|
|
|
|
|
|
-const onAddOption = async (variety) => {
|
|
|
+const onAddOption = async (region) => {
|
|
|
// 先关闭下拉菜单
|
|
|
if (document.activeElement) {
|
|
|
document.activeElement.blur();
|
|
|
@@ -181,8 +249,8 @@ const onAddOption = async (variety) => {
|
|
|
// 等待下拉菜单关闭后再显示弹窗
|
|
|
await nextTick();
|
|
|
|
|
|
- // 记录当前 variety
|
|
|
- currentVariety.value = variety;
|
|
|
+ // 记录当前 region
|
|
|
+ currentVariety.value = region;
|
|
|
showAddPopup.value = true;
|
|
|
}
|
|
|
|