From 7619d415522ab3dc3299d6a2a9f5c9964a692d3f Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期三, 18 六月 2025 17:58:53 +0800
Subject: [PATCH] 添加生产管理接口及优化表格字段

---
 src/views/production/components/ProductionDialog.vue |  721 +++++++++++++++++++++++++++++-------------------------
 1 files changed, 387 insertions(+), 334 deletions(-)

diff --git a/src/views/production/components/ProductionDialog.vue b/src/views/production/components/ProductionDialog.vue
index 035d75a..7733da7 100644
--- a/src/views/production/components/ProductionDialog.vue
+++ b/src/views/production/components/ProductionDialog.vue
@@ -1,4 +1,4 @@
-div<template>
+<template>
   <el-dialog
     v-model="dialogVisible"
     :title="dialogType === 'add' ? '鏂板鐢熶骇鍔犲伐' : '缂栬緫鐢熶骇鍔犲伐'"
@@ -6,60 +6,84 @@
     :close-on-click-modal="false"
     @close="handleClose"
   >
-    <el-button type="primary" @click="handlData">閫夋嫨鏁版嵁</el-button>
-    <ETable
-      v-if="tableData.length > 0"
-      :columns="columns"
-      height="200"
-      @cell-edit="handleCellEdit"
-      :showOperations="false"
-      :tableData="tableData"
-      @row-click="handleRowClick"
-      :editableColumns="['used']"
-    />
-    <div class="empty-table">
-    <h1>鐢熶骇鏄庣粏</h1>
-      <el-row :gutter="10" v-if="tableData.length > 0">
-      <el-col :span="2">
-        <el-button type="primary" @click="addNewRow">
-          <el-icon>
-            <Plus />
-          </el-icon>
-          鏂板
-        </el-button>
+    <el-row :gutter="10" style="margin-bottom: 10px">
+      <el-col :span="3">
+        <el-button type="primary" @click="handlData"
+          ><el-icon> <Plus /> </el-icon>閫夋嫨鏁版嵁</el-button
+        >
       </el-col>
-      <el-col :span="2">
-        <el-button type="danger" @click="clearAllRows">
+      <el-col :span="4">
+        <el-button
+          type="danger"
+          @click="removeSelectedData"
+          :disabled="tableData.length === 0"
+        >
           <el-icon>
             <Delete />
           </el-icon>
-          娓呯┖
+          娓呯┖宸查��
         </el-button>
       </el-col>
-      <!-- <el-col :span="2">
-        <el-button type="warning" @click="calculateAllCosts">
-          <el-icon>
-            <Warning />
-          </el-icon> 閲嶆柊璁$畻
-        </el-button>
-      </el-col> -->
+      <el-col :span="17" style="text-align: right; line-height: 32px">
+        <el-text type="info" size="small">
+          宸查�夋嫨 {{ tableData.length }} 椤规暟鎹�
+          <span v-if="tableData.length > 0">
+            锛屾�讳娇鐢ㄩ噺: {{ totalUsedQuantity.toFixed(2) }}
+          </span>
+        </el-text>
+      </el-col>
     </el-row>
-    <ProductionDetailsTable
-     v-if="tableData.length > 0"
-      v-model="detailsTableData"
-      :border="false"
-      :show-operations="true"
-      :auto-calculate="true"
-      @input-change="handleDetailsChange"
-      @delete-row="handleDeleteRow"
+    <ETableModify
+      :columns="columns"
+      :showOperations="false"
+      height="200"
+      @cell-edit="handleCellEdit"
+      :tableData="tableData"
+      :showOverflowTooltip="false"
+      @row-click="handleRowClick"
+      :editableColumns="['usedQuantity']"
+      @delete="handleRemoveItem"
     />
