From 9aae2af6f3937a7d99ec619b51f457002cef969f Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 03 十一月 2025 14:29:37 +0800
Subject: [PATCH] 档案管理-添加导出功能
---
src/views/personnelManagement/scheduling/index.vue | 496 ++++++++++++++++++++++++++----------------------------
1 files changed, 240 insertions(+), 256 deletions(-)
diff --git a/src/views/personnelManagement/scheduling/index.vue b/src/views/personnelManagement/scheduling/index.vue
index 8a7174d..251dbe9 100644
--- a/src/views/personnelManagement/scheduling/index.vue
+++ b/src/views/personnelManagement/scheduling/index.vue
@@ -5,43 +5,44 @@
<el-form :inline="true" :model="filterForm" class="filter-form">
<el-form-item label="鍛樺伐濮撳悕锛�">
<el-input
- v-model="filterForm.employeeName"
- placeholder="璇疯緭鍏ュ憳宸ュ鍚�"
- clearable
- style="width: 150px"
+ v-model="filterForm.staffName"
+ placeholder="璇疯緭鍏ュ憳宸ュ鍚�"
+ clearable
+ style="width: 150px"
/>
</el-form-item>
<el-form-item label="鐝绫诲瀷锛�">
<el-select v-model="filterForm.shiftType" placeholder="璇烽�夋嫨鐝" clearable style="width: 120px">
- <el-option label="鏃╃彮" value="鏃╃彮" />
- <el-option label="涓彮" value="涓彮" />
- <el-option label="鏅氱彮" value="鏅氱彮" />
- <el-option label="澶滅彮" value="澶滅彮" />
+ <el-option v-for="item in shift_type" :label="item.label" :value="item.value" :key="item.value"/>
</el-select>
</el-form-item>
<el-form-item label="鏃ユ湡鑼冨洿锛�">
<el-date-picker
- v-model="filterForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- style="width: 250px"
+ v-model="filterForm.dateRange"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD"
+ style="width: 250px"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleFilter">
- <el-icon><Search /></el-icon>
+ <el-icon><Search/></el-icon>
绛涢��
</el-button>
<el-button @click="resetFilter">
- <el-icon><Refresh /></el-icon>
+ <el-icon><Refresh/></el-icon>
閲嶇疆
</el-button>
+ <el-button @click="handleExport">
+ <el-icon><Download/></el-icon>
+ 瀵煎嚭
+ </el-button>
<el-button type="primary" @click="openScheduleDialog('add')">
- <el-icon><Plus /></el-icon>
+ <el-icon><Plus/></el-icon>
鏂板鎺掔彮
</el-button>
</el-form-item>
@@ -51,27 +52,32 @@
<!-- 鎺掔彮琛ㄦ牸 -->
<div class="table-section">
<el-table
- :data="filteredScheduleList"
- border
- stripe
- style="width: 100%"
- height="calc(100vh - 18.5em)"
- @selection-change="handleSelectionChange"
+ :data="scheduleList"
+ border
+ :loading="tableLoading"
+ stripe
+ style="width: 100%"
+ height="calc(100vh - 18.5em)"
+ @selection-change="handleSelectionChange"
>
- <el-table-column type="selection" width="55" />
- <el-table-column prop="employeeName" label="鍛樺伐濮撳悕" width="120" />
- <el-table-column prop="employeeId" label="鍛樺伐宸ュ彿" width="100" />
- <el-table-column prop="department" label="閮ㄩ棬" width="120" />
+ <el-table-column type="selection" width="55"/>
+ <el-table-column prop="staffName" label="鍛樺伐濮撳悕" width="120"/>
+ <el-table-column prop="staffNo" label="鍛樺伐宸ュ彿" width="100"/>
+ <el-table-column prop="department" label="閮ㄩ棬" width="120">
+ <template #default="scope">
+ {{ (department_type.find(i => i.value === String(scope.row.department)) || {}).label }}
+ </template>
+ </el-table-column>
<el-table-column prop="shiftType" label="鐝绫诲瀷" width="100">
<template #default="scope">
<el-tag :type="getShiftTagType(scope.row.shiftType)">
- {{ scope.row.shiftType }}
+ {{ (shift_type.find(i => i.value === String(scope.row.shiftType)) || {}).label }}
</el-tag>
</template>
</el-table-column>
- <el-table-column prop="workDate" label="宸ヤ綔鏃ユ湡" width="120" />
- <el-table-column prop="startTime" label="寮�濮嬫椂闂�" width="100" />
- <el-table-column prop="endTime" label="缁撴潫鏃堕棿" width="100" />
+ <el-table-column prop="workDate" label="宸ヤ綔鏃ユ湡" width="120"/>
+ <el-table-column prop="startTime" label="寮�濮嬫椂闂�" width="100"/>
+ <el-table-column prop="endTime" label="缁撴潫鏃堕棿" width="100"/>
<el-table-column prop="workHours" label="宸ヤ綔鏃堕暱" width="100">
<template #default="scope">
{{ scope.row.workHours }}灏忔椂
@@ -80,38 +86,45 @@
<el-table-column prop="status" label="鐘舵��" width="100">
<template #default="scope">
<el-tag :type="getStatusTagType(scope.row.status)">
- {{ scope.row.status }}
+ {{ (schedule_status.find(i => i.value === String(scope.row.status)) || {}).label }}
</el-tag>
</template>
</el-table-column>
- <el-table-column prop="remark" label="澶囨敞" min-width="150" />
+ <el-table-column prop="remark" label="澶囨敞" min-width="150"/>
<el-table-column label="鎿嶄綔" width="200" fixed="right">
<template #default="scope">
<el-button
- type="primary"
- size="small"
- @click="openScheduleDialog('edit', scope.row)"
+ type="primary"
+ size="small"
+ @click="openScheduleDialog('edit', scope.row)"
>
缂栬緫
</el-button>
<el-button
- type="danger"
- size="small"
- @click="handleDelete(scope.row)"
+ type="danger"
+ size="small"
+ @click="handleDelete(scope.row)"
>
鍒犻櫎
</el-button>
</template>
</el-table-column>
</el-table>
+ <pagination
+ v-if="tableCount > 0"
+ :total="tableCount"
+ :page="filterForm.current"
+ :limit="filterForm.size"
+ @pagination="paginationChange"
+ />
</div>
<!-- 鎵归噺鎿嶄綔 -->
<div class="batch-actions" v-if="selectedRows.length > 0">
<el-button
- type="danger"
- @click="handleBatchDelete"
- :disabled="selectedRows.length === 0"
+ type="danger"
+ @click="handleBatchDelete"
+ :disabled="selectedRows.length === 0"
>
鎵归噺鍒犻櫎 ({{ selectedRows.length }})
</el-button>
@@ -119,118 +132,111 @@
<!-- 鎺掔彮鏂板/缂栬緫瀵硅瘽妗� -->
<el-dialog
- v-model="scheduleDialog"
- :title="dialogType === 'add' ? '鏂板鎺掔彮' : '缂栬緫鎺掔彮'"
- width="700px"
- @close="closeScheduleDialog"
+ v-model="scheduleDialog"
+ :title="dialogType === 'add' ? '鏂板鎺掔彮' : '缂栬緫鎺掔彮'"
+ width="700px"
+ @close="closeScheduleDialog"
>
<el-form
- :model="scheduleForm"
- :rules="scheduleRules"
- ref="scheduleFormRef"
- label-width="120px"
+ :model="scheduleForm"
+ :rules="scheduleRules"
+ ref="scheduleFormRef"
+ label-width="120px"
>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鍛樺伐濮撳悕锛�" prop="employeeName">
- <el-input v-model="scheduleForm.employeeName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�" />
+ <el-form-item label="鍛樺伐濮撳悕锛�" prop="staffId">
+ <el-select v-model="scheduleForm.staffId" placeholder="璇疯緭鍏ュ憳宸ュ鍚�" style="width: 100%"
+ @change="handleSelectStaff">
+ <el-option v-for="item in personList" :label="item.staffName" :value="item.id" :key="item.id"/>
+ </el-select>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鍛樺伐宸ュ彿锛�" prop="employeeId">
- <el-input v-model="scheduleForm.employeeId" placeholder="璇疯緭鍏ュ憳宸ュ伐鍙�" />
+ <el-form-item label="鍛樺伐宸ュ彿锛�" prop="staffNo">
+ <el-input :disabled="true" v-model="scheduleForm.staffNo" placeholder=""/>
</el-form-item>
</el-col>
</el-row>
-
+
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="閮ㄩ棬锛�" prop="department">
<el-select v-model="scheduleForm.department" placeholder="璇烽�夋嫨閮ㄩ棬" style="width: 100%">
- <el-option label="鎶�鏈儴" value="鎶�鏈儴" />
- <el-option label="閿�鍞儴" value="閿�鍞儴" />
- <el-option label="浜轰簨閮�" value="浜轰簨閮�" />
- <el-option label="璐㈠姟閮�" value="璐㈠姟閮�" />
- <el-option label="鐢熶骇閮�" value="鐢熶骇閮�" />
+ <el-option v-for="item in department_type" :label="item.label" :value="item.value" :key="item.value"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="鐝绫诲瀷锛�" prop="shiftType">
<el-select v-model="scheduleForm.shiftType" placeholder="璇烽�夋嫨鐝" style="width: 100%">
- <el-option label="鏃╃彮" value="鏃╃彮" />
- <el-option label="涓彮" value="涓彮" />
- <el-option label="鏅氱彮" value="鏅氱彮" />
- <el-option label="澶滅彮" value="澶滅彮" />
+ <el-option v-for="item in shift_type" :label="item.label" :value="item.value" :key="item.value"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
-
+
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="宸ヤ綔鏃ユ湡锛�" prop="workDate">
<el-date-picker
- v-model="scheduleForm.workDate"
- type="date"
- placeholder="閫夋嫨宸ヤ綔鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
+ v-model="scheduleForm.workDate"
+ type="date"
+ placeholder="閫夋嫨宸ヤ綔鏃ユ湡"
+ style="width: 100%"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="鐘舵�侊細" prop="status">
<el-select v-model="scheduleForm.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option label="宸插畨鎺�" value="宸插畨鎺�" />
- <el-option label="宸茬‘璁�" value="宸茬‘璁�" />
- <el-option label="宸插畬鎴�" value="宸插畬鎴�" />
- <el-option label="宸插彇娑�" value="宸插彇娑�" />
+ <el-option v-for="item in schedule_status" :label="item.label" :value="item.value" :key="item.value"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
-
+
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="寮�濮嬫椂闂达細" prop="startTime">
<el-time-picker
- v-model="scheduleForm.startTime"
- placeholder="閫夋嫨寮�濮嬫椂闂�"
- style="width: 100%"
- format="HH:mm"
- value-format="HH:mm"
+ v-model="scheduleForm.startTime"
+ placeholder="閫夋嫨寮�濮嬫椂闂�"
+ style="width: 100%"
+ format="HH:mm"
+ value-format="HH:mm"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="缁撴潫鏃堕棿锛�" prop="endTime">
<el-time-picker
- v-model="scheduleForm.endTime"
- placeholder="閫夋嫨缁撴潫鏃堕棿"
- style="width: 100%"
- format="HH:mm"
- value-format="HH:mm"
+ v-model="scheduleForm.endTime"
+ placeholder="閫夋嫨缁撴潫鏃堕棿"
+ style="width: 100%"
+ format="HH:mm"
+ value-format="HH:mm"
/>
</el-form-item>
</el-col>
</el-row>
-
+
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="澶囨敞锛�" prop="remark">
<el-input
- v-model="scheduleForm.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+ v-model="scheduleForm.remark"
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
-
+
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitScheduleForm">纭</el-button>
@@ -242,10 +248,18 @@
</template>
<script setup>
-import { ref, reactive, computed, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Download, Search, Refresh } from '@element-plus/icons-vue'
+import {ref, reactive, computed, onMounted, getCurrentInstance} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {useDict} from "@/utils/dict.js"
+import {Plus, Download, Search, Refresh} from '@element-plus/icons-vue'
+import {save, del, delByIds, listPage} from "@/api/personnelManagement/scheduling.js"
+import {getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
+import dayjs from "dayjs";
+import pagination from "@/components/PIMTable/Pagination.vue";
+const { proxy } = getCurrentInstance();
+
+const tableCount = ref(0)
// 鍝嶅簲寮忔暟鎹�
const scheduleDialog = ref(false)
const dialogType = ref('add')
@@ -254,137 +268,109 @@
// 绛涢�夎〃鍗�
const filterForm = reactive({
- employeeName: '',
+ staffName: '',
shiftType: '',
- dateRange: []
+ dateRange: [],
+ current:1,
+ size: 10
})
// 鎺掔彮琛ㄥ崟
const scheduleForm = reactive({
id: '',
- employeeName: '',
- employeeId: '',
+ staffId: '',
+ staffNo: '',
department: '',
shiftType: '',
workDate: '',
startTime: '',
endTime: '',
+ workStartTime: '',
+ workEndTime: '',
workHours: 0,
- status: '宸插畨鎺�',
+ status: '',
remark: ''
})
// 琛ㄥ崟楠岃瘉瑙勫垯
const scheduleRules = reactive({
- employeeName: [{ required: true, message: '璇疯緭鍏ュ憳宸ュ鍚�', trigger: 'blur' }],
- employeeId: [{ required: true, message: '璇疯緭鍏ュ憳宸ュ伐鍙�', trigger: 'blur' }],
- department: [{ required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change' }],
- shiftType: [{ required: true, message: '璇烽�夋嫨鐝绫诲瀷', trigger: 'change' }],
- workDate: [{ required: true, message: '璇烽�夋嫨宸ヤ綔鏃ユ湡', trigger: 'change' }],
- startTime: [{ required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change' }],
- endTime: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
+ staffId: [{required: true, message: '璇烽�夋嫨鍛樺伐', trigger: 'change'}],
+ department: [{required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change'}],
+ shiftType: [{required: true, message: '璇烽�夋嫨鐝绫诲瀷', trigger: 'change'}],
+ workDate: [{required: true, message: '璇烽�夋嫨宸ヤ綔鏃ユ湡', trigger: 'change'}],
+ startTime: [{required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change'}],
+ endTime: [{required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change'}],
+ status: [{required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change'}]
})
+const tableLoading = ref(false)
+
+//瀛楀吀
+const {department_type, schedule_status, shift_type} = useDict("department_type", "schedule_status", "shift_type")
+// 浜哄憳鍒楄〃
+const personList = ref([]);
// 妯℃嫙鎺掔彮鏁版嵁
-const scheduleList = ref([
- {
- id: 1,
- employeeName: '寮犳捣娲�',
- employeeId: 'EMP001',
- department: '鎶�鏈儴',
- shiftType: '鏃╃彮',
- workDate: '2024-01-15',
- startTime: '08:00',
- endTime: '17:00',
- workHours: 9,
- status: '宸插畨鎺�',
- remark: '姝e父鎺掔彮'
- },
- {
- id: 2,
- employeeName: '鏉庤秴',
- employeeId: 'EMP002',
- department: '閿�鍞儴',
- shiftType: '涓彮',
- workDate: '2024-01-15',
- startTime: '14:00',
- endTime: '22:00',
- workHours: 8,
- status: '宸茬‘璁�',
- remark: '瀹㈡埛浼氳'
- },
- {
- id: 3,
- employeeName: '鐜嬫澃',
- employeeId: 'EMP003',
- department: '鐢熶骇閮�',
- shiftType: '鏅氱彮',
- workDate: '2024-01-15',
- startTime: '22:00',
- endTime: '06:00',
- workHours: 8,
- status: '宸插畨鎺�',
- remark: '澶滅彮鐢熶骇'
- }
-])
+const scheduleList = ref([])
-// 璁$畻灞炴�э細绛涢�夊悗鐨勬帓鐝垪琛�
-const filteredScheduleList = computed(() => {
- let result = scheduleList.value
- if (filterForm.employeeName) {
- result = result.filter(item =>
- item.employeeName.includes(filterForm.employeeName)
- )
- }
+/**
+ * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
+ */
+const getPersonList = () => {
+ getStaffOnJob().then(res => {
+ personList.value = res.data
+ })
+};
+const paginationChange = (obj) => {
+ filterForm.current = obj.page;
+ filterForm.size = obj.limit;
+ handleFilter();
+};
- if (filterForm.shiftType) {
- result = result.filter(item => item.shiftType === filterForm.shiftType)
- }
+const handleSelectStaff = (val) => {
+ let obj = personList.value.find(item => item.id === val)
+ scheduleForm.staffNo = obj.staffNo
- if (filterForm.dateRange && filterForm.dateRange.length === 2) {
- result = result.filter(item => {
- const workDate = new Date(item.workDate)
- const startDate = new Date(filterForm.dateRange[0])
- const endDate = new Date(filterForm.dateRange[1])
- return workDate >= startDate && workDate <= endDate
- })
- }
-
- return result
-})
+}
// 鑾峰彇鐝鏍囩绫诲瀷
const getShiftTagType = (shiftType) => {
- const typeMap = {
- '鏃╃彮': 'success',
- '涓彮': 'warning',
- '鏅氱彮': 'info',
- '澶滅彮': 'danger'
- }
+ const typeMap = Object.fromEntries(shift_type.value.map(i => [i.value, i.elTagType]))
return typeMap[shiftType] || 'info'
}
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
const getStatusTagType = (status) => {
- const typeMap = {
- '宸插畨鎺�': 'info',
- '宸茬‘璁�': 'warning',
- '宸插畬鎴�': 'success',
- '宸插彇娑�': 'danger'
- }
+ const typeMap = Object.fromEntries(schedule_status.value.map(i => [i.value, i.elTagType]))
return typeMap[status] || 'info'
}
// 绛涢��
-const handleFilter = () => {
- // 绛涢�夐�昏緫宸插湪璁$畻灞炴�т腑瀹炵幇
+const handleFilter = async () => {
+ tableLoading.value = true
+ let searchForm = {
+ ...filterForm,
+ ...(filterForm.dateRange.length > 0 && {
+ startDate: filterForm.dateRange[0],
+ endDate: filterForm.dateRange[1],
+ })
+ }
+ let resp = await listPage(searchForm)
+ tableCount.value = resp.data.total
+ scheduleList.value = resp.data.records.map(it => {
+ return {
+ ...it,
+ 'startTime': dayjs(it.workStartTime).format('HH:mm'),
+ 'endTime': dayjs(it.workEndTime).format('HH:mm'),
+ }
+ })
+ tableLoading.value = false
+
}
// 閲嶇疆绛涢��
const resetFilter = () => {
- filterForm.employeeName = ''
+ filterForm.staffName = ''
filterForm.shiftType = ''
filterForm.dateRange = []
}
@@ -393,16 +379,16 @@
const openScheduleDialog = (type, data) => {
dialogType.value = type
scheduleDialog.value = true
-
+ getPersonList()
if (type === 'edit' && data) {
// 缂栬緫妯″紡锛屽鍒舵暟鎹�
- Object.assign(scheduleForm, { ...data })
+ Object.assign(scheduleForm, {...data})
} else {
// 鏂板妯″紡锛岄噸缃〃鍗�
Object.keys(scheduleForm).forEach(key => {
scheduleForm[key] = ''
})
- scheduleForm.status = '宸插畨鎺�'
+ // scheduleForm.status = '宸插畨鎺�'
scheduleForm.workDate = new Date().toISOString().split('T')[0]
}
}
@@ -415,66 +401,59 @@
// 璁$畻宸ヤ綔鏃堕暱
const calculateWorkHours = () => {
- if (scheduleForm.startTime && scheduleForm.endTime) {
- const start = new Date(`2000-01-01 ${scheduleForm.startTime}`)
- const end = new Date(`2000-01-01 ${scheduleForm.endTime}`)
-
- if (end < start) {
- // 璺ㄥぉ鐨勬儏鍐�
- end.setDate(end.getDate() + 1)
+ if (scheduleForm.workDate && scheduleForm.startTime && scheduleForm.endTime) {
+ // 浣跨敤 workDate 涓� startTime 鍜� endTime 缁勫悎
+ const startDateTime = new Date(`${scheduleForm.workDate} ${scheduleForm.startTime}`)
+ const endDateTime = new Date(`${scheduleForm.workDate} ${scheduleForm.endTime}`)
+
+ // 澶勭悊璺ㄥぉ鎯呭喌锛堢粨鏉熸椂闂存棭浜庡紑濮嬫椂闂达級
+ if (endDateTime < startDateTime) {
+ // 璺ㄥぉ锛屽皢缁撴潫鏃ユ湡鍔犱竴澶�
+ endDateTime.setDate(endDateTime.getDate() + 1)
}
-
- const diffMs = end - start
+ // 璁$畻宸ヤ綔鏃堕暱锛堝皬鏃讹級
+ const diffMs = endDateTime - startDateTime
const diffHours = diffMs / (1000 * 60 * 60)
scheduleForm.workHours = Math.round(diffHours * 100) / 100
+ scheduleForm.workStartTime = dayjs(startDateTime).format("YYYY-MM-DD HH:mm:ss")
+ scheduleForm.workEndTime = dayjs(endDateTime).format("YYYY-MM-DD HH:mm:ss")
+
}
}
// 鎻愪氦鎺掔彮琛ㄥ崟
-const submitScheduleForm = () => {
- scheduleFormRef.value.validate((valid) => {
- if (valid) {
- // 璁$畻宸ヤ綔鏃堕暱
- calculateWorkHours()
-
- if (dialogType.value === 'add') {
- // 鏂板
- const newSchedule = {
- ...scheduleForm,
- id: Date.now() // 浣跨敤鏃堕棿鎴充綔涓轰复鏃禝D
- }
- scheduleList.value.push(newSchedule)
- ElMessage.success('鏂板鎺掔彮鎴愬姛')
- } else {
- // 缂栬緫
- const index = scheduleList.value.findIndex(item => item.id === scheduleForm.id)
- if (index !== -1) {
- scheduleList.value[index] = { ...scheduleForm }
- ElMessage.success('缂栬緫鎺掔彮鎴愬姛')
- }
- }
-
- closeScheduleDialog()
- }
- })
+const submitScheduleForm = async () => {
+ const valid = await scheduleFormRef.value.validate()
+ if (!valid) return
+
+ calculateWorkHours()
+ const newSchedule = {...scheduleForm}
+
+ try {
+ await save(newSchedule)
+ ElMessage.success('淇濆瓨鎺掔彮鎴愬姛')
+
+ handleFilter()
+ closeScheduleDialog()
+ } catch (err) {
+ ElMessage.error('淇濆瓨澶辫触')
+ }
}
// 鍒犻櫎鎺掔彮
const handleDelete = (row) => {
ElMessageBox.confirm(
- `纭畾瑕佸垹闄� ${row.employeeName} 鐨勬帓鐝褰曞悧锛焋,
- '鍒犻櫎鎻愮ず',
- {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }
+ `纭畾瑕佸垹闄� ${row.staffName} 鐨勬帓鐝褰曞悧锛焋,
+ '鍒犻櫎鎻愮ず',
+ {
+ confirmButtonText: '纭',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }
).then(() => {
- const index = scheduleList.value.findIndex(item => item.id === row.id)
- if (index !== -1) {
- scheduleList.value.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
+ del(row.id)
+ ElMessage.success('鍒犻櫎鎴愬姛')
+ handleFilter()
}).catch(() => {
ElMessage.info('宸插彇娑堝垹闄�')
})
@@ -486,19 +465,18 @@
ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑璁板綍')
return
}
-
+
ElMessageBox.confirm(
- `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃帓鐝褰曞悧锛焋,
- '鎵归噺鍒犻櫎鎻愮ず',
- {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }
+ `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃帓鐝褰曞悧锛焋,
+ '鎵归噺鍒犻櫎鎻愮ず',
+ {
+ confirmButtonText: '纭',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }
).then(() => {
- const selectedIds = selectedRows.value.map(row => row.id)
- scheduleList.value = scheduleList.value.filter(item => !selectedIds.includes(item.id))
- selectedRows.value = []
+ delByIds(selectedRows.value.map(item => item.id))
+ handleFilter()
ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
}).catch(() => {
ElMessage.info('宸插彇娑堝垹闄�')
@@ -510,16 +488,22 @@
selectedRows.value = selection
}
-// 鐩戝惉鏃堕棿鍙樺寲锛岃嚜鍔ㄨ绠楀伐浣滄椂闀�
-const watchTimeChange = () => {
- if (scheduleForm.startTime && scheduleForm.endTime) {
- calculateWorkHours()
+// 瀵煎嚭
+const handleExport = () => {
+ let searchForm = {
+ ...filterForm,
+ ...(filterForm.dateRange.length > 0 && {
+ startDate: filterForm.dateRange[0],
+ endDate: filterForm.dateRange[1],
+ })
}
+ proxy.download('/staff/staffScheduling/export', {}, '浜哄憳鎺掔彮.xlsx')
}
// 鐢熷懡鍛ㄦ湡
onMounted(() => {
// 椤甸潰鍒濆鍖�
+ handleFilter()
})
</script>
@@ -611,15 +595,15 @@
.scheduling-container {
padding: 10px;
}
-
+
.page-header {
padding: 15px;
}
-
+
.page-header h2 {
font-size: 24px;
}
-
+
.header-controls {
flex-direction: column;
gap: 10px;
--
Gitblit v1.9.3