From 2d3530a7c11557a40807ad7c0b9e302ce6ce3a9f Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期五, 28 八月 2026 10:16:32 +0800
Subject: [PATCH] feat: 综合业务模块页面重构与交互完善

---
 src/views/equipmentManagement/ledger/Form.vue |  365 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 310 insertions(+), 55 deletions(-)

diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
index 108dbe4..4405f90 100644
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ b/src/views/equipmentManagement/ledger/Form.vue
@@ -1,6 +1,24 @@
 <template>
-  <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
+  <el-form :model="form" label-width="120px" :rules="formRules" ref="formRef">
+    <el-divider content-position="left">鍩虹淇℃伅</el-divider>
     <el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="璁惧缂栧彿" prop="uniqueCode">
+          <div style="display: flex; gap: 10px; width: 100%;">
+            <el-checkbox
+              v-model="form.autoGenerateUniqueCode"
+              v-if="operationType === 'add'"
+              >鑷姩鐢熸垚
+            </el-checkbox>
+            <el-input 
+              v-model="form.uniqueCode" 
+              :placeholder="form.autoGenerateUniqueCode ? '淇濆瓨鍚庤嚜鍔ㄧ敓鎴�' : '璇疯緭鍏ヨ澶囩紪鍙�'" 
+              :disabled="form.autoGenerateUniqueCode || operationType === 'view'" 
+              clearable
+            />
+          </div>
+        </el-form-item>
+      </el-col>
       <el-col :span="12">
         <el-form-item label="璁惧鍚嶇О" prop="deviceName">
           <el-input v-model="form.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
@@ -8,7 +26,7 @@
       </el-col>
       <el-col :span="12">
         <el-form-item label="瑙勬牸鍨嬪彿" prop="deviceModel">
-          <el-input v-model="form.deviceModel" :disabled="(form.deviceModel != null && operationType === 'edit')" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+          <el-input v-model="form.deviceModel" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
@@ -17,8 +35,29 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="渚涘簲鍟�" prop="supplierName">
-          <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢" />
+        <el-form-item label="璁惧绫诲瀷" prop="type">
+          <el-select
+            v-model="form.type"
+            placeholder="璇烽�夋嫨鎴栬緭鍏ヨ澶囩被鍨�"
+            clearable
+            filterable
+            allow-create
+            default-first-option
+            style="width: 100%"
+            @change="handleDeviceTypeChange"
+          >
+            <el-option
+              v-for="item in deviceTypeOptions"
+              :key="item"
+              :label="item"
+              :value="item"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="鍑哄巶缂栧彿" prop="factoryNumber">
+          <el-input v-model="form.factoryNumber" placeholder="璇疯緭鍏ュ嚭鍘傜紪鍙�" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
@@ -27,19 +66,68 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
+        <el-form-item label="璐d换浜�" prop="responsiblePerson">
+          <el-input v-model="form.responsiblePerson" placeholder="璇疯緭鍏ヨ矗浠讳汉" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="寤烘。鏃ユ湡" prop="filingDate">
+          <el-date-picker
+            style="width: 100%"
+            v-model="form.filingDate"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            type="date"
+            placeholder="璇烽�夋嫨寤烘。鏃ユ湡"
+            clearable
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <el-divider content-position="left">閲囪喘淇℃伅</el-divider>
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="渚涘簲鍟�" prop="supplierName">
+          <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="鍒堕�犲巶鍟�" prop="manufacturer">
+          <el-input v-model="form.manufacturer" placeholder="璇疯緭鍏ュ埗閫犲巶鍟�" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="璐疆鏃ユ湡" prop="purchaseDate">
+          <el-date-picker
+            style="width: 100%"
+            v-model="form.purchaseDate"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            type="date"
+            placeholder="璇烽�夋嫨璐疆鏃ユ湡"
+            clearable
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="璧勪骇鍘熷��" prop="originalAssetValue">
+          <el-input-number :step="0.01" :min="0" style="width: 100%"
+            v-model="form.originalAssetValue"
+            placeholder="璇疯緭鍏ヨ祫浜у師鍊�"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
         <el-form-item label="鍗曚綅" prop="unit">
           <el-input v-model="form.unit" placeholder="璇疯緭鍏ュ崟浣�" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="鍚敤鎶樻棫" prop="enableDepreciation">
-          <el-switch v-model="form.enableDepreciation" :active-value="true" :inactive-value="false" />
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
         <el-form-item label="鏁伴噺" prop="number">
-          <el-input-number :step="0.01" :min="0" style="width: 100%"
+          <el-input-number :min="1" style="width: 100%"
             v-model="form.number"
