From f5987541fae35e3bed09c5eb7ba3b5f8ab65aba9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 21 七月 2025 17:50:02 +0800
Subject: [PATCH] 1.生产订单、生产派工、工序排产前端页面开发

---
 src/views/system/role/index.vue                                             |    5 
 src/views/basicData/supplierManage/index.vue                                |    2 
 src/views/productionManagement/operationScheduling/components/formDia.vue   |  165 +++++++++
 src/views/system/post/index.vue                                             |    5 
 src/views/procurementManagement/invoiceEntry/index.vue                      |    4 
 src/views/salesManagement/receiptPaymentLedger/index.vue                    |    6 
 src/components/PIMTable/PIMTable.vue                                        |    2 
 src/views/productionManagement/productionDispatching/components/formDia.vue |  165 +++++++++
 src/views/productionManagement/productionDispatching/index.vue              |  228 ++++++++++++
 src/views/salesManagement/salesLedger/index.vue                             |    6 
 src/views/productionManagement/operationScheduling/index.vue                |  227 ++++++++++++
 src/views/monitor/operlog/index.vue                                         |    5 
 src/views/monitor/server/index.vue                                          |    5 
 src/views/system/menu/index.vue                                             |    5 
 src/views/system/user/index.vue                                             |    8 
 src/views/basicData/customerFile/index.vue                                  |    6 
 src/views/system/role/authUser.vue                                          |    5 
 src/views/productionManagement/productionOrder/index.vue                    |  182 ++++++++++
 src/views/system/notice/index.vue                                           |    5 
 src/views/system/dict/index.vue                                             |    5 
 20 files changed, 1,020 insertions(+), 21 deletions(-)

diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index fb472fb..955173d 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -301,7 +301,7 @@
   },
   rowKey: {
     type: String,
-    default: undefined,
+    default: 'id',
   },
   page: {
     type: Object,
diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
index 385b895..a706616 100644
--- a/src/views/basicData/customerFile/index.vue
+++ b/src/views/basicData/customerFile/index.vue
@@ -231,7 +231,7 @@
 </template>
 
 <script setup>
-import { ref } from "vue";
+import {onMounted, ref} from "vue";
 import { Search } from "@element-plus/icons-vue";
 import {
   addCustomer,
@@ -591,7 +591,9 @@
   return `${year}-${month}-${day}`;
 }
 
-getList();
+onMounted(() => {
+	getList();
+});
 </script>
 
 <style scoped lang="scss"></style>
diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue
index af76ab2..68c51d3 100644
--- a/src/views/basicData/supplierManage/index.vue
+++ b/src/views/basicData/supplierManage/index.vue
@@ -221,7 +221,7 @@
 </template>
 
 <script setup>
-import { ref } from "vue";
+import { onMounted, ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { delSupplier } from "@/api/basicData/supplierManageFile.js";
 import { ElMessageBox } from "element-plus";
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
index dedc9c9..92f9c35 100644
--- a/src/views/monitor/operlog/index.vue
+++ b/src/views/monitor/operlog/index.vue
@@ -199,6 +199,7 @@
 
 <script setup name="Operlog">
 import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog"
+import {onMounted} from "vue";
 
 const { proxy } = getCurrentInstance()
 const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type","sys_common_status")
@@ -306,5 +307,7 @@
   }, `config_${new Date().getTime()}.xlsx`)
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/monitor/server/index.vue b/src/views/monitor/server/index.vue
index 5eb7945..d9840ac 100644
--- a/src/views/monitor/server/index.vue
+++ b/src/views/monitor/server/index.vue
@@ -171,6 +171,7 @@
 
 <script setup>
 import { getServer } from '@/api/monitor/server'
+import {onMounted} from "vue";
 
 const server = ref([])
 const { proxy } = getCurrentInstance()
@@ -183,5 +184,7 @@
   })
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
index 4fdf385..256377f 100644
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ b/src/views/procurementManagement/invoiceEntry/index.vue
@@ -7,8 +7,8 @@
               v-model="filters.supplierName"
               placeholder="璇疯緭鍏ュ悕绉版悳绱�"
               clearable
