From beed868dc7e61ea2f9fecadb87426ae34d98a41e Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 15 八月 2025 13:18:06 +0800
Subject: [PATCH] 考勤管理
---
src/views/collaborativeApproval/attendanceManagement/index.vue | 714 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 714 insertions(+), 0 deletions(-)
diff --git a/src/views/collaborativeApproval/attendanceManagement/index.vue b/src/views/collaborativeApproval/attendanceManagement/index.vue
new file mode 100644
index 0000000..37b3d59
--- /dev/null
+++ b/src/views/collaborativeApproval/attendanceManagement/index.vue
@@ -0,0 +1,714 @@
+<template>
+ <div class="app-container">
+ <el-tabs v-model="activeTab" type="border-card">
+ <!-- 鍋囨湡璁剧疆 -->
+ <el-tab-pane label="鍋囨湡璁剧疆" name="holiday">
+ <div class="tab-content">
+ <el-button type="primary" @click="openDialog('holiday', 'add')">鏂板鍋囨湡</el-button>
+
+ <el-table :data="holidayData" border style="width: 100%; margin-top: 20px;">
+ <el-table-column prop="name" label="鍋囨湡鍚嶇О" />
+ <el-table-column prop="type" label="鍋囨湡绫诲瀷">
+ <template #default="scope">
+ <el-tag :type="getTagType(scope.row.type)">{{ getTypeLabel(scope.row.type) }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" />
+ <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" />
+ <el-table-column prop="days" label="澶╂暟" align="center" />
+ <el-table-column prop="status" label="鐘舵��" >
+ <template #default="scope">
+ <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
+ {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" fixed="right">
+ <template #default="scope">
+ <el-button type="primary" size="small" @click="openDialog('holiday', 'edit', scope.row)">缂栬緫</el-button>
+ <el-button type="danger" size="small" @click="deleteItem('holiday', scope.row)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </el-tab-pane>
+
+ <!-- 骞村亣璁剧疆 -->
+ <el-tab-pane label="骞村亣璁剧疆" name="annual">
+ <div class="tab-content">
+ <el-button type="primary" @click="openDialog('annual', 'add')">鏂板骞村亣瑙勫垯</el-button>
+
+ <el-table :data="annualData" border style="width: 100%; margin-top: 20px;">
+ <el-table-column prop="employeeType" label="鍛樺伐绫诲瀷"/>
+ <el-table-column prop="workYears" label="宸ヤ綔骞撮檺" />
+ <el-table-column prop="annualDays" label="骞村亣澶╂暟" align="center" />
+ <el-table-column prop="maxCarryOver" label="鏈�澶х粨杞ぉ鏁�" align="center" />
+ <el-table-column prop="status" label="鐘舵��">
+ <template #default="scope">
+ <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
+ {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" fixed="right">
+ <template #default="scope">
+ <el-button type="primary" size="small" @click="openDialog('annual', 'edit', scope.row)">缂栬緫</el-button>
+ <el-button type="danger" size="small" @click="deleteItem('annual', scope.row)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </el-tab-pane>
+
+ <!-- 鍔犵彮璁剧疆 -->
+ <el-tab-pane label="鍔犵彮璁剧疆" name="overtime">
+ <div class="tab-content">
+ <el-button type="primary" @click="openDialog('overtime', 'add')">鏂板鍔犵彮瑙勫垯</el-button>
+
+ <el-table :data="overtimeData" border style="width: 100%; margin-top: 20px;">
+ <el-table-column prop="name" label="瑙勫垯鍚嶇О" />
+ <el-table-column prop="type" label="鍔犵彮绫诲瀷" >
+ <template #default="scope">
+ <el-tag :type="getTagType(scope.row.type)">{{ getTypeLabel(scope.row.type) }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="startTime" label="寮�濮嬫椂闂�" />
+ <el-table-column prop="endTime" label="缁撴潫鏃堕棿" />
+ <el-table-column prop="rate" label="鍊嶇巼" align="center" />
+ <el-table-column prop="status" label="鐘舵��" >
+ <template #default="scope">
+ <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
+ {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" fixed="right">
+ <template #default="scope">
+ <el-button type="primary" size="small" @click="openDialog('overtime', 'edit', scope.row)">缂栬緫</el-button>
+ <el-button type="danger" size="small" @click="deleteItem('overtime', scope.row)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </el-tab-pane>
+
+ <!-- 涓婄彮鏃堕棿璁剧疆 -->
+ <el-tab-pane label="涓婄彮鏃堕棿璁剧疆" name="worktime">
+ <div class="tab-content">
+ <el-button type="primary" @click="openDialog('worktime', 'add')">鏂板鏃堕棿娈�</el-button>
+
+ <el-table :data="worktimeData" border style="width: 100%; margin-top: 20px;">
+ <el-table-column prop="name" label="鏃堕棿娈靛悕绉�" />
+ <el-table-column prop="startTime" label="涓婄彮鏃堕棿"/>
+ <el-table-column prop="endTime" label="涓嬬彮鏃堕棿" />
+ <el-table-column prop="flexibleStart" label="寮规�т笂鐝�">
+ <template #default="scope">
+ <el-tag :type="scope.row.flexibleStart ? 'success' : 'info'">
+ {{ scope.row.flexibleStart ? '鏄�' : '鍚�' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="flexibleMinutes" label="寮规�ф椂闂�(鍒嗛挓)" width="120" align="center" />
+ <el-table-column prop="status" label="鐘舵��" >
+ <template #default="scope">
+ <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
+ {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" fixed="right">
+ <template #default="scope">
+ <el-button type="primary" size="small" @click="openDialog('worktime', 'edit', scope.row)">缂栬緫</el-button>
+ <el-button type="danger" size="small" @click="deleteItem('worktime', scope.row)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </el-tab-pane>
+ </el-tabs>
+
+ <!-- 閫氱敤寮圭獥 -->
+ <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
+ <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+ <el-form-item label="鍚嶇О" prop="name" v-if="currentType !== 'annual'">
+ <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
+ </el-form-item>
+
+ <el-form-item label="绫诲瀷" prop="type" v-if="currentType === 'holiday' || currentType === 'overtime'">
+ <el-select v-model="form.type" placeholder="璇烽�夋嫨绫诲瀷" style="width: 100%">
+ <el-option
+ v-for="option in getTypeOptions()"
+ :key="option.value"
+ :label="option.label"
+ :value="option.value"
+ />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="鍛樺伐绫诲瀷" prop="employeeType" v-if="currentType === 'annual'">
+ <el-select v-model="form.employeeType" placeholder="璇烽�夋嫨鍛樺伐绫诲瀷" style="width: 100%">
+ <el-option label="姝e紡鍛樺伐" value="regular" />
+ <el-option label="璇曠敤鏈熷憳宸�" value="probation" />
+ <el-option label="瀹炰範鐢�" value="intern" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="宸ヤ綔骞撮檺" prop="workYears" v-if="currentType === 'annual'">
+ <el-input v-model="form.workYears" placeholder="濡傦細1-3骞淬��3-5骞寸瓑" />
+ </el-form-item>
+
+ <el-form-item label="骞村亣澶╂暟" prop="annualDays" v-if="currentType === 'annual'">
+ <el-input-number v-model="form.annualDays" :min="0" :max="365" style="width: 100%" />
+ </el-form-item>
+
+ <el-form-item label="鏈�澶х粨杞ぉ鏁�" prop="maxCarryOver" v-if="currentType === 'annual'">
+ <el-input-number v-model="form.maxCarryOver" :min="0" :max="30" style="width: 100%" />
+ </el-form-item>
+
+ <el-form-item label="鏃ユ湡鑼冨洿" prop="dateRange" v-if="currentType === 'holiday'">
+ <el-date-picker
+ v-model="form.dateRange"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ style="width: 100%"
+ @change="calculateDays"
+ />
+ </el-form-item>
+
+ <el-form-item label="澶╂暟" prop="days" v-if="currentType === 'holiday'">
+ <el-input-number v-model="form.days" :min="0" style="width: 100%" />
+ </el-form-item>
+
+ <el-form-item label="寮�濮嬫椂闂�" prop="startTime" v-if="currentType === 'overtime'">
+ <el-time-picker
+ v-model="form.startTime"
+ placeholder="寮�濮嬫椂闂�"
+ format="HH:mm"
+ value-format="HH:mm"
+ style="width: 100%"
+ @change="validateTimeField('startTime')"
+ />
+ </el-form-item>
+
+ <el-form-item label="缁撴潫鏃堕棿" prop="endTime" v-if="currentType === 'overtime'">
+ <el-time-picker
+ v-model="form.endTime"
+ placeholder="缁撴潫鏃堕棿"
+ format="HH:mm"
+ value-format="HH:mm"
+ style="width: 100%"
+ @change="validateTimeField('endTime')"
+ />
+ </el-form-item>
+
+ <el-form-item label="鍊嶇巼" prop="rate" v-if="currentType === 'overtime'">
+ <el-input-number v-model="form.rate" :min="1" :max="3" :step="0.5" style="width: 100%" />
+ </el-form-item>
+
+ <el-form-item label="涓婄彮鏃堕棿" prop="workStartTime" v-if="currentType === 'worktime'">
+ <el-time-picker
+ v-model="form.workStartTime"
+ placeholder="涓婄彮鏃堕棿"
+ format="HH:mm"
+ value-format="HH:mm"
+ style="width: 100%"
+ @change="validateTimeField('workStartTime')"
+ />
+ </el-form-item>
+
+ <el-form-item label="涓嬬彮鏃堕棿" prop="workEndTime" v-if="currentType === 'worktime'">
+ <el-time-picker
+ v-model="form.workEndTime"
+ placeholder="涓嬬彮鏃堕棿"
+ format="HH:mm"
+ value-format="HH:mm"
+ style="width: 100%"
+ @change="validateTimeField('workEndTime')"
+ />
+ </el-form-item>
+
+ <el-form-item label="寮规�т笂鐝�" prop="flexibleStart" v-if="currentType === 'worktime'">
+ <el-switch v-model="form.flexibleStart" />
+ </el-form-item>
+
+ <el-form-item label="寮规�ф椂闂�(鍒嗛挓)" prop="flexibleMinutes" v-if="currentType === 'worktime' && form.flexibleStart">
+ <el-input-number v-model="form.flexibleMinutes" :min="0" :max="120" style="width: 100%" />
+ </el-form-item>
+
+ <el-form-item label="鐘舵��" prop="status">
+ <el-radio-group v-model="form.status">
+ <el-radio value="active">鍚敤</el-radio>
+ <el-radio value="inactive">鍋滅敤</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-form>
+
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="submitForm">纭畾</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, onUnmounted } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+
+// 褰撳墠婵�娲荤殑鏍囩椤�
+const activeTab = ref('holiday')
+
+// 寮圭獥鐩稿叧
+const dialogVisible = ref(false)
+const dialogTitle = ref('')
+const currentType = ref('')
+const currentAction = ref('')
+const currentEditId = ref('')
+const formRef = ref()
+
+// 琛ㄥ崟鏁版嵁
+const form = reactive({
+ name: '',
+ type: '',
+ dateRange: [],
+ days: 0,
+ employeeType: '',
+ workYears: '',
+ annualDays: 0,
+ maxCarryOver: 0,
+ startTime: '', // 鍔犵彮寮�濮嬫椂闂�
+ endTime: '', // 鍔犵彮缁撴潫鏃堕棿
+ workStartTime: '', // 涓婄彮鏃堕棿
+ workEndTime: '', // 涓嬬彮鏃堕棿
+ rate: 1.5,
+ flexibleStart: false,
+ flexibleMinutes: 30,
+ status: 'active'
+})
+
+// 琛ㄥ崟楠岃瘉瑙勫垯
+const rules = {
+ name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
+ type: [{ required: true, message: '璇烽�夋嫨绫诲瀷', trigger: 'change' }],
+ dateRange: [{ required: true, message: '璇烽�夋嫨鏃ユ湡鑼冨洿', trigger: 'change' }],
+ days: [{ required: true, message: '璇疯緭鍏ュぉ鏁�', trigger: 'blur' }],
+ employeeType: [{ required: true, message: '璇烽�夋嫨鍛樺伐绫诲瀷', trigger: 'change' }],
+ workYears: [{ required: true, message: '璇疯緭鍏ュ伐浣滃勾闄�', trigger: 'blur' }],
+ annualDays: [{ required: true, message: '璇疯緭鍏ュ勾鍋囧ぉ鏁�', trigger: 'blur' }],
+ maxCarryOver: [{ required: true, message: '璇疯緭鍏ユ渶澶х粨杞ぉ鏁�', trigger: 'blur' }],
+ startTime: [{
+ required: true,
+ message: '璇烽�夋嫨寮�濮嬫椂闂�',
+ trigger: 'change',
+ validator: (rule, value, callback) => {
+ if (!value) {
+ callback(new Error('璇烽�夋嫨寮�濮嬫椂闂�'))
+ } else {
+ callback()
+ }
+ }
+ }],
+ endTime: [{
+ required: true,
+ message: '璇烽�夋嫨缁撴潫鏃堕棿',
+ trigger: 'change',
+ validator: (rule, value, callback) => {
+ if (!value) {
+ callback(new Error('璇烽�夋嫨缁撴潫鏃堕棿'))
+ } else {
+ callback()
+ }
+ }
+ }],
+ workStartTime: [{
+ required: true,
+ message: '璇烽�夋嫨涓婄彮鏃堕棿',
+ trigger: 'change',
+ validator: (rule, value, callback) => {
+ if (!value) {
+ callback(new Error('璇烽�夋嫨涓婄彮鏃堕棿'))
+ } else {
+ callback()
+ }
+ }
+ }],
+ workEndTime: [{
+ required: true,
+ message: '璇烽�夋嫨涓嬬彮鏃堕棿',
+ trigger: 'change',
+ validator: (rule, value, callback) => {
+ if (!value) {
+ callback(new Error('璇烽�夋嫨涓嬬彮鏃堕棿'))
+ } else {
+ callback()
+ }
+ }
+ }],
+ rate: [{ required: true, message: '璇疯緭鍏ュ�嶇巼', trigger: 'blur' }]
+}
+
+// 妯℃嫙鏁版嵁
+const holidayData = ref([
+ { id: '1', name: '鏄ヨ妭', type: 'legal', startDate: '2024-02-10', endDate: '2024-02-17', days: 8, status: 'active' },
+ { id: '2', name: '娓呮槑鑺�', type: 'legal', startDate: '2024-04-05', endDate: '2024-04-05', days: 1, status: 'active' },
+ { id: '3', name: '鍔冲姩鑺�', type: 'legal', startDate: '2024-05-01', endDate: '2024-05-05', days: 5, status: 'active' }
+])
+
+const annualData = ref([
+ { id: '1', employeeType: 'regular', workYears: '1-3骞�', annualDays: 5, maxCarryOver: 2, status: 'active' },
+ { id: '2', employeeType: 'regular', workYears: '3-5骞�', annualDays: 10, maxCarryOver: 5, status: 'active' },
+ { id: '3', employeeType: 'regular', workYears: '5骞翠互涓�', annualDays: 15, maxCarryOver: 10, status: 'active' }
+])
+
+const overtimeData = ref([
+ { id: '1', name: '宸ヤ綔鏃ュ姞鐝�', type: 'weekday', startTime: '18:00', endTime: '22:00', rate: 1.5, status: 'active' },
+ { id: '2', name: '鍛ㄦ湯鍔犵彮', type: 'weekend', startTime: '09:00', endTime: '18:00', rate: 2.0, status: 'active' },
+ { id: '3', name: '娣卞鍔犵彮', type: 'night', startTime: '22:00', endTime: '06:00', rate: 2.5, status: 'active' }
+])
+
+const worktimeData = ref([
+ { id: '1', name: '鏍囧噯宸ヤ綔鏃堕棿', startTime: '09:00', endTime: '18:00', flexibleStart: true, flexibleMinutes: 30, status: 'active' },
+ { id: '2', name: '鏃╃彮鏃堕棿', startTime: '08:00', endTime: '17:00', flexibleStart: false, flexibleMinutes: 0, status: 'active' },
+ { id: '3', name: '鏅氱彮鏃堕棿', startTime: '14:00', endTime: '23:00', flexibleStart: false, flexibleMinutes: 0, status: 'active' }
+])
+
+// 宸ュ叿鍑芥暟
+const getTagType = (type) => {
+ const tagMap = {
+ legal: 'success', adjustment: 'warning', special: 'info', company: 'primary',
+ weekday: 'primary', weekend: 'warning', holiday: 'danger', night: 'info'
+ }
+ return tagMap[type] || 'info'
+}
+
+const getTypeLabel = (type) => {
+ const labelMap = {
+ legal: '娉曞畾鑺傚亣鏃�', adjustment: '璋冧紤鏃�', special: '鐗规畩鍋囨湡', company: '鍏徃鍋囨湡',
+ weekday: '宸ヤ綔鏃ュ姞鐝�', weekend: '鍛ㄦ湯鍔犵彮', holiday: '鑺傚亣鏃ュ姞鐝�', night: '娣卞鍔犵彮'
+ }
+ return labelMap[type] || type
+}
+
+const getTypeOptions = () => {
+ if (currentType.value === 'holiday') {
+ return [
+ { label: '娉曞畾鑺傚亣鏃�', value: 'legal' },
+ { label: '璋冧紤鏃�', value: 'adjustment' },
+ { label: '鐗规畩鍋囨湡', value: 'special' },
+ { label: '鍏徃鍋囨湡', value: 'company' }
+ ]
+ } else if (currentType.value === 'overtime') {
+ return [
+ { label: '宸ヤ綔鏃ュ姞鐝�', value: 'weekday' },
+ { label: '鍛ㄦ湯鍔犵彮', value: 'weekend' },
+ { label: '鑺傚亣鏃ュ姞鐝�', value: 'holiday' },
+ { label: '娣卞鍔犵彮', value: 'night' }
+ ]
+ }
+ return []
+}
+
+// 璁$畻鍋囨湡澶╂暟
+const calculateDays = () => {
+ try {
+ if (form.dateRange && form.dateRange.length === 2 && form.dateRange[0] && form.dateRange[1]) {
+ const start = new Date(form.dateRange[0])
+ const end = new Date(form.dateRange[1])
+
+ if (isNaN(start.getTime()) || isNaN(end.getTime())) {
+ console.warn('鏃犳晥鐨勬棩鏈熸牸寮�')
+ return
+ }
+
+ const diffTime = Math.abs(end - start)
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1
+ form.days = diffDays
+ }
+ } catch (error) {
+ console.error('璁$畻澶╂暟澶辫触:', error)
+ }
+}
+
+// 楠岃瘉鏃堕棿鏍煎紡
+const validateTime = (time) => {
+ if (!time) return ''
+ if (typeof time === 'string') return time
+ if (time instanceof Date) {
+ return time.toTimeString().slice(0, 5)
+ }
+ return ''
+}
+
+// 楠岃瘉鏃堕棿瀛楁
+const validateTimeField = (fieldName) => {
+ try {
+ const value = form[fieldName]
+ if (value && typeof value === 'object' && value.hour !== undefined) {
+ // 濡傛灉鏄椂闂村璞★紝杞崲涓哄瓧绗︿覆鏍煎紡
+ const hours = value.hour.toString().padStart(2, '0')
+ const minutes = value.minute.toString().padStart(2, '0')
+ form[fieldName] = `${hours}:${minutes}`
+ }
+ } catch (error) {
+ console.error(`楠岃瘉鏃堕棿瀛楁 ${fieldName} 澶辫触:`, error)
+ form[fieldName] = ''
+ }
+}
+
+// 鎵撳紑寮圭獥
+const openDialog = (type, action, row = null) => {
+ try {
+ currentType.value = type
+ currentAction.value = action
+
+ if (action === 'add') {
+ dialogTitle.value = `鏂板${getTypeName(type)}`
+ currentEditId.value = ''
+ resetForm()
+ } else if (action === 'edit' && row) {
+ dialogTitle.value = `缂栬緫${getTypeName(type)}`
+ currentEditId.value = row.id
+ fillForm(row)
+ }
+
+ dialogVisible.value = true
+ } catch (error) {
+ console.error('鎵撳紑寮圭獥澶辫触:', error)
+ ElMessage.error('鎵撳紑寮圭獥澶辫触锛岃閲嶈瘯')
+ }
+}
+
+const getTypeName = (type) => {
+ const nameMap = {
+ holiday: '鍋囨湡',
+ annual: '骞村亣瑙勫垯',
+ overtime: '鍔犵彮瑙勫垯',
+ worktime: '鏃堕棿娈�'
+ }
+ return nameMap[type] || ''
+}
+
+const resetForm = () => {
+ Object.assign(form, {
+ name: '',
+ type: '',
+ dateRange: [],
+ days: 0,
+ employeeType: '',
+ workYears: '',
+ annualDays: 0,
+ maxCarryOver: 0,
+ startTime: '',
+ endTime: '',
+ workStartTime: '',
+ workEndTime: '',
+ rate: 1.5,
+ flexibleStart: false,
+ flexibleMinutes: 30,
+ status: 'active'
+ })
+}
+
+const fillForm = (row) => {
+ if (currentType.value === 'holiday') {
+ Object.assign(form, {
+ name: row.name,
+ type: row.type,
+ dateRange: [new Date(row.startDate), new Date(row.endDate)],
+ days: row.days,
+ status: row.status
+ })
+ } else if (currentType.value === 'annual') {
+ Object.assign(form, {
+ employeeType: row.employeeType,
+ workYears: row.workYears,
+ annualDays: row.annualDays,
+ maxCarryOver: row.maxCarryOver,
+ status: row.status
+ })
+ } else if (currentType.value === 'overtime') {
+ Object.assign(form, {
+ name: row.name,
+ type: row.type,
+ startTime: row.startTime || '',
+ endTime: row.endTime || '',
+ rate: row.rate,
+ status: row.status
+ })
+ } else if (currentType.value === 'worktime') {
+ Object.assign(form, {
+ name: row.name,
+ workStartTime: row.startTime || '',
+ workEndTime: row.endTime || '',
+ flexibleStart: row.flexibleStart,
+ flexibleMinutes: row.flexibleMinutes,
+ status: row.status
+ })
+ }
+}
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = async () => {
+ try {
+ if (!formRef.value) {
+ ElMessage.error('琛ㄥ崟寮曠敤涓嶅瓨鍦�')
+ return
+ }
+
+ await formRef.value.validate()
+
+ if (currentAction.value === 'add') {
+ addItem()
+ } else if (currentAction.value === 'edit') {
+ editItem()
+ }
+
+ dialogVisible.value = false
+ ElMessage.success('鎿嶄綔鎴愬姛')
+ } catch (error) {
+ console.error('琛ㄥ崟楠岃瘉澶辫触:', error)
+ ElMessage.error('琛ㄥ崟楠岃瘉澶辫触锛岃妫�鏌ヨ緭鍏�')
+ }
+}
+
+const addItem = () => {
+ const newItem = { ...form, id: Date.now().toString() }
+
+ if (currentType.value === 'holiday') {
+ newItem.startDate = form.dateRange[0].toISOString().split('T')[0]
+ newItem.endDate = form.dateRange[1].toISOString().split('T')[0]
+ holidayData.value.push(newItem)
+ } else if (currentType.value === 'annual') {
+ annualData.value.push(newItem)
+ } else if (currentType.value === 'overtime') {
+ newItem.startTime = form.startTime || ''
+ newItem.endTime = form.endTime || ''
+ overtimeData.value.push(newItem)
+ } else if (currentType.value === 'worktime') {
+ newItem.startTime = form.workStartTime || ''
+ newItem.endTime = form.workEndTime || ''
+ worktimeData.value.push(newItem)
+ }
+}
+
+const editItem = () => {
+ let dataArray
+ let index
+
+ if (currentType.value === 'holiday') {
+ dataArray = holidayData.value
+ index = dataArray.findIndex(item => item.id === currentEditId.value)
+ if (index > -1) {
+ dataArray[index] = {
+ ...dataArray[index],
+ name: form.name,
+ type: form.type,
+ startDate: form.dateRange[0].toISOString().split('T')[0],
+ endDate: form.dateRange[1].toISOString().split('T')[0],
+ days: form.days,
+ status: form.status
+ }
+ }
+ } else if (currentType.value === 'annual') {
+ dataArray = annualData.value
+ index = dataArray.findIndex(item => item.id === currentEditId.value)
+ if (index > -1) {
+ dataArray[index] = {
+ ...dataArray[index],
+ employeeType: form.employeeType,
+ workYears: form.workYears,
+ annualDays: form.annualDays,
+ maxCarryOver: form.maxCarryOver,
+ status: form.status
+ }
+ }
+ } else if (currentType.value === 'overtime') {
+ dataArray = overtimeData.value
+ index = dataArray.findIndex(item => item.id === currentEditId.value)
+ if (index > -1) {
+ dataArray[index] = {
+ ...dataArray[index],
+ name: form.name,
+ type: form.type,
+ startTime: form.startTime || '',
+ endTime: form.endTime || '',
+ rate: form.rate,
+ status: form.status
+ }
+ }
+ } else if (currentType.value === 'worktime') {
+ dataArray = worktimeData.value
+ index = dataArray.findIndex(item => item.id === currentEditId.value)
+ if (index > -1) {
+ dataArray[index] = {
+ ...dataArray[index],
+ name: form.name,
+ startTime: form.workStartTime || '',
+ endTime: form.workEndTime || '',
+ flexibleStart: form.flexibleStart,
+ flexibleMinutes: form.flexibleMinutes,
+ status: form.status
+ }
+ }
+ }
+}
+
+// 鍒犻櫎椤圭洰
+const deleteItem = (type, row) => {
+ ElMessageBox.confirm('纭畾瑕佸垹闄よ繖涓」鐩悧锛�', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }).then(() => {
+ let dataArray
+ if (type === 'holiday') dataArray = holidayData.value
+ else if (type === 'annual') dataArray = annualData.value
+ else if (type === 'overtime') dataArray = overtimeData.value
+ else if (type === 'worktime') dataArray = worktimeData.value
+
+ const index = dataArray.findIndex(item => item.id === row.id)
+ if (index > -1) {
+ dataArray.splice(index, 1)
+ ElMessage.success('鍒犻櫎鎴愬姛')
+ }
+ })
+}
+
+onMounted(() => {
+ console.log('鑰冨嫟绠$悊椤甸潰鍔犺浇瀹屾垚')
+})
+
+onUnmounted(() => {
+ // 娓呯悊宸ヤ綔
+ dialogVisible.value = false
+ currentType.value = ''
+ currentAction.value = ''
+ currentEditId.value = ''
+})
+</script>
+
+<style scoped>
+.app-container {
+ padding: 20px;
+}
+
+.tab-content {
+ padding: 20px 0;
+}
+
+.dialog-footer {
+ text-align: right;
+}
+
+:deep(.el-tabs__content) {
+ padding: 20px;
+}
+
+:deep(.el-form-item) {
+ margin-bottom: 20px;
+}
+</style>
--
Gitblit v1.9.3