From 1a18bfbeeeb42c118cef061ff8dd383c708826aa Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 13 三月 2026 16:31:14 +0800
Subject: [PATCH] fix: 设备保养:可以在app上面进行设备保养计划新增,可多选设备(不需要设备编号),计划新增后,需定时生成多条任务(根据选择的多个设备生成多个任务)

---
 src/views/equipmentManagement/upkeep/index.vue              |   11 +
 src/views/inventoryManagement/stockManagement/New.vue       |   82 +++++++++++--
 src/views/equipmentManagement/upkeep/Form/formDia.vue       |   85 +++++++++----
 src/views/inventoryManagement/stockManagement/Qualified.vue |    2 
 src/views/inventoryManagement/stockManagement/Subtract.vue  |  108 ++++++++++++++---
 src/views/inventoryManagement/receiptManagement/Record.vue  |   16 ++
 6 files changed, 232 insertions(+), 72 deletions(-)

diff --git a/src/views/equipmentManagement/upkeep/Form/formDia.vue b/src/views/equipmentManagement/upkeep/Form/formDia.vue
index 66bf067..8b30fb7 100644
--- a/src/views/equipmentManagement/upkeep/Form/formDia.vue
+++ b/src/views/equipmentManagement/upkeep/Form/formDia.vue
@@ -11,8 +11,19 @@
 		<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
 			<el-row>
 				<el-col :span="12">
-					<el-form-item label="璁惧鍚嶇О" prop="taskId">
-						<el-select v-model="form.taskId" @change="setDeviceModel" filterable>
+					<el-form-item label="浠诲姟鍚嶇О" prop="taskName">
+						<el-input v-model="form.taskName" placeholder="璇疯緭鍏ヤ换鍔″悕绉�" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="璁惧鍚嶇О" prop="deviceIds">
+						<el-select
+							v-model="form.deviceIds"
+							multiple
+							filterable
+							placeholder="璇烽�夋嫨璁惧"
+							@change="handleDeviceChange"
+						>
 							<el-option
 								v-for="(item, index) in deviceOptions"
 								:key="index"
@@ -22,17 +33,7 @@
 						</el-select>
 					</el-form-item>
 				</el-col>
-				<el-col :span="12">
-					<el-form-item label="瑙勬牸鍨嬪彿">
-						<el-input
-							v-model="form.deviceModel"
-							placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
-							disabled
-						/>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row>
+				
 				<el-col :span="12">
 					<el-form-item label="褰曞叆浜�" prop="inspector">
 						<el-select
@@ -151,7 +152,8 @@
 const data = reactive({
 	form: {
 		taskId: undefined,
-		taskName: undefined,
+		deviceIds: [],
+		taskName: "",
 		// 褰曞叆浜猴細鍗曢�変竴涓敤鎴� id
 		inspector: undefined,
 		remarks: '',
@@ -163,7 +165,8 @@
 		registrationDate: ''
 	},
 	rules: {
-		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
+		deviceIds: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" }],
+		taskName: [{ required: true, message: "璇疯緭鍏ヤ换鍔″悕绉�", trigger: "blur" }],
 		inspector: [{ required: true, message: "璇烽�夋嫨褰曞叆浜�", trigger: "blur" },],
 		registrationDate: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }]
 	}
@@ -176,14 +179,32 @@
 	deviceOptions.value = data;
 };
 
