From 0de8ee923271c076d4c09134478e4ccaeefe5155 Mon Sep 17 00:00:00 2001 From: zhangrui Date: Wed, 4 Nov 2026 13:42:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=98=89=E5=85=B4=E5=AD=A6?= =?UTF-8?q?=E9=99=A2=E7=9A=84=E7=AD=BE=E5=88=B0=E5=AE=9A=E4=BD=8D=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/TrainsignUpMineController.java | 40 +- .../service/TrainSignUpActivityService.java | 14 +- .../impl/TrainSignUpActivityServiceImpl.java | 47 ++- .../activity/trainSignUp/scan/index.html | 363 ++++++++++++++---- 4 files changed, 358 insertions(+), 106 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainsignUpMineController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainsignUpMineController.java index 57d23a2..435d174 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainsignUpMineController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainsignUpMineController.java @@ -76,6 +76,7 @@ public class TrainsignUpMineController { @Aop(TransAop.READ_COMMITTED) @SaCheckPermission(value = {"trainSignUp.mine", "h5.trainSignUp.mine"}, mode = SaMode.OR) @SLog(tag = "品牌活动-活动签到", msg = "主动扫码签到") + // courseId为二维码点位ID,lat/lng为腾讯GCJ-02纬度/经度;Result返回签到结果及扩展进度。 public Result drivingScan(String courseId, Double lat, Double lng) { TrainSignUpCourse extensionCourse = dao.fetch(TrainSignUpCourse.class, courseId); TrainSignUpActivity extensionActivity = extensionCourse == null ? null @@ -90,41 +91,12 @@ public class TrainsignUpMineController { } } - // 主动扫码签到是用户自己打开扫一扫,扫二维码签到 - int count = dao.count(TrainSignUpUserCourse.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId())); - if (count == 0) { - return Result.error(99, "未查询到您的报名记录"); + try { + activityService.handleLegacyScanCodeSign(courseId, SecurityUtil.getUserId(), lat, lng); + return Result.success("签到成功"); + } catch (IllegalArgumentException e) { + return Result.error(99, e.getMessage()); } - - TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId); - List coordinates = course.getTransPosition(); - int minute = course.getSignUnit() != null ? course.getSignUnit() : 0; - int radius = course.getRadius() != null ? course.getRadius() : 100; - - boolean flag = true; - // 获取现在的日期,并根据设置的数据 - List timeList = dao.query(TrainSignUpUserCourse.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId())); - for (TrainSignUpUserCourse userCourse : timeList) { - DateTime startTime = DateUtil.offsetMinute(userCourse.getCourseStartTime(), -minute); - DateTime endTime = DateUtil.offsetMinute(userCourse.getCourseEndTime(), minute); - if(DateUtil.isIn(DateUtil.date(), startTime, endTime)) { - userCourse.setAttend(true); - userCourse.setAttendTime(DateUtil.date()); - flag = false; - } - } - if(flag) { - return Result.error(99, "未到签到时间"); - } - - double distance = DistanceUtil.getDistance(coordinates.get(0), coordinates.get(1), lat, lng); - if(distance > radius) { - return Result.error(99, "签到失败,您距离签到点还有%.1f米".formatted(distance - radius)); - } - - dao.update(timeList); - - return Result.success("签到成功"); } /** diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java index 4520b6b..6984a63 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java @@ -149,12 +149,22 @@ public interface TrainSignUpActivityService extends BaseService records = dao().query(TrainSignUpUserCourse.class, Cnd.where("activityId", "=", activity.getId()).and("courseId", "=", courseId) @@ -846,12 +846,17 @@ public class TrainSignUpActivityServiceImpl extends BaseServiceImpl coordinates, Double latitude, Double longitude, int radius) { - if (!validCoordinates(coordinates)) { + if (!validCoordinates(coordinates) || Math.abs(coordinates.get(0)) > 90 || Math.abs(coordinates.get(1)) > 180 + || radius <= 0) { throw new IllegalArgumentException("当前点位未配置有效签到坐标"); } - if (latitude == null || longitude == null || !Double.isFinite(latitude) || !Double.isFinite(longitude)) { + if (latitude == null || longitude == null || !Double.isFinite(latitude) || !Double.isFinite(longitude) + || Math.abs(latitude) > 90 || Math.abs(longitude) > 180) { throw new IllegalArgumentException("请先获取当前定位后再签到"); } double distance = com.budwk.app.base.utils.DistanceUtil.getDistance(coordinates.get(0), coordinates.get(1), latitude, longitude); @@ -860,6 +865,40 @@ public class TrainSignUpActivityServiceImpl extends BaseServiceImpl records = dao().query(TrainSignUpUserCourse.class, + Cnd.where("courseId", "=", courseId).and("userId", "=", userId)); + if (records.isEmpty()) { + throw new IllegalArgumentException("未查询到您的报名记录"); + } + requireScanCodeLocation(course.getCourseLocationCoordinates(), latitude, longitude, effectiveRadius(course)); + Date now = new Date(); + int minute = course.getSignUnit() == null ? 0 : course.getSignUnit(); + List available = records.stream().filter(record -> + record.getCourseStartTime() != null && record.getCourseEndTime() != null + && !now.before(DateUtil.offsetMinute(record.getCourseStartTime(), -minute)) + && !now.after(DateUtil.offsetMinute(record.getCourseEndTime(), minute))).toList(); + if (available.isEmpty()) { + throw new IllegalArgumentException("未到签到时间"); + } + for (TrainSignUpUserCourse record : available) { + // 重复请求保留首次签到时间,不改写其他课次。 + if (!record.isAttend()) { + record.setAttend(true); + record.setAttendTime(now); + dao().update(record); + } + } + } + private boolean isEmptyDynamicValue(Object value) { return value == null || value instanceof String && StrUtil.isBlank((String) value) || value instanceof Collection && ((Collection) value).isEmpty(); diff --git a/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scan/index.html b/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scan/index.html index 14f50f8..c85df36 100644 --- a/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scan/index.html +++ b/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scan/index.html @@ -13,6 +13,9 @@ layout("/layouts/platform_h5.html"){ .sign-message.success { color: #07c160; } .sign-message.error { color: #ee0a24; } .sign-actions { display: grid; gap: 12px; } + .location-panel { padding: 12px 16px; background: #fff; } + .location-tools { display: flex; align-items: center; justify-content: space-between; gap: 12px; } + .location-message { color: #606773; font-size: 13px; overflow-wrap: anywhere; } .point-list { max-height: 54vh; overflow-y: auto; } .point-row { display: flex; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid #f0f1f3; } .point-row small { display: block; margin-top: 4px; color: #969799; } @@ -26,6 +29,17 @@ layout("/layouts/platform_h5.html"){
+
+
+ {{locationMessage}} + {{mapReady ? '重新定位' : '重新加载地图'}} +
+
+ 距签到地点约 {{Math.ceil(distance)}} 米,签到范围 {{signRadius}} 米 +
+