diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/scanHandle/CultureScanHandle.java b/src/main/java/com/budwk/app/zhgh/activity/culture/scanHandle/CultureScanHandle.java index 1cd0177..2ef1e0f 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/scanHandle/CultureScanHandle.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/scanHandle/CultureScanHandle.java @@ -13,7 +13,9 @@ import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.ActionContext; +import javax.servlet.http.HttpServletRequest; import java.util.Map; /** diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/mobile/TrainScanCodeController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/mobile/TrainScanCodeController.java new file mode 100644 index 0000000..404a1e3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/mobile/TrainScanCodeController.java @@ -0,0 +1,100 @@ +package com.budwk.app.zhgh.activity.trainSignUp.controller.mobile; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DateUtil; +import com.aspose.slides.internal.og.add; +import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpCourse; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUser; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @ClassName TrainScanCodeController + * @Author JyuHsin + * @Date 2026/3/3 13:53 + * @Version 1.0 + * @Description TODO + */ +@IocBean +@Ok("json:full") +@At("/platform/mobile/train/scanCode") +public class TrainScanCodeController { + + @Inject + private Dao dao; + + @At("") + @Ok("beetl:/platform/zhghh5/activity/trainSignUp/scanCode/index.html") + @SaCheckPermission("h5.trainSignUp.sign") + public void scanCode() { + } + + @At + @SaCheckPermission("h5.trainSignUp.sign") + public Result getSignData(@Param("courseId") String courseId) { + TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId); + int count = dao.count(TrainSignUpUserCourse.class, + Cnd.where("activityId", "=", course.getActivityId()) + .and("userId", "=", SecurityUtil.getUserId()) + .and("isAttend", "=", true) + ); + Map resultMap = Map.of("signCount", count); + + // 查询用户是有报名记录 + TrainSignUpUserCourse userCourse = dao.fetch(TrainSignUpUserCourse.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId())); + if (userCourse == null) { + return Result.error(99, "您没有权限签到").addData(resultMap); + } + if (userCourse.isAttend()) { + return Result.error(99, "此点位,您已经签到").addData(resultMap); + } + + userCourse.setAttend(true); + userCourse.setAttendTime(DateUtil.date()); + + dao.update(userCourse); + count = count + 1; + return Result.success("签到成功").addData(Map.of("signCount", count)); + } + + @At + @SaCheckPermission("h5.trainSignUp.sign") + public Result saveAddress(@Param("courseId") String courseId, + @Param("name") String name, + @Param("tel") String tel, + @Param("province") String province, + @Param("city") String city, + @Param("county") String county, + @Param("addressDetail") String addressDetail) { + + TrainSignUpUser signUpUser = dao.fetch(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId())); + + List mobileColumnsValue = new ArrayList<>(); + + Map nameMap = Map.of("columnCode", "name", "columnName", "姓名", "columnValue", name, "columnFormType", "INPUT"); + mobileColumnsValue.add(NutMap.WRAP(nameMap)); + Map telMap = Map.of("columnCode", "tel", "columnName", "电话", "columnValue", tel, "columnFormType", "INPUT"); + mobileColumnsValue.add(NutMap.WRAP(telMap)); + + String address = province + city + county + addressDetail; + Map addressMap = Map.of("columnCode", "address", "columnName", "收货地址", "columnValue", address, "columnFormType", "INPUT"); + mobileColumnsValue.add(NutMap.WRAP(addressMap)); + + signUpUser.setMobileColumnsValue(mobileColumnsValue); + dao.update(signUpUser); + return Result.success("保存成功"); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/scanHandle/TrainScanHandle.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/scanHandle/TrainScanHandle.java new file mode 100644 index 0000000..d86792a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/scanHandle/TrainScanHandle.java @@ -0,0 +1,52 @@ +package com.budwk.app.zhgh.activity.trainSignUp.scanHandle; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.result.Result; +import com.budwk.app.sys.views.View_user; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.culture.models.ActivityTissue; +import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse; +import com.budwk.app.zhgh.scan.core.ScanHandler; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.view.ForwardView; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * @ClassName TrainScanHandle + * @Author JyuHsin + * @Date 2025/12/30 15:43 + * @Version 1.0 + * @Description TODO + */ +@IocBean +public class TrainScanHandle implements ScanHandler { + + @Inject + private Dao dao; + + @Override + public String getBizType() { + return "train"; + } + + @Override + public Object handle(Map params) { + try { + // 获取参数 + String courseId = params.get("courseId").toString(); + + return Result.success().addData("/platform/mobile/train/scanCode?courseId=" + courseId); + } catch (Exception e) { + return Result.error("请使用智慧工会系统身份二维码"); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/scan/controller/ScanController.java b/src/main/java/com/budwk/app/zhgh/scan/controller/ScanController.java index 81770b9..d1015b3 100644 --- a/src/main/java/com/budwk/app/zhgh/scan/controller/ScanController.java +++ b/src/main/java/com/budwk/app/zhgh/scan/controller/ScanController.java @@ -4,17 +4,23 @@ import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.scan.core.ScanDispatcher; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; +import org.nutz.mvc.ActionContext; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.POST; import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.view.ForwardView; +import org.nutz.mvc.view.ServerRedirectView; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.Map; /** @@ -37,16 +43,28 @@ public class ScanController { @At("/h5") @SaCheckPermission("h5.scan") @Ok("beetl:/platform/zhghh5/scan/index.html") - public void h5Index() {} + public void h5Index() { + } @At("/handle") @Ok("json") @SaCheckLogin - public Object handle(@Param("bizType") String bizType, @Param("params") String params) { - if(StrUtil.isBlank(bizType)) { + public Object handle(@Param("biz") String biz, + @Param("params") String params, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + if (StrUtil.isBlank(biz)) { return Result.error("请使用智慧工会系统身份二维码"); } Map paramsMap = Json.fromJson(Map.class, params); - return dispatcher.dispatch(bizType, paramsMap); + String requestType = request.getHeader("request-type"); + Object dispatch = dispatcher.dispatch(biz, paramsMap); + if ("inner".equals(requestType)) { + return dispatch; + } else { + Result result = (Result) dispatch; + new ServerRedirectView(Globals.AppDomain + result.getData().toString()).render(request, response, null); + return null; + } } } diff --git a/src/main/java/com/budwk/app/zhgh/scan/core/ScanDispatcher.java b/src/main/java/com/budwk/app/zhgh/scan/core/ScanDispatcher.java index c7fb82d..0508d6e 100644 --- a/src/main/java/com/budwk/app/zhgh/scan/core/ScanDispatcher.java +++ b/src/main/java/com/budwk/app/zhgh/scan/core/ScanDispatcher.java @@ -1,9 +1,12 @@ package com.budwk.app.zhgh.scan.core; +import org.checkerframework.checker.units.qual.C; import org.nutz.ioc.Ioc; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.ActionContext; +import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/budwk/app/zhgh/scan/core/ScanHandler.java b/src/main/java/com/budwk/app/zhgh/scan/core/ScanHandler.java index 3a79f8a..6c6bdf9 100644 --- a/src/main/java/com/budwk/app/zhgh/scan/core/ScanHandler.java +++ b/src/main/java/com/budwk/app/zhgh/scan/core/ScanHandler.java @@ -1,5 +1,8 @@ package com.budwk.app.zhgh.scan.core; +import org.nutz.mvc.ActionContext; + +import javax.servlet.http.HttpServletRequest; import java.util.Map; /** diff --git a/src/main/resources/views/layouts/platform.html b/src/main/resources/views/layouts/platform.html index e89f62c..c3c181c 100644 --- a/src/main/resources/views/layouts/platform.html +++ b/src/main/resources/views/layouts/platform.html @@ -72,6 +72,8 @@ + + diff --git a/src/main/resources/views/platform/zhgh/activity/trainSingUp/manage/index.html b/src/main/resources/views/platform/zhgh/activity/trainSingUp/manage/index.html index 0f47aa6..d690c03 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSingUp/manage/index.html +++ b/src/main/resources/views/platform/zhgh/activity/trainSingUp/manage/index.html @@ -121,7 +121,7 @@ layout("/layouts/platform.html"){ - + @@ -222,11 +222,14 @@ layout("/layouts/platform.html"){ this.courseDialog = true }, makeCourseCode(row) { - const o = { + const params = { courseId: row.id } + const encodedParams = encodeURIComponent(JSON.stringify(params)); + const codeAddress = "${AppDomain!}" + '/platform/scan/handle?biz=train¶ms=' + encodedParams + console.log(codeAddress) // 生成二维码的 base64 编码 - const content = jrQrcode.getQrBase64(JSON.stringify(o)) + const content = jrQrcode.getQrBase64(codeAddress) let image = new Image() image.src = content let viewer = new Viewer(image) diff --git a/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scanCode/index.html b/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scanCode/index.html new file mode 100644 index 0000000..441d162 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/trainSignUp/scanCode/index.html @@ -0,0 +1,118 @@ + + + +
+ +
+
+ + +
+
+
温馨提醒
+
+
+
+ + + +
+ + + diff --git a/src/main/resources/views/platform/zhghh5/scan/index.html b/src/main/resources/views/platform/zhghh5/scan/index.html index 18cac95..01e2a2d 100644 --- a/src/main/resources/views/platform/zhghh5/scan/index.html +++ b/src/main/resources/views/platform/zhghh5/scan/index.html @@ -95,6 +95,9 @@ layout("/layouts/platform_h5.html"){ .weui-msg__icon-area { margin-bottom: 20px; } + /*.result-dialog .van-dialog__footer { + display: none !important; + }*/
@@ -118,22 +121,33 @@ layout("/layouts/platform_h5.html"){ 点击扫描
- -
-
- - -
-
-
查询结果
-
+ +
+ +
+
+ +
@@ -148,14 +162,30 @@ layout("/layouts/platform_h5.html"){ scanStatus: false, html5QrCode: null, isProcessing: false, // 防止重复处理 + decodedText: null, resultVisible: false, - result: null, + jumpUrl: '/platform/mobile/train/scanCode', - decodedText: null, + iframeLoading: true, // iframe加载状态 + iframeError: false // iframe加载失败 + } + }, + computed: { + // 自动拼接完整URL,解决相对路径问题 + fullJumpUrl() { + if (!this.jumpUrl) return ''; + // 拼接当前页面的域名(如https://你的域名) + return this.jumpUrl.startsWith('http') + ? this.jumpUrl + : window.location.origin + this.jumpUrl; } }, methods: { + resultConfirm() { + this.isProcessing = false + this.resultVisible = false + }, async initCamera() { try { const devices = await Html5Qrcode.getCameras() @@ -251,48 +281,79 @@ layout("/layouts/platform_h5.html"){ this.isProcessing = true; await this.closeScan() - const { bizType, userId } = JSON.parse(decodedText) - this.result = await this.$axios.post('/platform/scan/handle', { - bizType: bizType, - params: JSON.stringify({ userId: userId, handle: false }), + const res = await this.$axios.post(decodedText, {}, { + headers: { 'request-type': 'inner' } // 标记为内部请求 }) - } catch (e) { - this.result = { - code: 99, - msg: '请使用智慧工会系统身份二维码' + .catch(e => { + this.$toast('请扫描智慧工会系统二维码') + }) + if(res && res.code === 0) { // 增加res判空,避免报错 + this.jumpUrl = res.data; + this.iframeLoading = true; // 重置加载状态 + this.iframeError = false; + this.resultVisible = true; // 显示弹窗(自动加载iframe) } + } catch (e) { + this.$toast('请扫描智慧工会系统二维码') } finally { - this.resultVisible = true + } }, - async resultConfirm() { - try { - const {bizType, userId} = JSON.parse(this.decodedText) - const res = await this.$axios.post('/platform/scan/handle', { - bizType: bizType, - params: JSON.stringify({userId: userId, handle: true}), - }) - if(res.code === 0) { - this.$toast.success(res.msg) + resizeIframe(height) { + this.$nextTick(() => { + const iframe = document.querySelector('iframe'); + if (iframe) { + // 如果传入了高度,用子页面的实际高度;否则用默认高度 + iframe.style.height = height || '400px'; + // 移除固定高度,改用动态值 + iframe.height = ''; // 清空原生height属性,优先用style } - } catch (e) { + }); + }, - } finally { - this.isProcessing = false; - this.initCamera() + // iframe加载失败处理 + handleIframeError() { + this.iframeLoading = false; + this.iframeError = true; + this.$toast('页面加载失败,请重试'); + }, + + // 弹窗关闭时清理iframe + handleDialogClose() { + this.jumpUrl = ''; + this.iframeLoading = true; + this.iframeError = false; + // 清空iframe内容,避免缓存 + const iframe = document.querySelector('iframe'); + if (iframe) iframe.src = 'about:blank'; + }, + + handleIframeMessage(event) { + const allowedOrigins = [window.location.origin, 'null']; // 允许about:blank + if (!allowedOrigins.includes(event.origin)) { + console.warn('拒绝接收非信任域名的消息:', event.origin); + return; } + + const { type, data } = event.data; + if (type === 'confirm') { + this.isProcessing = false + this.resultVisible = false + } + console.log('收到子页面消息:', type, data); } }, - async created() { await this.initCamera() + //this.resultVisible = true + window.addEventListener('message', this.handleIframeMessage); }, - beforeDestroy() { if (this.scanStatus) { this.closeScan(); } + window.removeEventListener('message', this.handleIframeMessage); } }); diff --git a/src/main/resources/views/platform/zhghh5/scan/index1.html b/src/main/resources/views/platform/zhghh5/scan/index1.html new file mode 100644 index 0000000..18cac95 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/scan/index1.html @@ -0,0 +1,301 @@ + + + + +
+ + + + +
+ +
+ +
+ + +
+ +
+ + + + +
+
+ + +
+
+
查询结果
+
+
+
+
+ +
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/sys/home/mine.js b/src/main/resources/views/platform/zhghh5/sys/home/mine.js index 08fa82b..1db678b 100644 --- a/src/main/resources/views/platform/zhghh5/sys/home/mine.js +++ b/src/main/resources/views/platform/zhghh5/sys/home/mine.js @@ -134,6 +134,7 @@ const mine = { }) }, codeValid() { + return true if(this.$store.state.user.member === true || ['年薪制', '境外聘用', '劳务派遣一类', '劳务派遣二类'].includes(this.$store.state.user.preparedBy)) { return true } @@ -141,7 +142,13 @@ const mine = { }, qrCode() { this.codeVisible = true - this.codeAddress = JSON.stringify({userId: this.$store.state.user.id, bizType: 'culture'}) + //this.codeAddress = JSON.stringify({userId: this.$store.state.user.id, bizType: 'culture'}) + const params = { + loginName: this.$store.state.user.loginname, + } + const encodedParams = encodeURIComponent(JSON.stringify(params)); + this.codeAddress = "${AppDomain!}" + '/platform/scan/handle?biz=culture¶ms=' + encodedParams + console.log(this.codeAddress) }, }, style() {