config.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { defineStore } from 'pinia'
  2. import { getAttendanceRule, getAttendanceSegment } from '@/api/mine.js'
  3. import { ref } from 'vue'
  4. export const useConfigStore = defineStore('config', () => {
  5. // 正常签到时间,分别为上午和下午
  6. const signInTimeRange = ref([[], []]);
  7. // 正常签退时间,分别为上午和下午
  8. const signOutTimeRange = ref([[], []]);
  9. // 迟到时间,分别为上午和下午
  10. const lateTimeRange = ref([[], []]);
  11. // 早退时间,分别为上午和下午
  12. const earlyTimeRange = ref([[], []]);
  13. function GetAttRule(user) {
  14. const fillZero = (timeStr) => timeStr + ':00';
  15. return new Promise((resolve, reject) => {
  16. try {
  17. getAttendanceSegment(user.unitId).then(res => {
  18. console.log('getAttendanceSegment', res);
  19. const result = res.returnParams.find(item => item.segment_status == "1");
  20. const { startTimeAm, endTimeAm, startTimePm, endTimePm } = getStartAndEndTime(result.work_time);
  21. getAttendanceRule(user.unitId).then(res => {
  22. // 找到正在用的考勤规则
  23. const attRule = res.returnParams.Rows.find(item => item.rule_status == "1");
  24. // 上午签到时间范围
  25. signInTimeRange.value[0] = [addMinutesToTime(startTimeAm, -attRule.on_advance_num), fillZero(startTimeAm)];
  26. // 上午签退时间范围
  27. signOutTimeRange.value[0] = [fillZero(endTimeAm), addMinutesToTime(endTimeAm, attRule.off_delay_num)];
  28. // 上午迟到时间范围
  29. lateTimeRange.value[0] = [fillZero(startTimeAm), addMinutesToTime(startTimeAm, attRule.late_num)];
  30. // 上午早退时间范围
  31. earlyTimeRange.value[0] = [addMinutesToTime(endTimeAm, -attRule.eary_num), fillZero(endTimeAm)];
  32. if(startTimePm){
  33. // 下午签到时间范围
  34. signInTimeRange.value[1] = [addMinutesToTime(startTimePm, -attRule.on_advance_num), fillZero(startTimePm)];
  35. // 下午签退时间范围
  36. signOutTimeRange.value[1] = [fillZero(endTimePm), addMinutesToTime(endTimePm, attRule.off_delay_num)];
  37. // 下午迟到时间范围
  38. lateTimeRange.value[1] = [fillZero(startTimePm), addMinutesToTime(startTimePm, attRule.late_num)];
  39. // 下午早退时间范围
  40. earlyTimeRange.value[1] = [addMinutesToTime(endTimePm, -attRule.eary_num), fillZero(endTimePm)];
  41. }else{
  42. //防止考勤设置时,没有分段设置考勤导致的异常
  43. // 下午签到时间范围
  44. signInTimeRange.value[1] = [addMinutesToTime(startTimeAm, -attRule.on_advance_num), fillZero(startTimeAm)];
  45. // 下午签退时间范围
  46. signOutTimeRange.value[1] = [fillZero(endTimeAm), addMinutesToTime(endTimeAm, attRule.off_delay_num)];
  47. // 下午迟到时间范围
  48. lateTimeRange.value[1] = [fillZero(startTimeAm), addMinutesToTime(startTimeAm, attRule.late_num)];
  49. // 下午早退时间范围
  50. earlyTimeRange.value[1] = [addMinutesToTime(endTimeAm, -attRule.eary_num), fillZero(endTimeAm)];
  51. }
  52. resolve(); // 确保执行完成后调用 resolve
  53. }).catch(err => {
  54. console.log(' 获取考勤规则时发生错误', err);
  55. reject('getAttendanceRuleErr');
  56. });
  57. }).catch(err => {
  58. console.log(' 获取考勤时间段时发生错误', err);
  59. reject('getAttendanceSegmentErr');
  60. });
  61. } catch (err) {
  62. console.error(' 处理考勤数据时发生错误', err);
  63. reject(err);
  64. }
  65. });
  66. }
  67. // 获取当天的上午上班、上午下班、下午上班和下午下班时间
  68. function getStartAndEndTime(timeString) {
  69. // 去除最后一个分号
  70. timeString = timeString.trim().replace(/;$/, '');
  71. const periods = timeString.split(';');
  72. let startTimeAm = null;
  73. let endTimeAm = null;
  74. let startTimePm = null;
  75. let endTimePm = null;
  76. // 遍历每个时间段
  77. for (let period of periods) {
  78. if (period) { // 确保不是空字符串
  79. const [start, end] = period.split(',').map(time => time.trim());
  80. const startHour = parseInt(start.split(':')[0]);
  81. if (startHour < 12) { // 上午时间段
  82. if (!startTimeAm || start < startTimeAm) {
  83. startTimeAm = start;
  84. }
  85. if (!endTimeAm || end > endTimeAm) {
  86. endTimeAm = end;
  87. }
  88. } else { // 下午时间段
  89. if (!startTimePm || start < startTimePm) {
  90. startTimePm = start;
  91. }
  92. if (!endTimePm || end > endTimePm) {
  93. endTimePm = end;
  94. }
  95. }
  96. }
  97. }
  98. return { startTimeAm, endTimeAm, startTimePm, endTimePm };
  99. }
  100. // 处理时间运算
  101. function addMinutesToTime(timeStr, minutesToAdd) {
  102. const [hours, minutes] = timeStr.split(':').map(Number);
  103. let date = new Date();
  104. date.setHours(hours);
  105. date.setMinutes(minutes);
  106. // 添加分钟数
  107. date.setMinutes(date.getMinutes() + minutesToAdd);
  108. // 获取新的小时和分钟值,确保它们是两位数格式
  109. const newHours = String(date.getHours()).padStart(2, '0');
  110. const newMinutes = String(date.getMinutes()).padStart(2, '0');
  111. // 返回格式化后的新时间字符串
  112. return `${newHours}:${newMinutes}:00`;
  113. }
  114. return {
  115. signInTimeRange,
  116. signOutTimeRange,
  117. lateTimeRange,
  118. earlyTimeRange,
  119. GetAttRule
  120. }
  121. })