From 80adf052e0b58abd634ca9b67f8569ccc468c430 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期一, 23 三月 2026 15:11:36 +0800
Subject: [PATCH] Merge branch 'dev_银川_中盛建材' of http://114.132.189.42:9002/r/product-inventory-management into dev_银川_中盛建材

---
 src/views/productionManagement/productionReporting/index.vue |  969 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 550 insertions(+), 419 deletions(-)

diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
index b823b6a..08fc2a6 100644
--- a/src/views/productionManagement/productionReporting/index.vue
+++ b/src/views/productionManagement/productionReporting/index.vue
@@ -1,428 +1,559 @@
 <template>
-	<div class="app-container">
-		<div class="search_form">
-			<el-form :model="searchForm" :inline="true">
-				<el-form-item label="瀹㈡埛鍚嶇О:">
-					<el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
-										@change="handleQuery" />
-				</el-form-item>
-				<el-form-item label="椤圭洰鍚嶇О:">
-					<el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
-										@change="handleQuery" />
-				</el-form-item>
-				<el-form-item label="鎺掍骇鏃ユ湡:">
-					<el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-													placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
-				</el-form-item>
-				<el-form-item label="鐘舵��:">
-					<el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 140px" clearable>
-						<el-option label="寰呯敓浜�" :value="1"></el-option>
-						<el-option label="宸叉姤宸�" :value="3"></el-option>
-						<el-option label="鐢熶骇涓�" :value="2"></el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="handleQuery">鎼滅储</el-button>
-				</el-form-item>
-			</el-form>
-		</div>
-		<div class="table_list">
-			<div style="text-align: right" class="mb10">
-				<el-button type="primary" @click="openForm('add')">鐢熶骇鎶ュ伐</el-button>
-			</div>
-			<PIMTable
-				rowKey="id"
-				:column="tableColumn"
-				:tableData="tableData"
-				:page="page"
-				:isSelection="true"
-				:expandRowKeys="expandedRowKeys"
-				@expand-change="expandChange"
-				@selection-change="handleSelectionChange"
-				:tableLoading="tableLoading"
-				@pagination="pagination"
-				:total="page.total"
-			>
-				<template #expand="{ row }">
-					<el-table
-						:data="expandData"
-						border
-						show-summary
-						:summary-method="summarizeMainTable"
-						v-loading="childrenLoading"
-					>
-						<el-table-column
-							align="center"
-							label="搴忓彿"
-							type="index"
-							width="60"
-						/>
-						<el-table-column label="鏈鐢熶骇鏁伴噺" prop="finishedNum" align="center">
-							<template #default="scope">
-								<el-input-number :step="0.01" :min="0" style="width: 100%"
-																 v-model="scope.row.finishedNum"
-																 :disabled="!scope.row.editType"
-																 :precision="2"
-																 placeholder="璇疯緭鍏�"
-																 clearable
-																 @change="changeNum(scope.row)"
-								/>
-							</template>
-						</el-table-column>
-<!--						<el-table-column label="寰呯敓浜ф暟閲�" prop="pendingNum" width="240" align="center"></el-table-column>-->
-						<el-table-column label="鐢熶骇浜�" prop="schedulingUserId" width="240">
-							<template #default="scope">
-								<el-select
-									v-model="scope.row.schedulingUserId"
-									placeholder="閫夋嫨浜哄憳"
-									:disabled="!scope.row.editType"
-									style="width: 100%;"
-								>
-									<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="240">
-							<template #default="scope">
-								<el-date-picker
-									v-model="scope.row.schedulingDate"
-									type="date"
-									:disabled="!scope.row.editType"
-									placeholder="璇烽�夋嫨鏃ユ湡"
-									value-format="YYYY-MM-DD"
-									format="YYYY-MM-DD"
-									clearable
-									style="width: 100%"
-								/>
-							</template>
-						</el-table-column>
-						<el-table-column label="鎿嶄綔" width="60">
-							<template #default="scope">
-								<el-button
-									link
-									type="primary"
-									size="small"
-									@click="changeEditType(scope.row)"
-									v-if="!scope.row.editType"
-									:disabled="scope.row.parentStatus === 3"
-								>缂栬緫</el-button
-								>
-								<el-button
-									link
-									type="primary"
-									size="small"
-									@click="saveReceiptPayment(scope.row)"
-									v-if="scope.row.editType"
-								>淇濆瓨</el-button
-								>
-							</template>
-						</el-table-column>
-					</el-table>
-				</template>
-			</PIMTable>
-		</div>
-		<form-dia ref="formDia" @close="handleQuery"></form-dia>
-	</div>
+  <div class="app-container">
+    <div class="search_form">
+      <el-form :model="searchForm"
+               :inline="true">
+        <el-form-item label="鐢熶骇璁㈠崟鍙�:">
+          <el-input v-model="searchForm.orderNo"
+                    placeholder="璇疯緭鍏�"
+                    clearable
+                    style="width: 160px;"
+                    @keyup.enter="handleQuery" />
+        </el-form-item>
+        <el-form-item label="鐝粍:">
+          <el-select v-model="searchForm.teamName"
+                     placeholder="璇烽�夋嫨"
+                     clearable
+                     style="width: 160px;"
+                     @keyup.enter="handleQuery">
+            <el-option label="鐧界彮"
+                       value="鐧界彮" />
+            <el-option label="澶滅彮"
+                       value="澶滅彮" />
+          </el-select>
+          <!-- <el-input v-model="searchForm.teamName"
+                    placeholder="璇疯緭鍏�""
+                    @keyup.enter="handleQuery" /> -->
+        </el-form-item>
+        <el-form-item label="浜у搧鍚嶇О:">
+          <el-input v-model="searchForm.productName"
+                    placeholder="璇疯緭鍏�"
+                    clearable
+                    style="width: 160px;"
+                    @keyup.enter="handleQuery" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary"
+                     @click="handleQuery">鎼滅储</el-button>
+          <el-button type="primary"
+                     @click="handleReset">閲嶇疆</el-button>
+        </el-form-item>
+      </el-form>
+      <div>
+        <el-button type="primary"
+                   @click="handleAdd">鏂板</el-button>
+        <el-button @click="handleExport">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :page="page"
+                :tableLoading="tableLoading"
+                :isSelection="false"
+                @selection-change="handleSelectionChange"
+                @pagination="pagination">
+        <template #outputVolume="{ row }">
+          <span style="font-weight: bold;color: #409eff;">{{ row.outputVolume }}</span><span style="margin-left: 5px;color: #909399;">鏂�</span>
+        </template>
+        <template #unqualifiedVolume="{ row }">
+          <span style="font-weight: bold;color: #b43434;">{{ row.unqualifiedVolume }}</span><span style="margin-left: 5px;color: #909399;">鏂�</span>
+        </template>
+        <template #completedVolume="{ row }">
+          <span style="font-weight: bold;color: #28e431;">{{ row.completedVolume }}</span><span style="margin-left: 5px;color: #909399;">鏂�</span>
+        </template>
+      </PIMTable>
+    </div>
+  </div>
 </template>
 
 <script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/productionReporting/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {
-	productionReportUpdate,
-	workListPage,
-	workListPageById
-} from "@/api/productionManagement/productionReporting.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
+  import { onMounted, ref, reactive, getCurrentInstance } from "vue";
+  import { useRouter } from "vue-router";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import dayjs from "dayjs";
+  import {
+    workListPage,
+    productionReport,
+    productionReportUpdate,
+    productionReportDelete,
+  } from "@/api/productionManagement/productionReporting.js";
+  import PIMTable from "@/components/PIMTable/PIMTable.vue";
 
