From 202557aeadba147a25ae72a8992fd184d13252d9 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期三, 11 六月 2025 18:02:41 +0800
Subject: [PATCH] 新增文档管理 优化其他页面

---
 src/views/basicInformation/index.vue                        |    7 
 src/api/basicInformation/coalFieldMaintenance.js            |    2 
 /dev/null                                                   |  541 -----------------------
 src/api/archiveManagement/index.js                          |   58 ++
 src/views/procureMent/components/ProductionDialog.vue       |  142 +++++
 src/api/basicInformation/coal.js                            |    2 
 src/views/production/index.vue                              |   22 
 src/views/archiveManagement/index.vue                       |  570 ++++++++++++++++++++++++
 src/views/basicInformation/mould/coalQualityMaintenance.vue |    7 
 src/views/production/components/ProductionDialog.vue        |   13 
 10 files changed, 779 insertions(+), 585 deletions(-)

diff --git a/src/api/archiveManagement/index.js b/src/api/archiveManagement/index.js
new file mode 100644
index 0000000..b8a9494
--- /dev/null
+++ b/src/api/archiveManagement/index.js
@@ -0,0 +1,58 @@
+// 鏂囨。绠$悊
+import request from '@/utils/request'
+
+// 鏌ヨ鏂囨。绠$悊鏍戝舰缁撴瀯
+export function getTree(query) {
+    return request({
+        url: '/tree/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 鏂板鎴栫紪杈戞枃妗d俊鎭�
+export function addOrEditTree(query) {
+    return request({
+        url: '/tree/addOrEditTree',
+        method: 'post',
+        data: query
+    })
+}
+// 鍒犻櫎鏂囨。淇℃伅鏁版嵁
+export function delTree(query) {
+    return request({
+        url: '/tree/delTree',
+        method: 'delete',
+        data: query
+    })
+}
+
+// /archive/list
+// 鏌ヨ鏂囨。鍒楄〃
+export function getArchiveList(query) {
+    return request({
+        url: '/archive/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// /archive/addOrEditArchive
+// 鏂板鎴栫紪杈戞枃妗d俊鎭�
+export function addOrEditArchive(query) {
+    return request({
+        url: '/archive/addOrEditArchive',
+        method: 'post',
+        data: query
+    })
+}
+
+// /archive/delArchive
+// 鍒犻櫎鏂囨。淇℃伅鏁版嵁
+export function delArchive(query) {
+    return request({
+        url: '/archive/delArchive',
+        method: 'delete',
+        data: query
+    })
+}
\ No newline at end of file
diff --git a/src/api/basicInformation/coal.js b/src/api/basicInformation/coal.js
index 635c0dd..f519cfc 100644
--- a/src/api/basicInformation/coal.js
+++ b/src/api/basicInformation/coal.js
@@ -6,7 +6,7 @@
     return request({
         url: '/coalInfo/list',
         method: 'get',
-        data: query
+        params: query
     })
 }
 
diff --git a/src/api/basicInformation/coalFieldMaintenance.js b/src/api/basicInformation/coalFieldMaintenance.js
index bbfcb39..68373f1 100644
--- a/src/api/basicInformation/coalFieldMaintenance.js
+++ b/src/api/basicInformation/coalFieldMaintenance.js
@@ -6,7 +6,7 @@
     return request({
         url: '/coalField/list',
         method: 'get',
-        data: query
+        params: query
     })
 }
 // 鏂板鎴栫紪杈戠叅璐ㄥ瓧娈�
diff --git a/src/views/archiveManagement/index.vue b/src/views/archiveManagement/index.vue
new file mode 100644
index 0000000..139b1e2
--- /dev/null
+++ b/src/views/archiveManagement/index.vue
@@ -0,0 +1,570 @@
+<template>
+  <el-card class="archive-management-card">
+    <div class="left">
+      <div class="left-content">
+        <div class="tree-header">
+          <h3>鏂囨。绠$悊</h3>
+          <el-button type="primary" size="small" @click="append('')" icon="Plus"
+            >鏂板</el-button
+          >
+        </div>
+
+        <!-- 鎼滅储妗� -->
+        <div class="search-box">
+          <el-input
+            v-model="filterText"
+            placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
+            size="small"
+            clearable
+            @input="handleFilter"
+          >
+            <template #prefix>
+              <el-icon><Search /></el-icon>
+            </template>
+          </el-input>
+        </div>
+
+        <div class="tree-container">
+          <el-tree
+            ref="treeRef"
+            :data="treeData"
+            :props="props"
+            :filter-node-method="filterNode"
+            :expand-on-click-node="false"
+            :default-expand-all="false"
+            node-key="id"
+            @node-click="handleNodeClick"
+            class="custom-tree"
+          >
+            <template #default="{ node, data }">
+              <div class="tree-node-content" @dblclick="headerDbClick(data)">
+                <div class="node-icon">
+                  <el-icon
+                    v-if="!node.isLeaf"
+                    :class="{ expanded: node.expanded }"
+                  >
+                    <Folder />
+                  </el-icon>
+                  <el-icon v-else>
+                    <Document />
+                  </el-icon>
+                </div>
+
+                <div class="node-label">
+                  <span v-if="!data.isEdit" class="label-text">{{
+                    node.label
+                  }}</span>
+                  <el-input
+                    v-else
+                    :ref="(el) => setInputRef(el, data)"
+                    placeholder="璇疯緭鍏ヨ妭鐐瑰悕绉�"
+                    v-model="newName"
+                    @blur="($event) => handleInputBlur($event, data, node)"
+                    @keyup.enter="
+                      ($event) => handleInputBlur($event, data, node)
+                    "
+                    size="small"
+                    class="tree-input"
+                    autofocus
+                  />
+                </div>
+                <div class="node-actions" v-show="!data.isEdit">
+                  <el-button
+                    link
+                    size="small"
+                    @click.stop="append(data)"
+                    icon="Plus"
+                    title="鏂板瀛愯妭鐐�"
+                  ></el-button>
+                  <el-button
+                    link
+                    size="small"
+                    @click.stop="remove(node, data)"
+                    icon="Delete"
+                    title="鍒犻櫎"
+                  ></el-button>
+                </div>
+              </div>
+            </template>
+          </el-tree>
+        </div>
+      </div>
+    </div>
+    <div class="right">
+      <el-row :gutter="24">
+          <el-col :span="2" :offset="20"><el-button :icon="Delete" type="danger">鍒犻櫎</el-button></el-col>
+          <el-col :span="2"><el-button :icon="Plus" type="primary">鏂板</el-button></el-col>
+      </el-row>
+      <ETable
+        :loading="loading"
+        :table-data="tableData"
+        :columns="columns"
+        @selection-change="handleSelectionChange"
+        @edit="handleEdit"
+        :show-selection="true"
+        :border="true"
+      >
+      </ETable>
+      <Pagination
+        :total="total"
+        :page-size="10"
+        :page-count="Math.ceil(total / 10)"
+        @page-change="currentPageChange"
+      ></Pagination>
+    </div>
+  </el-card>
+</template>
+<script setup>
+import { onMounted, ref, nextTick } from "vue";
+import ETable from "@/components/Table/ETable.vue";
+import { ElButton, ElInput, ElIcon } from "element-plus";
+import Pagination from "@/components/Pagination/index.vue";
+import {
+  Plus,
+  Search,
+  Folder,
+  Document,
+  Delete,
+} from "@element-plus/icons-vue";
+import {
+  getTree,
+  addOrEditTree,
+  delTree,
+  getArchiveList,
+  addOrEditArchive,
+  delArchive,
+} from "@/api/archiveManagement";
+const loading = ref(false);
+const tableData = ref([]);
+const treeData = ref([]);
+const newName = ref("");
+const inputRefs = ref(new Map()); // 瀛樺偍杈撳叆妗嗗紩鐢�
+const filterText = ref(""); // 鎼滅储鍏抽敭瀛�
+const treeRef = ref(); // 鏍戠粍浠跺紩鐢�
+const total = ref(0); // 鎬昏褰曟暟
+const current = ref(1); // 褰撳墠椤电爜
+const columns = [
+  { prop: "name", label: "鍚嶇О", minWidth: 180 },
+  { prop: "type", label: "绫诲瀷", minWidth: 120 },
+  { prop: "status", label: "鐘舵��", minWidth: 100 },
+];
+const handleSelectionChange = (selection) => {
+  console.log("Selected rows:", selection);
+};
+
+// 鎼滅储杩囨护鍔熻兘
+const handleFilter = () => {
+  treeRef.value?.filter(filterText.value);
+};
+
+const filterNode = (value, data) => {
+  if (!value) return true;
+  return data.name?.toLowerCase().includes(value.toLowerCase());
+};
+
+// 澶勭悊鑺傜偣鐐瑰嚮
+const handleNodeClick = async (data) => {
+  console.log("鐐瑰嚮鑺傜偣:", data);
+  let res = await getArchiveList(data.id);
+  tableData.value = res.data?.records || res.data || [];
+  console.log(data)
+};
+const currentPageChange = (id) => {
+  console.log(id);
+};
+// 鍙屽嚮缂栬緫鑺傜偣
+const headerDbClick = (comeTreeData) => {
+  comeTreeData.isEdit = true;
+  newName.value = comeTreeData.name;
+  nextTick(() => {
+    const inputEl = inputRefs.value.get(comeTreeData.id || comeTreeData);
+    if (inputEl) {
+      inputEl.focus();
+      inputEl.select();
+    }
+  });
+};
+
+// 璁剧疆杈撳叆妗嗗紩鐢ㄧ殑鏂规硶
+const setInputRef = (el, data) => {
+  if (el) {
+    inputRefs.value.set(data.id || data, el);
+    if (data.isEdit) {
+      nextTick(() => {
+        // el.focus();
+        // el.select();
+      });
+    }
+  }
+};
+
+// 澶勭悊杈撳叆妗嗗け鐒�
+const handleInputBlur = async (event, comeTreeData, node) => {
+  if (!comeTreeData.isEdit) return; // 濡傛灉涓嶆槸缂栬緫鐘舵�侊紝鐩存帴杩斿洖
+  if (event.relatedTarget && event.relatedTarget.tagName === "BUTTON") {
+    return;
+  }
+  comeTreeData.isEdit = false;
+  const newValue = newName.value.trim();
+  if (comeTreeData.name === newValue) {
+    console.log("娌℃湁淇敼鍐呭");
+    return;
+  }
+  if (newValue === "") {
+    console.warn("杈撳叆涓嶈兘涓虹┖");
+    newName.value = comeTreeData.name || "鏂拌妭鐐�";
+    return;
+  }
+  try {
+    comeTreeData.name = newValue;
+    // 鑾峰彇鐖惰妭鐐圭殑id - 閫氳繃 node 鍙傛暟鏇村噯纭湴鑾峰彇
+    let parentId = null;
+    if (node && node.parent && node.parent.data) {
+      parentId = node.parent.data.id;
+    }
+    await addOrEditTree({
+      name: newValue,
+      parentId: parentId || null, // 濡傛灉娌℃湁鐖惰妭鐐癸紝鍒欎负 null
+    });
+  } catch (error) {
+    console.error("瀛樺偍澶辫触", error);
+    comeTreeData.name = comeTreeData.name || "鏂拌妭鐐�";
+  }
+  console.log("淇濆瓨鎴愬姛:", newValue);
+};
+
+onMounted(async () => {
+  await getList();
+});
+const props = {
+  label: "name",
+  children: "children", // 鏀逛负 children 浠ュ尮閰嶆爣鍑嗙粨鏋�
+  isLeaf: "leaf",
+};
+
+const remove = async (node, data) => {
+  console.log("鍒犻櫎鑺傜偣:", data);
+  if (!data || !data.id) {
+    console.warn("鏃犳硶鍒犻櫎鏈畾涔夋垨鏃犳晥鐨勮妭鐐�");
+    return;
+  }
+  console.log("鍒犻櫎鑺傜偣 ID:", data.id);
+  let { code, msg } = await delTree([data.id]);
+  if (code !== 200) {
+    ElMessage.warning("鍒犻櫎澶辫触, " + msg);
+  } else {
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }
+  await getList();
+};
+
+const append = async (data) => {
+  if (data === "") {
+    // 鏂板鏍硅妭鐐�
+    console.log("鏂板鏍硅妭鐐�");
+    const newNode = {
+      id: Date.now(),
+      name: "鏂拌妭鐐�",
+      isEdit: true,
+    };
+    treeData.value.push(newNode);
+    newName.value = "鏂拌妭鐐�";
+
+    nextTick(() => {
+      const inputEl = inputRefs.value.get(newNode.id || newNode);
+      if (inputEl) {
+        inputEl.focus();
+        inputEl.select();
+      }
+    });
+  } else {
+    const hasChildren = data.children && data.children.length > 0;
+    const nodeKey = data.id || data;
+    const node = treeRef.value?.getNode(nodeKey);
+    const isExpanded = node?.expanded; // 濡傛灉鏈夊瓙绾т笖鏈睍寮�锛屽厛灞曞紑鑺傜偣
+    if (hasChildren && !isExpanded) {
+      console.log(treeRef.value, "灞曞紑鑺傜偣", nodeKey);
+      if (
+        treeRef.value &&
+        treeRef.value.store &&
+        treeRef.value.store.nodesMap[nodeKey]
+      ) {
+        treeRef.value.store.nodesMap[nodeKey].expanded = true;
+      }
+    }
+
+    const newNode = {
+      id: Date.now(),
+      name: "鏂板瓙鑺傜偣",
+      isEdit: true,
+    };
+
+    if (!data.children) {
+      data.children = [];
+    }
+    data.children.push(newNode);
+    newName.value = "鏂板瓙鑺傜偣";
+
+    // 鏍规嵁鏄惁闇�瑕佸睍寮�鏉ュ喅瀹氬欢杩熸椂闂�
+    const delay = hasChildren && !isExpanded ? 200 : 50;
+
+    // 绛夊緟DOM鏇存柊瀹屾垚鍚庡啀鑱氱劍
+    nextTick(() => {
+      setTimeout(() => {
+        const inputEl = inputRefs.value.get(newNode.id || newNode);
+        if (inputEl) {
+          inputEl.focus();
+          inputEl.select();
+
+          // 婊氬姩鍒版柊澧炵殑鑺傜偣浣嶇疆
+          inputEl.$el?.scrollIntoView?.({
+            behavior: "smooth",
+            block: "nearest",
+          });
+        }
+      }, delay);
+    });
+  }
+};
+
+const handleEdit = () => {};
+
+// 绉婚櫎鎳掑姞杞斤紝鐩存帴鑾峰彇鏁版嵁
+const getList = async () => {
+  try {
+    let res = await getTree();
+    if (res.code === 200) {
+      treeData.value = res.data?.records || res.data || [];
+    } else {
+      console.error("Failed to fetch tree data:", res.message);
+      treeData.value = [];
+    }
+  } catch (error) {
+    console.error("鑾峰彇鏍戝舰鏁版嵁澶辫触:", error);
+    treeData.value = [];
+  }
+};
+</script>
+<style scoped lang="scss">
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding-right: 8px;
+}
+
+// 鏍戝舰鑿滃崟鏍峰紡
+.tree-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 16px;
+  padding-bottom: 12px;
+  border-bottom: 1px solid #e4e7ed;
+
+  h3 {
+    margin: 0;
+    font-size: 16px;
+    font-weight: 600;
+    color: #303133;
+  }
+}
+
+.search-box {
+  margin-bottom: 16px;
+
+  .el-input {
+    border-radius: 6px;
+
+    :deep(.el-input__wrapper) {
+      border-radius: 6px;
+      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+
+      &:hover {
+        box-shadow: 0 1px 6px rgba(0, 0, 0, 0.15);
+      }
+
+      &.is-focus {
+        box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
+      }
+    }
+  }
+}
+
+.tree-container {
+  flex: 1;
+  overflow-y: auto;
+  border: 1px solid #dcdfe6;
+  border-radius: 8px;
+  background: #fff;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+
+  .custom-tree {
+    padding: 8px;
+    background: transparent;
+
+    :deep(.el-tree-node) {
+      .el-tree-node__content {
+        height: 36px;
+        padding: 0 8px;
+        border-radius: 6px;
+        margin: 2px 0;
+        transition: all 0.2s ease;
+
+        &:hover {
+          background-color: #f0f9ff;
+        }
+
+        &.is-current {
+          background-color: #e6f7ff;
+          border: 1px solid #91d5ff;
+        }
+      }
+
+      .el-tree-node__expand-icon {
+        color: #606266;
+        font-size: 14px;
+        padding: 6px;
+
+        &.expanded {
+          transform: rotate(90deg);
+        }
+
+        &.is-leaf {
+          color: transparent;
+        }
+      }
+    }
+  }
+}
+
+.tree-node-content {
+  display: flex;
+  align-items: center;
+  width: 100%;
+  padding: 4px 0;
+
+  .node-icon {
+    margin-right: 8px;
+    color: #faad14;
+    display: flex;
+    align-items: center;
+
+    .el-icon {
+      font-size: 16px;
+
+      &.expanded {
+        color: #1890ff;
+      }
+    }
+  }
+
+  .node-label {
+    flex: 1;
+    min-width: 0;
+
+    .label-text {
+      font-size: 14px;
+      color: #303133;
+      cursor: pointer;
+      display: block;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+
+      &:hover {
+        color: #1890ff;
+      }
+    }
+  }
+
+  .node-actions {
+    opacity: 0;
+    transition: opacity 0.2s ease;
+    display: flex;
+
+    .el-button {
+      padding: 4px;
+      margin-left: 4px;
+      color: #909399;
+      min-height: auto;
+
+      &:hover {
+        color: #1890ff;
+        background-color: #f0f9ff;
+      }
+
+      &.el-button--text:hover {
+        background-color: #f0f9ff;
+      }
+    }
+  }
+
+  &:hover .node-actions {
+    opacity: 1;
+  }
+}
+
+// 杈撳叆妗嗘牱寮忕編鍖�
+.tree-input {
+  flex: 1;
+
+  :deep(.el-input__wrapper) {
+    border-radius: 4px;
+    border: 1px solid #d9d9d9;
+    transition: all 0.2s ease;
+
+    &:hover {
+      border-color: #40a9ff;
+    }
+
+    &.is-focus {
+      border-color: #1890ff;
+      box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+    }
+  }
+
+  :deep(.el-input__inner) {
+    padding: 4px 8px;
+    font-size: 14px;
+    color: #303133;
+
+    &::placeholder {
+      color: #bfbfbf;
+    }
+  }
+}
+.el-card {
+  width: calc(100% - 40px);
+  height: calc(100vh - 130px);
+  margin: 20px;
+  box-sizing: border-box;
+  .left {
+    width: 30%;
+    height: calc(100vh - 160px);
+    background-color: #fafafa;
+    padding: 16px;
+    float: left;
+    box-sizing: border-box;
+    border-radius: 8px;
+
+    .left-content {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+    }
+  }
+  .right {
+    width: 70%;
+    height: calc(100vh - 160px);
+    padding: 0px 10px;
+    float: left;
+  }
+}
+.archive-management-card{
+  margin: 0;
+}
+</style>
diff --git a/src/views/basicInformation/index.vue b/src/views/basicInformation/index.vue
index c8be716..f399bc0 100644
--- a/src/views/basicInformation/index.vue
+++ b/src/views/basicInformation/index.vue
@@ -416,7 +416,10 @@
   loading.value = true;
   tabName.value = tab.props.name;
   tableData.value = [];
-
+  pageNum.value = 1;
+  pageSizes.value = 10;
+  total.value = 0;
+  queryParams.searchAll = "";
   // 鏍规嵁鏍囩椤电被鍨嬭缃搴旂殑鍒楅厤缃�
   const tabConfig = {
     supplier: () => {
@@ -615,7 +618,7 @@
       ElMessage.error("鍒犻櫎鎺ュ彛鏈厤缃�");
       return;
     }
-
+    console.log(deleteIds)
     const res = await deleteApi(deleteIds);
     
     if (res.code !== 200 && res.msg !== "鎿嶄綔鎴愬姛") {
diff --git a/src/views/basicInformation/indexs.vue b/src/views/basicInformation/indexs.vue
deleted file mode 100644
index 7a9559d..0000000
--- a/src/views/basicInformation/indexs.vue
+++ /dev/null
@@ -1,541 +0,0 @@
-<template>
-  <div class="app-container">
-      <el-form :inline="true" :model="queryParams" class="search-form">
-        <el-form-item label="鎼滅储">
-          <el-input
-            v-model="queryParams.searchText"
-            placeholder="璇疯緭鍏ュ叧閿瘝"
-            clearable
-            :style="{ width: '100%' }"
-          />
-        </el-form-item>
-        <el-form-item label="渚涘簲鍟嗗悕绉�">
-          <el-input
-            v-model="queryParams.supplierName"
-            placeholder="璇疯緭鍏�"
-            clearable
-            :style="{ width: '100%' }"
-          />
-        </el-form-item>
-        <el-form-item label="缁熶竴浜鸿瘑鍒彿">
-          <el-input
-            v-model="queryParams.identifyNumber"
-            placeholder="璇疯緭鍏�"
-            clearable
-            :style="{ width: '100%' }"
-          />
-        </el-form-item>
-        <el-form-item label="缁忚惀鍦板潃">
-          <el-input
-            v-model="queryParams.address"
-            placeholder="璇疯緭鍏�"
-            clearable
-            :style="{ width: '100%' }"
-          />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
-          <el-button @click="resetQuery">閲嶇疆</el-button>
-        </el-form-item>
-      </el-form>
-    <el-card>
-      <!-- 鏍囩椤� -->
-      <el-tabs
-        v-model="activeTab"
-        class="info-tabs"
-        @tab-click="handleTabClick"
-      >
-        <el-tab-pane
-          v-for="tab in tabs"
-          :key="tab.name"
-          :label="tab.label"
-          :name="tab.name"
-        />
-      </el-tabs>
-
-      <!-- 鎿嶄綔鎸夐挳鍖� -->
-      <el-row :gutter="24" class="table-toolbar">
-        <el-button type="primary" :icon="Plus" @click="handleAdd"
-          >鏂板缓</el-button
-        >
-        <el-button type="danger" :icon="Delete">鍒犻櫎</el-button>
-        <el-button type="info" :icon="Download" @click="handleExport">瀵煎嚭</el-button>
-      </el-row> 
-      <!-- 琛ㄦ牸缁勪欢 -->
-      <div>
-        <data-table
-          :loading="loading"
-          :table-data="tableData"
-          :columns="columns"
-          @selection-change="handleSelectionChange"
-          @edit="handleEdit"
-          @delete="handleDeleteSuccess"
-          :show-selection="true"
-          :border="true"
-          :maxHeight="440"
-        />
-      </div>
-      <pagination
-        v-if="total>0"
-        :page-num="queryParams.pageNum"
-        :page-size="queryParams.pageSize"
-        :total="total"
-        @pagination="handleQuery"
-        :layout="'total, prev, pager, next, jumper'"
-      />
-      <Supplier
-        v-if="tabName === 'supplier'"
-        v-model:supplierDialogFormVisible="dialogFormVisible"
-        :form="form"
-        :title="title"
-        @submit="handleSubmit"
-        @beforeClose="handleBeforeClose"
-        @update:dialogFormVisible="handleDialogFormVisible"
-        :addOrEdit="addOrEdit"
-      />
-      <Customer
-        v-if="tabName === 'customer'"
-        v-model:customerDialogFormVisible="dialogFormVisible"
-        :form="form"
-        :title="title"
-        @submit="handleSubmit"
-        @beforeClose="handleBeforeClose"
-      />
-      <Coal
-        v-if="tabName === 'coal'"
-        v-model:coalDialogFormVisible="dialogFormVisible"
-        :form="form"
-        :title="title"
-        @submit="handleSubmit"
-      />
-    </el-card>
-  </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "../../../hooks/usePaginationApi";
-import { ref, reactive, onMounted } from "vue";
-import { ElMessage } from "element-plus";
-import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue";
-import DataTable from "@/components/Table/ETable.vue";
-import Pagination from "@/components/Pagination";
-import Supplier from "./mould/supplier.vue";
-import Customer from "./mould/customer.vue";
-import Coal from "./mould/coal.vue";
-const { proxy } = getCurrentInstance()
-
-const {
-  columns
-} = usePaginationApi(()=> {
-  // 鍒嗛〉閫昏緫鍙互鍦ㄨ繖閲屽鐞�
-},{
-  searchText: "",
-  supplierName: "",
-  identifyNumber: "",
-  address: "",
-  pageNum: 1,
-  pageSize: 10,
-},[
-  { prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minWidth: 200 },
-  { prop: "identifyNumber", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 120 },
-  { prop: "address", label: "缁忚惀鍦板潃", minWidth: 150 },
-  { prop: "bank", label: "寮�鎴疯", minWidth: 120 },
-  { prop: "bankAccount", label: "閾惰璐﹀彿", minWidth: 150 },
-  { prop: "contacts", label: "鑱旂郴浜�", minWidth: 100 },
-  { prop: "contactAddress", label: "鑱旂郴鍦板潃", minWidth: 150 },
-  { prop: "maintainer", label: "缁存姢浜�", minWidth: 100 },
-  { prop: "maintainDate", label: "缁存姢鏃ユ湡", minWidth: 100 },
-]);
-
-
-
-
-
-// 寮圭獥
-const customerDialogFormVisible = ref(false);
-const coalDialogFormVisible = ref(false);
-const supplierDialogFormVisible = ref(false);
-const dialogFormVisible = ref(false);
-const form = ref({});
-const title = ref("");
-const copyForm = ref({});
-// 褰撳墠鏍囩
-const tabName = ref("supplier");
-// 鐘舵�佸彉閲�
-const loading = ref(false);
-const total = ref(200);
-const activeTab = ref("supplier");
-const selectedRows = ref([]);
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
-  searchText: "",
-  supplierName: "",
-  identifyNumber: "",
-  address: "",
-  pageNum: 1,
-  pageSize: 10,
-});
-onMounted(() => {
-  handleTabClick({ props: { name: "supplier" } });
-});
-// 鏍囩椤垫暟鎹�
-const tabs = reactive([
-  { name: "supplier", label: "渚涘簲鍟嗕俊鎭�" },
-  { name: "customer", label: "瀹㈡埛淇℃伅" },
-  { name: "coal", label: "鐓ょ淇℃伅" },
-]);
-// 鏄惁缂栬緫
-const addOrEdit = ref("add");
-// 琛ㄦ牸鏁版嵁
-const tableData = ref([]);
-// 鏂规硶瀹氫箟
-const handleQuery = () => {
-  loading.value = true;
-  // 杩欓噷娣诲姞瀹為檯鐨勬煡璇㈤�昏緫
-  setTimeout(() => {
-    loading.value = false;
-  }, 500);
-};
-
-/* // supplier 渚涘簲鍟嗘暟鎹�
-const supplierColumns = reactive([
-  { prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minWidth: 200 },
-  { prop: "identifyNumber", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 120 },
-  { prop: "address", label: "缁忚惀鍦板潃", minWidth: 150 },
-  { prop: "bank", label: "寮�鎴疯", minWidth: 120 },
-  { prop: "bankAccount", label: "閾惰璐﹀彿", minWidth: 150 },
-  { prop: "contacts", label: "鑱旂郴浜�", minWidth: 100 },
-  { prop: "contactAddress", label: "鑱旂郴鍦板潃", minWidth: 150 },
-  { prop: "maintainer", label: "缁存姢浜�", minWidth: 100 },
-  { prop: "maintainDate", label: "缁存姢鏃ユ湡", minWidth: 100 },
-]);
-// customer 瀹㈡埛鏁版嵁
-const customerColumns = reactive([
-  { prop: "customerName", label: "瀹㈡埛鍚嶇О", minWidth: 200 },
-  { prop: "identifyNumber", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 120 },
-  { prop: "address", label: "缁忚惀鍦板潃", minWidth: 150 },
-  { prop: "bank", label: "寮�鎴疯", minWidth: 120 },
-  { prop: "bankAccount", label: "閾惰璐﹀彿", minWidth: 150 },
-  { prop: "contacts", label: "鑱旂郴浜�", minWidth: 100 },
-  { prop: "contactAddress", label: "鑱旂郴鍦板潃", minWidth: 150 },
-  { prop: "maintainer", label: "缁存姢浜�", minWidth: 100 },
-  { prop: "maintainDate", label: "缁存姢鏃ユ湡", minWidth: 100 },
-]);
-// coal 鐓ょ鏁版嵁
-const coalColumns = reactive([
-  { prop: "coalName", label: "鐓ょ鍚嶇О", minWidth: 200 },
-  { prop: "maintainer", label: "缁存姢浜�", minWidth: 120 },
-  { prop: "maintenanceDate", label: "缁存姢鏃ユ湡", minWidth: 150 },
-]); */
-
-// 鏍囩椤电偣鍑�
-const handleTabClick = (tab) => {
-  loading.value = true;
-  tabName.value = tab.props.name;
-  tableData.value = [];
-  getList();
-  switch (tabName.value) {
-    case "supplier":
-      dialogFormVisible.value = supplierDialogFormVisible.value;
-      break;
-    case "customer":
-      columns.value = customerColumns;
-      dialogFormVisible.value = customerDialogFormVisible.value;
-      break;
-    case "coal":
-      columns.value = coalColumns;
-      dialogFormVisible.value = coalDialogFormVisible.value;
-      break;
-  }
-  setTimeout(() => {
-    loading.value = false;
-  }, 500);
-};
-// 閲嶇疆鏌ヨ
-const resetQuery = () => {
-  Object.keys(queryParams).forEach((key) => {
-    if (key !== "pageNum" && key !== "pageSize") {
-      queryParams[key] = "";
-    }
-  });
-  handleQuery();
-};
-// 鏂板
-const handleAdd = () => {
-  addOrEdit.value = "add";
-  handleAddEdit(tabName.value);
-};
-// 鏂板缂栬緫
-const handleAddEdit = (tabName) => {
-  addOrEdit.value == "add" ? (title.value = "鏂板") : (title.value = "缂栬緫");
-  if (tabName === "supplier") {
-    dialogFormVisible.value = true;
-    title.value = title.value + "渚涘簲鍟嗕俊鎭�";
-    openDialog();
-  } else if (tabName === "customer") {
-    dialogFormVisible.value = true;
-    title.value = title.value + "瀹㈡埛淇℃伅";
-    openDialog();
-  } else if (tabName === "coal") {
-    dialogFormVisible.value = true;
-    title.value = title.value + "鐓ょ淇℃伅";
-    openDialog();
-  }
-};
-// 鎵撳紑寮圭獥
-const openDialog = () => {
-  if (addOrEdit.value === "edit") {
-    copyForm.value = JSON.parse(JSON.stringify(form.value));
-    dialogFormVisible.value = true;
-    return;
-  }
-  form.value = {};
-  dialogFormVisible.value = true;
-};
-
-// 鎻愪氦琛ㄥ崟
-const handleSubmit = (val) => {
-  // 鎷垮埌鎻愪氦鏁版嵁
-  dialogFormVisible.value = false;
-  getList();
-};
-const handleDialogFormVisible = (value) => {
-  dialogFormVisible.value = value;
-};
-// 閫夋嫨琛�
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-// 缂栬緫
-const handleEdit = (row) => {
-  if (row.supplierName) {
-    form.value = JSON.parse(JSON.stringify(row));
-    addOrEdit.value = "edit";
-    handleAddEdit(tabName.value);
-    return;
-  }
-  if (selectedRows.value.length === 1) {
-    form.value = JSON.parse(JSON.stringify(selectedRows.value[0]));
-    addOrEdit.value = "edit";
-    handleAddEdit(tabName.value);
-    return;
-  } else {
-    ElMessage.warning("璇烽�夋嫨涓�鏉℃暟鎹慨鏀�");
-  }
-};
-
-const handleDeleteSuccess = (row) => {
-  ElMessage.success("鍒犻櫎鎴愬姛锛�" + row.supplierName);
-};
-// 鍏抽棴寮圭獥
-const handleBeforeClose = () => {
-  dialogFormVisible.value = false;
-  form.value = {};
-};
-const handleExport = (row) => {
-  proxy.download("system/post/export", {
-    ...queryParams.value
-  }, `post_${new Date().getTime()}.xlsx`)
-  ElMessage.success("瀵煎嚭鏁版嵁锛�" + row.supplierName);
-};
-const getList = () => {
-  loading.value = true;
-  setTimeout(() => {
-    tableData.value = [
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "123412123123123111",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-        contactsPhone: "19345678901",
-      },
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "123412123123123111",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-        contactsPhone: "19345678901",
-      },
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "123412123123123111",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-        contactsPhone: "19345678901",
-      },
-      {
-        supplierName: "浜ら�氶摱琛岃偂浠芥湁闄愬叕鍙�",
-        identifyNumber: "042-26881314",
-        address: "姹熻タ鐪�",
-        bank: "骞冲畨閾惰",
-        bankAccount: "123456789012345678",
-        contacts: "鍛ㄧ櫧鐜�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鍛ㄧ櫧鐜�",
-        maintainDate: "2022-08-29",
-      },
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "019-65851198",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-      },
-      {
-        supplierName: "浜ら�氶摱琛岃偂浠芥湁闄愬叕鍙�",
-        identifyNumber: "042-26881314",
-        address: "姹熻タ鐪�",
-        bank: "骞冲畨閾惰",
-        bankAccount: "123456789012345678",
-        contacts: "鍛ㄧ櫧鐜�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鍛ㄧ櫧鐜�",
-        maintainDate: "2022-08-29",
-      },
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "019-65851198",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-      },
-      {
-        supplierName: "浜ら�氶摱琛岃偂浠芥湁闄愬叕鍙�",
-        identifyNumber: "042-26881314",
-        address: "姹熻タ鐪�",
-        bank: "骞冲畨閾惰",
-        bankAccount: "123456789012345678",
-        contacts: "鍛ㄧ櫧鐜�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鍛ㄧ櫧鐜�",
-        maintainDate: "2022-08-29",
-      },
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "019-65851198",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-      },
-      {
-        supplierName: "浜ら�氶摱琛岃偂浠芥湁闄愬叕鍙�",
-        identifyNumber: "042-26881314",
-        address: "姹熻タ鐪�",
-        bank: "骞冲畨閾惰",
-        bankAccount: "123456789012345678",
-        contacts: "鍛ㄧ櫧鐜�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鍛ㄧ櫧鐜�",
-        maintainDate: "2022-08-29",
-      },
-      {
-        supplierName: "涓浗鍐堕噾绉戝伐鑲′唤鏈夐檺鍏徃",
-        identifyNumber: "019-65851198",
-        address: "灞辫タ鐪�",
-        bank: "浜ら�氶摱琛�",
-        bankAccount: "901234567890123456",
-        contacts: "鏉庨洩鑺�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鏉庨洩鑺�",
-        maintainDate: "2022-09-26",
-      },
-      {
-        supplierName: "浜ら�氶摱琛岃偂浠芥湁闄愬叕鍙�",
-        identifyNumber: "042-26881314",
-        address: "姹熻タ鐪�",
-        bank: "骞冲畨閾惰",
-        bankAccount: "123456789012345678",
-        contacts: "鍛ㄧ櫧鐜�",
-        contactAddress: "XX鐪乆X甯俋X鍖篨X璺�",
-        maintainer: "鍛ㄧ櫧鐜�",
-        maintainDate: "2022-08-29",
-      },
-    ];
-    total.value = tableData.value.length;
-    loading.value = false;
-  }, 500);
-};
-getList();
-</script>
-
-<style scoped>
-.app-container{
-  box-sizing: border-box;
-}
-.search-form {
-  background-color: #fff;
-  padding: 20px 20px 0 20px;
-  margin-bottom: 20px;
-  border-radius: 4px;
-  box-shadow: var(--el-box-shadow-light);
-}
-.search-form :deep(.el-form-item) {
-  margin-bottom: 16px;
-  width: 100%;
-}
-
-/* 鍝嶅簲寮忓竷灞� */
-@media screen and (min-width: 768px) {
-  .search-form :deep(.el-form-item) {
-    width: 50%;
-  }
-}
-@media screen and (min-width: 1200px) {
-  .search-form :deep(.el-form-item) {
-    width: 18%;
-  }
-}
-.info-tabs {
-  margin-bottom: 20px;
-}
-.table-toolbar {
-  margin-bottom: 20px;
-  display: flex;
-  flex-wrap: wrap;
-  gap: 10px;
-}
-
-/* 鍝嶅簲寮忚〃鏍� */
-@media screen and (max-width: 768px) {
-  .table-toolbar {
-    flex-direction: column;
-  }
-  .table-toolbar .el-button {
-    width: 100%;
-  }
-}
-/* 琛ㄦ牸宸ュ叿鏍� */
-.table-toolbar, .table-toolbar > * {
-  margin: 0 0 0 0 !important;
-}
-.table-toolbar{
-  margin-bottom: 20px !important;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/basicInformation/mould/coalQualityMaintenance.vue b/src/views/basicInformation/mould/coalQualityMaintenance.vue
index 26fe0ac..da58839 100644
--- a/src/views/basicInformation/mould/coalQualityMaintenance.vue
+++ b/src/views/basicInformation/mould/coalQualityMaintenance.vue
@@ -118,12 +118,11 @@
  */
 const initFormData = (newForm) => {
   formData.value = { ...newForm };
-  console.log(formData.value)
   // 澶勭悊 coalFieldList 瀛楁锛氱紪杈戞椂闇�瑕佸皢瀛楃涓茶浆鎹负鏁扮粍渚涘閫夌粍浠朵娇鐢�
-  if (newForm.coalFields) {
-    if (typeof newForm.coalFields === 'string') {
+  if (newForm.fieldIds) {
+    if (typeof newForm.fieldIds === 'string') {
       // 灏嗗瓧绗︿覆杞崲涓篒D鏁扮粍锛岀劧鍚庡尮閰嶅搴旂殑閫夐」瀵硅薄
-      const ids = parseCoalFields(newForm.coalFields);
+      const ids = parseCoalFields(newForm.fieldIds);
       formData.value.coalFieldList = ids.map(id => {
         const option = fieldOptions.find(opt => opt.value === id);
         return option || { fields: `瀛楁${id}`, value: id };
diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index 3216d1f..5a0f8a9 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -33,48 +33,66 @@
               <el-option label="鍚�" value="鍚�" />
               <el-option label="鍗冨厠" value="鍗冨厠" />
             </el-select>
-        </el-form-item>
-        <el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
-          <el-input v-model.number="form.purchaseQuantity" placeholder="璇疯緭鍏�"  >
+        </el-form-item>        <el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
+          <el-input 
+            v-model.number="form.purchaseQuantity" 
+            placeholder="璇疯緭鍏�"
+            @blur="handleQuantityBlur"
+          >
             <template v-slot:suffix>
             <i style="font-style:normal;">{{form.unit?form.unit:''}}</i>
           </template>
           </el-input>
+        </el-form-item><el-form-item label="绋庣巼" prop="taxRate">
+          <el-input 
+            v-model.number="form.taxRate" 
+            placeholder="璇疯緭鍏ョ◣鐜�"
+            @blur="handleTaxRateBlur"
+          >
+            <template v-slot:suffix>
+            <i style="font-style:normal;">%</i>
+          </template>
+            </el-input>
         </el-form-item>
         <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
-          <el-input v-model.number="form.priceExcludingTax" placeholder="璇疯緭鍏�" >
+          <el-input 
+            v-model.number="form.priceExcludingTax" 
+            placeholder="璇疯緭鍏�"
+            @blur="handlePriceBlur"
+          >
+            <template v-slot:suffix>
+            <i style="font-style:normal;">鍏�</i>
+          </template>
+          </el-input>
+        </el-form-item>        <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
+          <el-input 
+            v-model.number="form.priceIncludingTax"
+            placeholder="鑷姩璁$畻" 
+          >
             <template v-slot:suffix>
             <i style="font-style:normal;">鍏�</i>
           </template>
           </el-input>
         </el-form-item>
         <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
-          <el-input v-model.number="form.totalPriceExcludingTax" placeholder="璇疯緭鍏�" >
-            <template v-slot:suffix>
-            <i style="font-style:normal;">鍏�</i>
-          </template>
-          </el-input>
-        </el-form-item>
-        <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
-          <el-input v-model.number="form.priceIncludingTax" placeholder="璇疯緭鍏�" >
+          <el-input 
+            v-model.number="form.totalPriceExcludingTax"
+            placeholder="鑷姩璁$畻" 
+          >
             <template v-slot:suffix>
             <i style="font-style:normal;">鍏�</i>
           </template>
           </el-input>
         </el-form-item>
         <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
-          <el-input v-model.number="form.totalPriceIncludingTax" placeholder="璇疯緭鍏�" >
+          <el-input 
+            v-model.number="form.totalPriceIncludingTax"
+            placeholder="鑷姩璁$畻" 
+          >
             <template v-slot:suffix>
             <i style="font-style:normal;">鍏�</i>
           </template>
           </el-input>
-        </el-form-item>
-        <el-form-item label="绋庣巼" prop="taxRate">
-          <el-input v-model="form.taxRate" placeholder="璇疯緭鍏ョ◣鐜�" >
-            <template v-slot:suffix>
-            <i style="font-style:normal;">%</i>
-          </template>
-            </el-input>
         </el-form-item>
         <el-form-item label="鐧昏浜�" prop="registrantId">
           <el-input v-model="form.registrantId" disabled placeholder="璇疯緭鍏�" />
@@ -111,7 +129,7 @@
 </template>
 
 <script setup name="ProductionDialog">
-import { ref, defineProps, watch, onMounted, nextTick } from "vue";
+import { ref, defineProps, watch, onMounted, nextTick, computed  } from "vue";
 import { ElMessage } from "element-plus";
 import useUserStore from '@/store/modules/user'
 import {addOrEditPR} from "@/api/procureMent";
@@ -134,8 +152,89 @@
   required: true,
   type: Object,
 });
+
+const toFixed = (num, precision = 2) => {
+  if (isNaN(num) || num === null || num === undefined || num === '') {
+    return 0;
+  }
+  return Math.floor(parseFloat(num) * Math.pow(10, precision)) / Math.pow(10, precision);
+};
+// 鍚◣鍗曚环璁$畻
+const unitPriceWithTax = computed(() => {
+  const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
+  const taxRate = parseFloat(form.value.taxRate) || 0;
+  if (!priceExcludingTax || !taxRate) {
+    return 0;
+  }
+  const result = priceExcludingTax * (1 + taxRate / 100);
+  return toFixed(result, 2);
+});
+
+// 鍚◣鎬讳环璁$畻
+const totalUnitPriceWithTax = computed(() => {
+  const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
+  const taxRate = parseFloat(form.value.taxRate) || 0;
+  const purchaseQuantity = parseFloat(form.value.purchaseQuantity) || 0;
+  
+  if (!priceExcludingTax || !taxRate || !purchaseQuantity) {
+    return 0;
+  }
+  
+  const unitPriceWithTaxValue = priceExcludingTax * (1 + taxRate / 100);
+  const result = unitPriceWithTaxValue * purchaseQuantity;
+  return toFixed(result, 2);
+});
+
+// 涓嶅惈绋庢�讳环璁$畻
+const taxExclusiveTotalPrice = computed(() => {
+  const purchaseQuantity = parseFloat(form.value.purchaseQuantity) || 0;
+  const priceExcludingTax = parseFloat(form.value.priceExcludingTax) || 0;
+  
+  if (!purchaseQuantity || !priceExcludingTax) {
+    return 0;
+  }
+  
+  const result = purchaseQuantity * priceExcludingTax;
+  return toFixed(result, 2);
+});
+
+// 鐩戝惉璁$畻鍊煎彉鍖栵紝鍚屾鍒� form 瀵硅薄涓�
+watch(unitPriceWithTax, (newValue) => {
+  form.value.priceIncludingTax = newValue;
+});
+
+watch(totalUnitPriceWithTax, (newValue) => {
+  form.value.totalPriceIncludingTax = newValue;
+});
+
+watch(taxExclusiveTotalPrice, (newValue) => {
+  form.value.totalPriceExcludingTax = newValue;
+});
+
 const userStore = useUserStore()
 const userInfo = ref({});
+
+// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︼紝纭繚绮惧害
+const handleTaxRateBlur = () => {
+  if (form.value.taxRate !== null && form.value.taxRate !== undefined && form.value.taxRate !== '') {
+    form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
+  }
+};
+
+// 澶勭悊涓嶅惈绋庡崟浠疯緭鍏ユ澶辩劍锛岀‘淇濈簿搴�
+const handlePriceBlur = () => {
+  if (form.value.priceExcludingTax !== null && form.value.priceExcludingTax !== undefined && form.value.priceExcludingTax !== '') {
+    form.value.priceExcludingTax = toFixed(parseFloat(form.value.priceExcludingTax), 2);
+  }
+};
+
+// 澶勭悊閲囪喘鏁伴噺杈撳叆妗嗗け鐒︼紝纭繚绮惧害
+const handleQuantityBlur = () => {
+  if (form.value.purchaseQuantity !== null && form.value.purchaseQuantity !== undefined && form.value.purchaseQuantity !== '') {
+    form.value.purchaseQuantity = toFixed(parseFloat(form.value.purchaseQuantity), 3); // 鏁伴噺淇濈暀3浣嶅皬鏁�
+  }
+};
+
 onMounted(async () => {
   let res = await userStore.getInfo()
   userInfo.value = res;
@@ -176,6 +275,7 @@
 const formRef = ref(null);
 // 鎻愪氦琛ㄥ崟
 const handleSubmit = async () => {
+  console.log("鎻愪氦琛ㄥ崟", form.value);
   if (!formRef.value) return;
   await formRef.value.validate(async (valid) => {
     if (valid) {
diff --git a/src/views/production/components/ProductionDialog.vue b/src/views/production/components/ProductionDialog.vue
index 7ce8482..035d75a 100644
--- a/src/views/production/components/ProductionDialog.vue
+++ b/src/views/production/components/ProductionDialog.vue
@@ -1,4 +1,4 @@
-<template>
+div<template>
   <el-dialog
     v-model="dialogVisible"
     :title="dialogType === 'add' ? '鏂板鐢熶骇鍔犲伐' : '缂栬緫鐢熶骇鍔犲伐'"
@@ -17,9 +17,9 @@
       @row-click="handleRowClick"
       :editableColumns="['used']"
     />
-    <div v-if="tableData.length > 0" class="empty-table">
+    <div class="empty-table">
     <h1>鐢熶骇鏄庣粏</h1>
-      <el-row :gutter="10">
+      <el-row :gutter="10" v-if="tableData.length > 0">
       <el-col :span="2">
         <el-button type="primary" @click="addNewRow">
           <el-icon>
@@ -45,6 +45,7 @@
       </el-col> -->
     </el-row>
     <ProductionDetailsTable
+     v-if="tableData.length > 0"
       v-model="detailsTableData"
       :border="false"
       :show-operations="true"
@@ -52,8 +53,9 @@
       @input-change="handleDetailsChange"
       @delete-row="handleDeleteRow"
     />
-    </div>
       <div style="margin-top: 20px;" v-else>鏆傛棤鏁版嵁锛岃閫夋嫨閰嶇疆鏁版嵁</div>
+
+    </div>
 
     <template #footer>
       <div class="dialog-footer">
@@ -452,4 +454,7 @@
 .el-row > .el-col > h1 {
   font-weight: bolder;
 }
+.empty-table > .el-row{
+  margin-bottom: 12px;
+}
 </style>
diff --git a/src/views/production/index.vue b/src/views/production/index.vue
index 8872835..0e9b005 100644
--- a/src/views/production/index.vue
+++ b/src/views/production/index.vue
@@ -32,17 +32,17 @@
 import Pagination from "@/components/Pagination/index.vue";
 const childRef = ref(null);
 const columns = [
-  { prop: "category", label: "鐓ょ", width: 150 },
-  { prop: "unit", label: "鍗曚綅", width: 120 },
-  { prop: "productionVolume", label: "鐢熶骇鏁伴噺", width: 150 },
-  { prop: "laborCost", label: "浜哄伐鎴愭湰", width: 150 },
-  { prop: "materialCost", label: "鍘熸枡鎴愭湰", width: 120 },
-  { prop: "equipmentCost", label: "璁惧璐圭敤", width: 143 },
-  { prop: "totalCost", label: "鎬绘垚鏈�", width: 150 },
-  { prop: "totalPrice", label: "鎬诲敭浠�", width: 150 },
-  { prop: "profit", label: "鍒╂鼎", width: 100 },
-  { prop: "reviewer", label: "澶嶈浜�", width: 120 },
-  { prop: "date", label: "鏃ユ湡", width: 150 },
+  { prop: "category", label: "鐓ょ", minWidth: 150 },
+  { prop: "unit", label: "鍗曚綅", minWidth: 120 },
+  { prop: "productionVolume", label: "鐢熶骇鏁伴噺", minWidth: 150 },
+  { prop: "laborCost", label: "浜哄伐鎴愭湰", minWidth: 150 },
+  { prop: "materialCost", label: "鍘熸枡鎴愭湰", minWidth: 120 },
+  { prop: "equipmentCost", label: "璁惧璐圭敤", minWidth: 143 },
+  { prop: "totalCost", label: "鎬绘垚鏈�", minWidth: 150 },
+  { prop: "totalPrice", label: "鎬诲敭浠�", minWidth: 150 },
+  { prop: "profit", label: "鍒╂鼎", minWidth: 100 },
+  { prop: "reviewer", label: "澶嶈浜�", minWidth: 120 },
+  { prop: "date", label: "鏃ユ湡", minWidth: 150 },
 ];
 
 // 鎼滅储琛ㄥ崟鏁版嵁

--
Gitblit v1.9.3