-              :prefix-icon="Search"
-              @change="handleQuery"
+              prefix-icon="Search"
+              @change="getTableData"
           />
         </el-form-item>
         <el-form-item label="閲囪喘璁㈠崟鍙凤細">
diff --git a/src/views/productionManagement/operationScheduling/components/formDia.vue b/src/views/productionManagement/operationScheduling/components/formDia.vue
new file mode 100644
index 0000000..9e5f1eb
--- /dev/null
+++ b/src/views/productionManagement/operationScheduling/components/formDia.vue
@@ -0,0 +1,165 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
+        width="70%"
+        @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="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浜у搧澶х被锛�" prop="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鎬绘暟閲忥細" prop="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏈鎺掍骇鏁伴噺锛�" prop="staffNo">
+							<el-input-number
+								v-model="form.ticketsNum"
+								placeholder="璇疯緭鍏�"
+								:min="0"
+								:step="0.1"
+								:precision="2"
+								clearable
+								style="width: 100%"
+							/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="鎺掍骇浜猴細" prop="staffName">
+							<el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/>
+						</el-form-item>
+					</el-col>
+          <el-col :span="12">
+            <el-form-item label="鎺掍骇鏃ユ湡锛�" prop="contractStartTime">
+              <el-date-picker
+                  v-model="form.contractStartTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const operationType = ref('')
+const data = reactive({
+  form: {
+    staffNo: "",
+    staffName: "",
+    sex: "",
+    nativePlace: "",
+    postJob: "",
+    adress: "",
+    firstStudy: "",
+    profession: "",
+    identityCard: "",
+    age: 0,
+    phone: "",
+    emergencyContact: "",
+    emergencyContactPhone: "",
+    contractTerm: 0,
+    contractStartTime: "",
+    contractEndTime: "",
+    staffState: "",
+  },
+  rules: {
+    staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
+    staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+// 鎵撳紑寮规
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    getStaffJoinInfo(row.id).then(res => {
+      form.value = {...res.data}
+    })
+  }
+}
+// 鎻愪氦浜у搧琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate(valid => {
+    if (valid) {
+      form.value.staffState = 1
+      if (operationType.value === "add") {
+        staffJoinAdd(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      } else {
+        staffJoinUpdate(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      }
+    }
+  })
+}
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+  emit('close')
+};
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/operationScheduling/index.vue b/src/views/productionManagement/operationScheduling/index.vue
new file mode 100644
index 0000000..ca4bae6
--- /dev/null
+++ b/src/views/productionManagement/operationScheduling/index.vue
@@ -0,0 +1,227 @@
+<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="0"></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>
+				<el-button type="danger" @click="openForm('delete')" plain>鍙栨秷鎺掍骇</el-button>
+			</div>
+			<PIMTable
+				rowKey="id"
+				:column="tableColumn"
+				:tableData="tableData"
+				:page="page"
+				:isSelection="true"
+				@selection-change="handleSelectionChange"
+				:tableLoading="tableLoading"
+				@pagination="pagination"
+				:total="page.total"
+			></PIMTable>
+		</div>
+		<form-dia ref="formDia" @close="handleQuery"></form-dia>
+	</div>
+</template>
+
+<script setup>
+import {onMounted, ref} from "vue";
+import FormDia from "@/views/productionManagement/productionDispatching/components/formDia.vue";
+import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
+import {ElMessageBox} from "element-plus";
+import dayjs from "dayjs";
+
+const data = reactive({
+	searchForm: {
+		staffName: "",
+		status: 0,
+		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 tableColumn = ref([
+	{
+		label: "褰曞叆鏃ユ湡",
+		prop: "staffNo",
+	},
+	{
+		label: "鍚堝悓鍙�",
+		prop: "staffName",
+	},
+	{
+		label: "瀹㈡埛鍚堝悓鍙�",
+		prop: "addressPhone",
+		width: 250,
+	},
+	{
+		label: "瀹㈡埛鍚嶇О",
+		prop: "contactPerson",
+	},
+	{
+		label: "椤圭洰鍚嶇О",
+		prop: "contactPhone",
+		width:150
+	},
+	{
+		label: "浜у搧澶х被",
+		prop: "basicBankAccount",
+		width: 220,
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "bankAccount",
+		width: 220,
+	},
+	{
+		label: "鍗曚綅",
+		prop: "bankCode",
+		width:220
+	},
+	{
+		label: "鏁伴噺",
+		prop: "maintainer",
+	},
+	{
+		label: "鎺掍骇鏁伴噺",
+		prop: "maintenanceTime",
+		width: 100,
+	},
+	{
+		label: "寰呮帓鏁伴噺",
+		prop: "maintenanceTime",
+		width: 100,
+	},
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+	current: 1,
+	size: 100,
+	total: 0,
+});
+const formDia = ref()
+const { proxy } = getCurrentInstance()
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+	page.current = 1;
+	getList();
+};
+const changeDaterange = (value) => {
+	if (value) {
+		searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+		searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+	} else {
+		searchForm.entryDateStart = undefined;
+		searchForm.entryDateEnd = undefined;
+	}
+	handleQuery();
+};
+const pagination = (obj) => {
+	page.current = obj.page;
+	page.size = obj.limit;
+	getList();
+};
+const getList = () => {
+	tableLoading.value = true;
+	staffJoinListPage({...page, ...searchForm.value}).then(res => {
+		tableLoading.value = false;
+		tableData.value = res.data.records
+		page.total = res.data.total;
+	}).catch(err => {
+		tableLoading.value = false;
+	})
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+	selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+	if (selectedRows.value.length !== 1) {
+		proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
+		return;
+	}
+	if (selectedRows.value[0].unPaymentAmountTotal == 0) {
+		proxy.$message.warning("鏃犻渶鍐嶄粯娆�");
+		return;
+	}
+	nextTick(() => {
+		formDia.value?.openDialog(type, 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();
+});
+</script>
+
+<style scoped></style>
diff --git a/src/views/productionManagement/productionDispatching/components/formDia.vue b/src/views/productionManagement/productionDispatching/components/formDia.vue
new file mode 100644
index 0000000..9e5f1eb
--- /dev/null
+++ b/src/views/productionManagement/productionDispatching/components/formDia.vue
@@ -0,0 +1,165 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
+        width="70%"
+        @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="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浜у搧澶х被锛�" prop="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鎬绘暟閲忥細" prop="staffNo">
+              <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏈鎺掍骇鏁伴噺锛�" prop="staffNo">
+							<el-input-number
+								v-model="form.ticketsNum"
+								placeholder="璇疯緭鍏�"
+								:min="0"
+								:step="0.1"
+								:precision="2"
+								clearable
+								style="width: 100%"
+							/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="鎺掍骇浜猴細" prop="staffName">
+							<el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/>
+						</el-form-item>
+					</el-col>
+          <el-col :span="12">
+            <el-form-item label="鎺掍骇鏃ユ湡锛�" prop="contractStartTime">
+              <el-date-picker
+                  v-model="form.contractStartTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const operationType = ref('')
+const data = reactive({
+  form: {
+    staffNo: "",
+    staffName: "",
+    sex: "",
+    nativePlace: "",
+    postJob: "",
+    adress: "",
+    firstStudy: "",
+    profession: "",
+    identityCard: "",
+    age: 0,
+    phone: "",
+    emergencyContact: "",
+    emergencyContactPhone: "",
+    contractTerm: 0,
+    contractStartTime: "",
+    contractEndTime: "",
+    staffState: "",
+  },
+  rules: {
+    staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
+    staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+// 鎵撳紑寮规
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    getStaffJoinInfo(row.id).then(res => {
+      form.value = {...res.data}
+    })
+  }
+}
+// 鎻愪氦浜у搧琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate(valid => {
+    if (valid) {
+      form.value.staffState = 1
+      if (operationType.value === "add") {
+        staffJoinAdd(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      } else {
+        staffJoinUpdate(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      }
+    }
+  })
+}
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+  emit('close')
+};
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/productionDispatching/index.vue b/src/views/productionManagement/productionDispatching/index.vue
new file mode 100644
index 0000000..70a3de9
--- /dev/null
+++ b/src/views/productionManagement/productionDispatching/index.vue
@@ -0,0 +1,228 @@
+<template>
+	<div class="app-container">
+		<div class="search_form">
+			<div>
+				<span class="search_title">瀹㈡埛鍚嶇О锛�</span>
+				<el-input
+					v-model="searchForm.customerName"
+					style="width: 240px"
+					placeholder="璇疯緭鍏�"
+					@change="handleQuery"
+					clearable
+					prefix-icon="Search"
+				/>
+				<span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
+				<el-input
+					v-model="searchForm.customerName"
+					style="width: 240px"
+					placeholder="璇疯緭鍏�"
+					@change="handleQuery"
+					clearable
+					prefix-icon="Search"
+				/>
+				<span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
+				<el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+												placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+				<el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+				>鎼滅储</el-button
+				>
+			</div>
+			<div>
+				<el-button type="primary" @click="openForm('add')">鐢熶骇娲惧伐</el-button>
+			</div>
+		</div>
+		<div class="table_list">
+			<PIMTable
+				rowKey="id"
+				:column="tableColumn"
+				:tableData="tableData"
+				:page="page"
+				:isSelection="true"
+				@selection-change="handleSelectionChange"
+				:tableLoading="tableLoading"
+				@pagination="pagination"
+				:total="page.total"
+			></PIMTable>
+		</div>
+		<form-dia ref="formDia" @close="handleQuery"></form-dia>
+	</div>
+</template>
+
+<script setup>
+import {onMounted, ref} from "vue";
+import FormDia from "@/views/productionManagement/productionDispatching/components/formDia.vue";
+import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
+import {ElMessageBox} from "element-plus";
+import dayjs from "dayjs";
+
+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 tableColumn = ref([
+	{
+		label: "褰曞叆鏃ユ湡",
+		prop: "staffNo",
+	},
+	{
+		label: "鍚堝悓鍙�",
+		prop: "staffName",
+	},
+	{
+		label: "瀹㈡埛鍚堝悓鍙�",
+		prop: "addressPhone",
+		width: 250,
+	},
+	{
+		label: "瀹㈡埛鍚嶇О",
+		prop: "contactPerson",
+	},
+	{
+		label: "椤圭洰鍚嶇О",
+		prop: "contactPhone",
+		width:150
+	},
+	{
+		label: "浜у搧澶х被",
+		prop: "basicBankAccount",
+		width: 220,
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "bankAccount",
+		width: 220,
+	},
+	{
+		label: "鍗曚綅",
+		prop: "bankCode",
+		width:220
+	},
+	{
+		label: "鏁伴噺",
+		prop: "maintainer",
+	},
+	{
+		label: "鎺掍骇鏁伴噺",
+		prop: "maintenanceTime",
+		width: 100,
+	},
+	{
+		label: "寰呮帓鏁伴噺",
+		prop: "maintenanceTime",
+		width: 100,
+	},
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+	current: 1,
+	size: 100,
+	total: 0,
+});
+const formDia = ref()
+const { proxy } = getCurrentInstance()
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+	page.current = 1;
+	getList();
+};
+const changeDaterange = (value) => {
+	if (value) {
+		searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+		searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+	} else {
+		searchForm.entryDateStart = undefined;
+		searchForm.entryDateEnd = undefined;
+	}
+	handleQuery();
+};
+const pagination = (obj) => {
+	page.current = obj.page;
+	page.size = obj.limit;
+	getList();
+};
+const getList = () => {
+	tableLoading.value = true;
+	staffJoinListPage({...page, ...searchForm.value}).then(res => {
+		tableLoading.value = false;
+		tableData.value = res.data.records
+		page.total = res.data.total;
+	}).catch(err => {
+		tableLoading.value = false;
+	})
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+	selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+	if (selectedRows.value.length !== 1) {
+		proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
+		return;
+	}
+	if (selectedRows.value[0].unPaymentAmountTotal == 0) {
+		proxy.$message.warning("鏃犻渶鍐嶄粯娆�");
+		return;
+	}
+	nextTick(() => {
+		formDia.value?.openDialog(type, 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();
+});
+</script>
+
+<style scoped></style>
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
new file mode 100644
index 0000000..87ca041
--- /dev/null
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -0,0 +1,182 @@
+<template>
+	<div class="app-container">
+		<div class="search_form">
+			<div>
+				<span class="search_title">瀹㈡埛鍚嶇О锛�</span>
+				<el-input
+					v-model="searchForm.customerName"
+					style="width: 240px"
+					placeholder="璇疯緭鍏�"
+					@change="handleQuery"
+					clearable
+					prefix-icon="Search"
+				/>
+				<span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
+				<el-input
+					v-model="searchForm.customerName"
+					style="width: 240px"
+					placeholder="璇疯緭鍏�"
+					@change="handleQuery"
+					clearable
+					prefix-icon="Search"
+				/>
+				<span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
+				<el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+												placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+				<el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+				>鎼滅储</el-button
+				>
+			</div>
+			<div>
+				<el-button @click="handleOut">瀵煎嚭</el-button>
+			</div>
+		</div>
+		<div class="table_list">
+			<PIMTable
+				rowKey="id"
+				:column="tableColumn"
+				:tableData="tableData"
+				:page="page"
+				:tableLoading="tableLoading"
+				@pagination="pagination"
+			></PIMTable>
+		</div>
+	</div>
+</template>
+
+<script setup>
+import {onMounted, ref} from "vue";
+import {
+	listCustomer,
+} from "@/api/basicData/customerFile.js";
+import { ElMessageBox } from "element-plus";
+import dayjs from "dayjs";
+const { proxy } = getCurrentInstance();
+
+const tableColumn = ref([
+	{
+		label: "褰曞叆鏃ユ湡",
+		prop: "customerName",
+		width: 120,
+	},
+	{
+		label: "鍚堝悓鍙�",
+		prop: "taxpayerIdentificationNumber",
+		width: 220,
+	},
+	{
+		label: "瀹㈡埛鍚堝悓鍙�",
+		prop: "addressPhone",
+		width: 250,
+	},
+	{
+		label: "瀹㈡埛鍚嶇О",
+		prop: "contactPerson",
+	},
+	{
+		label: "椤圭洰鍚嶇О",
+		prop: "contactPhone",
+		width:150
+	},
+	{
+		label: "浜у搧澶х被",
+		prop: "basicBankAccount",
+		width: 220,
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "bankAccount",
+		width: 220,
+	},
+	{
+		label: "鍗曚綅",
+		prop: "bankCode",
+		width:220
+	},
+	{
+		label: "鏁伴噺",
+		prop: "maintainer",
+	},
+	{
+		label: "鎺掍骇鏁伴噺",
+		prop: "maintenanceTime",
+		width: 100,
+	},
+	{
+		label: "瀹屽伐鏁伴噺",
+		prop: "maintenanceTime",
+		width: 100,
+	},
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+	current: 1,
+	size: 100,
+	total: 0,
+});
+
+const data = reactive({
+	searchForm: {
+		customerName: "",
+		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 handleQuery = () => {
+	page.current = 1;
+	getList();
+};
+const pagination = (obj) => {
+	page.current = obj.page;
+	page.size = obj.limit;
+	getList();
+};
+const changeDaterange = (value) => {
+	if (value) {
+		searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+		searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+	} else {
+		searchForm.entryDateStart = undefined;
+		searchForm.entryDateEnd = undefined;
+	}
+	handleQuery();
+};
+const getList = () => {
+	tableLoading.value = true;
+	listCustomer({ ...searchForm.value, ...page }).then((res) => {
+		tableLoading.value = false;
+		tableData.value = res.records;
+		page.total = res.total;
+	});
+};
+
+// 瀵煎嚭
+const handleOut = () => {
+	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+		confirmButtonText: "纭",
+		cancelButtonText: "鍙栨秷",
+		type: "warning",
+	})
+		.then(() => {
+			proxy.download("/basic/customer/export", {}, "瀹㈡埛妗f.xlsx");
+		})
+		.catch(() => {
+			proxy.$modal.msg("宸插彇娑�");
+		});
+};
+
+onMounted(() => {
+	getList();
+});
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index fc84583..2cec625 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -138,7 +138,7 @@
 </template>
 
 <script setup>
-import { ref } from "vue";
+import {onMounted, ref} from "vue";
 import { invoiceLedgerSalesAccount } from "../../../api/salesManagement/invoiceLedger.js";
 import { customerInteractions } from "../../../api/salesManagement/receiptPayment.js";
 import Pagination from "../../../components/PIMTable/Pagination.vue";
@@ -259,7 +259,9 @@
   receiptRecord.value = originReceiptRecord.value.slice(start, end);
 };
 
-getList();
+onMounted(() => {
+	getList();
+});
 </script>
 
 <style scoped lang="scss">
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index f856f2d..1112213 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -299,7 +299,7 @@
 <script setup>
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
+import {onMounted, ref} from "vue";
 import { ElMessageBox } from "element-plus";
 import useUserStore from "@/store/modules/user";
 import { userListNoPage } from "@/api/system/user.js";
@@ -981,7 +981,9 @@
   });
 
 }
-getList();
+onMounted(() => {
+	getList();
+});
 </script>
 
 <style scoped lang="scss">
diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
index bd6ab65..6c67e1b 100644
--- a/src/views/system/dict/index.vue
+++ b/src/views/system/dict/index.vue
@@ -174,6 +174,7 @@
 <script setup name="Dict">
 import useDictStore from '@/store/modules/dict'
 import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type"
+import {onMounted} from "vue";
 
 const { proxy } = getCurrentInstance()
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
@@ -319,5 +320,7 @@
   })
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
index 78c49cf..bccb9e9 100644
--- a/src/views/system/menu/index.vue
+++ b/src/views/system/menu/index.vue
@@ -292,6 +292,7 @@
 import { addMenu, delMenu, getMenu, listMenu, updateMenu } from "@/api/system/menu"
 import SvgIcon from "@/components/SvgIcon"
 import IconSelect from "@/components/IconSelect"
