import { defineStore } from 'pinia' import { getAttendanceRule, getAttendanceSegment } from '@/api/mine.js' import { ref } from 'vue' export const useConfigStore = defineStore('config', () => { // 正常签到时间,分别为上午和下午 const signInTimeRange = ref([[], []]); // 正常签退时间,分别为上午和下午 const signOutTimeRange = ref([[], []]); // 迟到时间,分别为上午和下午 const lateTimeRange = ref([[], []]); // 早退时间,分别为上午和下午 const earlyTimeRange = ref([[], []]); function GetAttRule(user) { const fillZero = (timeStr) => timeStr + ':00'; return new Promise((resolve, reject) => { try { getAttendanceSegment(user.unitId).then(res => { console.log('getAttendanceSegment', res); const result = res.returnParams.find(item => item.segment_status == "1"); const { startTimeAm, endTimeAm, startTimePm, endTimePm } = getStartAndEndTime(result.work_time); getAttendanceRule(user.unitId).then(res => { // 找到正在用的考勤规则 const attRule = res.returnParams.Rows.find(item => item.rule_status == "1"); // 上午签到时间范围 signInTimeRange.value[0] = [addMinutesToTime(startTimeAm, -attRule.on_advance_num), fillZero(startTimeAm)]; // 上午签退时间范围 signOutTimeRange.value[0] = [fillZero(endTimeAm), addMinutesToTime(endTimeAm, attRule.off_delay_num)]; // 上午迟到时间范围 lateTimeRange.value[0] = [fillZero(startTimeAm), addMinutesToTime(startTimeAm, attRule.late_num)]; // 上午早退时间范围 earlyTimeRange.value[0] = [addMinutesToTime(endTimeAm, -attRule.eary_num), fillZero(endTimeAm)]; if(startTimePm){ // 下午签到时间范围 signInTimeRange.value[1] = [addMinutesToTime(startTimePm, -attRule.on_advance_num), fillZero(startTimePm)]; // 下午签退时间范围 signOutTimeRange.value[1] = [fillZero(endTimePm), addMinutesToTime(endTimePm, attRule.off_delay_num)]; // 下午迟到时间范围 lateTimeRange.value[1] = [fillZero(startTimePm), addMinutesToTime(startTimePm, attRule.late_num)]; // 下午早退时间范围 earlyTimeRange.value[1] = [addMinutesToTime(endTimePm, -attRule.eary_num), fillZero(endTimePm)]; }else{ //防止考勤设置时,没有分段设置考勤导致的异常 // 下午签到时间范围 signInTimeRange.value[1] = [addMinutesToTime(startTimeAm, -attRule.on_advance_num), fillZero(startTimeAm)]; // 下午签退时间范围 signOutTimeRange.value[1] = [fillZero(endTimeAm), addMinutesToTime(endTimeAm, attRule.off_delay_num)]; // 下午迟到时间范围 lateTimeRange.value[1] = [fillZero(startTimeAm), addMinutesToTime(startTimeAm, attRule.late_num)]; // 下午早退时间范围 earlyTimeRange.value[1] = [addMinutesToTime(endTimeAm, -attRule.eary_num), fillZero(endTimeAm)]; } resolve(); // 确保执行完成后调用 resolve }).catch(err => { console.log(' 获取考勤规则时发生错误', err); reject('getAttendanceRuleErr'); }); }).catch(err => { console.log(' 获取考勤时间段时发生错误', err); reject('getAttendanceSegmentErr'); }); } catch (err) { console.error(' 处理考勤数据时发生错误', err); reject(err); } }); } // 获取当天的上午上班、上午下班、下午上班和下午下班时间 function getStartAndEndTime(timeString) { // 去除最后一个分号 timeString = timeString.trim().replace(/;$/, ''); const periods = timeString.split(';'); let startTimeAm = null; let endTimeAm = null; let startTimePm = null; let endTimePm = null; // 遍历每个时间段 for (let period of periods) { if (period) { // 确保不是空字符串 const [start, end] = period.split(',').map(time => time.trim()); const startHour = parseInt(start.split(':')[0]); if (startHour < 12) { // 上午时间段 if (!startTimeAm || start < startTimeAm) { startTimeAm = start; } if (!endTimeAm || end > endTimeAm) { endTimeAm = end; } } else { // 下午时间段 if (!startTimePm || start < startTimePm) { startTimePm = start; } if (!endTimePm || end > endTimePm) { endTimePm = end; } } } } return { startTimeAm, endTimeAm, startTimePm, endTimePm }; } // 处理时间运算 function addMinutesToTime(timeStr, minutesToAdd) { const [hours, minutes] = timeStr.split(':').map(Number); let date = new Date(); date.setHours(hours); date.setMinutes(minutes); // 添加分钟数 date.setMinutes(date.getMinutes() + minutesToAdd); // 获取新的小时和分钟值,确保它们是两位数格式 const newHours = String(date.getHours()).padStart(2, '0'); const newMinutes = String(date.getMinutes()).padStart(2, '0'); // 返回格式化后的新时间字符串 return `${newHours}:${newMinutes}:00`; } return { signInTimeRange, signOutTimeRange, lateTimeRange, earlyTimeRange, GetAttRule } })