From 61d5d749daa7b0fbf5fdecf676927ab77f4264e0 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期三, 17 九月 2025 11:26:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev
---
src/views/collaborativeApproval/attendanceManagement/index.vue | 830 ++++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 680 insertions(+), 150 deletions(-)
diff --git a/src/views/collaborativeApproval/attendanceManagement/index.vue b/src/views/collaborativeApproval/attendanceManagement/index.vue
index 7fedb46..f6a3e3c 100644
--- a/src/views/collaborativeApproval/attendanceManagement/index.vue
+++ b/src/views/collaborativeApproval/attendanceManagement/index.vue
@@ -5,7 +5,7 @@
<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="鍋囨湡绫诲瀷">
@@ -25,8 +25,8 @@
</el-table-column>
<el-table-column label="鎿嶄綔" fixed="right">
<template #default="scope">
- <el-button type="primary" link @click="openDialog('holiday', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" link @click="deleteItem('holiday', scope.row)">鍒犻櫎</el-button>
+ <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>
@@ -37,9 +37,13 @@
<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="employeeType" label="鍛樺伐绫诲瀷">
+ <template #default="scope">
+ <el-tag :type="getTagType(scope.row.employeeType)">{{ getTypeLabel(scope.row.employeeType) }}</el-tag>
+ </template>
+ </el-table-column>
<el-table-column prop="workYears" label="宸ヤ綔骞撮檺" />
<el-table-column prop="annualDays" label="骞村亣澶╂暟" align="center" />
<el-table-column prop="maxCarryOver" label="鏈�澶х粨杞ぉ鏁�" align="center" />
@@ -52,8 +56,8 @@
</el-table-column>
<el-table-column label="鎿嶄綔" fixed="right">
<template #default="scope">
- <el-button type="primary" link @click="openDialog('annual', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" link @click="deleteItem('annual', scope.row)">鍒犻櫎</el-button>
+ <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>
@@ -64,7 +68,7 @@
<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="鍔犵彮绫诲瀷" >
@@ -84,8 +88,8 @@
</el-table-column>
<el-table-column label="鎿嶄綔" fixed="right">
<template #default="scope">
- <el-button type="primary" link @click="openDialog('overtime', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" link @click="deleteItem('overtime', scope.row)">鍒犻櫎</el-button>
+ <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>
@@ -96,15 +100,15 @@
<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 :type="scope.row.flexibleStart === 'true' ? 'success' : 'info'">
+ {{ scope.row.flexibleStart === 'true' ? '鏄�' : '鍚�' }}
</el-tag>
</template>
</el-table-column>
@@ -118,10 +122,56 @@
</el-table-column>
<el-table-column label="鎿嶄綔" fixed="right">
<template #default="scope">
- <el-button type="primary" link @click="openDialog('worktime', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" link @click="deleteItem('worktime', scope.row)">鍒犻櫎</el-button>
+ <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-tab-pane label="鎵撳崱璁板綍" name="attendance">
+ <div class="tab-content">
+ <div style="margin-bottom: 20px;">
+ <el-date-picker
+ v-model="attendanceDate"
+ type="date"
+ placeholder="閫夋嫨鏃ユ湡"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD"
+ style="margin-right: 10px;"
+ @change="filterAttendanceData"
+ />
+ <el-select
+ v-model="attendanceStatus"
+ placeholder="閫夋嫨鐘舵��"
+ style="width: 120px; margin-right: 10px;"
+ @change="filterAttendanceData"
+ >
+ <el-option label="鍏ㄩ儴" value="" />
+ <el-option label="姝e父" value="normal" />
+ <el-option label="杩熷埌" value="late" />
+ <el-option label="鏃╅��" value="early" />
+ <el-option label="缂哄嫟" value="absent" />
+ </el-select>
+ <el-button type="primary" @click="exportAttendance">瀵煎嚭璁板綍</el-button>
+ </div>
+
+ <el-table :data="filteredAttendanceData" border style="width: 100%;">
+ <el-table-column prop="employeeName" label="鍛樺伐濮撳悕" width="120" />
+ <el-table-column prop="department" label="閮ㄩ棬" width="120" />
+ <el-table-column prop="date" label="鏃ユ湡" width="120" />
+ <el-table-column prop="clockInTime" label="涓婄彮鎵撳崱" width="120" />
+ <el-table-column prop="clockOutTime" label="涓嬬彮鎵撳崱" width="120" />
+ <el-table-column prop="workHours" label="宸ヤ綔鏃堕暱" width="100" align="center" />
+ <el-table-column prop="status" label="鐘舵��" width="100" align="center">
+ <template #default="scope">
+ <el-tag :type="getAttendanceTagType(scope.row.status)">{{ getAttendanceStatusLabel(scope.row.status) }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="location" label="鎵撳崱鍦扮偣" width="150" />
+ <el-table-column prop="remark" label="澶囨敞" min-width="150" />
</el-table>
</div>
</el-tab-pane>
@@ -133,23 +183,29 @@
<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-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="姝e紡鍛樺伐" value="regular" />
<el-option label="璇曠敤鏈熷憳宸�" value="probation" />
- <el-option label="瀹炰範鐢�" value="intern" />
+ <el-option label="瀹炰範鐢�" value="intern" /> -->
+ <el-option
+ v-for="option in getTypeOptions()"
+ :key="option.value"
+ :label="option.label"
+ :value="option.value"
+ />
</el-select>
</el-form-item>
@@ -191,7 +247,7 @@
@change="validateTimeField('startTime')"
/>
</el-form-item>
-
+
<el-form-item label="缁撴潫鏃堕棿" prop="endTime" v-if="currentType === 'overtime'">
<el-time-picker
v-model="form.endTime"
@@ -237,14 +293,14 @@
<el-input-number v-model="form.flexibleMinutes" :min="0" :max="120" style="width: 100%" />
</el-form-item>
- <el-form-item label="鐘舵��" prop="status">
+ <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>
@@ -258,6 +314,7 @@
<script setup>
import { ref, reactive, onMounted, onUnmounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
+import { listHolidaySettings, addHolidaySettings, updateHolidaySettings, delHolidaySettings, listAnnualLeaveSettingList, addAnnualLeaveSetting, updateAnnualLeaveSetting, delAnnualLeaveSetting, listOvertimeSettingList, addOvertimeSetting, updateOvertimeSetting, delOvertimeSetting, listWorkingHoursSettingList, addWorkingHoursSetting, updateWorkingHoursSetting, delWorkingHoursSetting } from '@/api/collaborativeApproval/attendanceManagement.js'
// 褰撳墠婵�娲荤殑鏍囩椤�
const activeTab = ref('holiday')
@@ -269,12 +326,29 @@
const currentAction = ref('')
const currentEditId = ref('')
const formRef = ref()
+const page = {
+ current: 1,
+ size: 20,
+ total: 0,
+ }
+const holidayData = ref([])
+const annualData = ref([])
+const overtimeData = ref([])
+const worktimeData = ref([])
+
+// 鎵撳崱璁板綍鐩稿叧鏁版嵁
+const attendanceData = ref([])
+const filteredAttendanceData = ref([])
+const attendanceDate = ref('')
+const attendanceStatus = ref('')
// 琛ㄥ崟鏁版嵁
const form = reactive({
name: '',
type: '',
dateRange: [],
+ startDate: '',
+ endDate: '',
days: 0,
employeeType: '',
workYears: '',
@@ -300,9 +374,9 @@
workYears: [{ required: true, message: '璇疯緭鍏ュ伐浣滃勾闄�', trigger: 'blur' }],
annualDays: [{ required: true, message: '璇疯緭鍏ュ勾鍋囧ぉ鏁�', trigger: 'blur' }],
maxCarryOver: [{ required: true, message: '璇疯緭鍏ユ渶澶х粨杞ぉ鏁�', trigger: 'blur' }],
- startTime: [{
- required: true,
- message: '璇烽�夋嫨寮�濮嬫椂闂�',
+ startTime: [{
+ required: true,
+ message: '璇烽�夋嫨寮�濮嬫椂闂�',
trigger: 'change',
validator: (rule, value, callback) => {
if (!value) {
@@ -312,9 +386,9 @@
}
}
}],
- endTime: [{
- required: true,
- message: '璇烽�夋嫨缁撴潫鏃堕棿',
+ endTime: [{
+ required: true,
+ message: '璇烽�夋嫨缁撴潫鏃堕棿',
trigger: 'change',
validator: (rule, value, callback) => {
if (!value) {
@@ -324,9 +398,9 @@
}
}
}],
- workStartTime: [{
- required: true,
- message: '璇烽�夋嫨涓婄彮鏃堕棿',
+ workStartTime: [{
+ required: true,
+ message: '璇烽�夋嫨涓婄彮鏃堕棿',
trigger: 'change',
validator: (rule, value, callback) => {
if (!value) {
@@ -336,9 +410,9 @@
}
}
}],
- workEndTime: [{
- required: true,
- message: '璇烽�夋嫨涓嬬彮鏃堕棿',
+ workEndTime: [{
+ required: true,
+ message: '璇烽�夋嫨涓嬬彮鏃堕棿',
trigger: 'change',
validator: (rule, value, callback) => {
if (!value) {
@@ -350,37 +424,12 @@
}],
rate: [{ required: true, message: '璇疯緭鍏ュ�嶇巼', trigger: 'blur' }]
}
-
-// 妯℃嫙鏁版嵁
-const holidayData = ref([
- { id: '1', name: '鏄ヨ妭', type: 'legal', startDate: '2025-02-10', endDate: '2025-02-17', days: 8, status: 'active' },
- { id: '2', name: '娓呮槑鑺�', type: 'legal', startDate: '2025-04-05', endDate: '2025-04-05', days: 1, status: 'active' },
- { id: '3', name: '鍔冲姩鑺�', type: 'legal', startDate: '2025-05-01', endDate: '2025-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'
+ weekday: 'primary', weekend: 'warning', holiday: 'danger', night: 'info',
+ regular: 'success', probation: 'info', intern: 'danger'
}
return tagMap[type] || 'info'
}
@@ -388,9 +437,31 @@
const getTypeLabel = (type) => {
const labelMap = {
legal: '娉曞畾鑺傚亣鏃�', adjustment: '璋冧紤鏃�', special: '鐗规畩鍋囨湡', company: '鍏徃鍋囨湡',
- weekday: '宸ヤ綔鏃ュ姞鐝�', weekend: '鍛ㄦ湯鍔犵彮', holiday: '鑺傚亣鏃ュ姞鐝�', night: '娣卞鍔犵彮'
+ weekday: '宸ヤ綔鏃ュ姞鐝�', weekend: '鍛ㄦ湯鍔犵彮', holiday: '鑺傚亣鏃ュ姞鐝�', night: '娣卞鍔犵彮',
+ regular: '姝e紡鍛樺伐', probation: '璇曠敤鏈熷憳宸�', intern: '瀹炰範鐢�'
}
return labelMap[type] || type
+}
+
+// 鎵撳崱璁板綍鐩稿叧宸ュ叿鍑芥暟
+const getAttendanceTagType = (status) => {
+ const tagMap = {
+ normal: 'success',
+ late: 'warning',
+ early: 'warning',
+ absent: 'danger'
+ }
+ return tagMap[status] || 'info'
+}
+
+const getAttendanceStatusLabel = (status) => {
+ const labelMap = {
+ normal: '姝e父',
+ late: '杩熷埌',
+ early: '鏃╅��',
+ absent: '缂哄嫟'
+ }
+ return labelMap[status] || status
}
const getTypeOptions = () => {
@@ -408,6 +479,12 @@
{ label: '鑺傚亣鏃ュ姞鐝�', value: 'holiday' },
{ label: '娣卞鍔犵彮', value: 'night' }
]
+ } else if (currentType.value === 'annual') {
+ return [
+ { label: '姝e紡鍛樺伐', value: 'regular' },
+ { label: '璇曠敤鏈熷憳宸�', value: 'probation' },
+ { label: '瀹炰範鐢�', value: 'intern' }
+ ]
}
return []
}
@@ -418,12 +495,14 @@
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])
-
+ form.startDate = start.toISOString().split('T')[0]
+ form.endDate = end.toISOString().split('T')[0]
+
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
@@ -434,14 +513,14 @@
}
// 楠岃瘉鏃堕棿鏍煎紡
-const validateTime = (time) => {
- if (!time) return ''
- if (typeof time === 'string') return time
- if (time instanceof Date) {
- return time.toTimeString().slice(0, 5)
- }
- return ''
-}
+// 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) => {
@@ -464,7 +543,7 @@
try {
currentType.value = type
currentAction.value = action
-
+
if (action === 'add') {
dialogTitle.value = `鏂板${getTypeName(type)}`
currentEditId.value = ''
@@ -474,7 +553,7 @@
currentEditId.value = row.id
fillForm(row)
}
-
+
dialogVisible.value = true
} catch (error) {
console.error('鎵撳紑寮圭獥澶辫触:', error)
@@ -497,6 +576,8 @@
name: '',
type: '',
dateRange: [],
+ startDate: '',
+ endDate: '',
days: 0,
employeeType: '',
workYears: '',
@@ -519,6 +600,8 @@
name: row.name,
type: row.type,
dateRange: [new Date(row.startDate), new Date(row.endDate)],
+ startDate: row.startDate,
+ endDate: row.endDate,
days: row.days,
status: row.status
})
@@ -558,15 +641,15 @@
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) {
@@ -576,85 +659,438 @@
}
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)
+ const params = {
+ name: form.name,
+ type: form.type,
+ startDate: form.startDate,
+ endDate: form.endDate,
+ days: form.days,
+ status: form.status
+ }
+ addHolidaySettings(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("娣诲姞鎴愬姛");
+ // dialogVisible.value = false;
+ getHolidaySettingsList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
} else if (currentType.value === 'annual') {
- annualData.value.push(newItem)
+ // annualData.value.push(newItem)
+ const params = {
+ employeeType: form.employeeType,
+ workYears: form.workYears,
+ annualDays: form.annualDays,
+ maxCarryOver: form.maxCarryOver,
+ status: form.status
+ }
+ addAnnualLeaveSetting(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("娣诲姞鎴愬姛");
+ // dialogVisible.value = false;
+ getAnnualLeaveSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
} else if (currentType.value === 'overtime') {
- newItem.startTime = form.startTime || ''
- newItem.endTime = form.endTime || ''
- overtimeData.value.push(newItem)
+ const params = {
+ name: form.name,
+ type: form.type,
+ startTime: form.startTime || '',
+ endTime: form.endTime || '',
+ rate: form.rate,
+ status: form.status
+ }
+ addOvertimeSetting(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("娣诲姞鎴愬姛");
+ // dialogVisible.value = false;
+ getOvertimeSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+ // 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 params = {
+ name: form.name,
+ startTime: form.workStartTime || '',
+ endTime: form.workEndTime || '',
+ flexibleStart: form.flexibleStart,
+ flexibleMinutes: form.flexibleMinutes,
+ status: form.status
+ }
+ addWorkingHoursSetting(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("娣诲姞鎴愬姛");
+ getWorkingHoursSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+ // 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
- }
+ const params = {
+ id: currentEditId.value,
+ 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
}
+ updateHolidaySettings(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鏇存柊鎴愬姛");
+ // dialogVisible.value = false;
+ getHolidaySettingsList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
} 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
- }
+ const params = {
+ id: currentEditId.value,
+ employeeType: form.employeeType,
+ workYears: form.workYears,
+ annualDays: form.annualDays,
+ maxCarryOver: form.maxCarryOver,
+ status: form.status
}
+ updateAnnualLeaveSetting(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鏇存柊鎴愬姛");
+ getAnnualLeaveSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
} 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
- }
+ const params = {
+ id: currentEditId.value,
+ name: form.name,
+ type: form.type,
+ startTime: form.startTime || '',
+ endTime: form.endTime || '',
+ rate: form.rate,
+ status: form.status
}
+ updateOvertimeSetting(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鏇存柊鎴愬姛");
+ getOvertimeSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+
+ // 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 params = {
+ id: currentEditId.value,
+ name: form.name,
+ startTime: form.workStartTime || '',
+ endTime: form.workEndTime || '',
+ flexibleStart: form.flexibleStart,
+ flexibleMinutes: form.flexibleMinutes,
+ status: form.status
}
+ updateWorkingHoursSetting(params).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鏇存柊鎴愬姛");
+ getWorkingHoursSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+ // 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 filterAttendanceData = () => {
+ let filtered = attendanceData.value
+
+ // 鎸夋棩鏈熻繃婊�
+ if (attendanceDate.value) {
+ filtered = filtered.filter(item => item.date === attendanceDate.value)
+ }
+
+ // 鎸夌姸鎬佽繃婊�
+ if (attendanceStatus.value) {
+ filtered = filtered.filter(item => item.status === attendanceStatus.value)
+ }
+
+ filteredAttendanceData.value = filtered
+}
+
+// 瀵煎嚭鎵撳崱璁板綍
+const exportAttendance = () => {
+ ElMessage.success('瀵煎嚭鍔熻兘寮�鍙戜腑...')
+}
+
+// 鍒濆鍖栨墦鍗¤褰曞亣鏁版嵁
+const initAttendanceData = () => {
+ const mockData = [
+ {
+ id: 1,
+ employeeName: '闄堝織寮�',
+ department: '鎶�鏈儴',
+ date: '2025-08-15',
+ clockInTime: '09:00:00',
+ clockOutTime: '18:00:00',
+ workHours: '8.0h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 2,
+ employeeName: '鏉庨洩姊�',
+ department: '甯傚満閮�',
+ date: '2025-08-16',
+ clockInTime: '08:58:00',
+ clockOutTime: '18:05:00',
+ workHours: '8.12h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 3,
+ employeeName: '鐜嬪缓鍗�',
+ department: '浜轰簨閮�',
+ date: '2025-08-16',
+ clockInTime: '09:02:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.97h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 4,
+ employeeName: '璧垫檽涓�',
+ department: '璐㈠姟閮�',
+ date: '2025-09-02',
+ clockInTime: '08:55:00',
+ clockOutTime: '18:10:00',
+ workHours: '8.25h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 5,
+ employeeName: '寮犲浗搴�',
+ department: '鎶�鏈儴',
+ date: '2025-09-02',
+ clockInTime: '09:00:00',
+ clockOutTime: '18:30:00',
+ workHours: '8.5h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: '鍔犵彮'
+ },
+ {
+ id: 6,
+ employeeName: '鍒樻槑杈�',
+ department: '杩愯惀閮�',
+ date: '2025-09-03',
+ clockInTime: '09:05:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.92h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 7,
+ employeeName: '瀛欎附鍗�',
+ department: '璁捐閮�',
+ date: '2025-09-03',
+ clockInTime: '08:59:00',
+ clockOutTime: '18:02:00',
+ workHours: '8.05h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 8,
+ employeeName: '鍛ㄥ缓鍐�',
+ department: '閿�鍞儴',
+ date: '2025-09-04',
+ clockInTime: '09:15:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.75h',
+ status: 'late',
+ location: '鍏徃鎬婚儴',
+ remark: '浜ら�氬牭濉�'
+ },
+ {
+ id: 9,
+ employeeName: '鍚村皬鑺�',
+ department: '瀹㈡湇閮�',
+ date: '2025-09-04',
+ clockInTime: '09:01:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.98h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 10,
+ employeeName: '椹枃鏉�',
+ department: '鎶�鏈儴',
+ date: '2025-09-05',
+ clockInTime: '08:57:00',
+ clockOutTime: '17:30:00',
+ workHours: '7.55h',
+ status: 'early',
+ location: '鍏徃鎬婚儴',
+ remark: '鏈夋�ヤ簨鎻愬墠绂诲紑'
+ },
+ {
+ id: 11,
+ employeeName: '鏋楁檽涓�',
+ department: '琛屾斂閮�',
+ date: '2025-09-05',
+ clockInTime: '09:03:00',
+ clockOutTime: '18:08:00',
+ workHours: '8.08h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 12,
+ employeeName: '榛勭編鐜�',
+ department: '璐㈠姟閮�',
+ date: '2025-09-06',
+ clockInTime: '',
+ clockOutTime: '',
+ workHours: '0h',
+ status: 'absent',
+ location: '',
+ remark: '璇风梾鍋�'
+ },
+ {
+ id: 13,
+ employeeName: '閮戞捣娑�',
+ department: '甯傚満閮�',
+ date: '2025-08-14',
+ clockInTime: '09:00:00',
+ clockOutTime: '18:00:00',
+ workHours: '8.0h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 14,
+ employeeName: '璋附濞�',
+ department: '浜轰簨閮�',
+ date: '2025-08-20',
+ clockInTime: '08:58:00',
+ clockOutTime: '18:03:00',
+ workHours: '8.08h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 15,
+ employeeName: '浣曞織浼�',
+ department: '鎶�鏈儴',
+ date: '2025-08-21',
+ clockInTime: '09:10:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.83h',
+ status: 'late',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 16,
+ employeeName: '璁搁泤鑺�',
+ department: '璁捐閮�',
+ date: '2025-08-22',
+ clockInTime: '09:01:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.98h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 17,
+ employeeName: '閭撳缓骞�',
+ department: '杩愯惀閮�',
+ date: '2025-09-10',
+ clockInTime: '08:59:00',
+ clockOutTime: '18:05:00',
+ workHours: '8.1h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ },
+ {
+ id: 18,
+ employeeName: '鏇惧皬绾�',
+ department: '瀹㈡湇閮�',
+ date: '2025-09-11',
+ clockInTime: '09:02:00',
+ clockOutTime: '18:00:00',
+ workHours: '7.97h',
+ status: 'normal',
+ location: '鍏徃鎬婚儴',
+ remark: ''
+ }
+ ]
+
+ attendanceData.value = mockData
+ filteredAttendanceData.value = mockData
}
// 鍒犻櫎椤圭洰
@@ -664,21 +1100,115 @@
cancelButtonText: '鍙栨秷',
type: 'warning'
}).then(() => {
+ let ids = [];
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('鍒犻櫎鎴愬姛')
+ if (type === 'holiday') {
+ ids.push(row.id)
+ delHolidaySettings(ids).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ ids = []
+ getHolidaySettingsList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
}
+ else if (type === 'annual') {
+ ids.push(row.id)
+ delAnnualLeaveSetting(ids).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ ids = []
+ getAnnualLeaveSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+ }
+ else if (type === 'overtime') {
+ ids.push(row.id)
+ delOvertimeSetting(ids).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ ids = []
+ getOvertimeSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+ }
+ else if (type === 'worktime') {
+ ids.push(row.id)
+ delWorkingHoursSetting(ids).then(res => {
+ if(res.code == 200){
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ ids = []
+ getWorkingHoursSettingList()
+ }
+ }).catch(err => {
+ ElMessage.error(err.msg);
+ })
+ }
+
+ // const index = dataArray.findIndex(item => item.id === row.id)
+ // if (index > -1) {
+ // dataArray.splice(index, 1)
+ // ElMessage.success('鍒犻櫎鎴愬姛')
+ // }
})
}
+// 鑾峰彇鍋囨湡璁剧疆鍒楄〃
+const getHolidaySettingsList = () => {
+ // tableLoading.value = true;
+ listHolidaySettings({...page.value})
+ .then(res => {
+ // tableLoading.value = false;
+ holidayData.value = res.data.records
+ page.total = res.data.total;
+ }).catch(err => {
+ // tableLoading.value = false;
+ })
+};
+// 鑾峰彇骞村亣瑙勫垯鍒楄〃
+const getAnnualLeaveSettingList = () => {
+ listAnnualLeaveSettingList({...page.value})
+ .then(res => {
+ // console.log(res.data)
+ annualData.value = res.data.records
+ page.total = res.data.total;
+ }).catch(err => {
+ })
+};
+// 鑾峰彇鍔犵彮瑙勫垯鍒楄〃
+const getOvertimeSettingList = () => {
+
+ listOvertimeSettingList({...page.value})
+ .then(res => {
+ // console.log(res.data)
+ overtimeData.value = res.data.records
+ page.total = res.data.total;
+ }).catch(err => {
+ })
+};
+// 鑾峰彇宸ヤ綔鏃堕棿瑙勫垯鍒楄〃
+const getWorkingHoursSettingList = () => {
+
+ listWorkingHoursSettingList({...page.value})
+ .then(res => {
+ // console.log(res.data)
+ worktimeData.value = res.data.records
+ page.total = res.data.total;
+ }).catch(err => {
+ })
+};
onMounted(() => {
+ getHolidaySettingsList()
+ getAnnualLeaveSettingList()
+ getOvertimeSettingList()
+ getWorkingHoursSettingList()
+ initAttendanceData()
console.log('鑰冨嫟绠$悊椤甸潰鍔犺浇瀹屾垚')
})
--
Gitblit v1.9.3