-      <div style="margin-top: 20px;" v-else>鏆傛棤鏁版嵁锛岃閫夋嫨閰嶇疆鏁版嵁</div>
-
+    <div class="empty-table">
+      <h1>鐢熶骇鏄庣粏</h1>
+      <el-row :gutter="10">
+        <el-col :span="2">
+          <el-button type="primary" @click="addNewRow">
+            <el-icon>
+              <Plus />
+            </el-icon>
+            鏂板
+          </el-button>
+        </el-col>
+        <!-- <el-col :span="2">
+          <el-button type="danger" @click="clearAllRows">
+            <el-icon>
+              <Delete />
+            </el-icon>
+            娓呯┖
+          </el-button>
+        </el-col> -->
+      </el-row>
+      <ProductionDetailsTable
+        v-model="detailsTableData"
+        :border="false"
+        :show-operations="true"
+        :auto-calculate="true"
+        @input-change="handleDetailsChange"
+        @delete-row="handleDeleteRow"
+      />
     </div>
 
     <template #footer>
       <div class="dialog-footer">
-        <el-button @click="handleClose">鍙� 娑�</el-button>
+        <el-button
+          @click="handleClose"
+          v-if="dialogType === 'add' || dialogType === 'edit'"
+          >鍙� 娑�</el-button
+        >
+        <!-- <el-button @click="handleReset" v-if="dialogType === 'edit'"
+          >閲� 缃�</el-button
+        > -->
         <el-button type="primary" :loading="loading" @click="handleSubmit"
           >纭� 瀹�</el-button
         >
@@ -70,377 +94,406 @@
     v-model="innerVisible"
     width="1000"
     title="閫夋嫨閰嶇疆鏁版嵁"
+    center
     append-to-body
   >
+    <div style="margin-bottom: 10px">
+      <el-alert
+        v-if="tableData.length > 0"
+        :title="`褰撳墠宸查�夋嫨 ${tableData.length} 鏉℃暟鎹甡"
+        type="info"
+        :closable="false"
+        show-icon
+      />
+    </div>
     <ETable
+      :showIndex="false"
+      :showOverflowTooltip="false"
       @selection-change="handleSelectionChange"
       :showOperations="false"
-      :columns="formalDatabaseDataColumns"
+      ref="etableRef"
+      :columns="formalDatabaseColumns"
       :tableData="formalDatabaseData"
+      :defaultSelectedIds="selectedIds"
+      :rowKey="'id'"
       height="400"
       @cell-edit="handleCellEdit"
       :show-selection="true"
     />
-    <el-row :gutter="24">
-      <el-col :span="2" :offset="22">
-        <el-button type="primary" @click="handleSelectData">纭畾</el-button>
+    <el-row :gutter="24" style="margin-top: 15px">
+      <el-col :span="12">
+        <el-text type="info">
+          宸查�夋嫨 {{ formalDatabaseSelectedData.length }} 鏉℃暟鎹�
+        </el-text>
+      </el-col>
+      <el-col :span="12" style="text-align: right">
+        <el-button @click="innerVisible = false">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          @click="handleSelectData"
+          :disabled="formalDatabaseSelectedData.length === 0"
+        >
+          纭畾娣诲姞
+        </el-button>
       </el-col>
     </el-row>
   </el-dialog>
 </template>
 
 <script setup>
-import { ref, reactive, watch } from "vue";
-import ETable from "@/components/Table/EtableModify.vue";
+import { ref, reactive, watch, onMounted, nextTick, computed } from "vue";
+import ETable from "@/components/Table/ETable.vue";
+import ETableModify from "@/components/Table/EtableModify.vue";
 import ProductionDetailsTable from "./ProductionDetailsTable.vue";
-import { ElMessage } from "element-plus";
+import { ElMessage, ElMessageBox, ElAlert, ElText } from "element-plus";
 import { Delete, Warning, Plus } from "@element-plus/icons-vue";
+import {
+  getOfficialAll,
+  addOrEditPM,
+  deleteProductionInventory,
+} from "@/api/production/index.js";
+import { validateFormData, validateNumber, deepClone, createDefaultProductionRow } from "@/utils/production";
+import { useCoalData } from "./useCoalData";
+import useUserStore from "@/store/modules/user";
 
+// Props 鍜� Emits
 const props = defineProps({
-  visible: {
-    type: Boolean,
-    default: false,
-  },
-  type: {
-    type: String,
-    default: "add", // 'add' 鎴� 'edit'
-  },
-  rowData: {
-    type: Object,
-    default: () => ({}),
-  },
+  visible: { type: Boolean, default: false },
+  type: { type: String, default: "add" },
+  rowData: { type: Object, default: () => ({}) },
 });
