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