From 03e5b550e53a2f629c50df5c5b0000d15355694c Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期五, 13 三月 2026 17:02:00 +0800
Subject: [PATCH] feat(质量管理): 新增检测项目管理功能
---
src/views/qualityManagement/InspectItem/index.vue | 233 ++++++++++++++++++++++++++++++++++++++++++++++
src/api/qualityManagement/inspectItem.js | 25 +++++
2 files changed, 258 insertions(+), 0 deletions(-)
diff --git a/src/api/qualityManagement/inspectItem.js b/src/api/qualityManagement/inspectItem.js
new file mode 100644
index 0000000..1203b57
--- /dev/null
+++ b/src/api/qualityManagement/inspectItem.js
@@ -0,0 +1,25 @@
+import request from "@/utils/request";
+
+export function qualityInspectItemListPage(data) {
+ return request({
+ url: "/qualityInspectItem/listPage",
+ method: "post",
+ data,
+ });
+}
+
+export function qualityInspectItemSave(data) {
+ return request({
+ url: "/qualityInspectItem/save",
+ method: "post",
+ data,
+ });
+}
+
+export function qualityInspectItemDelete(data) {
+ return request({
+ url: "/qualityInspectItem/delete",
+ method: "post",
+ data,
+ });
+}
diff --git a/src/views/qualityManagement/InspectItem/index.vue b/src/views/qualityManagement/InspectItem/index.vue
new file mode 100644
index 0000000..9ec8792
--- /dev/null
+++ b/src/views/qualityManagement/InspectItem/index.vue
@@ -0,0 +1,233 @@
+<template>
+ <div class="app-container">
+ <div class="search_form">
+ <div style="display: flex; flex-direction: row; align-items: center;">
+ <span class="search_title">妫�娴嬮」鐩細</span>
+ <el-input
+ v-model="searchForm.name"
+ style="width: 260px"
+ placeholder="璇疯緭鍏ユ娴嬮」鐩悕绉�"
+ clearable
+ :prefix-icon="Search"
+ @change="handleQuery"
+ @clear="handleQuery"
+ />
+ <el-button type="primary" style="margin-left: 10px" @click="handleQuery">鎼滅储</el-button>
+ </div>
+ <div>
+ <el-button type="primary" @click="openDialog('add')">鏂板</el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+ </div>
+ </div>
+ <div class="table_list">
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :page="page"
+ :isSelection="true"
+ :tableLoading="tableLoading"
+ :total="page.total"
+ @selection-change="handleSelectionChange"
+ @pagination="pagination"
+ />
+ </div>
+
+ <el-dialog v-model="dialogVisible" :title="operationType === 'add' ? '鏂板妫�娴嬮」鐩�' : '淇敼妫�娴嬮」鐩�'" width="520px" @close="closeDialog">
+ <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+ <el-form-item label="妫�娴嬮」鐩�" prop="name">
+ <el-input v-model="form.name" placeholder="璇疯緭鍏ユ娴嬮」鐩悕绉�" clearable />
+ </el-form-item>
+ <el-form-item label="鍗曚綅" prop="unit">
+ <el-input v-model="form.unit" placeholder="璇疯緭鍏ュ崟浣�" clearable />
+ </el-form-item>
+ <el-form-item label="鏍囧噯鍊�" prop="standardValue">
+ <el-input v-model="form.standardValue" placeholder="璇疯緭鍏ユ爣鍑嗗��" clearable />
+ </el-form-item>
+ <el-form-item label="鍐呮帶鍊�" prop="internalControl">
+ <el-input v-model="form.internalControl" placeholder="璇疯緭鍏ュ唴鎺у��" clearable />
+ </el-form-item>
+ <el-form-item label="鍖栭獙鍊�" prop="testValue">
+ <el-input v-model="form.testValue" placeholder="璇疯緭鍏ュ寲楠屽��" clearable />
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import { ElMessageBox } from "element-plus";
+import { getCurrentInstance, reactive, ref, toRefs } from "vue";
+import {
+ qualityInspectItemDelete,
+ qualityInspectItemListPage,
+ qualityInspectItemSave,
+} from "@/api/qualityManagement/inspectItem.js";
+
+const { proxy } = getCurrentInstance();
+
+const data = reactive({
+ searchForm: {
+ name: "",
+ },
+ form: {
+ id: null,
+ name: "",
+ unit: "",
+ standardValue: "",
+ internalControl: "",
+ testValue: "",
+ },
+ rules: {
+ name: [{ required: true, message: "璇疯緭鍏ユ娴嬮」鐩悕绉�", trigger: "blur" }],
+ unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
+ },
+});
+
+const { searchForm, form, rules } = toRefs(data);
+
+const tableColumn = ref([
+ { label: "妫�娴嬮」鐩�", prop: "name" },
+ { label: "鍗曚綅", prop: "unit", width: 120 },
+ { label: "鏍囧噯鍊�", prop: "standardValue", width: 160 },
+ { label: "鍐呮帶鍊�", prop: "internalControl", width: 160 },
+ { label: "鍖栭獙鍊�", prop: "testValue", width: 160 },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: "right",
+ width: 100,
+ operation: [
+ {
+ name: "缂栬緫",
+ type: "text",
+ clickFun: (row) => openDialog("edit", row),
+ },
+ ],
+ },
+]);
+
+const tableData = ref([]);
+const tableLoading = ref(false);
+const selectedRows = ref([]);
+const dialogVisible = ref(false);
+const operationType = ref("add");
+const page = reactive({
+ current: 1,
+ size: 10,
+ total: 0,
+});
+
+const resetFormData = () => {
+ form.value = {
+ id: null,
+ name: "",
+ unit: "",
+ standardValue: "",
+ internalControl: "",
+ testValue: "",
+ };
+};
+
+const getList = () => {
+ tableLoading.value = true;
+ const params = {
+ name: searchForm.value.name || null,
+ current: page.current,
+ size: page.size,
+ };
+ qualityInspectItemListPage(params)
+ .then((res) => {
+ const records = res?.data?.records || [];
+ tableData.value = records;
+ page.total = res?.data?.total || 0;
+ })
+ .finally(() => {
+ tableLoading.value = false;
+ });
+};
+
+const handleQuery = () => {
+ page.current = 1;
+ getList();
+};
+
+const pagination = (obj) => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+};
+
+const handleSelectionChange = (selection) => {
+ selectedRows.value = selection;
+};
+
+const openDialog = (type, row) => {
+ operationType.value = type;
+ resetFormData();
+ if (type === "edit" && row) {
+ form.value = {
+ id: row.id || null,
+ name: row.name || "",
+ unit: row.unit || "",
+ standardValue: row.standardValue || "",
+ internalControl: row.internalControl || "",
+ testValue: row.testValue || "",
+ };
+ }
+ dialogVisible.value = true;
+};
+
+const closeDialog = () => {
+ proxy.resetForm("formRef");
+ resetFormData();
+ dialogVisible.value = false;
+};
+
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (!valid) {
+ return;
+ }
+ qualityInspectItemSave(form.value).then(() => {
+ proxy.$modal.msgSuccess(operationType.value === "add" ? "鏂板鎴愬姛" : "淇敼鎴愬姛");
+ closeDialog();
+ getList();
+ });
+ });
+};
+
+const handleDelete = () => {
+ if (!selectedRows.value.length) {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ const ids = selectedRows.value.map((item) => item.id);
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鎻愮ず", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ qualityInspectItemDelete(ids).then(() => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList();
+ });
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
+
+getList();
+</script>
+
+<style scoped></style>
--
Gitblit v1.9.3