feat: 支持跨天打卡和时间重叠验证

- 允许签到"最晚可延后"时间超过 23:59:59,支持员工凌晨下班打卡
  - 凌晨打卡记录自动归属前一天
  - 前后端新增提前/延后时间重叠验证,防止产生歧义时间窗口
  - 优化导出逻辑以正确处理跨天打卡记录
  - 打卡消息提示归属日期信息
This commit is contained in:
kuaifan
2026-01-06 12:31:41 +00:00
parent d4547cbe97
commit 6bdefc4f03
4 changed files with 118 additions and 23 deletions
+22 -6
View File
@@ -88,16 +88,32 @@ class UserCheckinRecord extends AbstractModel
/**
* 时间收集
* @param string $data
* @param array $times
* @param string $data 日期
* @param array $times 签到时间数组
* @param string|null $shiftStart 班次开始时间(如 "09:00"),用于判断跨天
* @return \Illuminate\Support\Collection
*/
public static function atCollect($data, $times)
public static function atCollect($data, $times, $shiftStart = null)
{
$sameTimes = array_map(function($time) use ($data) {
$shiftStartMinutes = null;
if ($shiftStart) {
$parts = explode(':', $shiftStart);
$shiftStartMinutes = intval($parts[0]) * 60 + intval($parts[1]);
}
$sameTimes = array_map(function($time) use ($data, $shiftStartMinutes) {
$parts = explode(':', $time);
$timeMinutes = intval($parts[0]) * 60 + intval($parts[1]);
// 如果签到时间早于班次开始时间,视为跨天打卡(属于次日凌晨)
$targetDate = $data;
if ($shiftStartMinutes !== null && $timeMinutes < $shiftStartMinutes) {
$targetDate = date("Y-m-d", strtotime($data . " +1 day"));
}
return [
"datetime" => "{$data} {$time}",
"timestamp" => strtotime("{$data} {$time}")
"datetime" => "{$targetDate} {$time}",
"timestamp" => strtotime("{$targetDate} {$time}")
];
}, $times);
return collect($sameTimes);