From 1f55a1dc8273985685b79604dc9d60b908319934 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 16 九月 2025 16:21:08 +0800
Subject: [PATCH] 打卡记录页面

---
 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 419b261..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: '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,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