石墨仪设备 前端仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

253 lines
6.9 KiB

<template>
<div class="component-page">
<section class="flex items-center h-20 gap-3 pl-3">
<button class="btn-light px-3 py-1 text-xs" @click="onAddOre">添加矿石</button>
<button
:disabled="selectedIds.length !== 1"
class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
@click="onEditOre">
编辑矿石
</button>
<button
:disabled="selectedIds.length === 0"
class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
@click="onDeleteOre">
删除矿石
</button>
<button
:disabled="selectedIds.length !== 1"
class="btn-light px-3 py-1 text-xs ml-12 disabled:btn-light-disabled"
@click="onAddCraft">
添加工艺
</button>
<button
:disabled="selectedCraftIds.length !== 1"
class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
@click="onEditCraft">
编辑工艺
</button>
<button
:disabled="selectedCraftIds.length === 0"
class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
@click="onDeleteCraft">
删除工艺
</button>
</section>
<section>
<header class="h-10 flex items-center bg-[#000]/[0.02] text-xs pr-3 text-text">
<div class="w-10 self-stretch flex justify-center items-center" @click="onSelectAll">
<img
class="w-4 h-4"
:src="
selectedIds.length > 0
? selectedIds.length === oreList.length
? icon_select
: icon_partial
: icon_unselect
"
alt="icon" />
</div>
<p class="w-14">ID</p>
<p class="w-[18rem]">矿石名称</p>
<p>工艺</p>
</header>
<main class="overflow-auto" style="max-height: calc(100vh - var(--headerHeight) - var(--footerHeight) - 120px)">
<div
v-for="ore in oreList"
:key="ore.id"
class="min-h-10 flex items-center text-xs pr-3 text-[#6e6e6e] border-b border-b-[#f8f8f8]"
@click="onItemSelect(ore)">
<div class="w-10 self-stretch flex justify-center items-center">
<img class="w-4 h-4" :src="selectedIds.includes(ore.id) ? icon_select : icon_unselect" alt="" />
</div>
<p class="w-14">{{ ore.id }}</p>
<p class="w-[18rem]">{{ ore.oresName }}</p>
<div class="flex-auto">
<ul class="appearance-none flex items-center gap-3 text-sm flex-wrap my-2">
<li
v-for="craft in ore.craftsList"
:key="craft.id"
class="bg-[#F4F4F4] rounded-sm px-2 h-7 leading-7"
:class="`${selectedCraftIds.includes(craft.id) && 'bg-primary text-white'}`"
@click.stop="onCraftItemSelect(craft)">
{{ craft.name }}
</li>
</ul>
</div>
</div>
</main>
</section>
<van-overlay v-if="showCraftEditDialog" :show="true">
<div class="flex justify-center items-center h-full">
<CraftConfig :craft="craftOnEdit" @ok="confirmCraftEdit" @cancel="showCraftEditDialog = false" />
</div>
</van-overlay>
<van-overlay v-if="showEditDialog" :show="true">
<div class="flex justify-center items-center h-full">
<AddOre :ore="oreOnEdit" @confirm="addOrUpdateOre" @cancel="showEditDialog = false" />
</div>
</van-overlay>
</div>
</template>
<script lang="ts" setup>
import CraftConfig from "./components/CraftConfig.vue";
import icon_unselect from "@/assets/Icon-unselect.svg";
import icon_select from "@/assets/Icon-select.svg";
import icon_partial from "@/assets/Icon-partial-select.svg";
import { onMounted, ref } from "vue";
import { showToast } from "vant";
import {
createCraft,
createOre,
deleteCraft,
deleteOre,
getOreList,
updateCraft,
updateOre,
type Craft,
type Ore,
} from "@/services/ore/oreManage";
import AddOre from "./components/AddOre.vue";
import * as R from "ramda";
import { ElMessageBox } from "element-plus";
const showEditDialog = ref<boolean>(false);
const oreOnEdit = ref<Ore | undefined>();
const showCraftEditDialog = ref<boolean>(false);
const craftOnEdit = ref<Craft | undefined>();
const oreList = ref<Ore[]>([]);
const selectedIds = ref<number[]>([]);
const selectedCraftIds = ref<number[]>([]);
function getOres() {
getOreList({ pageNum: 1, pageSize: 9999 }).then(res => {
if (res.success) {
oreList.value = res.data.list;
} else {
showToast(res.msg);
}
});
}
onMounted(() => {
getOres();
});
function onItemSelect(ore: Ore) {
if (selectedIds.value.includes(ore.id)) {
selectedIds.value = selectedIds.value.filter(id => id !== ore.id);
} else {
selectedIds.value = [...selectedIds.value, ore.id];
}
}
function onCraftItemSelect(craft: Craft) {
if (selectedCraftIds.value.includes(craft.id)) {
selectedCraftIds.value = selectedCraftIds.value.filter(id => id !== craft.id);
} else {
selectedCraftIds.value = [...selectedCraftIds.value, craft.id];
}
}
function onSelectAll() {
if (selectedIds.value.length === oreList.value.length) {
selectedIds.value = [];
} else {
selectedIds.value = oreList.value.map(ore => ore.id);
}
}
function addOrUpdateOre(ore: Ore) {
let req;
if (ore.id) {
req = updateOre({ id: ore.id, name: ore.oresName });
} else {
req = createOre({ name: ore.oresName });
}
req.then(res => {
if (res.success) {
showEditDialog.value = false;
getOres();
} else {
showToast(res.msg);
}
});
}
function onAddOre() {
oreOnEdit.value = undefined;
showEditDialog.value = true;
}
function onEditOre() {
if (selectedIds.value.length === 0) return;
oreOnEdit.value = oreList.value.find(ore => ore.id === selectedIds.value[0]);
showEditDialog.value = true;
}
function onDeleteOre() {
if (selectedIds.value.length === 0) return;
ElMessageBox.confirm("确定删除矿石?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
center: true,
}).then(() => {
deleteOre(selectedIds.value.join(",")).then(res => {
if (res.success) {
selectedIds.value = [];
getOres();
} else {
showToast(res.msg);
}
});
});
}
function onAddCraft() {
craftOnEdit.value = undefined;
showCraftEditDialog.value = true;
}
function onEditCraft() {
if (selectedCraftIds.value.length === 0) return;
const allCrafts = R.pipe(R.pluck("craftsList"), R.flatten)(oreList.value);
craftOnEdit.value = allCrafts.find(craft => craft.id === selectedCraftIds.value[0]);
showCraftEditDialog.value = true;
}
function onDeleteCraft() {
if (selectedCraftIds.value.length === 0) return;
ElMessageBox.confirm("确定删除工艺?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
center: true,
}).then(() => {
deleteCraft(selectedCraftIds.value.join(",")).then(res => {
if (res.success) {
selectedCraftIds.value = [];
getOres();
} else {
showToast(res.msg);
}
});
});
}
function confirmCraftEdit(craft: Craft) {
let req;
if (craft.id) {
req = updateCraft({ id: craft.id, name: craft.name, steps: craft.steps });
} else {
req = createCraft({ name: craft.name, steps: craft.steps, oresId: selectedIds.value[0] });
}
req.then(res => {
if (res.success) {
showCraftEditDialog.value = false;
getOres();
} else {
showToast(res.msg);
}
});
}
</script>