+import {onMounted} from "vue";
 
 const { proxy } = getCurrentInstance()
 const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable")
@@ -448,5 +449,7 @@
   }).catch(() => {})
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue
index 96dadcc..8043db0 100644
--- a/src/views/system/notice/index.vue
+++ b/src/views/system/notice/index.vue
@@ -160,6 +160,7 @@
 
 <script setup name="Notice">
 import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"
+import {onMounted} from "vue";
 
 const { proxy } = getCurrentInstance()
 const { sys_notice_status, sys_notice_type } = proxy.useDict("sys_notice_status", "sys_notice_type")
@@ -288,5 +289,7 @@
   }).catch(() => {})
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue
index 2608669..0e80652 100644
--- a/src/views/system/post/index.vue
+++ b/src/views/system/post/index.vue
@@ -146,6 +146,7 @@
 
 <script setup name="Post">
 import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post"
+import {onMounted} from "vue";
 
 const { proxy } = getCurrentInstance()
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
@@ -283,5 +284,7 @@
   }, `post_${new Date().getTime()}.xlsx`)
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue
index 20be11c..a460f3c 100644
--- a/src/views/system/role/authUser.vue
+++ b/src/views/system/role/authUser.vue
@@ -94,6 +94,7 @@
 <script setup name="AuthUser">
 import selectUser from "./selectUser"
 import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role"
+import {onMounted} from "vue";
 
 const route = useRoute()
 const { proxy } = getCurrentInstance()
@@ -175,5 +176,7 @@
   }).catch(() => {})
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index 0a52f44..d960674 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -244,6 +244,7 @@
 <script setup name="Role">
 import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role"
 import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu"
+import {onMounted} from "vue";
 
 const router = useRouter()
 const { proxy } = getCurrentInstance()
@@ -580,5 +581,7 @@
   reset()
 }
 
-getList()
+onMounted(() => {
+	getList();
+});
 </script>
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 8363b68..8a7c05b 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -512,6 +512,7 @@
 } from "@/api/system/user";
 import { Splitpanes, Pane } from "splitpanes";
 import "splitpanes/dist/splitpanes.css";
+import {onMounted} from "vue";
 
 const router = useRouter();
 const appStore = useAppStore();
@@ -893,7 +894,8 @@
     }
   });
 }
-
-getDeptTree();
-getList();
+onMounted(() => {
+	getDeptTree();
+	getList();
+});
 </script>

--
Gitblit v1.9.3