-const data = reactive({
-	searchForm: {
-		staffName: "",
-		entryDate: [
-			dayjs().format("YYYY-MM-DD"),
-			dayjs().add(1, "day").format("YYYY-MM-DD"),
-		], // 褰曞叆鏃ユ湡
-		entryDateStart: dayjs().format("YYYY-MM-DD"),
-		entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
-	},
-});
-const { searchForm } = toRefs(data);
-const expandedRowKeys = ref([]);
-const expandData = ref([]);
-const userList = ref([])
-const tableColumn = ref([
-	{
-		type: "expand",
-		dataType: "slot",
-		slot: "expand",
-	},
-	{
-		label: "鐘舵��",
-		prop: "status",
-		dataType: "tag",
-		formatData: (params) => {
-			if (params == 3) {
-				return "宸叉姤宸�";
-			} else if (params == 1) {
-				return "寰呯敓浜�";
-			} else {
-				return '鐢熶骇涓�';
-			}
-		},
-		formatType: (params) => {
-			if (params == 3) {
-				return "success";
-			} else if (params == 1) {
-				return "primary";
-			} else {
-				return 'warning';
-			}
-		},
-	},
-	{
-		label: "鎺掍骇鏃ユ湡",
-		prop: "schedulingDate",
-		width: 120,
-	},
-	{
-		label: "鎺掍骇浜�",
-		prop: "schedulingUserName",
-	},
-	{
-		label: "鍚堝悓鍙�",
-		prop: "salesContractNo",
-		width: 200,
-	},
-	{
-		label: "瀹㈡埛鍚堝悓鍙�",
-		prop: "customerContractNo",
-		width: 200,
-	},
-	{
-		label: "瀹㈡埛鍚嶇О",
-		prop: "customerName",
-		width: 200,
-	},
-	{
-		label: "椤圭洰鍚嶇О",
-		prop: "projectName",
-		width:300
-	},
-	{
-		label: "浜у搧澶х被",
-		prop: "productCategory",
-		width: 150,
-	},
-	{
-		label: "瑙勬牸鍨嬪彿",
-		prop: "specificationModel",
-		width: 150,
-	},
-	{
-		label: "鍗曚綅",
-		prop: "unit",
-	},
-	{
-		label: "宸ュ簭",
-		prop: "process",
-	},
-	{
-		label: "鎺掍骇鏁伴噺",
-		prop: "schedulingNum",
-		width: 100,
-	},
-	{
-		label: "鐢熶骇鏁伴噺",
-		prop: "finishedNum",
-		width: 100,
-	},
-	{
-		label: "寰呯敓浜ф暟閲�",
-		prop: "pendingFinishNum",
-		width: 100,
-	},
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const childrenLoading = ref(false);
-const page = reactive({
-	current: 1,
-	size: 100,
-	total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
+  const router = useRouter();
+  const { proxy } = getCurrentInstance();
 
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-	page.current = 1;
-	getList();
-};
-const changeDaterange = (value) => {
-	if (value) {
-		searchForm.value.entryDateStart = value[0];
-		searchForm.value.entryDateEnd = value[1];
-	} else {
-		searchForm.value.entryDateStart = undefined;
-		searchForm.value.entryDateEnd = undefined;
-	}
-	handleQuery();
-};
-const pagination = (obj) => {
-	page.current = obj.page;
-	page.size = obj.limit;
-	getList();
-};
-const getList = () => {
-	tableLoading.value = true;
-	const params = { ...searchForm.value, ...page };
-	params.entryDate = undefined
-	expandedRowKeys.value = []
-	workListPage(params).then(res => {
-		tableLoading.value = false;
-		tableData.value = res.data.records.map(item => ({
-			...item,
-			pendingFinishNum: (Number(item.schedulingNum) || 0) - (Number(item.finishedNum) || 0)
-		}));
-		page.total = res.data.total;
-	}).catch(err => {
-		tableLoading.value = false;
-	})
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
-	userListNoPageByTenantId().then((res) => {
-		userList.value = res.data;
-	});
-	if (expandedRows.length > 0) {
-		nextTick(() => {
-			expandedRowKeys.value = [];
-			try {
-				childrenLoading.value = true;
-				workListPageById({ id: row.id }).then((res) => {
-					childrenLoading.value = false;
-					const index = tableData.value.findIndex((item) => item.id === row.id);
-					if (index > -1) {
-						expandData.value = res.data.map(item => ({
-							...item,
-							pendingNum: (Number(item.schedulingNum) || 0) - (Number(item.finishedNum) || 0),
-							parentStatus: row.status // 鏂板鐖惰〃鐘舵��
-						}));
-					}
-					expandedRowKeys.value.push(row.id);
-				});
-			} catch (error) {
-				childrenLoading.value = false;
-				console.log(error);
-			}
-		})
-	} else {
-		expandedRowKeys.value = [];
-	}
-};
-const changeNum = (row) => {
-	// 鎵惧埌鐖惰〃鏍兼暟鎹�
-	const parentRow = tableData.value.find(item => item.id === expandedRowKeys.value[0]);
-	// 璁$畻鎵�鏈夊瓙琛ㄦ牸 finishedNum 鐨勬�诲拰
-	const totalFinishedNum = expandData.value.reduce((sum, item) => sum + (Number(item.finishedNum) || 0), 0);
-	// 鐖惰〃鏍肩殑鎺掍骇鏁伴噺
-	const schedulingNum = parentRow ? Number(parentRow.schedulingNum) : 0;
-	
-	if (totalFinishedNum > schedulingNum) {
-		// 鍥為��鏈杈撳叆
-		row.finishedNum = schedulingNum - (totalFinishedNum - Number(row.finishedNum));
-		proxy.$modal.msgWarning('鎵�鏈夋湰娆$敓浜ф暟閲忎箣鍜屼笉鍙ぇ浜庢帓浜ф暟閲�');
-	}
-	row.pendingNum = row.schedulingNum - row.finishedNum;
-}
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
-	row.editType = !row.editType;
-};
-// 淇濆瓨璁板綍
-const saveReceiptPayment = (row) => {
-	productionReportUpdate(row).then((res) => {
-		row.editType = !row.editType;
-		getList();
-		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-	});
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-	selectedRows.value = selection;
-};
-const summarizeMainTable = (param) => {
-	return proxy.summarizeTable(param, [
-		"finishedNum"
-	]);
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
-	if (selectedRows.value.length !== 1) {
-		proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
-		return;
-	}
-	if (selectedRows.value[0].pendingFinishNum == 0) {
-		proxy.$message.warning("鏃犻渶鍐嶆姤宸�");
-		return;
-	}
-	nextTick(() => {
-		const rowInfo = type === 'add' ? selectedRows.value[0] : row
-		formDia.value?.openDialog(type, rowInfo)
-	})
-};
+  const tableColumn = ref([
+    {
+      label: "鐢熶骇璁㈠崟鍙�",
+      prop: "orderNo",
+    },
+    {
+      label: "鐝粍",
+      prop: "teamName",
+      width: "120px",
+      dataType: "tag",
+      formatType: params => {
+        return params === "鐧界彮" ? "primary" : "warning";
+      },
+    },
+    {
+      label: "浜у搧缂栫爜",
+      prop: "materialCode",
+      width: "150px",
+    },
+    {
+      label: "浜у搧鍚嶇О",
+      prop: "productName",
+      width: "150px",
+    },
+    {
+      label: "瑙勬牸",
+      prop: "specification",
+      width: "120px",
+      className: "specification-cell",
+    },
+    {
+      label: "浜у嚭鏂归噺",
+      prop: "outputVolume",
+      width: "120px",
+      align: "right",
+      dataType: "slot",
+      slot: "outputVolume",
+    },
+    {
+      label: "涓嶅悎鏍兼柟閲�",
+      prop: "unqualifiedVolume",
+      width: "120px",
+      align: "right",
+      dataType: "slot",
+      slot: "unqualifiedVolume",
+    },
+    {
+      label: "瀹屾垚鏂归噺",
+      prop: "completedVolume",
+      width: "120px",
+      align: "right",
+      dataType: "slot",
+      slot: "completedVolume",
+    },
+    {
+      label: "鍒涘缓浜�",
+      prop: "createBy",
+      width: "120px",
+      dataType: "tag",
+    },
+    {
+      label: "鍒涘缓鏃堕棿",
+      prop: "createTime",
+      width: "160px",
+      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD HH:mm:ss") : ""),
+    },
+    {
+      label: "鎿嶄綔",
+      dataType: "action",
+      width: "200px",
+      fixed: "right",
+      operation: [
+        {
+          name: "璇︽儏",
+          type: "text",
+          clickFun: row => {
+            handleDetail(row);
+          },
+        },
+        {
+          name: "缂栬緫",
+          type: "text",
+          clickFun: row => {
+            handleEdit(row);
+          },
+        },
+        {
+          name: "鍒犻櫎",
+          type: "text",
+          clickFun: row => {
+            handleDelete(row);
+          },
+        },
+      ],
+    },
+  ]);
 
-// 鍒犻櫎
-const handleDelete = () => {
-	let ids = [];
-	if (selectedRows.value.length > 0) {
-		ids = selectedRows.value.map((item) => item.id);
-	} else {
-		proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-		return;
-	}
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			staffJoinDel(ids).then((res) => {
-				proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-				getList();
-			});
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-// 瀵煎嚭
-const handleOut = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-onMounted(() => {
-	getList();
-});
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({
+    current: 1,
+    size: 10,
+    total: 0,
+  });
+
+  const searchForm = reactive({
+    orderNo: "",
+    teamName: "",
+    productName: "",
+  });
+
+  const mockData = [
+    {
+      id: 1,
+      orderNo: "PO202401001",
+      teamName: "鐧界彮",
+      materialCode: "PC001",
+      productName: "鏍囧噯鐮屽潡",
+      specification: "600脳240脳200",
+      outputVolume: 120.5,
+      unqualifiedVolume: 2.3,
+      completedVolume: 118.2,
+      createBy: "寮犱笁",
+      createTime: "2024-01-15 08:30:00",
+    },
+    {
+      id: 2,
+      orderNo: "PO202401002",
+      teamName: "澶滅彮",
+      materialCode: "PC002",
+      productName: "鏍囧噯鐮屽潡",
+      specification: "600脳240脳200",
+      outputVolume: 150.8,
+      unqualifiedVolume: 1.5,
+      completedVolume: 149.3,
+      createBy: "鏉庡洓",
+      createTime: "2024-01-15 09:15:00",
+    },
+    {
+      id: 3,
+      orderNo: "PO202401003",
+      teamName: "鐧界彮",
+      materialCode: "PC003",
+      productName: "鍔犳皵鐮屽潡",
+      specification: "600脳240脳250",
+      outputVolume: 95.2,
+      unqualifiedVolume: 0.8,
+      completedVolume: 94.4,
+      createBy: "鐜嬩簲",
+      createTime: "2024-01-15 10:00:00",
+    },
+    {
+      id: 4,
+      orderNo: "PO202401004",
+      teamName: "鐧界彮",
+      materialCode: "PC004",
+      productName: "鏍囧噯鐮屽潡",
+      specification: "600脳240脳200",
+      outputVolume: 180.6,
+      unqualifiedVolume: 3.2,
+      completedVolume: 177.4,
+      createBy: "璧靛叚",
+      createTime: "2024-01-15 14:20:00",
+    },
+    {
+      id: 5,
+      orderNo: "PO202401005",
+      teamName: "澶滅彮",
+      materialCode: "PC005",
+      productName: "鍔犳皵鐮屽潡",
+      specification: "600脳240脳250",
+      outputVolume: 110.3,
+      unqualifiedVolume: 1.1,
+      completedVolume: 109.2,
+      createBy: "瀛欎竷",
+      createTime: "2024-01-15 15:45:00",
+    },
+    {
+      id: 6,
+      orderNo: "PO202401006",
+      teamName: "鐧界彮",
+      materialCode: "PC006",
+      productName: "鏍囧噯鐮屽潡",
+      specification: "600脳240脳200",
+      outputVolume: 135.7,
+      unqualifiedVolume: 2.5,
+      completedVolume: 133.2,
+      createBy: "鍛ㄥ叓",
+      createTime: "2024-01-16 08:00:00",
+    },
+    {
+      id: 7,
+      orderNo: "PO202401007",
+      teamName: "鐧界彮",
+      materialCode: "PC007",
+      productName: "鍔犳皵鐮屽潡",
+      specification: "600脳240脳250",
+      outputVolume: 88.4,
+      unqualifiedVolume: 0.6,
+      completedVolume: 87.8,
+      createBy: "鍚翠節",
+      createTime: "2024-01-16 09:30:00",
+    },
+    {
+      id: 8,
+      orderNo: "PO202401008",
+      teamName: "澶滅彮",
+      materialCode: "PC008",
+      productName: "鏍囧噯鐮屽潡",
+      specification: "600脳240脳200",
+      outputVolume: 165.2,
+      unqualifiedVolume: 2.8,
+      completedVolume: 162.4,
+      createBy: "閮戝崄",
+      createTime: "2024-01-16 11:00:00",
+    },
+    {
+      id: 9,
+      orderNo: "PO202401009",
+      teamName: "鐧界彮",
+      materialCode: "PC009",
+      productName: "鍔犳皵鐮屽潡",
+      specification: "600脳240脳250",
+      outputVolume: 102.5,
+      unqualifiedVolume: 1.3,
+      completedVolume: 101.2,
+      createBy: "閽卞崄涓�",
+      createTime: "2024-01-16 13:15:00",
+    },
+    {
+      id: 10,
+      orderNo: "PO202401010",
+      teamName: "鐧界彮",
+      materialCode: "PC010",
+      productName: "鏍囧噯鐮屽潡",
+      specification: "600脳240脳200",
+      outputVolume: 142.8,
+      unqualifiedVolume: 2.1,
+      completedVolume: 140.7,
+      createBy: "鍒樺崄浜�",
+      createTime: "2024-01-16 15:00:00",
+    },
+  ];
+
+  const form = reactive({
+    id: undefined,
+    orderId: "",
+    orderNo: "",
+    teamName: "",
+    materialCode: "",
+    productName: "",
+    specification: "",
+    outputVolume: 0,
+    unqualifiedVolume: 0,
+    completedVolume: 0,
+    processId: "",
+    params: {},
+  });
+
+  const selectedRows = ref([]);
+
+  const getList = () => {
+    tableLoading.value = true;
+    setTimeout(() => {
+      tableLoading.value = false;
+      const start = (page.current - 1) * page.size;
+      const end = start + page.size;
+      tableData.value = mockData.slice(start, end);
+      page.total = mockData.length;
+    }, 500);
+  };
+
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+
+  const handleReset = () => {
+    searchForm.orderNo = "";
+    searchForm.teamName = "";
+    searchForm.productName = "";
+    page.current = 1;
+    getList();
+  };
+
+  const pagination = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
+
+  const handleAdd = () => {
+    Object.assign(form, {
+      id: undefined,
+      orderId: "",
+      orderNo: "",
+      teamName: "",
+      materialCode: "",
+      productName: "",
+      specification: "",
+      outputVolume: 0,
+      unqualifiedVolume: 0,
+      completedVolume: 0,
+      processId: "",
+      params: {},
+    });
+    router.push({
+      path: "/productionManagement/ReportingDialog",
+      query: { data: JSON.stringify(form) },
+    });
+  };
+
+  const handleEdit = row => {
+    Object.assign(form, {
+      id: row.id,
+      orderId: row.orderId || "",
+      orderNo: row.orderNo,
+      teamName: row.teamName,
+      materialCode: row.materialCode,
+      productName: row.productName,
+      specification: row.specification,
+      outputVolume: row.outputVolume,
+      unqualifiedVolume: row.unqualifiedVolume,
+      completedVolume: row.completedVolume,
+      createBy: row.createBy || "",
+      createTime: row.createTime || new Date(),
+      processId: row.processId || "",
+      params: row.params || {},
+    });
+    router.push({
+      path: "/productionManagement/ReportingDialog",
+      query: { data: JSON.stringify(form) },
+    });
+  };
+
+  const handleDetail = row => {
+    ElMessage.info("璇︽儏鍔熻兘寰呭疄鐜�");
+  };
+
+  const handleDelete = row => {
+    ElMessageBox.confirm("纭鍒犻櫎璇ユ潯鏁版嵁鍚�?", "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        productionReportDelete({ id: row.id })
+          .then(() => {
+            ElMessage.success("鍒犻櫎鎴愬姛");
+            getList();
+          })
+          .catch(() => {
+            ElMessage.error("鍒犻櫎澶辫触");
+          });
+      })
+      .catch(() => {});
+  };
+
+  const handleExport = () => {
+    ElMessage.info("瀵煎嚭鍔熻兘寰呭疄鐜�");
+  };
+
+  onMounted(() => {
+    getList();
+  });
 </script>
 
-<style scoped></style>
+<style scoped lang="scss">
+  .app-container {
+    padding: 24px;
+    background-color: #f0f2f5;
+    min-height: calc(100vh - 48px);
+  }
+
+  .search_form {
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-start;
+    flex-wrap: wrap;
+    gap: 16px;
+    margin-bottom: 24px;
+    padding: 20px;
+    background-color: #ffffff;
+    border-radius: 6px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
+    transition: all 0.3s ease;
+
+    &:hover {
+      box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.08);
+    }
+
+    :deep(.el-form) {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 0;
+
+      .el-form-item {
+        margin-right: 16px;
+        margin-bottom: 0;
+
+        &:last-child {
+          margin-right: 0;
+        }
+      }
+    }
+
+    > div {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 8px;
+      flex-shrink: 0;
+    }
+  }
+
+  .table_list {
+    background-color: #ffffff;
+    border-radius: 6px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
+    overflow: hidden;
+    height: calc(100vh - 220px);
+  }
+
+  :deep(.el-table) {
+    border: none;
+    border-radius: 6px;
+    overflow: hidden;
+
+    .el-table__header-wrapper {
+      background-color: #fafafa;
+
+      th {
+        background-color: #fafafa;
+        font-weight: 600;
+        color: #303133;
+        border-bottom: 1px solid #ebeef5;
+        padding: 14px 0;
+      }
+    }
+
+    .el-table__body-wrapper {
+      tr {
+        transition: all 0.3s ease;
+
+        &:hover {
+          background-color: #f5f7fa;
+        }
+
+        td {
+          border-bottom: 1px solid #ebeef5;
+          padding: 12px 0;
+        }
+      }
+
+      tr.current-row {
+        background-color: #ecf5ff;
+      }
+    }
+
+    .el-table__empty-block {
+      padding: 40px 0;
+    }
+  }
+</style>
+<style lang="scss">
+  .specification-cell {
+    color: #7a7d81;
+    font-style: italic;
+  }
+</style>

--
Gitblit v1.9.3