-const dialogVisible = defineModel("visible", {
-  type: Boolean,
-  default: false,
-});
-const emit = defineEmits(["update:visible", "success"]);
 
+const dialogVisible = defineModel("visible", { type: Boolean, default: false });
+const emit = defineEmits(["update:visible", "success", "update:productionAndProcessing"]);
+
+// 鐢ㄦ埛淇℃伅鍜岀叅绉嶆暟鎹�
+const userStore = useUserStore();
+const { getCoalNameById } = useCoalData();
+let userInfo;
+
+// 瀵硅瘽妗嗙姸鎬�
 const innerVisible = ref(false);
 const dialogType = ref("add");
 const loading = ref(false);
-const formRef = ref(null);
+const etableRef = ref(null);
+
+// 鏁版嵁鐘舵��
 const tableData = ref([]);
+const detailsTableData = ref([]);
+const formalDatabaseData = ref([]);
+const formalDatabaseSelectedData = ref([]);
+const selectedIds = ref([]);
 const currentRow = ref(null);
+const copyForm = ref(null);
+// 琛ㄦ牸鍒楅厤缃�
 const columns = [
-  { label: "鐓ょ", prop: "category" },
-  { label: "鐑��", prop: "Calorific" },
-  { label: "搴撳瓨鏁伴噺", prop: "stock" },
-  { label: "鏈浣跨敤鏁伴噺", prop: "used" },
-];
-const detailsTableData = ref([
+  { label: "鐓ょ", prop: "coal", minwidth: 120 },
+  { label: "搴撳瓨鏁伴噺", prop: "inventoryQuantity", minwidth: 100 },
   {
-    coalType: "",
-    calorificValue: "",
-    productionQuantity: "",
-    laborCost: "",
-    energyCost: "",
-    equipmentDepreciation: "",
-    purchasePrice: "",
-    totalCost: "",
+    label: "浣跨敤鏁伴噺",
+    prop: "usedQuantity",
+    editable: true,
+    minwidth: 120,
+    editType: "number",
   },
+];
+
+const formalDatabaseColumns = ref([
+  { prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minwidth: 150 },
+  { prop: "coal", label: "鐓ょ绫诲瀷", minwidth: 60 },
+  { prop: "inventoryQuantity", label: "搴撳瓨鏁伴噺", minwidth: 80 },
+  { prop: "unit", label: "鍗曚綅", minwidth: 20 },
+  { prop: "priceExcludingTax", label: "鍗曚环锛堜笉鍚◣锛�", minwidth: 80 },
+  { prop: "createTime", label: "鐧昏鏃ユ湡", width: 200 },
 ]);
+// 宸ュ叿鍑芥暟
+const debugIdMatching = () => {
+  if (formalDatabaseData.value.length > 0 && selectedIds.value.length > 0) {
+    const matchedRows = formalDatabaseData.value.filter((row) =>
+      selectedIds.value.includes(row.id)
+    );
+  }
+};
+
 const handleRowClick = (row) => {
   currentRow.value = row;
 };
-const formalDatabaseDataColumns = ref([
-  { prop: "name", label: "渚涘簲鍟嗗悕绉�", width: 150 },
-  { prop: "type", label: "鐓ょ绫诲瀷", width: 120 },
-  { prop: "unit", label: "鍗曚綅", width: 100 },
-  { prop: "number", label: "閲囪喘鏁伴噺", width: 100 },
-  { prop: "money", label: "鍗曚环锛堝惈绋庯級", width: 120 },
-  { prop: "money1", label: "鎬讳环锛堝惈绋庯級", width: 120 },
-  { prop: "money2", label: "绋庣巼", width: 80 },
-  { prop: "money3", label: "涓嶅惈绋庡崟浠�", width: 120 },
-  { prop: "createUser", label: "鐧昏浜�", width: 100 },
-  { prop: "createTime", label: "鐧昏鏃ユ湡", width: 150 },
-]);
-// 琛ㄥ崟鏁版嵁
-const formData = reactive({
-  category: "",
-  unit: "",
-  productionVolume: 0,
-  laborCost: 0,
-  materialCost: 0,
-  equipmentCost: 0,
-  totalCost: 0,
-  totalPrice: 0,
-  profit: 0,
-  reviewer: "",
-  date: "",
-});
-const handlData = () => {
+
+// 鑾峰彇閰嶇疆鏁版嵁
+const handlData = async () => {
   innerVisible.value = true;
+  let res = await getOfficialAll();
+  if (res.code === 200) {
+    formalDatabaseData.value = res.data;
+    const existingOfficialIds = tableData.value
+      .map((item) => item.officialId)
+      .filter((id) => id);
+    selectedIds.value = existingOfficialIds;
+    debugIdMatching();
+    nextTick(() => {
+      setTimeout(() => {
+        if (etableRef.value && existingOfficialIds.length > 0) {
+          etableRef.value.setDefaultSelection();
+        }
+      }, 100);
+    });
+  } else {
+    ElMessage.error("鑾峰彇閰嶇疆鏁版嵁澶辫触");
+  }
 };
-const formalDatabaseData = ref([]);
-const formalDatabaseSelectedData = ref([]);
-formalDatabaseData.value = [
-  {
-    id: 1,
-    name: "渚涘簲鍟咥",
-    type: "鍔ㄥ姏鐓�",
-    unit: "鍚�",
-    number: 120,
-    money: 500,
-    money1: 200,
-    money2: 200,
-    money3: 300,
-    money4: "楂樹綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 2,
-    name: "渚涘簲鍟咥",
-    type: "鍔ㄥ姏鐓�",
-    unit: "鍚�",
-    number: 100,
-    money: 600,
-    money1: 300,
-    money2: 300,
-    money3: 300,
-    money4: "浣庝綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 3,
-    name: "渚涘簲鍟咮",
-    type: "鐒︾叅",
-    unit: "鍚�",
-    number: 300,
-    money: 789,
-    money1: 400,
-    money2: 400,
-    money3: 400,
-    money4: "楂樹綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 4,
-    name: "渚涘簲鍟咮",
-    type: "鐒︾叅",
-    unit: "鍚�",
-    number: 256,
-    money: 800,
-    money1: 420,
-    money2: 420,
-    money3: 420,
-    money4: "浣庝綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 5,
-    name: "渚涘簲鍟咰",
-    type: "鏃犵儫鐓�",
-    unit: "鍚�",
-    number: 256,
-    money: 700,
-    money1: 300,
-    money2: 300,
-    money3: 300,
-    money4: "楂樹綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 6,
-    name: "渚涘簲鍟咥",
-    type: "鍔ㄥ姏鐓�",
-    unit: "鍚�",
-    number: 120,
-    money: 500,
-    money1: 200,
-    money2: 200,
-    money3: 300,
-    money4: "楂樹綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 7,
-    name: "渚涘簲鍟咥",
-    type: "鍔ㄥ姏鐓�",
-    unit: "鍚�",
-    number: 100,
-    money: 600,
-    money1: 300,
-    money2: 300,
-    money3: 300,
-    money4: "浣庝綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 8,
-    name: "渚涘簲鍟咮",
-    type: "鐒︾叅",
-    unit: "鍚�",
-    number: 300,
-    money: 789,
-    money1: 400,
-    money2: 400,
-    money3: 400,
-    money4: "楂樹綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 9,
-    name: "渚涘簲鍟咮",
-    type: "鐒︾叅",
-    unit: "鍚�",
-    number: 256,
-    money: 800,
-    money1: 420,
-    money2: 420,
-    money3: 420,
-    money4: "浣庝綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-  {
-    id: 10,
-    name: "渚涘簲鍟咰",
-    type: "鏃犵儫鐓�",
-    unit: "鍚�",
-    number: 256,
-    money: 700,
-    money1: 300,
-    money2: 300,
-    money3: 300,
-    money4: "楂樹綅",
-    createUser: "admin",
-    createTime: "2025-06-01",
-  },
-];
+// 鎵嬪姩璁剧疆琛ㄦ牸閫変腑鐘舵��
+const setTableSelection = (ids) => {
+  if (!etableRef.value || !Array.isArray(ids) || ids.length === 0) {
+    return;
+  }
 
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
-  category: [{ required: true, message: "璇烽�夋嫨鐓ょ", trigger: "change" }],
+  nextTick(() => {
+    setTimeout(() => {
+      try {
+        etableRef.value.clearSelection();
+        const rowsToSelect = formalDatabaseData.value.filter((row) =>
+          ids.includes(row.id)
+        );
+        if (rowsToSelect.length > 0) {
+          etableRef.value.setRowsSelection(rowsToSelect, true);
+        }
+      } catch (error) {
+      }
+    }, 150);
+  });
 };
 
-// 鍒濆鍖�
+// 鍒濆鍖栧拰缂栬緫鍒濆鍖�
 const Initialization = () => {
-  console.log("鍒濆鍖栨暟鎹�");
   tableData.value = [];
+  detailsTableData.value = [];
+  copyForm.value = null;
+  dialogType.value = "add";
 };
+
+const editInitialization = (data) => {
+  copyForm.value = deepClone(data);
+  tableData.value = data.productionInventoryList || [];
+  detailsTableData.value = data.productionList || [];
+  dialogType.value = "edit";
+  const existingOfficialIds = tableData.value
+    .map((item) => item.officialId)
+    .filter((id) => id);
+  selectedIds.value = existingOfficialIds;
+};
+// 鐩戝惉瀵硅瘽妗嗙姸鎬侊紝鍦ㄦ墦寮�鏃惰缃�変腑鐘舵��
+watch(innerVisible, (newVal) => {
+  if (newVal && selectedIds.value.length > 0) {
+    setTimeout(() => setTableSelection(selectedIds.value), 200);
+  }
+  // 瀵硅瘽妗嗗叧闂椂娓呯┖閫夋嫨鐘舵��
+  if (!newVal) {
+    formalDatabaseSelectedData.value = [];
+  }
+});
+
 defineExpose({
-  Initialization
+  Initialization,
+  editInitialization,
 });
 const handleSelectData = (row) => {
+  tableData.value = [];
   if (!innerVisible.value) return;
-  // 鑾峰彇閫変腑鐨勬暟鎹�
   const selectedData = formalDatabaseSelectedData.value;
   if (selectedData.length === 0) {
     ElMessage.warning("璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�");
     return;
   }
-  // 灏嗛�変腑鐨勬暟鎹牴鎹渶瑕佺瓫閫夊埌琛ㄦ牸涓�
+  let addedCount = 0;
+  let duplicateCount = 0;
   selectedData.forEach((item) => {
-    const existingItem = tableData.value.find(
-      (row) => row.id === item.id
-    );
-    if (!existingItem) {
-      tableData.value.push({
-        id: item.id,
-        category: item.type,
-        Calorific: item.money4,
-        stock: item.number,
-        used: 0, // 鍒濆浣跨敤鏁伴噺涓�0
-      });
-    }
+    const newItem = {
+      ...item, // 澶嶅埗鎵�鏈夊師濮嬫暟鎹�
+      officialId: item.id, // 淇濆瓨鍘熷鐨刬d浣滀负officialId
+      usedQuantity: 0, // 鍒濆浣跨敤鏁伴噺涓�0
+      // 鍙互鏍规嵁闇�瑕佹坊鍔犲叾浠栧瓧娈�
+    };
+    tableData.value.push(newItem);
+    addedCount++;
   });
+
+  // 鏇存柊selectedIds锛岀‘淇濆寘鍚墍鏈夊綋鍓峵ableData涓殑officialId
+  const allOfficialIds = tableData.value
+    .map((item) => item.officialId)
+    .filter((id) => id);
+  selectedIds.value = allOfficialIds;
+
+  // 鍏抽棴閫夋嫨瀵硅瘽妗�
   innerVisible.value = false;
+
+  // 鏄剧ず缁撴灉娑堟伅
+  let message = "";
+  if (addedCount > 0) {
+    message += `鎴愬姛娣诲姞 ${addedCount} 鏉℃暟鎹甡;
+  }
+  if (duplicateCount > 0) {
+    message += (message ? "锛�" : "") + `璺宠繃 ${duplicateCount} 鏉¢噸澶嶆暟鎹甡;
+  }
+  if (message) {
+    ElMessage.success(message);
+  } else {
+    ElMessage.info("娌℃湁鏂版暟鎹娣诲姞");
+  }
 };
 const handleSelectionChange = (selection) => {
   formalDatabaseSelectedData.value = selection;
 };
-const reset = () => {
-  // formRef
-  formRef.value?.resetFields();
-};
-
-const selectChange = (value) => {};
-
-// 鎻愪氦琛ㄥ崟
+// 鎻愪氦琛ㄥ崟 - 浣跨敤宸ュ叿鍑芥暟楠岃瘉
 const handleSubmit = async () => {
-  console.log(detailsTableData.value);
-  // dialogVisible.value = false;
-};
+  // 楠岃瘉鐢熶骇鏄庣粏鏁版嵁
+  const detailsValidation = validateFormData(detailsTableData.value, [
+    "coal",
+    "productionQuantity", 
+    "laborCost",
+    "energyConsumptionCost",
+    "equipmentDepreciation",
+    "purchasePrice"
+  ]);
+  
+  if (!detailsValidation.isValid) {
+    ElMessage.warning(detailsValidation.message);
+    return;
+  }
 
+  // 楠岃瘉搴撳瓨浣跨敤鏁版嵁
+  if (tableData.value.length === 0) {
+    ElMessage.warning("璇锋坊鍔犵敓浜у姞宸ユ暟鎹�");
+    return;
+  }
+
+  for (let i = 0; i < tableData.value.length; i++) {
+    const element = tableData.value[i];
+    if (element.usedQuantity == 0 || element.usedQuantity === null) {
+      ElMessage.warning(`璇峰~鍐欎娇鐢ㄦ暟閲�: ${element.coal}`);
+      return;
+    }
+  }
+
+  try {
+    const data = {
+      ...copyForm.value,
+      productionList: detailsTableData.value,
+      productionInventoryList: tableData.value,
+    };
+    const res = await addOrEditPM(data);
+    if (res.code === 200) {
+      dialogVisible.value = false;
+      emit("success");
+    } else {
+      ElMessage.error("鎻愪氦澶辫触");
+    }
+  } catch (error) {
+    ElMessage.error("鎻愪氦澶辫触锛岃閲嶈瘯");
+  }
+};
 // 鍏抽棴寮圭獥
 const handleClose = () => {
   dialogVisible.value = false;
-  formRef.value?.resetFields();
-  Object.assign(formData, {
-    category: "",
-    unit: "",
-    productionVolume: 0,
-    laborCost: 0,
-    materialCost: 0,
-    equipmentCost: 0,
-    totalCost: 0,
-    totalPrice: 0,
-    profit: 0,
-    reviewer: "",
-    date: "",
-  });
 };
 
-// 娣诲姞鍗曞厓鏍肩紪杈戝鐞嗗嚱鏁�
+// 浣跨敤鏁伴噺楠岃瘉 - 浣跨敤宸ュ叿鍑芥暟
 const handleCellEdit = (row, prop, value) => {
-  if (prop === "used" && Number(value) > Number(row.stock)) {
-    ElMessage.warning("浣跨敤鏁伴噺涓嶈兘澶т簬搴撳瓨鏁伴噺锛�");
-    row.used = row.stock;
+  if (prop === "usedQuantity") {
+    const validation = validateNumber(value, 0, Number(row.inventoryQuantity));
+    
+    if (!validation.isValid) {
+      ElMessage.warning(validation.message);
+      row.usedQuantity = validation.value;
+      return;
+    }
+    
+    row.usedQuantity = validation.value;
   }
 };
 
-// 澶勭悊鐢熶骇鏄庣粏琛ㄦ牸鐨勬搷浣�
+// 澶勭悊鐢熶骇鏄庣粏琛ㄦ牸鐨勬搷浣� - 浣跨敤宸ュ叿鍑芥暟
 const addNewRow = () => {
-  detailsTableData.value.push({
-    coalType: "",
-    calorificValue: "",
-    productionQuantity: "",
-    laborCost: "",
-    energyCost: "",
-    equipmentDepreciation: "",
-    purchasePrice: "",
-    totalCost: "",
-  });
+  const newRow = createDefaultProductionRow(userInfo);
+  detailsTableData.value.push(newRow);
 };
 
-const clearAllRows = () => {
-  detailsTableData.value = [];
-  ElMessage.success("宸叉竻绌烘墍鏈夋暟鎹�");
+// 閲嶇疆鏁版嵁 - 浣跨敤娣辨嫹璐�
+const handleReset = () => {
+  if (copyForm.value) {
+    tableData.value = deepClone(copyForm.value.productionInventoryList) || [];
+    detailsTableData.value = deepClone(copyForm.value.productionList) || [];
+  }
 };
 
-const calculateAllCosts = () => {
-  detailsTableData.value.forEach((row) => {
-    const laborCost = parseFloat(row.laborCost) || 0;
-    const energyCost = parseFloat(row.energyCost) || 0;
-    const equipmentDepreciation = parseFloat(row.equipmentDepreciation) || 0;
-    const purchasePrice = parseFloat(row.purchasePrice) || 0;
+// 鑾峰彇鐢ㄦ埛淇℃伅
+onMounted(async () => {
+  try {
+    userInfo = await userStore.getInfo();
+  } catch (error) {
+    ElMessage.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛岃閲嶈瘯");
+  }
+});
 
-    row.totalCost = (
-      laborCost +
-      energyCost +
-      equipmentDepreciation +
-      purchasePrice
-    ).toFixed(2);
-  });
-  ElMessage.success("閲嶆柊璁$畻瀹屾垚");
-};
-
+// 绠�鍖栫殑浜嬩欢澶勭悊鍑芥暟
 const handleDetailsChange = (data) => {
-  console.log("鐢熶骇鏄庣粏鏁版嵁鍙樺寲:", data);
 };
 
 const handleDeleteRow = (index) => {
   ElMessage.success(`宸插垹闄ょ ${index + 1} 琛屾暟鎹甡);
 };
+
+// 鍒犻櫎鍗曚釜宸查�夋暟鎹」
+const handleRemoveItem = (row) => {
+  const index = tableData.value.findIndex(
+    (item) => item.officialId === row.officialId
+  );
+  if (index > -1) {
+    tableData.value.splice(index, 1);
+
+    // 鏇存柊selectedIds
+    const updatedOfficialIds = tableData.value
+      .map((item) => item.officialId)
+      .filter((id) => id);
+    selectedIds.value = updatedOfficialIds;
+    ElMessage.success("宸插垹闄ら�変腑椤�");
+  }
+};
+
+// 娓呯┖鎵�鏈夊凡閫夋暟鎹�
+const removeSelectedData = () => {
+  if (tableData.value.length === 0) {
+    ElMessage.warning("娌℃湁鍙竻绌虹殑鏁版嵁");
+    return;
+  }
+  ElMessageBox.confirm("纭娓呯┖鎵�鏈夊凡閫夋嫨鐨勬暟鎹悧锛�", "璀﹀憡", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(async () => {
+      if (dialogType.value === "edit") {
+        let res = await deleteProductionInventory({
+          productionInventoryList: tableData.value,
+        });
+        emit("update:productionAndProcessing", tableData.value, copyForm.value);
+      }
+      // [Vue warn]: Component emitted event "update:productionAndProcessing" but it is neither declared in the emits option nor as an "onUpdate:productionAndProcessing" prop.
+
+      formalDatabaseSelectedData.value = [];
+      tableData.value = [];
+      selectedIds.value = [];
+      ElMessage.success("宸叉竻绌烘墍鏈夋暟鎹�");
+    })
+    .catch(() => {});
+};
+
+// 璁$畻鎬讳娇鐢ㄩ噺
+const totalUsedQuantity = computed(() => {
+  return tableData.value.reduce((total, item) => {
+    const usedQty = Number(item.usedQuantity) || 0;
+    return total + usedQty;
+  }, 0);
+});
 </script>
 
 <style scoped lang="scss">
@@ -454,7 +507,7 @@
 .el-row > .el-col > h1 {
   font-weight: bolder;
 }
-.empty-table > .el-row{
+.empty-table > .el-row {
   margin-bottom: 12px;
 }
 </style>

--
Gitblit v1.9.3