From e200b8192f3c9d34645faec0013518f6b70722df Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 05 一月 2026 11:47:17 +0800
Subject: [PATCH] 海川开心: 1.销售管理、仓储物流一些字段赋默认值 2.生产报工改成可以多个报工

---
 src/views/productionManagement/productionReporting/components/formDia.vue |  295 +++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 178 insertions(+), 117 deletions(-)

diff --git a/src/views/productionManagement/productionReporting/components/formDia.vue b/src/views/productionManagement/productionReporting/components/formDia.vue
index ecb7d81..a10c6ef 100644
--- a/src/views/productionManagement/productionReporting/components/formDia.vue
+++ b/src/views/productionManagement/productionReporting/components/formDia.vue
@@ -7,81 +7,97 @@
 				draggable
         @close="closeDia"
     >
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鎺掍骇鏁伴噺锛�" prop="schedulingNum">
-              <el-input v-model="form.schedulingNum" placeholder="璇疯緭鍏�" clearable disabled/>
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="寰呯敓浜ф暟閲忥細" prop="pendingNum">
-							<el-input v-model="form.pendingNum" placeholder="璇疯緭鍏�" clearable disabled/>
-						</el-form-item>
-					</el-col>
-        </el-row>
-        <el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="鏈鐢熶骇鏁伴噺锛�" prop="finishedNum">
-							<el-input-number
-								v-model="form.finishedNum"
-								placeholder="璇疯緭鍏�"
-								:min="0"
-								:step="0.1"
-								:precision="2"
-								clearable
-								style="width: 100%"
-								@change="changeNum"
-							/>
-						</el-form-item>
-					</el-col>
-          <el-col :span="12">
-            <el-form-item label="鍗曚环(鍏�)锛�" prop="unitPrice">
-              <el-input v-model="form.unitPrice" placeholder="璇疯緭鍏�" clearable @input="calculateTotalPrice"/>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鎬讳环(鍏�)锛�" prop="totalPrice">
-              <el-input v-model="form.totalPrice" placeholder="璇疯緭鍏�" clearable disabled/>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="鐢熶骇浜猴細" prop="schedulingUserId">
-							<el-select
-								v-model="form.schedulingUserId"
-								placeholder="閫夋嫨浜哄憳"
-								style="width: 100%;"
+      <el-form label-width="140px" label-position="top" :rules="rules" ref="formRef">
+        <el-table
+          :data="reportList"
+          border
+          style="width: 100%"
+        >
+          <el-table-column
+            align="center"
+            label="搴忓彿"
+            type="index"
+            width="60"
+          />
+          <el-table-column label="鍚堝悓鍙�" prop="salesContractNo" width="150" />
+          <el-table-column label="浜у搧澶х被" prop="productCategory" width="120" />
+          <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" />
+          <el-table-column label="鎺掍骇鏁伴噺" prop="schedulingNum" width="100">
+            <template #default="scope">
+              <span>{{ scope.row.schedulingNum }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="寰呯敓浜ф暟閲�" prop="pendingNum" width="100">
+            <template #default="scope">
+              <span>{{ scope.row.pendingNum }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏈鐢熶骇鏁伴噺" prop="finishedNum" width="150">
+            <template #default="scope">
+              <el-input-number
+                v-model="scope.row.finishedNum"
+                placeholder="璇疯緭鍏�"
+                :min="0"
+                :step="0.1"
+                :precision="2"
+                clearable
+                style="width: 100%"
+                @change="(val) => changeNum(scope.row, val)"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚环(鍏�)" prop="unitPrice" width="120">
+            <template #default="scope">
+              <el-input-number
+                v-model="scope.row.unitPrice"
+                placeholder="璇疯緭鍏�"
+                :min="0"
+                :step="0.01"
+                :precision="2"
+                clearable
+                style="width: 100%"
+                @change="() => calculateTotalPrice(scope.row)"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="鎬讳环(鍏�)" prop="totalPrice" width="120">
+            <template #default="scope">
+              <span>{{ scope.row.totalPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鐢熶骇浜�" prop="schedulingUserId" width="150">
+            <template #default="scope">
+              <el-select
+                v-model="scope.row.schedulingUserId"
+                placeholder="閫夋嫨浜哄憳"
+                style="width: 100%;"
                 filterable
                 default-first-option
                 :reserve-keyword="false"
-							>
-								<el-option
-									v-for="user in userList"
-									:key="user.userId"
-									:label="user.nickName"
-									:value="user.userId"
-								/>
-							</el-select>
-						</el-form-item>
-					</el-col>
-          <el-col :span="12">
-            <el-form-item label="鐢熶骇鏃ユ湡锛�" prop="schedulingDate">
+              >
+                <el-option
+                  v-for="user in userList"
+                  :key="user.userId"
+                  :label="user.nickName"
+                  :value="user.userId"
+                />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="鐢熶骇鏃ユ湡" prop="schedulingDate" width="150">
+            <template #default="scope">
               <el-date-picker
-                  v-model="form.schedulingDate"
-                  type="date"
-                  placeholder="璇烽�夋嫨鏃ユ湡"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  clearable
-                  style="width: 100%"
+                v-model="scope.row.schedulingDate"
+                type="date"
+                placeholder="璇烽�夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                clearable
+                style="width: 100%"
               />
-            </el-form-item>
-          </el-col>
-        </el-row>
+            </template>
+          </el-table-column>
+        </el-table>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -94,7 +110,7 @@
 </template>
 
 <script setup>
-import {ref} from "vue";
+import {ref, reactive, toRefs, getCurrentInstance} from "vue";
 import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
 import {userListNoPageByTenantId} from "@/api/system/user.js";
 import {productionReport, productionReportUpdate} from "@/api/productionManagement/productionReporting.js";
@@ -104,83 +120,128 @@
 const userList = ref([])
 const dialogFormVisible = ref(false);
 const operationType = ref('')
+const reportList = ref([])
 const data = reactive({
-  form: {
-		successNum: "",
-		schedulingNum: "",
-    pendingNum: "",
-		finishedNum: "",
-		schedulingUserId: "",
-		schedulingDate: "",
-		unitPrice: "",
-		totalPrice: "",
-  },
   rules: {
 		schedulingNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
   },
 });
-const { form, rules } = toRefs(data);
+const { rules } = toRefs(data);
 
 // 鎵撳紑寮规
-const openDialog = (type, row) => {
+const openDialog = (type, rows) => {
   operationType.value = type;
   dialogFormVisible.value = true;
 	userListNoPageByTenantId().then((res) => {
 		userList.value = res.data;
 	});
-	form.value = {...row}
-  const total = Number(row?.schedulingNum ?? 0);
-  const pendingFinish = Number(row?.pendingFinishNum ?? 0);
-  const autoFill = pendingFinish > 0 ? Math.min(pendingFinish, total) : total;
-  form.value.finishedNum = autoFill;
-  form.value.pendingNum = Math.max(total - autoFill, 0);
-  changeNum(form.value.finishedNum);
+	
+	// 澶勭悊澶氭潯鏁版嵁
+	const rowsArray = Array.isArray(rows) ? rows : [rows];
+	reportList.value = rowsArray.map(row => {
+		const total = Number(row?.schedulingNum ?? 0);
+		const pendingFinish = Number(row?.pendingFinishNum ?? 0);
+		const autoFill = pendingFinish > 0 ? Math.min(pendingFinish, total) : total;
+		const unitPrice = row?.unitPrice ? Number(row.unitPrice) : 0.33;
+		
+		return {
+			id: row?.id ?? null,
+			salesContractNo: row?.salesContractNo ?? '',
+			productCategory: row?.productCategory ?? '',
+			specificationModel: row?.specificationModel ?? '',
+			schedulingNum: total,
+			pendingNum: Math.max(total - autoFill, 0),
+			finishedNum: autoFill,
+			unitPrice: unitPrice,
+			totalPrice: (autoFill * unitPrice).toFixed(2),
+			schedulingUserId: row?.schedulingUserId ?? '',
+			schedulingDate: row?.schedulingDate ?? '',
+		};
+	});
 }
 
-const changeNum = (value) => {
-	if (value > form.value.schedulingNum) {
-		form.value.finishedNum = form.value.schedulingNum;
+const changeNum = (row, value) => {
+	if (value > row.schedulingNum) {
+		row.finishedNum = row.schedulingNum;
 		proxy.$modal.msgWarning('鏈鐢熶骇鏁伴噺涓嶅彲澶т簬鎺掍骇鏁伴噺')
 	}
-	form.value.pendingNum = form.value.schedulingNum - form.value.finishedNum;
-	calculateTotalPrice();
+	row.pendingNum = row.schedulingNum - row.finishedNum;
+	calculateTotalPrice(row);
 }
 
 // 璁$畻鎬讳环
-const calculateTotalPrice = () => {
-	const quantity = Number(form.value.finishedNum ?? 0);
-	const unitPrice = Number(form.value.unitPrice ?? 0);
+const calculateTotalPrice = (row) => {
+	const quantity = Number(row.finishedNum ?? 0);
+	const unitPrice = Number(row.unitPrice ?? 0);
 	
 	if (quantity > 0 && unitPrice > 0) {
-		form.value.totalPrice = (quantity * unitPrice).toFixed(2);
+		row.totalPrice = (quantity * unitPrice).toFixed(2);
 	} else {
-		form.value.totalPrice = '0.00';
+		row.totalPrice = '0.00';
 	}
 }
+
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs.formRef.validate(valid => {
-    if (valid) {
-      form.value.staffState = 1
-      if (operationType.value === "add") {
-				productionReport(form.value).then(res => {
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-          closeDia();
-        })
-      } else {
-				productionReportUpdate(form.value).then(res => {
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-          closeDia();
-        })
-      }
-    }
-  })
+	// 楠岃瘉鏁版嵁
+	for (let i = 0; i < reportList.value.length; i++) {
+		const item = reportList.value[i];
+		if (!item.finishedNum || item.finishedNum <= 0) {
+			proxy.$modal.msgError(`绗�${i + 1}琛屾湰娆$敓浜ф暟閲忛渶澶т簬0`);
+			return;
+		}
+		if (item.finishedNum > item.schedulingNum) {
+			proxy.$modal.msgError(`绗�${i + 1}琛屾湰娆$敓浜ф暟閲忎笉鍙ぇ浜庢帓浜ф暟閲廯);
+			return;
+		}
+		if (!item.schedulingUserId) {
+			proxy.$modal.msgError(`绗�${i + 1}琛岃閫夋嫨鐢熶骇浜篳);
+			return;
+		}
+		if (!item.schedulingDate) {
+			proxy.$modal.msgError(`绗�${i + 1}琛岃閫夋嫨鐢熶骇鏃ユ湡`);
+			return;
+		}
+	}
+
+	// 鏋勫缓鎻愪氦鏁版嵁鏁扮粍
+	const payloadList = reportList.value.map(item => ({
+		id: item.id,
+		finishedNum: Number(item.finishedNum),
+		unitPrice: Number(item.unitPrice || 0.33),
+		totalPrice: Number(item.totalPrice || 0),
+		schedulingUserId: item.schedulingUserId,
+		schedulingDate: item.schedulingDate,
+	}));
+
+	if (operationType.value === "add") {
+		productionReport(payloadList).then(res => {
+			proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+			closeDia();
+		}).catch(err => {
+			console.error('鎻愪氦澶辫触:', err);
+		})
+	} else {
+		// 缂栬緫妯″紡锛岄�愭潯鏇存柊
+		Promise.all(payloadList.map(item => productionReportUpdate(item)))
+			.then(() => {
+				proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+				closeDia();
+			})
+			.catch(err => {
+				console.error('鎻愪氦澶辫触:', err);
+				proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯');
+			});
+	}
 }
 
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef");
+  if (proxy.$refs.formRef) {
+    proxy.resetForm("formRef");
+  }
   dialogFormVisible.value = false;
+  reportList.value = [];
   emit('close')
 };
 defineExpose({

--
Gitblit v1.9.3