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
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>
|