|
@@ -1,12 +1,12 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div class="diagnosis-report-page">
|
|
|
|
|
|
|
+ <div class="diagnosis-report-page" v-loading="loading">
|
|
|
<div class="diagnosis-header">
|
|
<div class="diagnosis-header">
|
|
|
<div class="diagnosis-header__title-row">
|
|
<div class="diagnosis-header__title-row">
|
|
|
<span class="diagnosis-header__title">种植报告</span>
|
|
<span class="diagnosis-header__title">种植报告</span>
|
|
|
<img class="diagnosis-header__icon" src="@/assets/img/report/star.png" alt="" />
|
|
<img class="diagnosis-header__icon" src="@/assets/img/report/star.png" alt="" />
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="diagnosis-header__desc">梅县区雁洋镇南福村的飞鸟智慧农业</div>
|
|
|
|
|
- <div class="diagnosis-header__base">梅州柚子基地</div>
|
|
|
|
|
|
|
+ <div class="diagnosis-header__desc">{{ headerDesc }}</div>
|
|
|
|
|
+ <div class="diagnosis-header__base">{{ headerBase }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="diagnosis-content">
|
|
<div class="diagnosis-content">
|
|
|
<div class="variety-bar">
|
|
<div class="variety-bar">
|
|
@@ -29,6 +29,7 @@
|
|
|
<span>基本信息</span>
|
|
<span>基本信息</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="base-data__body">
|
|
<div class="base-data__body">
|
|
|
|
|
+ <div v-if="!loading && !baseInfoList.length" class="base-data__empty">暂无基本信息</div>
|
|
|
<div v-for="item in baseInfoList" :key="item.key" class="base-info-item">
|
|
<div v-for="item in baseInfoList" :key="item.key" class="base-info-item">
|
|
|
<div class="base-info-item__row">
|
|
<div class="base-info-item__row">
|
|
|
<span class="base-info-item__label">{{ item.label }}</span>
|
|
<span class="base-info-item__label">{{ item.label }}</span>
|
|
@@ -62,6 +63,12 @@
|
|
|
</div>
|
|
</div>
|
|
|
<div class="report-panel">
|
|
<div class="report-panel">
|
|
|
<div class="report-panel__title">{{ activeReportTabMeta.label }}</div>
|
|
<div class="report-panel__title">{{ activeReportTabMeta.label }}</div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-if="activeReportHtml"
|
|
|
|
|
+ class="report-panel__body"
|
|
|
|
|
+ v-html="activeReportHtml"
|
|
|
|
|
+ ></div>
|
|
|
|
|
+ <div v-else class="report-panel__empty">暂无报告内容</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -77,8 +84,9 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { computed, ref } from "vue";
|
|
|
|
|
|
|
+import { computed, onActivated, onMounted, ref } from "vue";
|
|
|
import { useRouter } from "vue-router";
|
|
import { useRouter } from "vue-router";
|
|
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
import { Plus, Edit } from "@element-plus/icons-vue";
|
|
import { Plus, Edit } from "@element-plus/icons-vue";
|
|
|
import adjustPhenologyPopup from "../components/adjustPhenologyPopup.vue";
|
|
import adjustPhenologyPopup from "../components/adjustPhenologyPopup.vue";
|
|
|
import restingDatePopup from "../components/restingDatePopup.vue";
|
|
import restingDatePopup from "../components/restingDatePopup.vue";
|
|
@@ -89,61 +97,242 @@ import tab3Icon from "@/assets/img/report/tab-3.png";
|
|
|
import tab4Icon from "@/assets/img/report/tab-4.png";
|
|
import tab4Icon from "@/assets/img/report/tab-4.png";
|
|
|
import tab5Icon from "@/assets/img/report/tab-5.png";
|
|
import tab5Icon from "@/assets/img/report/tab-5.png";
|
|
|
|
|
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// Props / Emits — 无
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
-const varietyList = ref([
|
|
|
|
|
- { id: 1, name: "金柚" }
|
|
|
|
|
-]);
|
|
|
|
|
-const activeVarietyId = ref(1);
|
|
|
|
|
-const adjustPhenologyPopupRef = ref(null);
|
|
|
|
|
-const restingDatePopupRef = ref(null);
|
|
|
|
|
-const editPlantPointPopupRef = ref(null);
|
|
|
|
|
|
|
|
|
|
-/** 基本信息展示数据:后续可替换为接口 */
|
|
|
|
|
-const baseInfoList = ref([
|
|
|
|
|
- {
|
|
|
|
|
- key: "crop",
|
|
|
|
|
- label: "种植作物:",
|
|
|
|
|
- value: "柚子 — 金柚",
|
|
|
|
|
- actionInline: { key: "changeVariety", text: "更改品种" }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- key: "trait",
|
|
|
|
|
- label: "品种特质:",
|
|
|
|
|
- value: "金柚果大皮薄,果肉晶莹剔透,酸甜适中,富含维生素C和膳食纤维,具有清热解渴、健脾开胃的功效。其果皮可用于提取精油,果肉适合鲜食及加工成果汁、果酱等产品。"
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- key: "phenology",
|
|
|
|
|
- label: "物候信息:",
|
|
|
|
|
- value: "当前为果实膨大期,预计采收时间为2024年10月中旬。",
|
|
|
|
|
- actionInline: { key: "adjustPhenology", text: "调整物候" }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- key: "soil",
|
|
|
|
|
- label: "土壤条件:",
|
|
|
|
|
- value: "土壤pH值6.2,有机质含量2.8%,氮磷钾含量适中,土壤通气性和保水性良好,适合柚子生长。建议定期检测土壤养分,适时补充有机肥。",
|
|
|
|
|
- actionBlock: { key: "soilSense", text: "土壤感知" }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- key: "terrain",
|
|
|
|
|
- label: "地形条件:",
|
|
|
|
|
- value: "坡度8°,海拔185米,南向坡面,排水良好。",
|
|
|
|
|
- actionInline: { key: "editLocation", text: "修改定位" }
|
|
|
|
|
- }
|
|
|
|
|
-]);
|
|
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// 常量
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+/** module1_basic 字段标签 → 基本信息展示项 */
|
|
|
|
|
+const BASE_FIELD_META = [
|
|
|
|
|
+ { key: "crop", labels: ["作物品种", "种植作物"], label: "种植作物:", actionInline: { key: "changeVariety", text: "更改品种" } },
|
|
|
|
|
+ { key: "trait", labels: ["品种特质"], label: "品种特质:" },
|
|
|
|
|
+ { key: "phenology", labels: ["物候信息", "物候期"], label: "物候信息:", actionInline: { key: "adjustPhenology", text: "调整物候" } },
|
|
|
|
|
+ { key: "soil", labels: ["土壤条件"], label: "土壤条件:", actionBlock: { key: "soilSense", text: "土壤感知" } },
|
|
|
|
|
+ { key: "terrain", labels: ["地形条件"], label: "地形条件:", actionInline: { key: "editLocation", text: "修改定位" } },
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+/** Tab key → report/check 返回字段 */
|
|
|
|
|
+const REPORT_TAB_FIELD = {
|
|
|
|
|
+ weather: "module2_weather",
|
|
|
|
|
+ pest: "module3_pest",
|
|
|
|
|
+ quality: "module4_quality",
|
|
|
|
|
+ input: "module5_input",
|
|
|
|
|
+ manage: "module6_management",
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-/** 报告模块 Tab */
|
|
|
|
|
const reportTabs = [
|
|
const reportTabs = [
|
|
|
{ key: "weather", label: "气象风险", icon: tab1Icon },
|
|
{ key: "weather", label: "气象风险", icon: tab1Icon },
|
|
|
{ key: "pest", label: "病虫风险", icon: tab2Icon },
|
|
{ key: "pest", label: "病虫风险", icon: tab2Icon },
|
|
|
{ key: "quality", label: "品质潜力", icon: tab3Icon },
|
|
{ key: "quality", label: "品质潜力", icon: tab3Icon },
|
|
|
{ key: "input", label: "必要投入", icon: tab4Icon },
|
|
{ key: "input", label: "必要投入", icon: tab4Icon },
|
|
|
- { key: "manage", label: "农事管理", icon: tab5Icon }
|
|
|
|
|
|
|
+ { key: "manage", label: "农事管理", icon: tab5Icon },
|
|
|
];
|
|
];
|
|
|
|
|
+
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// 页面状态
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+const loading = ref(false);
|
|
|
|
|
+const varietyList = ref([]);
|
|
|
|
|
+const activeVarietyId = ref(null);
|
|
|
|
|
+const headerDesc = ref("");
|
|
|
|
|
+const headerBase = ref("");
|
|
|
|
|
+const baseInfoList = ref([]);
|
|
|
|
|
+/** 各 Tab 对应的 markdown 原文 */
|
|
|
|
|
+const moduleMarkdownMap = ref({});
|
|
|
const activeReportTab = ref("weather");
|
|
const activeReportTab = ref("weather");
|
|
|
|
|
+const adjustPhenologyPopupRef = ref(null);
|
|
|
|
|
+const restingDatePopupRef = ref(null);
|
|
|
|
|
+const editPlantPointPopupRef = ref(null);
|
|
|
|
|
+
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// 计算属性
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
const activeReportTabMeta = computed(
|
|
const activeReportTabMeta = computed(
|
|
|
() => reportTabs.find((tab) => tab.key === activeReportTab.value) || reportTabs[0]
|
|
() => reportTabs.find((tab) => tab.key === activeReportTab.value) || reportTabs[0]
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+const activeReportHtml = computed(() => {
|
|
|
|
|
+ const field = REPORT_TAB_FIELD[activeReportTab.value];
|
|
|
|
|
+ const md = moduleMarkdownMap.value[field] || "";
|
|
|
|
|
+ return md ? markdownToHtml(md) : "";
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// 工具函数
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+function getSelectedFarm() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return {};
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 解析 module1_basic 中 `**标签**:内容` 段落 */
|
|
|
|
|
+function parseBasicSections(markdown = "") {
|
|
|
|
|
+ const text = String(markdown).replace(/\r\n/g, "\n");
|
|
|
|
|
+ const sections = {};
|
|
|
|
|
+ const re = /\*\*([^*]+)\*\*[::]\s*/g;
|
|
|
|
|
+ const matches = [...text.matchAll(re)];
|
|
|
|
|
+ matches.forEach((match, index) => {
|
|
|
|
|
+ const label = String(match[1] || "").trim();
|
|
|
|
|
+ const start = match.index + match[0].length;
|
|
|
|
|
+ const end = index + 1 < matches.length ? matches[index + 1].index : text.length;
|
|
|
|
|
+ sections[label] = text.slice(start, end).trim();
|
|
|
|
|
+ });
|
|
|
|
|
+ return sections;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function findSectionValue(sections, labels) {
|
|
|
|
|
+ for (const label of labels) {
|
|
|
|
|
+ if (sections[label]) return sections[label];
|
|
|
|
|
+ }
|
|
|
|
|
+ return "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 轻量 markdown → HTML(标题 / 粗体 / 列表) */
|
|
|
|
|
+function markdownToHtml(markdown = "") {
|
|
|
|
|
+ const escapeHtml = (str) =>
|
|
|
|
|
+ String(str)
|
|
|
|
|
+ .replace(/&/g, "&")
|
|
|
|
|
+ .replace(/</g, "<")
|
|
|
|
|
+ .replace(/>/g, ">");
|
|
|
|
|
+
|
|
|
|
|
+ const lines = String(markdown).replace(/\r\n/g, "\n").split("\n");
|
|
|
|
|
+ const html = [];
|
|
|
|
|
+ let inList = false;
|
|
|
|
|
+
|
|
|
|
|
+ const flushList = () => {
|
|
|
|
|
+ if (!inList) return;
|
|
|
|
|
+ html.push("</ul>");
|
|
|
|
|
+ inList = false;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const inline = (str) =>
|
|
|
|
|
+ escapeHtml(str).replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
|
|
|
|
|
+
|
|
|
|
|
+ lines.forEach((raw) => {
|
|
|
|
|
+ const line = raw.trimEnd();
|
|
|
|
|
+ const trimmed = line.trim();
|
|
|
|
|
+ if (!trimmed) {
|
|
|
|
|
+ flushList();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (/^###\s+/.test(trimmed)) {
|
|
|
|
|
+ flushList();
|
|
|
|
|
+ html.push(`<h4>${inline(trimmed.replace(/^###\s+/, ""))}</h4>`);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (/^##\s+/.test(trimmed)) {
|
|
|
|
|
+ flushList();
|
|
|
|
|
+ html.push(`<h3>${inline(trimmed.replace(/^##\s+/, ""))}</h3>`);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (/^#\s+/.test(trimmed)) {
|
|
|
|
|
+ flushList();
|
|
|
|
|
+ html.push(`<h2>${inline(trimmed.replace(/^#\s+/, ""))}</h2>`);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (/^[-*]\s+/.test(trimmed)) {
|
|
|
|
|
+ if (!inList) {
|
|
|
|
|
+ html.push("<ul>");
|
|
|
|
|
+ inList = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ html.push(`<li>${inline(trimmed.replace(/^[-*]\s+/, ""))}</li>`);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ flushList();
|
|
|
|
|
+ html.push(`<p>${inline(trimmed)}</p>`);
|
|
|
|
|
+ });
|
|
|
|
|
+ flushList();
|
|
|
|
|
+ return html.join("");
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function buildBaseInfoList(sections) {
|
|
|
|
|
+ return BASE_FIELD_META.map((meta) => ({
|
|
|
|
|
+ key: meta.key,
|
|
|
|
|
+ label: meta.label,
|
|
|
|
|
+ value: findSectionValue(sections, meta.labels) || "—",
|
|
|
|
|
+ actionInline: meta.actionInline,
|
|
|
|
|
+ actionBlock: meta.actionBlock,
|
|
|
|
|
+ }));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function applyReportData(report, farm) {
|
|
|
|
|
+ const region = report.region || farm.rawAddress || farm.farm_address || farm.city || "";
|
|
|
|
|
+ const farmName = farm.farm_name || farm.name || "";
|
|
|
|
|
+ headerDesc.value = region ? `${region}的飞鸟智慧农业` : "飞鸟智慧农业";
|
|
|
|
|
+ headerBase.value = farmName || "我的基地";
|
|
|
|
|
+
|
|
|
|
|
+ const cropName = report.variety || report.crop || farm.variety_name || farm.categoryLabel || "作物";
|
|
|
|
|
+ varietyList.value = [{ id: report.id || 1, name: cropName }];
|
|
|
|
|
+ activeVarietyId.value = varietyList.value[0].id;
|
|
|
|
|
+
|
|
|
|
|
+ const sections = parseBasicSections(report.module1_basic || "");
|
|
|
|
|
+ baseInfoList.value = buildBaseInfoList(sections);
|
|
|
|
|
+
|
|
|
|
|
+ moduleMarkdownMap.value = {
|
|
|
|
|
+ module2_weather: report.module2_weather || "",
|
|
|
|
|
+ module3_pest: report.module3_pest || "",
|
|
|
|
|
+ module4_quality: report.module4_quality || "",
|
|
|
|
|
+ module5_input: report.module5_input || "",
|
|
|
|
|
+ module6_management: report.module6_management || "",
|
|
|
|
|
+ };
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function resetReportView(farm = {}) {
|
|
|
|
|
+ headerDesc.value = farm.rawAddress || farm.farm_address || farm.city
|
|
|
|
|
+ ? `${farm.rawAddress || farm.farm_address || farm.city}的飞鸟智慧农业`
|
|
|
|
|
+ : "飞鸟智慧农业";
|
|
|
|
|
+ headerBase.value = farm.farm_name || farm.name || "我的基地";
|
|
|
|
|
+ varietyList.value = [];
|
|
|
|
|
+ activeVarietyId.value = null;
|
|
|
|
|
+ baseInfoList.value = [];
|
|
|
|
|
+ moduleMarkdownMap.value = {};
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// 业务逻辑:加载报告
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+async function fetchDiagnosisReport() {
|
|
|
|
|
+ const farm = getSelectedFarm();
|
|
|
|
|
+ const farmId = farm.farm_id ?? farm.id;
|
|
|
|
|
+ const zoneId = farm.zone_id ?? farm.zoneId;
|
|
|
|
|
+ if (farmId == null || farmId === "" || zoneId == null || zoneId === "") {
|
|
|
|
|
+ resetReportView(farm);
|
|
|
|
|
+ ElMessage.warning("请先选择农场与分区");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ loading.value = true;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const raw = await VE_API.questionnaire.checkReportGenerated({
|
|
|
|
|
+ farm_id: farmId,
|
|
|
|
|
+ zone_id: zoneId,
|
|
|
|
|
+ });
|
|
|
|
|
+ const res = Array.isArray(raw) ? raw[0] : raw;
|
|
|
|
|
+ const report = res?.data?.report;
|
|
|
|
|
+ if (res?.code === 200 && report) {
|
|
|
|
|
+ applyReportData(report, farm);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ resetReportView(farm);
|
|
|
|
|
+ ElMessage.warning(res?.msg || res?.message || "暂无诊断报告");
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error("fetchDiagnosisReport failed", error);
|
|
|
|
|
+ resetReportView(farm);
|
|
|
|
|
+ ElMessage.error("报告加载失败");
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ loading.value = false;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// 事件处理 / 生命周期
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
const handleBaseAction = (key) => {
|
|
const handleBaseAction = (key) => {
|
|
|
if (key === "adjustPhenology") {
|
|
if (key === "adjustPhenology") {
|
|
|
adjustPhenologyPopupRef.value?.open();
|
|
adjustPhenologyPopupRef.value?.open();
|
|
@@ -157,12 +346,10 @@ const handleBaseAction = (key) => {
|
|
|
router.push("/soil_sense");
|
|
router.push("/soil_sense");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- // 后续接入对应弹窗 / 跳转
|
|
|
|
|
console.log("base action:", key);
|
|
console.log("base action:", key);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handlePhenologyConfirm = (payload) => {
|
|
const handlePhenologyConfirm = (payload) => {
|
|
|
- // 物候弹窗确认后,接着弹出历史开花/播种时间弹窗
|
|
|
|
|
restingDatePopupRef.value?.open(payload);
|
|
restingDatePopupRef.value?.open(payload);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -171,14 +358,16 @@ const handleSwitchGrowing = () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleRestingDateConfirm = (payload) => {
|
|
const handleRestingDateConfirm = (payload) => {
|
|
|
- // 后续接入接口保存
|
|
|
|
|
console.log("resting date confirm:", payload);
|
|
console.log("resting date confirm:", payload);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handlePlantPointConfirm = (payload) => {
|
|
const handlePlantPointConfirm = (payload) => {
|
|
|
- // 后续接入接口保存
|
|
|
|
|
console.log("plant point confirm:", payload);
|
|
console.log("plant point confirm:", payload);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+// onMounted(fetchDiagnosisReport);
|
|
|
|
|
+// tabbar 切换时组件被 keep-alive 缓存,需在激活时重新拉报告
|
|
|
|
|
+onActivated(fetchDiagnosisReport);
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
@@ -261,7 +450,8 @@ const handlePlantPointConfirm = (payload) => {
|
|
|
.base-data {
|
|
.base-data {
|
|
|
margin: 10px 0;
|
|
margin: 10px 0;
|
|
|
padding: 5px;
|
|
padding: 5px;
|
|
|
- min-height: 382px;
|
|
|
|
|
|
|
+ // min-height: 382px;
|
|
|
|
|
+ min-height: auto;
|
|
|
background: url("@/assets/img/report/base-bg.png") no-repeat center top / 100% 100%;
|
|
background: url("@/assets/img/report/base-bg.png") no-repeat center top / 100% 100%;
|
|
|
box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
|
|
|
|
|
@@ -289,6 +479,13 @@ const handlePlantPointConfirm = (payload) => {
|
|
|
background: #fff;
|
|
background: #fff;
|
|
|
border-radius: 8px;
|
|
border-radius: 8px;
|
|
|
|
|
|
|
|
|
|
+ .base-data__empty {
|
|
|
|
|
+ padding: 20px 0;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.base-info-item {
|
|
.base-info-item {
|
|
|
margin-bottom: 8px;
|
|
margin-bottom: 8px;
|
|
|
&__row {
|
|
&__row {
|
|
@@ -402,6 +599,61 @@ const handlePlantPointConfirm = (payload) => {
|
|
|
z-index: -1;
|
|
z-index: -1;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ &__empty {
|
|
|
|
|
+ margin-top: 14px;
|
|
|
|
|
+ padding: 24px 0;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &__body {
|
|
|
|
|
+ margin-top: 12px;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ line-height: 1.7;
|
|
|
|
|
+ word-break: break-word;
|
|
|
|
|
+
|
|
|
|
|
+ :deep(h2) {
|
|
|
|
|
+ margin: 0 0 10px;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #1d2129;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(h3) {
|
|
|
|
|
+ margin: 14px 0 8px;
|
|
|
|
|
+ font-size: 15px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #1d2129;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(h4) {
|
|
|
|
|
+ margin: 12px 0 6px;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #4e5969;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(p) {
|
|
|
|
|
+ margin: 0 0 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(ul) {
|
|
|
|
|
+ margin: 0 0 10px;
|
|
|
|
|
+ padding-left: 18px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(li) {
|
|
|
|
|
+ margin-bottom: 4px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(strong) {
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #1d2129;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|