石墨仪设备 前端仓库
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

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
  1. <template>
  2. <div class="component-page">
  3. <section class="flex items-center h-20 gap-3 pl-3">
  4. <button class="btn-light px-3 py-1 text-xs" @click="onAddOre">添加矿石</button>
  5. <button
  6. :disabled="selectedIds.length !== 1"
  7. class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
  8. @click="onEditOre">
  9. 编辑矿石
  10. </button>
  11. <button
  12. :disabled="selectedIds.length === 0"
  13. class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
  14. @click="onDeleteOre">
  15. 删除矿石
  16. </button>
  17. <button
  18. :disabled="selectedIds.length !== 1"
  19. class="btn-light px-3 py-1 text-xs ml-12 disabled:btn-light-disabled"
  20. @click="onAddCraft">
  21. 添加工艺
  22. </button>
  23. <button
  24. :disabled="selectedCraftIds.length !== 1"
  25. class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
  26. @click="onEditCraft">
  27. 编辑工艺
  28. </button>
  29. <button
  30. :disabled="selectedCraftIds.length === 0"
  31. class="btn-light px-3 py-1 text-xs disabled:btn-light-disabled"
  32. @click="onDeleteCraft">
  33. 删除工艺
  34. </button>
  35. </section>
  36. <section>
  37. <header class="h-10 flex items-center bg-[#000]/[0.02] text-xs pr-3 text-text">
  38. <div class="w-10 self-stretch flex justify-center items-center" @click="onSelectAll">
  39. <img
  40. class="w-4 h-4"
  41. :src="
  42. selectedIds.length > 0
  43. ? selectedIds.length === oreList.length
  44. ? icon_select
  45. : icon_partial
  46. : icon_unselect
  47. "
  48. alt="icon" />
  49. </div>
  50. <p class="w-14">ID</p>
  51. <p class="w-[18rem]">矿石名称</p>
  52. <p>工艺</p>
  53. </header>
  54. <main class="overflow-auto" style="max-height: calc(100vh - var(--headerHeight) - var(--footerHeight) - 120px)">
  55. <div
  56. v-for="ore in oreList"
  57. :key="ore.id"
  58. class="min-h-10 flex items-center text-xs pr-3 text-[#6e6e6e] border-b border-b-[#f8f8f8]"
  59. @click="onItemSelect(ore)">
  60. <div class="w-10 self-stretch flex justify-center items-center">
  61. <img class="w-4 h-4" :src="selectedIds.includes(ore.id) ? icon_select : icon_unselect" alt="" />
  62. </div>
  63. <p class="w-14">{{ ore.id }}</p>
  64. <p class="w-[18rem]">{{ ore.oresName }}</p>
  65. <div class="flex-auto">
  66. <ul class="appearance-none flex items-center gap-3 text-sm flex-wrap my-2">
  67. <li
  68. v-for="craft in ore.craftsList"
  69. :key="craft.id"
  70. class="bg-[#F4F4F4] rounded-sm px-2 h-7 leading-7"
  71. :class="`${selectedCraftIds.includes(craft.id) && 'bg-primary text-white'}`"
  72. @click.stop="onCraftItemSelect(craft)">
  73. {{ craft.name }}
  74. </li>
  75. </ul>
  76. </div>
  77. </div>
  78. </main>
  79. </section>
  80. <van-overlay v-if="showCraftEditDialog" :show="true">
  81. <div class="flex justify-center items-center h-full">
  82. <CraftConfig :craft="craftOnEdit" @ok="confirmCraftEdit" @cancel="showCraftEditDialog = false" />
  83. </div>
  84. </van-overlay>
  85. <van-overlay v-if="showEditDialog" :show="true">
  86. <div class="flex justify-center items-center h-full">
  87. <AddOre :ore="oreOnEdit" @confirm="addOrUpdateOre" @cancel="showEditDialog = false" />
  88. </div>
  89. </van-overlay>
  90. </div>
  91. </template>
  92. <script lang="ts" setup>
  93. import CraftConfig from "./components/CraftConfig.vue";
  94. import icon_unselect from "@/assets/Icon-unselect.svg";
  95. import icon_select from "@/assets/Icon-select.svg";
  96. import icon_partial from "@/assets/Icon-partial-select.svg";
  97. import { onMounted, ref } from "vue";
  98. import { showToast } from "vant";
  99. import {
  100. createCraft,
  101. createOre,
  102. deleteCraft,
  103. deleteOre,
  104. getOreList,
  105. updateCraft,
  106. updateOre,
  107. type Craft,
  108. type Ore,
  109. } from "@/services/ore/oreManage";
  110. import AddOre from "./components/AddOre.vue";
  111. import * as R from "ramda";
  112. import { ElMessageBox } from "element-plus";
  113. const showEditDialog = ref<boolean>(false);
  114. const oreOnEdit = ref<Ore | undefined>();
  115. const showCraftEditDialog = ref<boolean>(false);
  116. const craftOnEdit = ref<Craft | undefined>();
  117. const oreList = ref<Ore[]>([]);
  118. const selectedIds = ref<number[]>([]);
  119. const selectedCraftIds = ref<number[]>([]);
  120. function getOres() {
  121. getOreList({ pageNum: 1, pageSize: 9999 }).then(res => {
  122. if (res.success) {
  123. oreList.value = res.data.list;
  124. } else {
  125. showToast(res.msg);
  126. }
  127. });
  128. }
  129. onMounted(() => {
  130. getOres();
  131. });
  132. function onItemSelect(ore: Ore) {
  133. if (selectedIds.value.includes(ore.id)) {
  134. selectedIds.value = selectedIds.value.filter(id => id !== ore.id);
  135. } else {
  136. selectedIds.value = [...selectedIds.value, ore.id];
  137. }
  138. }
  139. function onCraftItemSelect(craft: Craft) {
  140. if (selectedCraftIds.value.includes(craft.id)) {
  141. selectedCraftIds.value = selectedCraftIds.value.filter(id => id !== craft.id);
  142. } else {
  143. selectedCraftIds.value = [...selectedCraftIds.value, craft.id];
  144. }
  145. }
  146. function onSelectAll() {
  147. if (selectedIds.value.length === oreList.value.length) {
  148. selectedIds.value = [];
  149. } else {
  150. selectedIds.value = oreList.value.map(ore => ore.id);
  151. }
  152. }
  153. function addOrUpdateOre(ore: Ore) {
  154. let req;
  155. if (ore.id) {
  156. req = updateOre({ id: ore.id, name: ore.oresName });
  157. } else {
  158. req = createOre({ name: ore.oresName });
  159. }
  160. req.then(res => {
  161. if (res.success) {
  162. showEditDialog.value = false;
  163. getOres();
  164. } else {
  165. showToast(res.msg);
  166. }
  167. });
  168. }
  169. function onAddOre() {
  170. oreOnEdit.value = undefined;
  171. showEditDialog.value = true;
  172. }
  173. function onEditOre() {
  174. if (selectedIds.value.length === 0) return;
  175. oreOnEdit.value = oreList.value.find(ore => ore.id === selectedIds.value[0]);
  176. showEditDialog.value = true;
  177. }
  178. function onDeleteOre() {
  179. if (selectedIds.value.length === 0) return;
  180. ElMessageBox.confirm("确定删除矿石?", {
  181. confirmButtonText: "确定",
  182. cancelButtonText: "取消",
  183. center: true,
  184. }).then(() => {
  185. deleteOre(selectedIds.value.join(",")).then(res => {
  186. if (res.success) {
  187. selectedIds.value = [];
  188. getOres();
  189. } else {
  190. showToast(res.msg);
  191. }
  192. });
  193. });
  194. }
  195. function onAddCraft() {
  196. craftOnEdit.value = undefined;
  197. showCraftEditDialog.value = true;
  198. }
  199. function onEditCraft() {
  200. if (selectedCraftIds.value.length === 0) return;
  201. const allCrafts = R.pipe(R.pluck("craftsList"), R.flatten)(oreList.value);
  202. craftOnEdit.value = allCrafts.find(craft => craft.id === selectedCraftIds.value[0]);
  203. showCraftEditDialog.value = true;
  204. }
  205. function onDeleteCraft() {
  206. if (selectedCraftIds.value.length === 0) return;
  207. ElMessageBox.confirm("确定删除工艺?", {
  208. confirmButtonText: "确定",
  209. cancelButtonText: "取消",
  210. center: true,
  211. }).then(() => {
  212. deleteCraft(selectedCraftIds.value.join(",")).then(res => {
  213. if (res.success) {
  214. selectedCraftIds.value = [];
  215. getOres();
  216. } else {
  217. showToast(res.msg);
  218. }
  219. });
  220. });
  221. }
  222. function confirmCraftEdit(craft: Craft) {
  223. let req;
  224. if (craft.id) {
  225. req = updateCraft({ id: craft.id, name: craft.name, steps: craft.steps });
  226. } else {
  227. req = createCraft({ name: craft.name, steps: craft.steps, oresId: selectedIds.value[0] });
  228. }
  229. req.then(res => {
  230. if (res.success) {
  231. showCraftEditDialog.value = false;
  232. getOres();
  233. } else {
  234. showToast(res.msg);
  235. }
  236. });
  237. }
  238. </script>