|
@@ -1,9 +1,9 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div class="select-equipment">
|
|
|
|
|
|
|
+ <div class="select-equipment" :class="{ 'is-service-equipment': isService }">
|
|
|
<div class="select-equipment__content">
|
|
<div class="select-equipment__content">
|
|
|
<div class="page-header">
|
|
<div class="page-header">
|
|
|
- <div class="page-title">请填写您的农场设备</div>
|
|
|
|
|
- <div class="page-subtitle">完善设备信息,让农机调度更精准</div>
|
|
|
|
|
|
|
+ <div class="page-title">{{ pageTitle }}</div>
|
|
|
|
|
+ <div class="page-subtitle">{{ pageSubtitle }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="toolbar">
|
|
<div class="toolbar">
|
|
@@ -24,9 +24,10 @@
|
|
|
<div class="equipment-list" v-loading="loading">
|
|
<div class="equipment-list" v-loading="loading">
|
|
|
<div v-for="group in displayGroups" :key="group.name" class="equipment-card">
|
|
<div v-for="group in displayGroups" :key="group.name" class="equipment-card">
|
|
|
<div class="section-title">
|
|
<div class="section-title">
|
|
|
- <span class="title-icon"></span>
|
|
|
|
|
|
|
+ <img class="title-icon" src="@/assets/img/home/label-icon.png" alt="" />
|
|
|
<span>{{ group.name }}</span>
|
|
<span>{{ group.name }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div v-if="group.desc" class="section-desc">{{ group.desc }}</div>
|
|
|
<div class="tag-group">
|
|
<div class="tag-group">
|
|
|
<div
|
|
<div
|
|
|
v-for="item in group.items"
|
|
v-for="item in group.items"
|
|
@@ -46,12 +47,17 @@
|
|
|
<div class="custom-bottom-fixed-btns">
|
|
<div class="custom-bottom-fixed-btns">
|
|
|
<div class="btns-l">
|
|
<div class="btns-l">
|
|
|
<div class="bottom-btn secondary-btn" @click="emit('prev')">上一步</div>
|
|
<div class="bottom-btn secondary-btn" @click="emit('prev')">上一步</div>
|
|
|
- <div class="bottom-btn secondary-btn" :class="{ disabled: submitting }" @click="handleSkip">
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-if="isLastStep && !isService"
|
|
|
|
|
+ class="bottom-btn secondary-btn"
|
|
|
|
|
+ :class="{ disabled: submitting }"
|
|
|
|
|
+ @click="handleSkip"
|
|
|
|
|
+ >
|
|
|
跳过
|
|
跳过
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="bottom-btn primary-btn" :class="{ disabled: submitting }" @click="handleSubmit">
|
|
<div class="bottom-btn primary-btn" :class="{ disabled: submitting }" @click="handleSubmit">
|
|
|
- {{ submitting ? "提交中..." : "提交信息" }}
|
|
|
|
|
|
|
+ {{ primaryBtnText }}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -64,8 +70,8 @@
|
|
|
<tip-popup
|
|
<tip-popup
|
|
|
v-model:show="showSuccessPopup"
|
|
v-model:show="showSuccessPopup"
|
|
|
type="executeSuccess"
|
|
type="executeSuccess"
|
|
|
- text="您的信息已上传"
|
|
|
|
|
- text2="请等待诊断报告生成"
|
|
|
|
|
|
|
+ :text="isService ? '您的信息已提交成功' : '您的信息已上传'"
|
|
|
|
|
+ :text2="isService ? '' : '请等待诊断报告生成'"
|
|
|
buttonText="完成"
|
|
buttonText="完成"
|
|
|
@confirm="handleComplete"
|
|
@confirm="handleComplete"
|
|
|
/>
|
|
/>
|
|
@@ -80,9 +86,16 @@ import { Search } from "@element-plus/icons-vue";
|
|
|
import addMachinePopup from "./addMachinePopup.vue";
|
|
import addMachinePopup from "./addMachinePopup.vue";
|
|
|
import tipPopup from "@/components/popup/tipPopup.vue";
|
|
import tipPopup from "@/components/popup/tipPopup.vue";
|
|
|
|
|
|
|
|
-const emit = defineEmits(["prev", "confirm"]);
|
|
|
|
|
|
|
+const emit = defineEmits(["prev", "next", "confirm"]);
|
|
|
|
|
+const props = defineProps({
|
|
|
|
|
+ isService: { type: Boolean, default: false },
|
|
|
|
|
+ isLastStep: { type: Boolean, default: true },
|
|
|
|
|
+ equipmentScope: { type: String, default: "" },
|
|
|
|
|
+ totalSteps: { type: Number, default: 4 },
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
const EQUIPMENT_KEY = "ENTRY_SELECTED_EQUIPMENT";
|
|
const EQUIPMENT_KEY = "ENTRY_SELECTED_EQUIPMENT";
|
|
|
|
|
+const TASK_KEY = "ENTRY_SELECTED_FARM_TASKS";
|
|
|
const SELECTED_LIST_KEY = "ENTRY_SELECTED_VARIETY_LIST";
|
|
const SELECTED_LIST_KEY = "ENTRY_SELECTED_VARIETY_LIST";
|
|
|
const CATEGORY_SESSION_KEY = "ENTRY_SELECTED_CATEGORY";
|
|
const CATEGORY_SESSION_KEY = "ENTRY_SELECTED_CATEGORY";
|
|
|
const LOCATION_KEY = "ENTRY_RESIDENT_LOCATION";
|
|
const LOCATION_KEY = "ENTRY_RESIDENT_LOCATION";
|
|
@@ -134,6 +147,99 @@ const DEFAULT_GROUPS = [
|
|
|
},
|
|
},
|
|
|
];
|
|
];
|
|
|
|
|
|
|
|
|
|
+const FIELD_GROUPS = [
|
|
|
|
|
+ {
|
|
|
|
|
+ name: "耕地(整地、施肥、撒肥、中耕等)",
|
|
|
|
|
+ items: [
|
|
|
|
|
+ { id: 1001, name: "大中型拖拉机" },
|
|
|
|
|
+ { id: 1002, name: "手扶拖拉机" },
|
|
|
|
|
+ { id: 1003, name: "旋耕机" },
|
|
|
|
|
+ { id: 1004, name: "微耕机" },
|
|
|
|
|
+ { id: 1005, name: "挖掘机" },
|
|
|
|
|
+ { id: 1006, name: "培土机" },
|
|
|
|
|
+ { id: 1007, name: "撒肥机" },
|
|
|
|
|
+ { id: 1008, name: "秸秆还田机" },
|
|
|
|
|
+ { id: 1009, name: "开沟机" },
|
|
|
|
|
+ { id: 1010, name: "水田打浆机" },
|
|
|
|
|
+ { id: 1011, name: "深松机" },
|
|
|
|
|
+ { id: 1012, name: "起垄机" },
|
|
|
|
|
+ { id: 1013, name: "甘蔗开行机" },
|
|
|
|
|
+ { id: 1014, name: "棉花拔杆机" },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: "种(播种、育秧、移栽、补苗等)",
|
|
|
|
|
+ items: [
|
|
|
|
|
+ { id: 2001, name: "插秧机" },
|
|
|
|
|
+ { id: 2002, name: "一体育秧机" },
|
|
|
|
|
+ { id: 2003, name: "播种机" },
|
|
|
|
|
+ { id: 2004, name: "移栽机" },
|
|
|
|
|
+ { id: 2005, name: "无人机播种" },
|
|
|
|
|
+ { id: 2006, name: "小麦/玉米精量播种机" },
|
|
|
|
|
+ { id: 2007, name: "免耕播种机" },
|
|
|
|
|
+ { id: 2008, name: "花生覆膜播种机" },
|
|
|
|
|
+ { id: 2009, name: "马铃薯播种机" },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: "收(收割、烘干、运输等)",
|
|
|
|
|
+ items: [
|
|
|
|
|
+ { id: 3001, name: "联合收割机" },
|
|
|
|
|
+ { id: 3002, name: "半喂入收割机" },
|
|
|
|
|
+ { id: 3003, name: "玉米联合收割机" },
|
|
|
|
|
+ { id: 3004, name: "水稻收割机" },
|
|
|
|
|
+ { id: 3005, name: "烘干机" },
|
|
|
|
|
+ { id: 3006, name: "运粮车" },
|
|
|
|
|
+ { id: 3007, name: "挂车" },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+const FRUIT_GROUPS = [
|
|
|
|
|
+ {
|
|
|
|
|
+ name: "土壤与园地管理",
|
|
|
|
|
+ desc: "(整地、除草、清园、开沟修渠等)",
|
|
|
|
|
+ items: [
|
|
|
|
|
+ { id: 4001, name: "旋耕机" },
|
|
|
|
|
+ { id: 4002, name: "微耕机" },
|
|
|
|
|
+ { id: 4003, name: "挖掘机" },
|
|
|
|
|
+ { id: 4004, name: "旋耕开沟机" },
|
|
|
|
|
+ { id: 4005, name: "割草机" },
|
|
|
|
|
+ { id: 4006, name: "清沟机" },
|
|
|
|
|
+ { id: 4007, name: "运输车" },
|
|
|
|
|
+ { id: 4008, name: "开沟施肥机" },
|
|
|
|
|
+ { id: 4009, name: "树盘管理机" },
|
|
|
|
|
+ { id: 4010, name: "行间除草机" },
|
|
|
|
|
+ { id: 4011, name: "生草播种机" },
|
|
|
|
|
+ { id: 4012, name: "压草机" },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: "肥水管理",
|
|
|
|
|
+ desc: "(施肥、灌水、灌药等)",
|
|
|
|
|
+ items: [
|
|
|
|
|
+ { id: 5001, name: "水肥一体化" },
|
|
|
|
|
+ { id: 5002, name: "滴灌系统" },
|
|
|
|
|
+ { id: 5003, name: "注肥/注药泵" },
|
|
|
|
|
+ { id: 5004, name: "施肥枪" },
|
|
|
|
|
+ { id: 5005, name: "移动水车" },
|
|
|
|
|
+ { id: 5006, name: "水泵" },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: "植保打药",
|
|
|
|
|
+ desc: "(冠层打药、内膛打药等)",
|
|
|
|
|
+ items: [
|
|
|
|
|
+ { id: 6001, name: "植保无人机" },
|
|
|
|
|
+ { id: 6002, name: "风送式喷雾机" },
|
|
|
|
|
+ { id: 6003, name: "背负式喷雾器" },
|
|
|
|
|
+ { id: 6004, name: "柴油喷药机" },
|
|
|
|
|
+ { id: 6005, name: "烟雾机" },
|
|
|
|
|
+ { id: 6006, name: "高架喷雾机" },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
const displayGroups = computed(() => {
|
|
const displayGroups = computed(() => {
|
|
|
const keyword = (appliedKeyword.value || "").trim();
|
|
const keyword = (appliedKeyword.value || "").trim();
|
|
|
if (!keyword) return equipmentGroups.value;
|
|
if (!keyword) return equipmentGroups.value;
|
|
@@ -153,6 +259,17 @@ const allEquipmentItems = computed(() =>
|
|
|
equipmentGroups.value.flatMap((group) => group.items)
|
|
equipmentGroups.value.flatMap((group) => group.items)
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+const pageTitle = computed(() =>
|
|
|
|
|
+ props.isService ? "完善设备信息" : "请填写您的农场设备"
|
|
|
|
|
+);
|
|
|
|
|
+const pageSubtitle = computed(() =>
|
|
|
|
|
+ props.isService ? "让农机调度更精准(可多选)" : "完善设备信息,让农机调度更精准"
|
|
|
|
|
+);
|
|
|
|
|
+const primaryBtnText = computed(() => {
|
|
|
|
|
+ if (submitting.value) return "提交中...";
|
|
|
|
|
+ return props.isLastStep ? "提交信息" : `下一步 (3/${props.isService ? props.totalSteps : 4})`;
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
function readJson(key) {
|
|
function readJson(key) {
|
|
|
try {
|
|
try {
|
|
|
const raw = sessionStorage.getItem(key);
|
|
const raw = sessionStorage.getItem(key);
|
|
@@ -162,25 +279,84 @@ function readJson(key) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function cloneGroups(groups) {
|
|
|
|
|
+ return groups.map((group) => ({
|
|
|
|
|
+ name: group.name,
|
|
|
|
|
+ desc: group.desc || "",
|
|
|
|
|
+ items: group.items.map((item) => ({ ...item })),
|
|
|
|
|
+ }));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function flattenEquipment(cached) {
|
|
|
|
|
+ if (!cached) return [];
|
|
|
|
|
+ if (Array.isArray(cached)) return cached;
|
|
|
|
|
+ return [...(cached.field || []), ...(cached.fruit || [])];
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function getScopeList(cached, scope) {
|
|
|
|
|
+ if (!cached) return [];
|
|
|
|
|
+ if (Array.isArray(cached)) return scope === "fruit" ? [] : cached;
|
|
|
|
|
+ return cached[scope] || [];
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function getCurrentScope() {
|
|
|
|
|
+ if (props.equipmentScope === "fruit") return "fruit";
|
|
|
|
|
+ if (props.equipmentScope === "field") return "field";
|
|
|
|
|
+ return "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function restoreSelection() {
|
|
function restoreSelection() {
|
|
|
const cached = readJson(EQUIPMENT_KEY);
|
|
const cached = readJson(EQUIPMENT_KEY);
|
|
|
- if (!Array.isArray(cached)) return;
|
|
|
|
|
- cached.forEach((item) => {
|
|
|
|
|
- if (item?.id != null) selectedIds.add(String(item.id));
|
|
|
|
|
|
|
+ const scope = getCurrentScope();
|
|
|
|
|
+ const list = scope ? getScopeList(cached, scope) : flattenEquipment(cached);
|
|
|
|
|
+ list.forEach((item) => {
|
|
|
|
|
+ if (item?.id == null) return;
|
|
|
|
|
+ selectedIds.add(String(item.id));
|
|
|
|
|
+ if (!item.custom) return;
|
|
|
|
|
+ const exists = allEquipmentItems.value.some((row) => String(row.id) === String(item.id));
|
|
|
|
|
+ if (exists) return;
|
|
|
|
|
+ let group = equipmentGroups.value.find((row) => row.name === item.groupName);
|
|
|
|
|
+ if (!group) group = equipmentGroups.value[equipmentGroups.value.length - 1];
|
|
|
|
|
+ if (group) {
|
|
|
|
|
+ group.items.push({ id: item.id, name: item.name, custom: true });
|
|
|
|
|
+ }
|
|
|
|
|
+ if (Number(item.id) >= customMachineId) customMachineId = Number(item.id);
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function saveSelectionDraft() {
|
|
function saveSelectionDraft() {
|
|
|
- const selected = allEquipmentItems.value.filter((item) =>
|
|
|
|
|
- selectedIds.has(String(item.id))
|
|
|
|
|
- );
|
|
|
|
|
- sessionStorage.setItem(EQUIPMENT_KEY, JSON.stringify(selected));
|
|
|
|
|
|
|
+ const scope = getCurrentScope();
|
|
|
|
|
+ const selected = allEquipmentItems.value
|
|
|
|
|
+ .filter((item) => selectedIds.has(String(item.id)))
|
|
|
|
|
+ .map((item) => {
|
|
|
|
|
+ const group = equipmentGroups.value.find((row) =>
|
|
|
|
|
+ row.items.some((rowItem) => String(rowItem.id) === String(item.id))
|
|
|
|
|
+ );
|
|
|
|
|
+ return { ...item, scope: scope || "farmer", groupName: group?.name };
|
|
|
|
|
+ });
|
|
|
|
|
+ if (!props.isService) {
|
|
|
|
|
+ sessionStorage.setItem(EQUIPMENT_KEY, JSON.stringify(selected));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ const cached = readJson(EQUIPMENT_KEY);
|
|
|
|
|
+ const next = {
|
|
|
|
|
+ field: Array.isArray(cached) ? cached : cached?.field || [],
|
|
|
|
|
+ fruit: Array.isArray(cached) ? [] : cached?.fruit || [],
|
|
|
|
|
+ };
|
|
|
|
|
+ if (scope === "fruit") next.fruit = selected;
|
|
|
|
|
+ else next.field = selected;
|
|
|
|
|
+ sessionStorage.setItem(EQUIPMENT_KEY, JSON.stringify(next));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function fetchEquipmentList() {
|
|
function fetchEquipmentList() {
|
|
|
loading.value = true;
|
|
loading.value = true;
|
|
|
- // 暂无农机列表接口,使用本地默认数据
|
|
|
|
|
- equipmentGroups.value = DEFAULT_GROUPS;
|
|
|
|
|
|
|
+ if (!props.isService) {
|
|
|
|
|
+ equipmentGroups.value = cloneGroups(DEFAULT_GROUPS);
|
|
|
|
|
+ } else if (props.equipmentScope === "fruit") {
|
|
|
|
|
+ equipmentGroups.value = cloneGroups(FRUIT_GROUPS);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ equipmentGroups.value = cloneGroups(FIELD_GROUPS);
|
|
|
|
|
+ }
|
|
|
loading.value = false;
|
|
loading.value = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -240,13 +416,19 @@ function getPhenophaseLabel(item) {
|
|
|
function buildPlotPayload(includeEquipment = true) {
|
|
function buildPlotPayload(includeEquipment = true) {
|
|
|
const baForm = readJson("ENTRY_BA_FORM") || {};
|
|
const baForm = readJson("ENTRY_BA_FORM") || {};
|
|
|
const varietyList = getVarietyDraftList();
|
|
const varietyList = getVarietyDraftList();
|
|
|
- const equipmentList = includeEquipment
|
|
|
|
|
- ? allEquipmentItems.value.filter((item) => selectedIds.has(String(item.id)))
|
|
|
|
|
- : [];
|
|
|
|
|
|
|
+ const equipmentCache = readJson(EQUIPMENT_KEY);
|
|
|
|
|
+ const equipmentList = includeEquipment ? flattenEquipment(equipmentCache) : [];
|
|
|
|
|
+ const taskCache = readJson(TASK_KEY);
|
|
|
|
|
+ const taskList = Array.isArray(taskCache)
|
|
|
|
|
+ ? taskCache
|
|
|
|
|
+ : [...(taskCache?.field || []), ...(taskCache?.fruit || [])];
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
user_name: baForm.name,
|
|
user_name: baForm.name,
|
|
|
tel: baForm.phone,
|
|
tel: baForm.phone,
|
|
|
|
|
+ team_name: baForm.teamName || "",
|
|
|
|
|
+ team_type: baForm.teamType || "",
|
|
|
|
|
+ invite_type: baForm.inviteType || (props.isService ? "service" : "farmer"),
|
|
|
crops: varietyList.map((item) => ({
|
|
crops: varietyList.map((item) => ({
|
|
|
crop_type: item.categoryName,
|
|
crop_type: item.categoryName,
|
|
|
crop_id: Number(item.categoryId),
|
|
crop_id: Number(item.categoryId),
|
|
@@ -260,6 +442,12 @@ function buildPlotPayload(includeEquipment = true) {
|
|
|
id: item.id,
|
|
id: item.id,
|
|
|
name: item.name,
|
|
name: item.name,
|
|
|
})),
|
|
})),
|
|
|
|
|
+ farm_tasks: taskList.map((item) => ({
|
|
|
|
|
+ id: item.id,
|
|
|
|
|
+ name: item.name,
|
|
|
|
|
+ })),
|
|
|
|
|
+ field_tasks: (taskCache?.field || []).map((item) => ({ id: item.id, name: item.name })),
|
|
|
|
|
+ fruit_tasks: (taskCache?.fruit || []).map((item) => ({ id: item.id, name: item.name })),
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -270,7 +458,10 @@ function clearEntrySession() {
|
|
|
sessionStorage.removeItem(LOCATION_KEY);
|
|
sessionStorage.removeItem(LOCATION_KEY);
|
|
|
sessionStorage.removeItem(EDIT_UID_KEY);
|
|
sessionStorage.removeItem(EDIT_UID_KEY);
|
|
|
sessionStorage.removeItem(EQUIPMENT_KEY);
|
|
sessionStorage.removeItem(EQUIPMENT_KEY);
|
|
|
|
|
+ sessionStorage.removeItem(TASK_KEY);
|
|
|
|
|
+ sessionStorage.removeItem("ENTRY_MANUAL_VIEW");
|
|
|
sessionStorage.removeItem(STEP_KEY);
|
|
sessionStorage.removeItem(STEP_KEY);
|
|
|
|
|
+ sessionStorage.removeItem("ENTRY_INVITE_TYPE");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const showSuccessPopup = ref(false);
|
|
const showSuccessPopup = ref(false);
|
|
@@ -279,7 +470,7 @@ async function submitEntry(includeEquipment = true) {
|
|
|
if (submitting.value) return;
|
|
if (submitting.value) return;
|
|
|
const varietyList = getVarietyDraftList();
|
|
const varietyList = getVarietyDraftList();
|
|
|
|
|
|
|
|
- if (!varietyList.length) {
|
|
|
|
|
|
|
+ if (!props.isService && !varietyList.length) {
|
|
|
ElMessage.warning("请先完善种植品种信息");
|
|
ElMessage.warning("请先完善种植品种信息");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -318,16 +509,25 @@ const handleComplete = () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleSkip = () => {
|
|
const handleSkip = () => {
|
|
|
|
|
+ if (!props.isLastStep) {
|
|
|
|
|
+ emit("next");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
submitEntry(false);
|
|
submitEntry(false);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleSubmit = () => {
|
|
const handleSubmit = () => {
|
|
|
|
|
+ saveSelectionDraft();
|
|
|
|
|
+ if (!props.isLastStep) {
|
|
|
|
|
+ emit("next");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
submitEntry(true);
|
|
submitEntry(true);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
- restoreSelection();
|
|
|
|
|
fetchEquipmentList();
|
|
fetchEquipmentList();
|
|
|
|
|
+ restoreSelection();
|
|
|
});
|
|
});
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -444,36 +644,20 @@ onMounted(() => {
|
|
|
color: #1a1a1a;
|
|
color: #1a1a1a;
|
|
|
|
|
|
|
|
.title-icon {
|
|
.title-icon {
|
|
|
- position: relative;
|
|
|
|
|
- width: 14px;
|
|
|
|
|
- height: 14px;
|
|
|
|
|
|
|
+ width: 15px;
|
|
|
|
|
+ height: 15px;
|
|
|
|
|
+ object-fit: contain;
|
|
|
flex-shrink: 0;
|
|
flex-shrink: 0;
|
|
|
-
|
|
|
|
|
- &::before,
|
|
|
|
|
- &::after {
|
|
|
|
|
- content: "";
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- width: 10px;
|
|
|
|
|
- height: 10px;
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- &::before {
|
|
|
|
|
- left: 0;
|
|
|
|
|
- top: 2px;
|
|
|
|
|
- background: #2199f8;
|
|
|
|
|
- opacity: 0.85;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- &::after {
|
|
|
|
|
- right: 0;
|
|
|
|
|
- top: 0;
|
|
|
|
|
- background: #7ec8ff;
|
|
|
|
|
- opacity: 0.9;
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .section-desc {
|
|
|
|
|
+ margin: -2px 0 2px 22px;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: rgba(0, 0, 0, 0.4);
|
|
|
|
|
+ line-height: 18px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.tag-group {
|
|
.tag-group {
|
|
|
display: grid;
|
|
display: grid;
|
|
|
grid-template-columns: repeat(3, 1fr);
|
|
grid-template-columns: repeat(3, 1fr);
|
|
@@ -573,5 +757,35 @@ onMounted(() => {
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ &.is-service-equipment {
|
|
|
|
|
+ .page-subtitle {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #005599;
|
|
|
|
|
+ line-height: 22px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .tag-item {
|
|
|
|
|
+ height: auto;
|
|
|
|
|
+ min-height: 36px;
|
|
|
|
|
+ padding: 6px 4px;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ line-height: 16px;
|
|
|
|
|
+
|
|
|
|
|
+ .text {
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ white-space: normal;
|
|
|
|
|
+ overflow: visible;
|
|
|
|
|
+ text-overflow: unset;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ line-height: 16px;
|
|
|
|
|
+ padding: 0 4px;
|
|
|
|
|
+ word-break: break-all;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|