-// 閫夋嫨璁惧鏃讹紝鍥炲~璁惧鍚嶇О(taskName)鍜岃鏍煎瀷鍙�(deviceModel)
-const setDeviceModel = (id) => {
-	const option = deviceOptions.value.find((item) => item.id === id);
-	if (option) {
-		form.value.taskId = option.id;
-		form.value.taskName = option.deviceName;
-		form.value.deviceModel = option.deviceModel;
+const normalizeIdList = (val) => {
+	if (!val) return []
+	if (Array.isArray(val)) return val
+	if (typeof val === 'string') {
+		const s = val.trim()
+		// JSON 瀛楃涓诧細"[1,2,3]"
+		if (s.startsWith('[') && s.endsWith(']')) {
+			try {
+				const arr = JSON.parse(s)
+				return Array.isArray(arr) ? arr : []
+			} catch {
+				return []
+			}
+		}
+		// 閫楀彿鍒嗛殧锛�"1,2,3"
+		return s.split(',').map(v => v.trim()).filter(Boolean)
 	}
+	return []
+}
+
+// 閫夋嫨璁惧鏃讹紝椤哄甫鍥炲~瑙勬牸鍨嬪彿锛堝閫夋椂鍙栫涓�涓澶囩殑瑙勬牸鍨嬪彿锛�
+const handleDeviceChange = () => {
+	const selectedIds = form.value.deviceIds || []
+	const firstId = Array.isArray(selectedIds) ? selectedIds[0] : undefined
+	const firstDevice = deviceOptions.value.find(d => String(d.id) === String(firstId))
+	form.value.deviceModel = firstDevice?.deviceModel || firstDevice?.model || form.value.deviceModel
 }
 
 // 鎵撳紑寮规
@@ -203,16 +224,19 @@
 	await loadDeviceName();
 	
 	if (type === 'edit' && row) {
-		form.value = { ...row }
+		form.value = { ...form.value, ...row }
 		// 缂栬緫鏃剁敤鎺ュ彛杩斿洖鐨� registrantId 鍥炴樉褰曞叆浜�
 		if (row.registrantId) {
 			form.value.inspector = row.registrantId
 		}
 
-		// 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
-		if (form.value.taskId) {
-			setDeviceModel(form.value.taskId);
-		}
+		// 缂栬緫鍥炴樉锛歞eviceIds 鍙兘鏄� JSON 瀛楃涓� / 閫楀彿鍒嗛殧 / 鏁扮粍
+		const ids = normalizeIdList(row.deviceIds ?? row.taskIds)
+		form.value.deviceIds = ids.map(v => {
+			const n = Number(v)
+			return Number.isNaN(n) ? v : n
+		})
+		handleDeviceChange()
 	} else if (type === 'add') {
 		// 鏂板鏃惰缃櫥璁版棩鏈熶负褰撳ぉ
 		form.value.registrationDate = getCurrentDate();
@@ -236,8 +260,8 @@
 	// 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
 	form.value = {
 		taskId: undefined,
-		taskName: undefined,
-		inspector: undefined,
+		deviceIds: [],
+		taskName: "",
 		inspector: undefined,
 		remarks: '',
 		frequencyType: '',
@@ -255,6 +279,8 @@
 		if (valid) {
 			try {
 				const payload = { ...form.value }
+				// 鍚庣瑕佹眰锛歞eviceIds 浠� JSON.stringify([1,2,3]) 褰㈠紡浼犲弬
+				payload.deviceIds = JSON.stringify(form.value.deviceIds || [])
 				// 涓嶅啀鍚戝悗绔紶淇濆吇浜哄瓧娈碉紝浠呬娇鐢ㄦ帴鍙h姹傜殑 registrant / registrantId
 				// 鏍规嵁閫夋嫨鐨�"褰曞叆浜�"璁剧疆 registrant / registrantId
 				if (payload.inspector) {
@@ -268,6 +294,7 @@
 				}
 				delete payload.inspector
 				delete payload.inspectorIds
+				delete payload.taskIds
 				
 				if (payload.frequencyType === 'WEEKLY') {
 					let frequencyDetail = ''
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index a016819..8370ba8 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -16,7 +16,7 @@
                         :prefix-icon="Search"
                         @change="getScheduledTableData" />
             </el-form-item>
-            <el-form-item label="浠诲姟鐘舵��">
+            <!-- <el-form-item label="浠诲姟鐘舵��">
               <el-select v-model="scheduledFilters.status"
                          placeholder="璇烽�夋嫨浠诲姟鐘舵��"
                          clearable
@@ -26,7 +26,7 @@
                 <el-option label="鍋滅敤"
                            value="0" />
               </el-select>
-            </el-form-item>
+            </el-form-item> -->
             <el-form-item>
               <el-button type="primary"
                          @click="getScheduledTableData">鎼滅储</el-button>
@@ -313,10 +313,11 @@
 
   // 瀹氭椂浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
   const scheduledColumns = ref([
-    { prop: "taskName", label: "璁惧鍚嶇О" },
+    { prop: "taskName", label: "浠诲姟鍚嶇О" },
     {
-      label: "瑙勬牸鍨嬪彿",
-      prop: "deviceModel",
+      prop: "deviceName",
+      label: "璁惧",
+      minWidth: 180
     },
     {
       prop: "frequencyType",
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index b738581..d8866b9 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -73,6 +73,18 @@
         <el-table-column label="鍏ュ簱鏁伴噺"
                          prop="stockInNum"
                          show-overflow-tooltip/>
+        <el-table-column label="杞︾墝鍙�"
+                         prop="licensePlateNo"
+                         v-if="type === '0'"
+                         show-overflow-tooltip/>
+        <el-table-column label="姣涢噸(鍚�)"
+                         prop="grossWeight"
+                         v-if="type === '0'"
+                         show-overflow-tooltip/>
+        <el-table-column label="鐨噸(鍚�)"
+                         prop="tareWeight"
+                         v-if="type === '0'"
+                         show-overflow-tooltip/>
         <el-table-column label="鍑�閲�(鍚�)"
                          prop="netWeight"
                          v-if="type === '0'"
@@ -91,6 +103,10 @@
                          prop="weighingDate"
                          v-if="type === '0'"
                          show-overflow-tooltip/>
+        <el-table-column label="杩囩鍛�"
+                         prop="weighingOperator"
+                         v-if="type === '0'"
+                         show-overflow-tooltip/>
       </el-table>
       <pagination v-show="total > 0"
                   :total="total"
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 5d3ac53..001e897 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -37,21 +37,57 @@
           <el-input v-model="formState.unit"  disabled />
         </el-form-item>
 
+        <!-- productType === 0锛氬師鏉愭枡 -->
         <el-form-item
-            label="搴撳瓨鏁伴噺"
-            prop="qualitity"
+            v-if="type === 'qualified' && formState.productType === 0"
+            label="杞︾墝鍙�"
+            prop="licensePlateNo"
         >
-          <el-input-number v-model="formState.qualitity" :step="1" :min="1" style="width: 100%" />
+          <el-input v-model="formState.licensePlateNo" />
         </el-form-item>
 
         <el-form-item
-            v-if="type === 'qualified'"
-            label="搴撳瓨棰勮鏁伴噺"
-            prop="warnNum"
+            v-if="type === 'qualified' && formState.productType === 0"
+            label="姣涢噸(鍚�)"
+            prop="grossWeight"
         >
-          <el-input-number v-model="formState.warnNum" :step="1" :min="0" :max="formState.qualitity" style="width: 100%" />
+          <el-input-number
+              v-model="formState.grossWeight"
+              :step="0.01"
+              :min="0"
+              style="width: 100%"
+              @change="computeNetWeight"
+          />
         </el-form-item>
-        <!-- productType === 0锛氬師鏉愭枡 -->
+
+        <el-form-item
+            v-if="type === 'qualified' && formState.productType === 0"
+            label="鐨噸(鍚�)"
+            prop="tareWeight"
+        >
+          <el-input-number
+              v-model="formState.tareWeight"
+              :step="0.01"
+              :min="0"
+              style="width: 100%"
+              @change="computeNetWeight"
+          />
+        </el-form-item>
+
+        <el-form-item
+            v-if="type === 'qualified' && formState.productType === 0"
+            label="鍑�閲�(鍚�)"
+            prop="netWeight"
+        >
+          <el-input-number
+              v-model="formState.netWeight"
+              :step="0.01"
+              :min="0"
+              style="width: 100%"
+              disabled
+          />
+        </el-form-item>
+
         <el-form-item
             v-if="type === 'qualified' && formState.productType === 0"
             label="杩囩鏃ユ湡"
@@ -70,10 +106,10 @@
 
         <el-form-item
             v-if="type === 'qualified' && formState.productType === 0"
-            label="鍑�閲�(鍚�)"
-            prop="netWeight"
+            label="杩囩鍛�"
+            prop="weighingOperator"
         >
-          <el-input-number v-model="formState.netWeight" :step="0.01" :min="0" style="width: 100%" />
+          <el-input v-model="formState.weighingOperator" />
         </el-form-item>
 
         <el-form-item label="澶囨敞" prop="remark">
@@ -125,11 +161,14 @@
   productName: "",
   productModelName: "",
   unit: "",
-  weighingDate: undefined,
   productType: undefined,
-  qualitity: 0,
-  warnNum: 0,
+  // 杩囩鐩稿叧瀛楁锛堜粎鍘熸潗鏂欏悎鏍煎搧浣跨敤锛�
+  licensePlateNo: "",
+  grossWeight: undefined,
+  tareWeight: undefined,
   netWeight: undefined,
+  weighingDate: undefined,
+  weighingOperator: "",
   remark: '',
 });
 
@@ -161,6 +200,8 @@
 // 浜у搧閫夋嫨澶勭悊
 const handleProductSelect = async (products) => {
   formState.value.weighingDate = undefined;
+  formState.value.grossWeight = undefined;
+  formState.value.tareWeight = undefined;
   formState.value.netWeight = undefined;
   if (products && products.length > 0) {
     const product = products[0];
@@ -176,6 +217,19 @@
   }
 };
 
+// 鍑�閲� = 姣涢噸 - 鐨噸
+const computeNetWeight = () => {
+  const { grossWeight, tareWeight } = formState.value;
+  if (grossWeight != null && tareWeight != null) {
+    const net = Number(grossWeight) - Number(tareWeight);
+    // 淇濈暀涓や綅灏忔暟锛屼笖涓嶄负璐�
+    const safeNet = Number(net.toFixed(2));
+    formState.value.netWeight = safeNet > 0 ? safeNet : 0;
+  } else {
+    formState.value.netWeight = undefined;
+  }
+};
+
 const handleSubmit = () => {
   proxy.$refs["formRef"].validate(valid => {
     if (valid) {
diff --git a/src/views/inventoryManagement/stockManagement/Qualified.vue b/src/views/inventoryManagement/stockManagement/Qualified.vue
index 0b79b00..6c5be2a 100644
--- a/src/views/inventoryManagement/stockManagement/Qualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -29,7 +29,7 @@
         <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
         <el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip />
         <el-table-column label="鍐荤粨鏁伴噺" prop="lockedQuantity" show-overflow-tooltip />
-        <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum"  show-overflow-tooltip />
+        <!-- <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum"  show-overflow-tooltip /> -->
         <el-table-column label="鍑�閲�(鍚�)" prop="netWeight"  show-overflow-tooltip />
         <el-table-column label="澶囨敞" prop="remark"  show-overflow-tooltip />
         <el-table-column label="鏈�杩戞洿鏂版椂闂�" prop="updateTime" show-overflow-tooltip />
diff --git a/src/views/inventoryManagement/stockManagement/Subtract.vue b/src/views/inventoryManagement/stockManagement/Subtract.vue
index 1cd9b06..d23c974 100644
--- a/src/views/inventoryManagement/stockManagement/Subtract.vue
+++ b/src/views/inventoryManagement/stockManagement/Subtract.vue
@@ -38,25 +38,71 @@
         </el-form-item>
 
         <el-form-item
-            label="鏁伴噺"
-            prop="qualitity"
-        >
-          <el-input-number v-model="formState.qualitity" :step="1" :min="1" :max="maxQuality" style="width: 100%" />
-        </el-form-item>
-
-        <el-form-item
-            v-if="isRawMaterial"
-            label="鍑�閲�"
-            prop="netWeight"
-        >
-          <el-input-number v-model="formState.netWeight" :precision="2" :step="0.01" :min="0" style="width: 100%" />
-        </el-form-item>
-
-        <el-form-item
             label="杞︾墝鍙�"
             prop="licensePlateNo"
         >
           <el-input v-model="formState.licensePlateNo" />
+        </el-form-item>
+
+        <el-form-item
+            label="姣涢噸(鍚�)"
+            prop="grossWeight"
+        >
+          <el-input-number
+              v-model="formState.grossWeight"
+              :step="0.01"
+              :min="0"
+              style="width: 100%"
+              @change="computeNetWeight"
+          />
+        </el-form-item>
+
+        <el-form-item
+            label="鐨噸(鍚�)"
+            prop="tareWeight"
+        >
+          <el-input-number
+              v-model="formState.tareWeight"
+              :step="0.01"
+              :min="0"
+              style="width: 100%"
+              @change="computeNetWeight"
+          />
+        </el-form-item>
+
+        <el-form-item
+            label="鍑�閲�(鍚�)"
+            prop="netWeight"
+        >
+          <el-input-number
+              v-model="formState.netWeight"
+              :step="0.01"
+              :min="0"
+              style="width: 100%"
+              disabled
+          />
+        </el-form-item>
+
+        <el-form-item
+            label="杩囩鏃ユ湡"
+            prop="weighingDate"
+        >
+          <el-date-picker
+              style="width: 100%"
+              v-model="formState.weighingDate"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              format="YYYY-MM-DD HH:mm:ss"
+              type="datetime"
+              placeholder="璇烽�夋嫨杩囩鏃ユ湡"
+              clearable
+          />
+        </el-form-item>
+
+        <el-form-item
+            label="杩囩鍛�"
+            prop="weighingOperator"
+        >
+          <el-input v-model="formState.weighingOperator" />
         </el-form-item>
 
         <el-form-item label="澶囨敞" prop="remark">
@@ -81,7 +127,7 @@
 </template>
 
 <script setup>
-import {ref, computed, getCurrentInstance} from "vue";
+import {ref, computed, getCurrentInstance, onMounted} from "vue";
 import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
 import {subtractStockInventory} from "@/api/inventoryManagement/stockInventory.js";
 import {subtractStockUnInventory} from "@/api/inventoryManagement/stockUninventory.js";
@@ -108,10 +154,6 @@
   initFormData()
 })
 
-const maxQuality = computed(() => {
-  return props.record.unLockedQuantity ? props.record.unLockedQuantity :  0;
-})
-
 const isRawMaterial = computed(() => {
   return props.record.parentName === '鍘熸潗鏂�';
 })
@@ -131,9 +173,13 @@
   productName: "",
   model: "",
   unit: "",
-  qualitity: 0,
+  // 杩囩鐩稿叧瀛楁
+  licensePlateNo: "",
+  grossWeight: undefined,
+  tareWeight: undefined,
   netWeight: undefined,
-  licensePlateNo: undefined,
+  weighingDate: undefined,
+  weighingOperator: "",
   remark: '',
 });
 
@@ -158,13 +204,29 @@
     productName: "",
     model: "",
     unit: "",
-    qualitity: 0,
+    licensePlateNo: "",
+    grossWeight: undefined,
+    tareWeight: undefined,
     netWeight: undefined,
+    weighingDate: undefined,
+    weighingOperator: "",
     remark: '',
   };
   isShow.value = false;
 };
 
+// 鍑�閲� = 姣涢噸 - 鐨噸
+const computeNetWeight = () => {
+  const { grossWeight, tareWeight } = formState.value;
+  if (grossWeight != null && tareWeight != null) {
+    const net = Number(grossWeight) - Number(tareWeight);
+    const safeNet = Number(net.toFixed(2));
+    formState.value.netWeight = safeNet > 0 ? safeNet : 0;
+  } else {
+    formState.value.netWeight = undefined;
+  }
+};
+
 // 浜у搧閫夋嫨澶勭悊
 const handleProductSelect = async (products) => {
   if (products && products.length > 0) {

--
Gitblit v1.9.3