+            disabled
             placeholder="璇疯緭鍏ユ暟閲�"
             @change="mathNum"
           />
@@ -67,22 +155,18 @@
       </el-col>
       <el-col :span="12">
         <el-form-item label="绋庣巼(%)" prop="taxRate">
-          <!-- <el-input
-            v-model="form.taxRate"
-            placeholder="璇疯緭鍏ョ◣鐜�"
-            type="number"
-          >
-            <template #append> % </template>
-          </el-input> -->
           <el-select
             v-model="form.taxRate"
             placeholder="璇烽�夋嫨"
             clearable
             @change="mathNum"
           >
-            <el-option label="1" :value="1" />
-            <el-option label="6" :value="6" />
-            <el-option label="13" :value="13" />
+            <el-option
+              v-for="dict in tax_rate"
+              :key="dict.value"
+              :label="dict.label"
+              :value="Number(dict.value)"
+            />
           </el-select>
         </el-form-item>
       </el-col>
@@ -96,21 +180,87 @@
           />
         </el-form-item>
       </el-col>
-      <!-- <el-col :span="12">
-        <el-form-item label="褰曞叆浜�" prop="createUser">
-          <el-input v-model="form.createUser" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
+    </el-row>
+
+    <el-divider content-position="left">鎶�鏈弬鏁�</el-divider>
+    <el-row :gutter="20">
+      <el-col :span="24">
+        <el-form-item label="涓昏鎶�鏈弬鏁�" prop="technicalParameters">
+          <el-input type="textarea" :rows="3" v-model="form.technicalParameters" placeholder="璇疯緭鍏ヤ富瑕佹妧鏈弬鏁�" />
         </el-form-item>
-      </el-col> -->
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="涓昏鐢ㄩ��" prop="mainPurpose">
+          <el-input type="textarea" :rows="3" v-model="form.mainPurpose" placeholder="璇疯緭鍏ヤ富瑕佺敤閫�" />
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <el-divider content-position="left">杩愯绠$悊</el-divider>
+    <el-row :gutter="20">
       <el-col :span="12">
-        <el-form-item label="褰曞叆鏃ユ湡" prop="createTime">
+        <el-form-item label="璁惧鐘舵��" prop="status">
+          <el-select
+            v-model="form.status"
+            placeholder="璇烽�夋嫨"
+            :disabled="operationType === 'edit'"
+            style="width: 100%"
+          >
+            <el-option label="鍋滅敤" :value="0" />
+            <el-option label="鍚敤" :value="1" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="鍚敤鏃ユ湡" prop="activationDate">
           <el-date-picker
             style="width: 100%"
-            v-model="form.createTime"
+            v-model="form.activationDate"
             format="YYYY-MM-DD"
-            value-format="YYYY-MM-DD HH:mm:ss"
+            value-format="YYYY-MM-DD"
             type="date"
-            placeholder="璇烽�夋嫨褰曞叆鏃ユ湡"
+            placeholder="璇烽�夋嫨鍚敤鏃ユ湡"
             clearable
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="棰勮杩愯鏃堕棿" prop="planRuntimeTime">
+          <el-date-picker
+            style="width: 100%"
+            v-model="form.planRuntimeTime"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            type="date"
+            placeholder="璇烽�夋嫨棰勮杩愯鏃堕棿"
+            clearable
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="鍚敤鎶樻棫" prop="isDepr">
+          <el-switch v-model="form.isDepr" :active-value="1" :inactive-value="2" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12" v-if="form.isDepr === 1">
+        <el-form-item label="姣忓勾鎶樻棫閲戦" prop="annualDepreciationAmount">
+          <el-input-number 
+            :step="0.01" 
+            :min="0" 
+            style="width: 100%"
+            v-model="form.annualDepreciationAmount"
+            placeholder="璇疯緭鍏ユ瘡骞存姌鏃ч噾棰�"
+          />
+        </el-form-item>
+      </el-col>
+      
+      <el-col :span="24">
+        <el-form-item label="璁惧鍥剧墖" prop="storageBlobDTOs">
+          <AttachmentUploadImage
+            v-model:fileList="fileList"
+            :limit="20"
+            :fileSize="5"
+            :buttonText="'涓婁紶鍥剧墖'"
           />
         </el-form-item>
       </el-col>
@@ -120,7 +270,6 @@
 
 <script setup>
 import useFormData from "@/hooks/useFormData";
