|
@@ -1,107 +1,145 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="planting-page">
|
|
<div class="planting-page">
|
|
|
<div class="page-card">
|
|
<div class="page-card">
|
|
|
- <!-- 顶部:Tab + 操作 -->
|
|
|
|
|
|
|
+ <!-- 顶部:Tab -->
|
|
|
<div class="page-header">
|
|
<div class="page-header">
|
|
|
<div class="page-tabs">
|
|
<div class="page-tabs">
|
|
|
- <div v-for="tab in tabs" :key="tab.value" class="page-tabs__item"
|
|
|
|
|
- :class="{ 'is-active': activeTab === tab.value }" @click="activeTab = tab.value">
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="tab in tabs"
|
|
|
|
|
+ :key="tab.value"
|
|
|
|
|
+ class="page-tabs__item"
|
|
|
|
|
+ :class="{ 'is-active': activeTab === tab.value }"
|
|
|
|
|
+ @click="activeTab = tab.value"
|
|
|
|
|
+ >
|
|
|
{{ tab.label }}
|
|
{{ tab.label }}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-button type="warning" class="btn-add" @click="onAddDevice">
|
|
|
|
|
- 新增设备
|
|
|
|
|
- </el-button>
|
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 筛选区 -->
|
|
|
|
|
- <div class="filter-panel">
|
|
|
|
|
- <div class="filter-row">
|
|
|
|
|
- <span class="filter-label">区域:</span>
|
|
|
|
|
- <div class="filter-content region-selects">
|
|
|
|
|
- <el-select v-model="filters.province" placeholder="选择省份" clearable class="region-select">
|
|
|
|
|
- <el-option v-for="item in provinceOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- <el-select v-model="filters.city" placeholder="选择城市" clearable class="region-select">
|
|
|
|
|
- <el-option v-for="item in cityOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <!-- 种植方案 -->
|
|
|
|
|
+ <template v-if="activeTab === 'scheme'">
|
|
|
|
|
+ <div class="filter-panel">
|
|
|
|
|
+ <div class="filter-row">
|
|
|
|
|
+ <span class="filter-label">区域:</span>
|
|
|
|
|
+ <div class="filter-content region-selects">
|
|
|
|
|
+ <el-select v-model="filters.province" placeholder="选择省份" clearable class="region-select">
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="item in provinceOptions"
|
|
|
|
|
+ :key="item.value"
|
|
|
|
|
+ :label="item.label"
|
|
|
|
|
+ :value="item.value"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ <el-select v-model="filters.city" placeholder="选择城市" clearable class="region-select">
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="item in cityOptions"
|
|
|
|
|
+ :key="item.value"
|
|
|
|
|
+ :label="item.label"
|
|
|
|
|
+ :value="item.value"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
|
|
|
- <div class="filter-row">
|
|
|
|
|
- <span class="filter-label">品类:</span>
|
|
|
|
|
- <div class="filter-content tag-list">
|
|
|
|
|
- <div v-for="(item, idx) in categoryOptions" :key="`category-${idx}`" type="button" class="filter-tag"
|
|
|
|
|
- :class="{ 'is-active': filters.categoryIndex === idx }" @click="filters.categoryIndex = idx">
|
|
|
|
|
- {{ item }}
|
|
|
|
|
|
|
+ <div class="filter-row">
|
|
|
|
|
+ <span class="filter-label">品类:</span>
|
|
|
|
|
+ <div class="filter-content tag-list">
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(item, idx) in categoryOptions"
|
|
|
|
|
+ :key="`category-${idx}`"
|
|
|
|
|
+ class="filter-tag"
|
|
|
|
|
+ :class="{ 'is-active': filters.categoryIndex === idx }"
|
|
|
|
|
+ @click="filters.categoryIndex = idx"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ item }}
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
|
|
|
- <div class="filter-row">
|
|
|
|
|
- <span class="filter-label">品种:</span>
|
|
|
|
|
- <div class="filter-content tag-list">
|
|
|
|
|
- <div v-for="(item, idx) in varietyOptions" :key="`variety-${idx}`" type="button" class="filter-tag"
|
|
|
|
|
- :class="{ 'is-active': filters.varietyIndex === idx }" @click="filters.varietyIndex = idx">
|
|
|
|
|
- {{ item }}
|
|
|
|
|
|
|
+ <div class="filter-row">
|
|
|
|
|
+ <span class="filter-label">品种:</span>
|
|
|
|
|
+ <div class="filter-content tag-list">
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(item, idx) in varietyOptions"
|
|
|
|
|
+ :key="`variety-${idx}`"
|
|
|
|
|
+ class="filter-tag"
|
|
|
|
|
+ :class="{ 'is-active': filters.varietyIndex === idx }"
|
|
|
|
|
+ @click="filters.varietyIndex = idx"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ item }}
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
|
|
|
- <!-- 方案表格 -->
|
|
|
|
|
- <div class="table-wrap">
|
|
|
|
|
- <el-table :data="tableData" border class="scheme-table" :header-cell-style="headerCellStyle"
|
|
|
|
|
- :cell-style="{ verticalAlign: 'top' }">
|
|
|
|
|
- <el-table-column prop="name" label="农事名称" min-width="110" fixed />
|
|
|
|
|
- <el-table-column label="农事类型" min-width="120">
|
|
|
|
|
- <template #default="{ row }">
|
|
|
|
|
- <div class="type-tags">
|
|
|
|
|
- <span v-for="(item, idx) in row.types" :key="idx" class="type-tag">{{ item }}</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column prop="trigger" label="触发条件" min-width="160" />
|
|
|
|
|
- <el-table-column label="药肥处方" min-width="260">
|
|
|
|
|
- <template #default="{ row }">
|
|
|
|
|
- <div class="prescription">
|
|
|
|
|
- <div class="prescription__title">{{ row.prescription.category }}</div>
|
|
|
|
|
- <div v-for="(line, idx) in row.prescription.lines" :key="idx" class="prescription__line">
|
|
|
|
|
- {{ line }}
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column label="执行规程" align="center">
|
|
|
|
|
- <el-table-column label="执行窗口" min-width="140" prop="execute.window" />
|
|
|
|
|
- <el-table-column label="执行设备" min-width="120">
|
|
|
|
|
|
|
+ <div class="table-wrap">
|
|
|
|
|
+ <el-table
|
|
|
|
|
+ :data="tableData"
|
|
|
|
|
+ border
|
|
|
|
|
+ class="scheme-table"
|
|
|
|
|
+ :header-cell-style="headerCellStyle"
|
|
|
|
|
+ :cell-style="{ verticalAlign: 'top' }"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-table-column prop="name" label="农事名称" min-width="110" fixed />
|
|
|
|
|
+ <el-table-column label="农事类型" min-width="120">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<div class="type-tags">
|
|
<div class="type-tags">
|
|
|
- <span v-for="(item, idx) in row.execute.devices" :key="idx" class="type-tag">{{ item }}</span>
|
|
|
|
|
|
|
+ <span v-for="(item, idx) in row.types" :key="idx" class="type-tag">{{ item }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="注意事项" min-width="160" prop="execute.notes" />
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column label="复核规程" align="center">
|
|
|
|
|
- <el-table-column label="复核时间" min-width="120">
|
|
|
|
|
|
|
+ <el-table-column prop="trigger" label="触发条件" min-width="160" />
|
|
|
|
|
+ <el-table-column label="药肥处方" min-width="260">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <span class="review-time">
|
|
|
|
|
- 执行后 <em class="review-time__num">{{ row.review.days }}</em> 天
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <div class="prescription">
|
|
|
|
|
+ <div class="prescription__title">{{ row.prescription.category }}</div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(line, idx) in row.prescription.lines"
|
|
|
|
|
+ :key="idx"
|
|
|
|
|
+ class="prescription__line"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ line }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="复核标准" prop="review.standard" min-width="160" />
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- </el-table>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-table-column label="执行规程" align="center">
|
|
|
|
|
+ <el-table-column label="执行窗口" min-width="140" prop="execute.window" />
|
|
|
|
|
+ <el-table-column label="执行设备" min-width="120">
|
|
|
|
|
+ <template #default="{ row }">
|
|
|
|
|
+ <div class="type-tags">
|
|
|
|
|
+ <span
|
|
|
|
|
+ v-for="(item, idx) in row.execute.devices"
|
|
|
|
|
+ :key="idx"
|
|
|
|
|
+ class="type-tag"
|
|
|
|
|
+ >{{ item }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="注意事项" min-width="160" prop="execute.notes" />
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="复核规程" align="center">
|
|
|
|
|
+ <el-table-column label="复核时间" min-width="120">
|
|
|
|
|
+ <template #default="{ row }">
|
|
|
|
|
+ <span class="review-time">
|
|
|
|
|
+ 执行后 <em class="review-time__num">{{ row.review.days }}</em> 天
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="复核标准" prop="review.standard" min-width="160" />
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
- <!-- 底部操作 -->
|
|
|
|
|
- <div class="page-footer">
|
|
|
|
|
- <el-button type="warning" plain class="btn-copy" @click="onCopyScheme">
|
|
|
|
|
- 复制为我的方案
|
|
|
|
|
- </el-button>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <div class="page-footer">
|
|
|
|
|
+ <el-button type="warning" plain class="btn-copy" @click="onCopyScheme">
|
|
|
|
|
+ 复制为我的方案
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 我的方案 -->
|
|
|
|
|
+ <MySchemePanel v-else @edit-scheme="onEditMyScheme" />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<EditSchemeDialog v-model="editDialogVisible" @confirm="onEditConfirm" />
|
|
<EditSchemeDialog v-model="editDialogVisible" @confirm="onEditConfirm" />
|
|
@@ -112,6 +150,7 @@
|
|
|
import { reactive, ref } from "vue";
|
|
import { reactive, ref } from "vue";
|
|
|
import { ElMessage } from "element-plus";
|
|
import { ElMessage } from "element-plus";
|
|
|
import EditSchemeDialog from "./components/EditSchemeDialog.vue";
|
|
import EditSchemeDialog from "./components/EditSchemeDialog.vue";
|
|
|
|
|
+import MySchemePanel from "./components/MySchemePanel.vue";
|
|
|
|
|
|
|
|
const tabs = [
|
|
const tabs = [
|
|
|
{ label: "种植方案", value: "scheme" },
|
|
{ label: "种植方案", value: "scheme" },
|
|
@@ -220,16 +259,16 @@ const headerCellStyle = {
|
|
|
fontWeight: 400,
|
|
fontWeight: 400,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const onAddDevice = () => {
|
|
|
|
|
- ElMessage.info("新增设备功能待接入");
|
|
|
|
|
|
|
+const onCopyScheme = () => {
|
|
|
|
|
+ editDialogVisible.value = true;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const onCopyScheme = () => {
|
|
|
|
|
|
|
+const onEditMyScheme = () => {
|
|
|
editDialogVisible.value = true;
|
|
editDialogVisible.value = true;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const onEditConfirm = () => {
|
|
const onEditConfirm = () => {
|
|
|
- ElMessage.success("已复制为我的方案");
|
|
|
|
|
|
|
+ ElMessage.success(activeTab.value === "mine" ? "方案已更新" : "已复制为我的方案");
|
|
|
};
|
|
};
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -237,7 +276,7 @@ const onEditConfirm = () => {
|
|
|
$primary: $warning-color;
|
|
$primary: $warning-color;
|
|
|
$primary-light: color.mix(#fff, $warning-color, 90%);
|
|
$primary-light: color.mix(#fff, $warning-color, 90%);
|
|
|
$text: rgba(0, 0, 0, 0.6);
|
|
$text: rgba(0, 0, 0, 0.6);
|
|
|
-$border: #E7E7E7;
|
|
|
|
|
|
|
+$border: #e7e7e7;
|
|
|
|
|
|
|
|
.planting-page {
|
|
.planting-page {
|
|
|
box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
@@ -258,7 +297,6 @@ $border: #E7E7E7;
|
|
|
.page-header {
|
|
.page-header {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
|
|
border-bottom: 1px solid $border;
|
|
border-bottom: 1px solid $border;
|
|
|
|
|
|
|
|
.page-tabs {
|
|
.page-tabs {
|
|
@@ -291,11 +329,6 @@ $border: #E7E7E7;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- .btn-add {
|
|
|
|
|
- height: 32px;
|
|
|
|
|
- padding: 0 16px;
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.filter-panel {
|
|
.filter-panel {
|
|
@@ -330,7 +363,7 @@ $border: #E7E7E7;
|
|
|
|
|
|
|
|
.filter-tag {
|
|
.filter-tag {
|
|
|
border: 1px solid transparent;
|
|
border: 1px solid transparent;
|
|
|
- background: #F3F3F3;
|
|
|
|
|
|
|
+ background: #f3f3f3;
|
|
|
color: $text;
|
|
color: $text;
|
|
|
padding: 5px 10px;
|
|
padding: 5px 10px;
|
|
|
border-radius: 3px;
|
|
border-radius: 3px;
|
|
@@ -371,7 +404,7 @@ $border: #E7E7E7;
|
|
|
padding: 1px 6px;
|
|
padding: 1px 6px;
|
|
|
border-radius: 4px;
|
|
border-radius: 4px;
|
|
|
font-size: 12px;
|
|
font-size: 12px;
|
|
|
- color: #2199F8;
|
|
|
|
|
|
|
+ color: #2199f8;
|
|
|
background: rgba(33, 153, 248, 0.1);
|
|
background: rgba(33, 153, 248, 0.1);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -380,7 +413,7 @@ $border: #E7E7E7;
|
|
|
&__title {
|
|
&__title {
|
|
|
display: inline-block;
|
|
display: inline-block;
|
|
|
width: fit-content;
|
|
width: fit-content;
|
|
|
- color: #4C4C4C;
|
|
|
|
|
|
|
+ color: #4c4c4c;
|
|
|
margin-bottom: 2px;
|
|
margin-bottom: 2px;
|
|
|
background: rgba(125, 125, 125, 0.1);
|
|
background: rgba(125, 125, 125, 0.1);
|
|
|
padding: 0 6px;
|
|
padding: 0 6px;
|