From 44c1a1c40029e0eeef20a33f551a42e174cdac64 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期六, 14 三月 2026 14:32:07 +0800
Subject: [PATCH] 生产记录

---
 src/views/productionManagement/productionRecords/New.vue   |  122 +++++++++++++
 src/views/productionManagement/productionRecords/Edit.vue  |  165 ++++++++++++++++++
 src/api/productionManagement/productionRecords.js          |   38 ++++
 src/views/productionManagement/productionRecords/index.vue |  189 +++++++++++++++++++++
 4 files changed, 514 insertions(+), 0 deletions(-)

diff --git a/src/api/productionManagement/productionRecords.js b/src/api/productionManagement/productionRecords.js
new file mode 100644
index 0000000..6393901
--- /dev/null
+++ b/src/api/productionManagement/productionRecords.js
@@ -0,0 +1,38 @@
+// 鐢熶骇璁板綍锛堝弬鏁帮級鎺ュ彛
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ
+export function listPage(query) {
+  return request({
+    url: "/productParameter/listPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板
+export function add(data) {
+  return request({
+    url: "/productParameter/addProductParameter",
+    method: "post",
+    data: data,
+  });
+}
+
+// 淇敼
+export function update(data) {
+  return request({
+    url: "/productParameter/updProductParameter",
+    method: "put",
+    data: data,
+  });
+}
+
+// 鍒犻櫎 ids 涓烘暟缁勬椂浼氭嫾鎴� productParameter/1,2,3
+export function del(ids) {
+  const idStr = Array.isArray(ids) ? ids.join(",") : ids;
+  return request({
+    url: `/productParameter/${idStr}`,
+    method: "delete",
+  });
+}
diff --git a/src/views/productionManagement/productionRecords/Edit.vue b/src/views/productionManagement/productionRecords/Edit.vue
new file mode 100644
index 0000000..97ea9cb
--- /dev/null
+++ b/src/views/productionManagement/productionRecords/Edit.vue
@@ -0,0 +1,165 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="isShow"
+      title="缂栬緫鐢熶骇璁板綍"
+      width="520px"
+      @close="closeModal"
+    >
+      <el-form
+        ref="formRef"
+        label-width="120px"
+        :model="formState"
+        label-position="top"
+      >
+        <el-form-item
+          label="鍙傛暟椤�"
+          prop="parameterItem"
+          :rules="[{ required: true, message: '璇疯緭鍏ュ弬鏁伴」' }]"
+        >
+          <el-input v-model="formState.parameterItem" placeholder="璇疯緭鍏ュ弬鏁伴」" />
+        </el-form-item>
+        <el-form-item
+          label="鍙傛暟绫诲瀷"
+          prop="type"
+          :rules="[{ required: true, message: '璇烽�夋嫨鍙傛暟绫诲瀷' }]"
+        >
+          <el-select v-model="formState.type" placeholder="璇烽�夋嫨鍙傛暟绫诲瀷" style="width: 100%;">
+            <el-option
+              v-for="dict in parameter_tyep"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="鍗曚綅"
+          prop="unit"
+          :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣�' }]"
+        >
+          <el-input v-model="formState.unit" placeholder="璇疯緭鍏ュ崟浣�" />
+        </el-form-item>
+        <el-form-item label="鍙傛暟鏍煎紡" prop="parameterFormat">
+          <el-input v-model="formState.parameterFormat" placeholder="璇疯緭鍏ュ弬鏁版牸寮忥紙閫夊~锛�" />
+        </el-form-item>
+        <el-form-item
+          label="鏄惁蹇呭~"
+          prop="isRequired"
+          :rules="[{ required: true, message: '璇烽�夋嫨鏄惁蹇呭~' }]"
+        >
+          <el-select v-model="formState.isRequired" placeholder="璇烽�夋嫨" style="width: 100%;">
+            <el-option label="鏄�" value="1" />
+            <el-option label="鍚�" value="0" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="handleSubmit">纭</el-button>
+          <el-button @click="closeModal">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed, getCurrentInstance, watch } from "vue";
+import { update } from "@/api/productionManagement/productionRecords.js";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+  },
+  record: {
+    type: Object,
+    default: () => ({}),
+  },
+});
+
+const emit = defineEmits(["update:visible", "completed"]);
+
+const formRef = ref(null);
+const formState = ref({
+  id: undefined,
+  code: "",
+  parameterItem: "",
+  type: "",
+  unit: "",
+  parameterFormat: "",
+  isRequired: undefined,
+});
+
+const isShow = computed({
+  get() {
+    return props.visible;
+  },
+  set(val) {
+    emit("update:visible", val);
+  },
+});
+
+// 鍥炴樉锛氱洃鍚� record 鍙樺寲
+watch(
+  () => props.record,
+  (newRecord) => {
+    if (newRecord && Object.keys(newRecord).length) {
+      formState.value = {
+        id: newRecord.id,
+        code: newRecord.code ?? "",
+        parameterItem: newRecord.parameterItem ?? "",
+        type: newRecord.type ?? "",
+        unit: newRecord.unit ?? "",
+        parameterFormat: newRecord.parameterFormat ?? "",
+        isRequired: newRecord.isRequired,
+      };
+    }
+  },
+  { immediate: true, deep: true }
+);
+
+// 寮圭獥鎵撳紑鏃堕噸鏂板洖鏄�
+watch(
+  () => props.visible,
+  (visible) => {
+    if (visible && props.record && Object.keys(props.record).length) {
+      formState.value = {
+        id: props.record.id,
+        code: props.record.code ?? "",
+        parameterItem: props.record.parameterItem ?? "",
+        type: props.record.type ?? "",
+        unit: props.record.unit ?? "",
+        parameterFormat: props.record.parameterFormat ?? "",
+        isRequired: props.record.isRequired,
+      };
+    }
+  }
+);
+
+const { proxy } = getCurrentInstance();
+const { parameter_tyep } = proxy.useDict("parameter_tyep");
+
+const closeModal = () => {
+  isShow.value = false;
+};
+
+const handleSubmit = () => {
+  formRef.value.validate((valid) => {
+    if (valid) {
+      update(formState.value).then(() => {
+        isShow.value = false;
+        emit("completed");
+        proxy.$modal.msgSuccess("淇敼鎴愬姛");
+      });
+    }
+  });
+};
+
+defineExpose({
+  closeModal,
+  handleSubmit,
+  isShow,
+});
+</script>
diff --git a/src/views/productionManagement/productionRecords/New.vue b/src/views/productionManagement/productionRecords/New.vue
new file mode 100644
index 0000000..f0e2e9f
--- /dev/null
+++ b/src/views/productionManagement/productionRecords/New.vue
@@ -0,0 +1,122 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="isShow"
+      title="鏂板鐢熶骇璁板綍"
+      width="520px"
+      @close="closeModal"
+    >
+      <el-form
+        ref="formRef"
+        label-width="120px"
+        :model="formState"
+        label-position="top"
+      >
+        <el-form-item
+          label="鍙傛暟椤�"
+          prop="parameterItem"
+          :rules="[{ required: true, message: '璇疯緭鍏ュ弬鏁伴」' }]"
+        >
+          <el-input v-model="formState.parameterItem" placeholder="璇疯緭鍏ュ弬鏁伴」" />
+        </el-form-item>
+        <el-form-item
+          label="鍙傛暟绫诲瀷"
+          prop="type"
+          :rules="[{ required: true, message: '璇烽�夋嫨鍙傛暟绫诲瀷' }]"
+        >
+          <el-select v-model="formState.type" placeholder="璇烽�夋嫨鍙傛暟绫诲瀷" style="width: 100%;">
+            <el-option
+              v-for="dict in parameter_tyep"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="鍗曚綅"
+          prop="unit"
+          :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣�' }]"
+        >
+          <el-input v-model="formState.unit" placeholder="璇疯緭鍏ュ崟浣�" />
+        </el-form-item>
+        <el-form-item label="鍙傛暟鏍煎紡" prop="parameterFormat">
+          <el-input v-model="formState.parameterFormat" placeholder="璇疯緭鍏ュ弬鏁版牸寮忥紙閫夊~锛�" />
+        </el-form-item>
+        <el-form-item
+          label="鏄惁蹇呭~"
+          prop="isRequired"
+          :rules="[{ required: true, message: '璇烽�夋嫨鏄惁蹇呭~' }]"
+        >
+          <el-select v-model="formState.isRequired" placeholder="璇烽�夋嫨" style="width: 100%;">
+            <el-option label="鏄�" value="1" />
+            <el-option label="鍚�" value="0" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="handleSubmit">纭</el-button>
+          <el-button @click="closeModal">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed, getCurrentInstance } from "vue";
+import { add } from "@/api/productionManagement/productionRecords.js";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+  },
+});
+
+const emit = defineEmits(["update:visible", "completed"]);
+
+const formRef = ref(null);
+const formState = ref({
+  parameterItem: "",
+  type: "",
+  unit: "",
+  parameterFormat: "",
+  isRequired: undefined,
+});
+
+const isShow = computed({
+  get() {
+    return props.visible;
+  },
+  set(val) {
+    emit("update:visible", val);
+  },
+});
+
+const { proxy } = getCurrentInstance();
+const { parameter_tyep } = proxy.useDict("parameter_tyep");
+
+const closeModal = () => {
+  isShow.value = false;
+};
+
+const handleSubmit = () => {
+  formRef.value.validate((valid) => {
+    if (valid) {
+      add(formState.value).then(() => {
+        isShow.value = false;
+        emit("completed");
+        proxy.$modal.msgSuccess("鏂板鎴愬姛");
+      });
+    }
+  });
+};
+
+defineExpose({
+  closeModal,
+  handleSubmit,
+  isShow,
+});
+</script>
diff --git a/src/views/productionManagement/productionRecords/index.vue b/src/views/productionManagement/productionRecords/index.vue
new file mode 100644
index 0000000..7422fa3
--- /dev/null
+++ b/src/views/productionManagement/productionRecords/index.vue
@@ -0,0 +1,189 @@
+<!-- 鐢熶骇璁板綍 -->
+<template>
+  <div class="app-container">
+    <div class="search_form">
+      <el-form :model="searchForm" :inline="true">
+        <el-form-item label="鍙傛暟缂栫爜:">
+          <el-input
+            v-model="searchForm.code"
+            placeholder="璇疯緭鍏�"
+            clearable
+            style="width: 200px;"
+            @change="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鍙傛暟椤�:">
+          <el-input
+            v-model="searchForm.parameterItem"
+            placeholder="璇疯緭鍏�"
+            clearable
+            style="width: 200px;"
+            @change="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鍙傛暟绫诲瀷:">
+          <el-select
+            v-model="searchForm.type"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 200px;"
+            @change="handleQuery"
+          >
+            <el-option
+              v-for="dict in parameter_tyep"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="table_list">
+      <div style="text-align: right" class="mb10">
+        <el-button type="primary" @click="showNewModal">鏂板</el-button>
+      </div>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :tableLoading="tableLoading"
+        @pagination="pagination"
+        :total="page.total"
+      />
+    </div>
+    <NewRecord v-if="isShowNewModal" v-model:visible="isShowNewModal" @completed="getList" />
+    <EditRecord
+      v-if="isShowEditModal"
+      v-model:visible="isShowEditModal"
+      :record="record"
+      @completed="getList"
+    />
+  </div>
+</template>
+
+<script setup>
+import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
+import NewRecord from "./New.vue";
+import EditRecord from "./Edit.vue";
+import { listPage, del } from "@/api/productionManagement/productionRecords.js";
+
+const data = reactive({
+  searchForm: {
+    code: "",
+    parameterItem: "",
+    type: "",
+  },
+});
+const { searchForm } = toRefs(data);
+const { proxy } = getCurrentInstance();
+const { parameter_tyep } = proxy.useDict("parameter_tyep");
+
+const tableColumn = ref([
+  { label: "鍙傛暟缂栫爜", prop: "code" },
+  { label: "鍙傛暟椤�", prop: "parameterItem" },
+  {
+    label: "鍙傛暟绫诲瀷",
+    prop: "type",
+    formatData: (params) =>
+      (parameter_tyep?.value ?? parameter_tyep ?? []).find((d) => String(d.value) === String(params))?.label ?? params,
+  },
+  { label: "鍗曚綅", prop: "unit" },
+  { label: "鍙傛暟鏍煎紡", prop: "parameterFormat" },
+  {
+    label: "鏄惁蹇呭~",
+    prop: "isRequired",
+    formatData: (params) => (params === '1' ? "鏄�" : "鍚�"),
+  },
+//   { label: "鍒涘缓浜�", prop: "createUser" },
+  { label: "鍒涘缓鏃ユ湡", prop: "createTime" },
+//   { label: "鏇存柊浜�", prop: "updateUser" },
+  { label: "鏇存柊鏃ユ湡", prop: "updateTime" },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: "right",
+    width: 160,
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => showEditModal(row),
+      },
+      {
+        name: "鍒犻櫎",
+        type: "text",
+        clickFun: (row) => handleDeleteRow(row),
+      },
+    ],
+  },
+]);
+
+const tableData = ref([]);
+const tableLoading = ref(false);
+const isShowNewModal = ref(false);
+const isShowEditModal = ref(false);
+const record = ref({});
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0,
+});
+
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+
+const getList = () => {
+  tableLoading.value = true;
+  const params = { ...searchForm.value, ...page };
+  listPage(params)
+    .then((res) => {
+      tableLoading.value = false;
+      const data = res.data;
+      tableData.value = data?.records ?? (Array.isArray(data) ? data : []);
+      page.total = data?.total ?? 0;
+    })
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
+
+const showNewModal = () => {
+  isShowNewModal.value = true;
+};
+
+const showEditModal = (row) => {
+  record.value = { ...row };
+  isShowEditModal.value = true;
+};
+
+const handleDeleteRow = (row) => {
+  proxy.$modal
+    .confirm(`鏄惁纭鍒犻櫎鍙傛暟缂栫爜涓�"${row.code}"鐨勬暟鎹紵`)
+    .then(() => del([row.id]))
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+    })
+    .catch(() => {});
+};
+
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped></style>

--
Gitblit v1.9.3