-// import useUserStore from "@/store/modules/user";
 import { getLedgerById } from "@/api/equipmentManagement/ledger";
 import dayjs from "dayjs";
 import {
@@ -128,69 +277,174 @@
   calculateTaxExclusiveTotalPrice,
 } from "@/utils/summarizeTable";
 import { ElMessage } from "element-plus";
-import {ref} from "vue";
+import { ref, getCurrentInstance, computed } from "vue";
+import AttachmentUploadImage from '@/components/AttachmentUpload/image/index.vue';
+
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
 
 defineOptions({
   name: "璁惧鍙拌处琛ㄥ崟",
 });
 const formRef = ref(null);
-const operationType = ref('');
+const operationType = ref('add');
+// 璁惧绫诲瀷鍥哄畾閫夐」
+const deviceTypeOptions = ref([
+  '鐢熶骇璁惧',
+  '鍔炲叕璁惧',
+  '妫�娴嬭澶�',
+  '杩愯緭璁惧',
+  '鍏朵粬璁惧'
+]);
 const formRules = {
-	deviceName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-	deviceModel: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-	supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-	unit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-	number: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-	taxIncludingPriceUnit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-	taxRate: [{ required: true, trigger: "change", message: "璇疯緭鍏�" }],
+  uniqueCode: [
+    { 
+      validator: (rule, value, callback) => {
+        if (!form.autoGenerateUniqueCode && (value === undefined || value === null || value === '')) {
+          callback(new Error('璇疯緭鍏ヨ澶囩紪鍙�'));
+        } else {
+          callback();
+        }
+      }, 
+      trigger: "blur" 
+    }
+  ],
+  deviceName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
+  deviceModel: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
+  type: [{ required: true, trigger: "change", message: "璇烽�夋嫨鎴栬緭鍏ヨ澶囩被鍨�" }],
+  supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
+  unit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
+  number: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
+  taxIncludingPriceUnit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
+  taxRate: [{ required: true, trigger: "change", message: "璇疯緭鍏�" }],
+  planRuntimeTime: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
+  status: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
+  annualDepreciationAmount: [
+    { 
+      validator: (rule, value, callback) => {
+        if (form.isDepr === 1 && (value === undefined || value === null || value === '')) {
+          callback(new Error('鍚敤鎶樻棫鏃讹紝璇疯緭鍏ユ瘡骞存姌鏃ч噾棰�'));
+        } else {
+          callback();
+        }
+      }, 
+      trigger: "blur" 
+    }
+  ],
 }
 
 const { form, resetForm } = useFormData({
+  // Basic Info
+  autoGenerateUniqueCode: true,
+  uniqueCode: undefined, // 鍞竴鎬х紪鍙�
   deviceName: undefined, // 璁惧鍚嶇О
   deviceModel: undefined, // 瑙勬牸鍨嬪彿
   deviceBrand: undefined, // 璁惧鍝佺墝
-  supplierName: undefined, // 渚涘簲鍟�
+  type: undefined, // 璁惧绫诲瀷
+  factoryNumber: undefined, // 鍑哄巶缂栧彿
   storageLocation: undefined, // 瀛樻斁浣嶇疆
-  enableDepreciation: false, // 鏄惁鍚敤鎶樻棫
+  responsiblePerson: undefined, // 璐d换浜�
+  filingDate: dayjs().format("YYYY-MM-DD"), // 寤烘。鏃ユ湡
+  
+  // Purchase Info
+  supplierName: undefined, // 渚涘簲鍟�
+  manufacturer: undefined, // 鍒堕�犲巶鍟�
+  purchaseDate: undefined, // 璐疆鏃ユ湡
+  originalAssetValue: undefined, // 璧勪骇鍘熷��
   unit: undefined, // 鍗曚綅
-  number: undefined, // 鏁伴噺
+  number: 1, // 鏁伴噺
   taxIncludingPriceUnit: undefined, // 鍚◣鍗曚环
   taxIncludingPriceTotal: undefined, // 鍚◣鎬讳环
   taxRate: undefined, // 绋庣巼
   unTaxIncludingPriceTotal: undefined, // 涓嶅惈绋庢�讳环
-  // createUser: useUserStore().nickName, // 褰曞叆浜�
-  createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 褰曞叆鏃ユ湡
+  
+  // Technical Specs
+  technicalParameters: undefined, // 涓昏鎶�鏈弬鏁�
+  mainPurpose: undefined, // 涓昏鐢ㄩ��
+  
+  // Operation Info
+  status: 1, // 璁惧鐘舵�� (0鍋滅敤 1鍚敤)
+  activationDate: undefined, // 鍚敤鏃ユ湡
+  planRuntimeTime: dayjs().format("YYYY-MM-DD"), // 棰勮杩愯鏃堕棿
+  isDepr: 2, // 鏄惁鍚敤鎶樻棫 1-鏄� 2-鍚�
+  annualDepreciationAmount: undefined, // 姣忓勾鎶樻棫閲戦
+  storageBlobDTOs: undefined, // 璁惧鍥剧墖鎻愪氦
+  storageBlobVOs: undefined, // 璁惧鍥剧墖灞曠ず
+});
+
+const fileList = computed({
+  get() {
+    return form.storageBlobVOs || [];
+  },
+  set(val) {
+    form.storageBlobDTOs = val;
+    form.storageBlobVOs = val;
+  }
 });
 
 const loadForm = async (id) => {
-	if (id) {
-		operationType.value = 'edit'
-	}
+  if (id) {
+    operationType.value = 'edit';
+  } else {
+    operationType.value = 'add';
+  }
   const { code, data } = await getLedgerById(id);
   if (code == 200) {
+    form.autoGenerateUniqueCode = false;
+    form.uniqueCode = data.uniqueCode;
     form.deviceName = data.deviceName;
     form.deviceModel = data.deviceModel;
     form.deviceBrand = data.deviceBrand;
-    form.supplierName = data.supplierName;
+    form.type = data.type;
+    form.factoryNumber = data.factoryNumber;
     form.storageLocation = data.storageLocation;
-    form.enableDepreciation = data.enableDepreciation;
+    form.responsiblePerson = data.responsiblePerson;
+    form.filingDate = data.filingDate;
+
+    form.supplierName = data.supplierName;
+    form.manufacturer = data.manufacturer;
+    if (data.purchaseDate) {
+      form.purchaseDate = dayjs(data.purchaseDate).format('YYYY-MM-DD');
+    }
+    form.originalAssetValue = data.originalAssetValue;
     form.unit = data.unit;
-    form.number = data.number;
+    form.number = 1;
     form.taxIncludingPriceUnit = data.taxIncludingPriceUnit;
     form.taxIncludingPriceTotal = data.taxIncludingPriceTotal;
     form.taxRate = data.taxRate;
     form.unTaxIncludingPriceTotal = data.unTaxIncludingPriceTotal;
-    form.createTime = data.createTime;
+
+    form.technicalParameters = data.technicalParameters;
+    form.mainPurpose = data.mainPurpose;
+
+    form.status = data.status != null ? data.status : 1;
+    if (data.activationDate) {
+      form.activationDate = dayjs(data.activationDate).format('YYYY-MM-DD');
+    }
+    form.isDepr = data.isDepr;
+    form.annualDepreciationAmount = data.annualDepreciationAmount;
+    
+    // 棰勮杩愯鏃堕棿锛氬悗绔繑鍥炲悗杞负 YYYY-MM-DD 浠ヤ究鏃ユ湡閫夋嫨鍣ㄦ纭睍绀�
+    if (data.planRuntimeTime) {
+      form.planRuntimeTime = dayjs(data.planRuntimeTime).format('YYYY-MM-DD');
+    } else {
+      form.planRuntimeTime = undefined;
+    }
+    form.storageBlobVOs = data.storageBlobVOs;
+    form.storageBlobDTOs = data.storageBlobVOs;
+  }
+};
+
+const handleDeviceTypeChange = (value) => {
+  // 濡傛灉杈撳叆鐨勬柊鍊间笉鍦ㄥ浐瀹氶�夐」涓紝鍒欐坊鍔犲埌閫夐」鍒楄〃
+  if (value && !deviceTypeOptions.value.includes(value)) {
+    deviceTypeOptions.value.push(value);
   }
 };
 
 const mathNum = () => {
   if (!form.taxIncludingPriceUnit) {
     ElMessage.error("璇疯緭鍏ュ崟浠�");
-    return;
-  }
-  if (!form.number) {
-    ElMessage.error("璇疯緭鍏ユ暟閲�");
     return;
   }
   form.taxIncludingPriceTotal = calculateTaxIncludeTotalPrice(
@@ -213,6 +467,7 @@
 // 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
 const resetFormAndValidate = () => {
   resetForm();
+  operationType.value = 'add'; // 閲嶇疆涓烘柊澧�
   clearValidate();
 };
 
@@ -222,6 +477,6 @@
   resetForm,
   clearValidate,
   resetFormAndValidate,
-	formRef,
+  formRef,
 });
 </script>

--
Gitblit v1.9.3