|
|
@@ -375,7 +375,9 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
|
|
|
* <p>
|
|
|
* 二维码内容格式:「设备编码 [分隔符] 时间」
|
|
|
* 设备编码部分必须等于 task.punchDeviceCode(开启扫码打卡时必填)
|
|
|
- * 时间部分必须是 yyyy-MM-dd HH:mm:ss 格式,误差 ±24h 内视为有效
|
|
|
+ * 时间部分必须是 yyyy-MM-dd HH:mm:ss 格式,必须落在
|
|
|
+ * [scanStartTime, scanStartTime + scanIntervalSec] 窗口内
|
|
|
+ * (二维码每 scanIntervalSec 秒切换一次,扫码时这个时间戳应落在当前窗口)
|
|
|
*/
|
|
|
@Override
|
|
|
public boolean verifyQrCode(Long taskId, String qrCode) {
|
|
|
@@ -403,20 +405,32 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
|
|
|
taskId, task.getPunchDeviceCode(), deviceCode);
|
|
|
return false;
|
|
|
}
|
|
|
- // 2. 校验时间(误差 ±24 小时)
|
|
|
+ // 2. 校验时间(必须落在 [scanStartTime, scanStartTime+scanIntervalSec] 窗口内)
|
|
|
+ Date qrTime;
|
|
|
try {
|
|
|
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- Date qrTime = sdf.parse(timeStr);
|
|
|
- long diffMs = Math.abs(System.currentTimeMillis() - qrTime.getTime());
|
|
|
- long oneDayMs = 24L * 60 * 60 * 1000;
|
|
|
- if (diffMs > oneDayMs) {
|
|
|
- log.warn("二维码时间超出有效期: taskId={}, qrTime={}", taskId, timeStr);
|
|
|
- return false;
|
|
|
- }
|
|
|
+ qrTime = sdf.parse(timeStr);
|
|
|
} catch (java.text.ParseException e) {
|
|
|
log.warn("二维码时间格式不合法: taskId={}, timeStr={}", taskId, timeStr);
|
|
|
return false;
|
|
|
}
|
|
|
+ if (task.getScanStartTime() == null) {
|
|
|
+ // 未配置开启时间(老任务):放行(向下兼容)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ long windowStart = task.getScanStartTime().getTime();
|
|
|
+ // 间隔默认 1800 秒;0/负数视为 1800(兜底)
|
|
|
+ int interval = task.getScanIntervalSec() == null || task.getScanIntervalSec() <= 0
|
|
|
+ ? 1800 : task.getScanIntervalSec();
|
|
|
+ long windowEnd = windowStart + interval * 1000L;
|
|
|
+ long qrMs = qrTime.getTime();
|
|
|
+ if (qrMs < windowStart || qrMs > windowEnd) {
|
|
|
+ log.warn("二维码时间不在有效窗口内: taskId={}, qrTime={}, window=[{}, {}]",
|
|
|
+ taskId, timeStr,
|
|
|
+ new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(windowStart)),
|
|
|
+ new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(windowEnd)));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
|