Kaynağa Gözat

考勤修复跨日班次打卡逻辑

zhonghuizhen 9 ay önce
ebeveyn
işleme
04a0cba90a

+ 7 - 0
src/views/business/attendance/attendanceDetails.vue

@@ -106,6 +106,7 @@
             prop="daKaShiJian1"
             prop="daKaShiJian1"
             label="打卡时间"
             label="打卡时间"
             width="160"
             width="160"
+            :formatter="formatDateTime"
           />
           />
           <el-table-column
           <el-table-column
             key="zhuangTai1"
             key="zhuangTai1"
@@ -142,6 +143,7 @@
             prop="daKaShiJian2"
             prop="daKaShiJian2"
             label="打卡时间"
             label="打卡时间"
             width="160"
             width="160"
+            :formatter="formatDateTime"
           />
           />
           <el-table-column
           <el-table-column
             key="zhuangTai2"
             key="zhuangTai2"
@@ -502,6 +504,11 @@ export default {
                 String(previousDay.getDate()).padStart(2, '0')
                 String(previousDay.getDate()).padStart(2, '0')
             ].join('-')
             ].join('-')
     },
     },
+    formatDateTime(row, column, cellValue) {
+      if (!cellValue) return '';
+      // 方法1:使用字符串截取(推荐)
+      return cellValue.substring(0, 16);
+    },
     handleExport(columns, data, title, message, nameKey = 'name') {
     handleExport(columns, data, title, message, nameKey = 'name') {
       IbpsExport.excel({
       IbpsExport.excel({
         columns: columns,
         columns: columns,

+ 7 - 2
src/views/business/attendance/attendanceOverview.vue

@@ -65,8 +65,8 @@
               </el-table-column>
               </el-table-column>
               <!-- 上班分组 -->
               <!-- 上班分组 -->
               <el-table-column label="考勤概况">
               <el-table-column label="考勤概况">
-                  <el-table-column key="zui_zao" prop="zui_zao" label="最早" min-width="160" />
-                  <el-table-column key="zui_wan" prop="zui_wan" label="最晚" min-width="160" />
+                  <el-table-column key="zui_zao" prop="zui_zao" label="最早" min-width="160" :formatter="formatDateTime"/>
+                  <el-table-column key="zui_wan" prop="zui_wan" label="最晚" min-width="160" :formatter="formatDateTime"/>
                   <el-table-column key="da_ka_ci_shu_" prop="da_ka_ci_shu_" label="打卡次数" min-width="100" />
                   <el-table-column key="da_ka_ci_shu_" prop="da_ka_ci_shu_" label="打卡次数" min-width="100" />
                   <el-table-column key="total_ban_ci_shi_chang" prop="total_ban_ci_shi_chang" label="标准工作时长(小时)" min-width="160" />
                   <el-table-column key="total_ban_ci_shi_chang" prop="total_ban_ci_shi_chang" label="标准工作时长(小时)" min-width="160" />
                   <el-table-column key="total_gong_zuo_shi_chan" prop="total_gong_zuo_shi_chan" label="实际工作时长(小时)" min-width="160" />
                   <el-table-column key="total_gong_zuo_shi_chan" prop="total_gong_zuo_shi_chan" label="实际工作时长(小时)" min-width="160" />
@@ -244,6 +244,11 @@ export default {
                   break
                   break
           }
           }
       },
       },
+      formatDateTime(row, column, cellValue) {
+      if (!cellValue) return '';
+      // 方法1:使用字符串截取(推荐)
+      return cellValue.substring(0, 16);
+    },
       // 导出数据
       // 导出数据
       exportData () {
       exportData () {
           const exportColumns = [
           const exportColumns = [

+ 3 - 31
src/views/business/attendance/makeUPVerify.vue

@@ -151,7 +151,7 @@ export default {
           {
           {
             prop: 'buKaShiJian',
             prop: 'buKaShiJian',
             label: '补卡时间',
             label: '补卡时间',
-            dateFormat: 'HH:mm:ss',
+            dateFormat: 'yyyy-MM-dd HH:mm',
             sortable: 'custom',
             sortable: 'custom',
             width: 100
             width: 100
           },
           },
@@ -296,32 +296,6 @@ export default {
       data.zhuangTai = status
       data.zhuangTai = status
       const submitData = data
       const submitData = data
 
 
-      /*
-            const submitData = {
-                banCiZhuangTai: data.ban_ci_zhuang_tai || '',
-                bianZhiRen: data.bian_zhi_ren_ || '',
-                bianZhiShiJian: data.bian_zhi_shi_jian || '',
-                buKaBanCi: data.bu_ka_ban_ci_ || '',
-                buKaRiQi: data.bu_ka_ri_qi_ || '',
-                buKaShiJian: data.bu_ka_shi_jian_ || '',
-                buKaShiYou: data.bu_ka_shi_you_ || '',
-                createBy: data.create_by_ || '',
-                createTime: data.create_time_ || '',
-                diDian: data.di_dian_ || '',
-                fuJian: data.fu_jian_ || '',
-                id: data.id_ || '',
-                ip: data.ip_ || '',
-                kaoQinId: data.kao_qin_id_ || '',
-                paiBanId: data.pai_ban_id_ || '',
-                paiBanJiLuId: data.pai_ban_ji_lu_id_ || '',
-                shenHeRen: data.shen_he_ren_ || '',
-                shenHeShiJian: time || '',
-                shenHeYiJian: data.shen_he_yi_jian_ || '',
-                tenantId: data.tenant_id_ || '',
-                updateBy: data.update_by_ || '',
-                updateTime: data.update_time_ || '',
-                zhuangTai: status
-            }*/
       // 更新补卡数据
       // 更新补卡数据
       saveAttendanceReissue(submitData).then((res) => {
       saveAttendanceReissue(submitData).then((res) => {
         self.$message.success(`操作成功`)
         self.$message.success(`操作成功`)
@@ -341,13 +315,11 @@ export default {
         if (submitData.buKaBanCi.includes('上班')) {
         if (submitData.buKaBanCi.includes('上班')) {
           // 更新上班数据
           // 更新上班数据
           updateData.zhuangTai1 = '正常'
           updateData.zhuangTai1 = '正常'
-          updateData.daKaShiJian1 =
-            submitData.buKaRiQi + ' ' + submitData.buKaShiJian
+          updateData.daKaShiJian1 = submitData.buKaShiJian
         } else {
         } else {
           // 更新下班数据
           // 更新下班数据
           updateData.zhuangTai2 = '正常'
           updateData.zhuangTai2 = '正常'
-          updateData.daKaShiJian2 =
-            submitData.buKaRiQi + ' ' + submitData.buKaShiJian
+          updateData.daKaShiJian2 = submitData.buKaShiJian
         }
         }
         if (
         if (
           updateData.zhuangTai1 === '正常' &&
           updateData.zhuangTai1 === '正常' &&

+ 9 - 6
src/views/business/attendance/makeUpEdit.vue

@@ -52,14 +52,16 @@
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
       <!-- 补卡时间 -->
       <!-- 补卡时间 -->
+
       <el-form-item
       <el-form-item
         label="补卡时间"
         label="补卡时间"
         prop="buKaShiJian"
         prop="buKaShiJian"
         class="form-item-uniform"
         class="form-item-uniform"
       >
       >
-        <el-time-picker
+      <el-date-picker
           v-model="formData.buKaShiJian"
           v-model="formData.buKaShiJian"
-          value-format="HH:mm:ss"
+          type="datetime"
+          format="yyyy-MM-dd HH:mm"
           :placeholder="readonly ? '' : '请选择时间'"
           :placeholder="readonly ? '' : '请选择时间'"
           :disabled="readonly"
           :disabled="readonly"
         />
         />
@@ -273,6 +275,7 @@ export default {
           paiBanId: this.params.pai_ban_id_ || this.params.paiBanId|| '',
           paiBanId: this.params.pai_ban_id_ || this.params.paiBanId|| '',
           paiBanJiLuId: this.params.pai_ban_ji_lu_id_ || this.params.paiBanJiLuId|| ''
           paiBanJiLuId: this.params.pai_ban_ji_lu_id_ || this.params.paiBanJiLuId|| ''
         }
         }
+        console.log('页面初始化',this.formData.buKaShiJian)
       }
       }
     },
     },
     handleOpened() {
     handleOpened() {
@@ -355,8 +358,8 @@ export default {
             self.formData.buKaShiJian = self.buKaBanCiOptions[0].value.includes(
             self.formData.buKaShiJian = self.buKaBanCiOptions[0].value.includes(
               '上班'
               '上班'
             )
             )
-              ? self.yichangdata[0].banCiKaiShi.split(' ')[1] + ':00'
-              : self.yichangdata[0].banCiJieShu.split(' ')[1] + ':00'
+              ? self.yichangdata[0].banCiKaiShi
+              : self.yichangdata[0].banCiJieShu
           }
           }
         })
         })
         .catch(() => {})
         .catch(() => {})
@@ -374,9 +377,9 @@ export default {
         (item) => item.banCiBieMing === bieming
         (item) => item.banCiBieMing === bieming
       )[0]
       )[0]
       if (type === '上班') {
       if (type === '上班') {
-        this.formData.buKaShiJian = obj.banCiKaiShi.split(' ')[1] + ':00'
+        this.formData.buKaShiJian = obj.banCiKaiShi
       } else {
       } else {
-        this.formData.buKaShiJian = obj.banCiJieShu.split(' ')[1] + ':00'
+        this.formData.buKaShiJian = obj.banCiJieShu
       }
       }
     },
     },
     handleFormAction({ key }) {
     handleFormAction({ key }) {

+ 1 - 1
src/views/business/attendance/makeUpRecords.vue

@@ -156,7 +156,7 @@ export default {
           {
           {
             prop: 'buKaShiJian',
             prop: 'buKaShiJian',
             label: '补卡时间',
             label: '补卡时间',
-            dateFormat: 'HH:mm:ss',
+            dateFormat: 'yyyy-MM-dd HH:mm',
             sortable: 'custom',
             sortable: 'custom',
             width: 100
             width: 100
           },
           },

+ 7 - 0
src/views/business/attendance/personAttendanceDetails.vue

@@ -95,6 +95,7 @@
             prop="daKaShiJian1"
             prop="daKaShiJian1"
             label="打卡时间"
             label="打卡时间"
             width="160"
             width="160"
+            :formatter="formatDateTime"
           />
           />
           <el-table-column
           <el-table-column
             key="zhuangTai1"
             key="zhuangTai1"
@@ -131,6 +132,7 @@
             prop="daKaShiJian2"
             prop="daKaShiJian2"
             label="打卡时间"
             label="打卡时间"
             width="160"
             width="160"
+            :formatter="formatDateTime"
           />
           />
           <el-table-column
           <el-table-column
             key="zhuangTai2"
             key="zhuangTai2"
@@ -379,6 +381,11 @@ export default {
           break
           break
       }
       }
     },
     },
+    formatDateTime(row, column, cellValue) {
+      if (!cellValue) return '';
+      // 方法1:使用字符串截取(推荐)
+      return cellValue.substring(0, 16);
+    },
     // 导出数据
     // 导出数据
     exportData() {
     exportData() {
       const exportColumns = [
       const exportColumns = [

+ 21 - 6
src/views/system/dashboard/components/util.js

@@ -764,6 +764,16 @@ export function buildComponent(name, column, preview, vm) {
                         10,
                         10,
                         this.$common.getDate('day', i - 1, item.start_date_)
                         this.$common.getDate('day', i - 1, item.start_date_)
                       )
                       )
+                      const nextdate = this.$common.getFormatDate(
+                        'string',
+                        10,
+                        this.$common.getDate('day', i, item.start_date_)
+                      )
+                      const enddate = this.$common.getFormatDate(
+                        'string',
+                        10,
+                        this.$common.getDate('day', i+1, item.start_date_)
+                      )
                       const shiftList = shift.split(',')
                       const shiftList = shift.split(',')
                       shiftList.forEach((s) => {
                       shiftList.forEach((s) => {
                         const t = scheduleShift.find((i) => i.alias === s)
                         const t = scheduleShift.find((i) => i.alias === s)
@@ -786,12 +796,16 @@ export function buildComponent(name, column, preview, vm) {
                             .join('\n'),
                             .join('\n'),
                           title: s,
                           title: s,
                           start: date,
                           start: date,
-                          end: date,
-                          jieShuShiJian: date,
+                          end:t.dateRange[0].isSecondDay=='Y'? nextdate : date, //是否跨天班次,跨天班次要设置为结束日期的下一天,即开始日期的后天
+                          jieShuShiJian: t.dateRange[0].isSecondDay=='Y'? nextdate : date,
+                          kaishishijian: date,
                           zhuangTai: '',
                           zhuangTai: '',
-                          id: i,
+                          // id: i,
+                          id:attendance?.id_ || i,
                           bcolor: t.color,
                           bcolor: t.color,
                           attendance: attendance || {}, // 考勤状态
                           attendance: attendance || {}, // 考勤状态
+                          //allDay: true,         // 标记为全天事件
+                          //display: "auto",       // 自动跨天渲染(默认值)
                           ...t
                           ...t
                         })
                         })
                       })
                       })
@@ -818,10 +832,11 @@ export function buildComponent(name, column, preview, vm) {
             param.event._def.title
             param.event._def.title
           )
           )
         },
         },
-        showDaKaBtn(targetDay) {
+        showDaKaBtn(targetDay1,targetDay2) { //班次开始或结束时间有一个是今天就显示打卡按钮
+          
           // 判断是否展示打卡按钮,当前日期则展示
           // 判断是否展示打卡按钮,当前日期则展示
           const today = this.$common.getDateNow()
           const today = this.$common.getDateNow()
-          if (targetDay === today) {
+          if (targetDay1 === today || targetDay2 === today) {
             return true
             return true
           } else {
           } else {
             return false
             return false
@@ -941,7 +956,7 @@ export function buildComponent(name, column, preview, vm) {
                               </div>
                               </div>
                             `
                             `
               // 打卡按钮显示
               // 打卡按钮显示
-              if (this.showDaKaBtn(event.extendedProps.jieShuShiJian)) {
+              if (this.showDaKaBtn(event.extendedProps.kaishishijian,event.extendedProps.jieShuShiJian)) {
                 const button = document.createElement('button')
                 const button = document.createElement('button')
                 button.className = 'clock-btn'
                 button.className = 'clock-btn'
                 // 根据打卡状态显示不同文本
                 // 根据打卡状态显示不同文本

+ 23 - 13
src/views/system/homepage/components/banciDialog.vue

@@ -73,7 +73,7 @@
                   banci &&
                   banci &&
                   banci.attendance &&
                   banci.attendance &&
                   banci.attendance.zhuang_tai_1_ != '正常' &&
                   banci.attendance.zhuang_tai_1_ != '正常' &&
-                  compareTime() &&
+                  compareTime('in') &&
                   validExist(banci.attendance, 'in')
                   validExist(banci.attendance, 'in')
                 "
                 "
                 class="clock-btn"
                 class="clock-btn"
@@ -90,7 +90,7 @@
                   banci &&
                   banci &&
                   banci.attendance &&
                   banci.attendance &&
                   banci.attendance.zhuang_tai_2_ != '正常' &&
                   banci.attendance.zhuang_tai_2_ != '正常' &&
-                  compareTime() &&
+                  compareTime('out') &&
                   validExist(banci.attendance, 'out')
                   validExist(banci.attendance, 'out')
                 "
                 "
                 class="clock-btn"
                 class="clock-btn"
@@ -151,21 +151,31 @@ export default {
       if (!data?.[time[type]]) {
       if (!data?.[time[type]]) {
         return '未打卡'
         return '未打卡'
       }
       }
-
+      let showtime = data[time[type]].substring(0, 16); //显示年月日时分
       return data[status[type]] === '正常'
       return data[status[type]] === '正常'
-        ? `${data[time[type]]} 正常`
-        : `${data[time[type]]} <span style="color: red;">${data[status[type]] === '异常' ? '迟到' : data[status[type]]}${data[duration[type]]}分钟</span>`
+        ? `${showtime} 正常`
+        : `${showtime} <span style="color: red;">${data[status[type]] === '异常' ? '迟到' : data[status[type]]}${data[duration[type]]}分钟</span>`
     },
     },
-    compareTime() {
-      // 比较班次时间和当前时间,过去日期的才显示,返回true。
+    compareTime(flag) {
+      // 比较班次打卡时间和当前时间,过去日期的才显示,返回true。
       const today = this.$common.getDateNow()
       const today = this.$common.getDateNow()
-      if (this.banciInfo.jieShuShiJian < today) {
-        return true
+      if(flag === 'in') { //比较上班时间
+        if (this.banciInfo.kaishishijian < today) {
+          return true
+        } else {
+          return false
+        }
       } else {
       } else {
-        return false
+        if (this.banciInfo.jieShuShiJian < today) {
+          return true
+        } else {
+          return false
+        }
       }
       }
+      
     },
     },
     async validExist(attendance, type) {
     async validExist(attendance, type) {
+
       // 判断该班次是否申请过
       // 判断该班次是否申请过
       const str = type === 'in' ? '上班' : '下班'
       const str = type === 'in' ? '上班' : '下班'
       const banci = attendance.ban_ci_bie_ming_ + '-' + str
       const banci = attendance.ban_ci_bie_ming_ + '-' + str
@@ -194,12 +204,12 @@ export default {
         const str = type === 'in' ? '上班' : '下班'
         const str = type === 'in' ? '上班' : '下班'
         const buKaShiJian =
         const buKaShiJian =
           type === 'in'
           type === 'in'
-            ? attendanceInfo.ban_ci_kai_shi_.split(' ')[1] + ':00'
-            : attendanceInfo.ban_ci_jie_shu_.split(' ')[1] + ':00'
+            ? attendanceInfo.ban_ci_kai_shi_
+            : attendanceInfo.ban_ci_jie_shu_
         params = {
         params = {
           bu_ka_ri_qi_: attendanceInfo.ri_qi_,
           bu_ka_ri_qi_: attendanceInfo.ri_qi_,
           bu_ka_ban_ci_: attendanceInfo.ban_ci_bie_ming_ + '-' + str,
           bu_ka_ban_ci_: attendanceInfo.ban_ci_bie_ming_ + '-' + str,
-          bu_ka_shi_jian_: buKaShiJian,
+          bu_ka_shi_jian_: buKaShiJian.substring(0, 16),
           pai_ban_id_: attendanceInfo.pai_ban_id_,
           pai_ban_id_: attendanceInfo.pai_ban_id_,
           pai_ban_ji_lu_id_: attendanceInfo.pai_ban_ji_lu_id_,
           pai_ban_ji_lu_id_: attendanceInfo.pai_ban_ji_lu_id_,
           kao_qin_id_:attendanceInfo.id_
           kao_qin_id_:attendanceInfo.id_