From 193ddd53abc21bbfbcf1d69782f57dfaab8d2463 Mon Sep 17 00:00:00 2001 From: yaowanxin <3588231647@qq.com> Date: 星期四, 04 九月 2025 16:33:39 +0800 Subject: [PATCH] 考勤管理-假期、年假、加班、上班界面展示, --- src/api/collaborativeApproval/attendanceManagement.js | 136 +++++++++++++ src/views/collaborativeApproval/attendanceManagement/index.vue | 429 +++++++++++++++++++++++++++++++----------- 2 files changed, 455 insertions(+), 110 deletions(-) diff --git a/src/api/collaborativeApproval/attendanceManagement.js b/src/api/collaborativeApproval/attendanceManagement.js new file mode 100644 index 0000000..3c99775 --- /dev/null +++ b/src/api/collaborativeApproval/attendanceManagement.js @@ -0,0 +1,136 @@ +import request from "@/utils/request"; + +// 鏌ヨ鍋囨湡璁剧疆鍒楄〃 +export function listHolidaySettings(query) { + return request({ + url: "/holidaySettings/getList", + method: "get", + params: query, + }); +} +//鏌ヨ骞村亣瑙勫垯鍒楄〃 +export function listAnnualLeaveSettingList(query) { + return request({ + url: "/holidaySettings/getAnnualLeaveSettingList", + method: "get", + params: query, + }); +} +//鏌ヨ鍔犵彮瑙勫垯鍒楄〃 +export function listOvertimeSettingList(query) { + return request({ + url: "/holidaySettings/getOvertimeSettingList", + method: "get", + params: query, + }); +} +//鏌ヨ宸ヤ綔鏃堕棿瑙勫垯鍒楄〃 +export function listWorkingHoursSettingList(query) { + return request({ + url: "/holidaySettings/getWorkingHoursSettingList", + method: "get", + params: query, + }); +} + +// 鏂板鍋囨湡璁剧疆 +export function addHolidaySettings(data) { + return request({ + url: "/holidaySettings/add", + method: "post", + data: data, + }); +} +//鏂板骞村亣瑙勫垯 +export function addAnnualLeaveSetting(data) { + return request({ + url: "/holidaySettings/addAnnualLeaveSetting", + method: "post", + data: data, + }); +} +//鏂板鍔犵彮瑙勫垯 +export function addOvertimeSetting(data) { + return request({ + url: "/holidaySettings/addOvertimeSetting", + method: "post", + data: data, + }); +} +//鏂板宸ヤ綔鏃堕棿瑙勫垯 +export function addWorkingHoursSetting(data) { + return request({ + url: "/holidaySettings/addWorkingHoursSetting", + method: "post", + data: data, + }); +} + + +// 淇敼鍋囨湡璁剧疆 +export function updateHolidaySettings(data) { + return request({ + url: "/holidaySettings/update", + method: "post", + data: data, + }); +} +// 淇敼骞村亣瑙勫垯 +export function updateAnnualLeaveSetting(data) { + return request({ + url: "/holidaySettings/updateAnnualLeaveSetting", + method: "post", + data: data, + }); +} +// 淇敼鍔犵彮瑙勫垯 +export function updateOvertimeSetting(data) { + return request({ + url: "/holidaySettings/updateOvertimeSetting", + method: "post", + data: data, + }); +} +// 淇敼宸ヤ綔鏃堕棿瑙勫垯 +export function updateWorkingHoursSetting(data) { + return request({ + url: "/holidaySettings/updateWorkingHoursSetting", + method: "post", + data: data, + }); +} + +// 鎵归噺鍒犻櫎鍋囨湡璁剧疆 +export function delHolidaySettings(query) { + return request({ + url: "/holidaySettings/delete", + method: "delete", + data: query, + }); +} +// 鎵归噺鍒犻櫎骞村亣瑙勫垯 +export function delAnnualLeaveSetting(query) { + return request({ + url: "/holidaySettings/deleteAnnualLeaveSetting", + method: "delete", + data: query, + }); +} +// 鎵归噺鍒犻櫎鍔犵彮瑙勫垯 +export function delOvertimeSetting(query) { + return request({ + url: "/holidaySettings/deleteOvertimeSetting", + method: "delete", + data: query, + }); +} +// 鎵归噺鍒犻櫎宸ヤ綔鏃堕棿瑙勫垯 +export function delWorkingHoursSetting(query) { + return request({ + url: "/holidaySettings/deleteWorkingHoursSetting", + method: "delete", + data: query, + }); +} + + diff --git a/src/views/collaborativeApproval/attendanceManagement/index.vue b/src/views/collaborativeApproval/attendanceManagement/index.vue index 37b3d59..245d3b5 100644 --- a/src/views/collaborativeApproval/attendanceManagement/index.vue +++ b/src/views/collaborativeApproval/attendanceManagement/index.vue @@ -39,7 +39,11 @@ <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" /> @@ -103,8 +107,8 @@ <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> @@ -147,9 +151,15 @@ <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> @@ -237,7 +247,7 @@ <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> @@ -258,6 +268,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 +280,23 @@ 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 form = reactive({ name: '', type: '', dateRange: [], + startDate: '', + endDate: '', days: 0, employeeType: '', workYears: '', @@ -350,37 +372,12 @@ }], 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' + weekday: 'primary', weekend: 'warning', holiday: 'danger', night: 'info', + regular: 'success', probation: 'info', intern: 'danger' } return tagMap[type] || 'info' } @@ -388,7 +385,8 @@ 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 } @@ -408,6 +406,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,6 +422,8 @@ 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('鏃犳晥鐨勬棩鏈熸牸寮�') @@ -434,14 +440,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) => { @@ -497,6 +503,8 @@ name: '', type: '', dateRange: [], + startDate: '', + endDate: '', days: 0, employeeType: '', workYears: '', @@ -519,6 +527,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 }) @@ -576,22 +586,84 @@ } 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) } } @@ -600,60 +672,104 @@ 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 + // } + // } } } @@ -664,21 +780,114 @@ 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() console.log('鑰冨嫟绠$悊椤甸潰鍔犺浇瀹屾垚') }) -- Gitblit v1.9.3