From 453a8d24f1035b246b91b875a4163dccab32cbc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E8=AF=9A?= <1009578407@qq.com> Date: Fri, 16 Oct 2026 17:22:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:h5=E4=BC=9A=E5=91=98=E5=85=A5=E4=BC=9A?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=B7=B2=E6=98=AF=E4=BC=9A=E5=91=98=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E3=80=81=E6=93=8D=E4=BD=9C=E6=A0=8F=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E9=9A=90=E8=97=8F=EF=BC=9Bh5=E4=BD=93?= =?UTF-8?q?=E6=A3=80=E6=A8=A1=E5=9D=97=EF=BC=9A=E4=BD=93=E6=A3=80=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E3=80=81=E6=88=91=E7=9A=84=E4=BD=93=E6=A3=80=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=8D=A1=E7=89=87=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../H5HealthCheckupController.java | 3 + .../apply/MemberApplyController.java | 100 +++++++- .../healthCheckup/list/index.html | 67 +++++- .../healthCheckup/mine/index.html | 69 +++++- .../member/apply/submit/index.html | 227 +++++++++++++++--- 5 files changed, 406 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/healthCheckup/h5controller/H5HealthCheckupController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/healthCheckup/h5controller/H5HealthCheckupController.java index be0c21cd..63b6821c 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/healthCheckup/h5controller/H5HealthCheckupController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/healthCheckup/h5controller/H5HealthCheckupController.java @@ -84,6 +84,7 @@ public class H5HealthCheckupController { Sql sql = Sqls.create(""" select *, + (select count(*) from health_checkup_project_subject subject where subject.projectId=p.id) as subjectCount, (select count(*) from health_checkup_user_selection s where s.projectId=p.id and s.selectUserId=@userId) as selectCount from health_checkup_project p @@ -121,6 +122,8 @@ public class H5HealthCheckupController { p.choiceTimeStart, p.choiceTimeEnd, p.cover, + p.healthCheckupType, + (select count(*) from health_checkup_project_subject subject where subject.projectId=p.id) as subjectCount, sub.optionName FROM health_checkup_user_selection us diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java index 90899d98..8ee03e57 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java @@ -12,6 +12,8 @@ import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; +import com.budwk.app.flow.enums.ProcessInstanceStateEnum; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.sys.models.Sys_union_group; import com.budwk.app.web.commons.auth.utils.AuthUtil; @@ -31,6 +33,7 @@ import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; @@ -87,9 +90,12 @@ public class MemberApplyController { @SaCheckPermission("member.apply.submit") @SLog(tag = "会员入会申请", msg = "提交申请,申请人: ${args[0].username}") public Result submit(@Param("data") MemberApplyRecord memberApplyRecord){ - if (StrUtil.isBlank(memberApplyRecord.getId())) { - memberCommonService.validateApplyOrChangeIsDoing(null, "apply"); + lockApplicant(); + String blockMessage = getApplyBlockMessage(currentUser(), memberApplyRecord.getId(), null); + if (StrUtil.isNotBlank(blockMessage)) { + return Result.error(blockMessage); } + memberApplyRecord.setUserId(SecurityUtil.getUserId()); // 开启流程实例 Dict args = Dict.create(); // 设置流程变量 @@ -126,9 +132,15 @@ public class MemberApplyController { @SaCheckPermission("member.apply.submit") @SLog(tag = "会员入会申请", msg = "重新提交申请,申请人: ${args[0].username}") public Result submitAgain(@Param("data") MemberApplyRecord memberApplyRecord, @Param("taskId") Long taskId) { - if (StrUtil.isBlank(memberApplyRecord.getId())) { - memberCommonService.validateApplyOrChangeIsDoing(null, "apply"); + lockApplicant(); + String blockMessage = getApplyBlockMessage(currentUser(), memberApplyRecord.getId(), taskId); + if (StrUtil.isNotBlank(blockMessage)) { + return Result.error(blockMessage); } + if (taskId == null) { + return Result.error("申请任务不存在或已处理,请勿重复提交"); + } + memberApplyRecord.setUserId(SecurityUtil.getUserId()); Dict dict = Dict.create(); // 设置流程变量 if ("HMC".equals(Globals.SchoolCode)) { @@ -190,14 +202,86 @@ public class MemberApplyController { /** - * 获取当前登录用户信息,是用来判断当前用户是否是会员 - * @return + * 获取当前登录用户信息及入会申请限制,供页面进入时提示。 + * + * @param id 当前编辑的申请ID,新申请可为空 + * @param taskId 重新提交的申请任务ID,新申请可为空 + * @return 用户资料及禁止提交的原因;合法退回重提不视为重复申请 */ @At @ApiOperation("获取当前登录用户信息") @SaCheckPermission("member.apply.submit") - public Result getSelfUserInfo() { - return Result.success(dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()))); + public Result getSelfUserInfo(String id, Long taskId) { + View_user user = currentUser(); + if (user == null) { + return Result.error("无法获取当前用户信息"); + } + NutMap data = Lang.obj2map(user, NutMap.class); + data.setv("applicationBlockMessage", getApplyBlockMessage(user, id, taskId)); + return Result.success(data); + } + + private View_user currentUser() { + return dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId())); + } + + // 在提交事务中锁定申请人,避免并发请求同时通过检查并开启多个流程。 + private void lockApplicant() { + Sql sql = Sqls.create("SELECT id FROM sys_user WHERE id=@userId FOR UPDATE"); + sql.setParam("userId", SecurityUtil.getUserId()); + sql.setCallback(Sqls.callback.records()); + dao.execute(sql); + } + + // 页面提示与提交接口共用实时校验;只放行本人退回或撤回后仍待处理的申请节点。 + private String getApplyBlockMessage(View_user user, String id, Long taskId) { + if (user == null) { + return "无法获取当前用户信息"; + } + if (user.getMember() != null && user.getMember() != 0) { + return "您已是工会会员,无需重复提交入会申请"; + } + if (StrUtil.isNotBlank(id)) { + MemberApplyRecord record = dao.fetch(MemberApplyRecord.class, id); + if (record == null || !SecurityUtil.getUserId().equals(record.getUserId())) { + return "申请记录不存在或不属于当前用户"; + } + } + Long excludedInstanceId = -1L; + if (taskId != null) { + ProcessTask task = dao.fetch(ProcessTask.class, taskId); + ProcessInstance instance = task == null ? null : dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + if (StrUtil.isBlank(id) || task == null || instance == null + || !"startTask".equals(task.getTaskName()) + || !ProcessTaskStateEnum.DOING.getCode().equals(task.getTaskState()) + || !ProcessInstanceStateEnum.DOING.getCode().equals(instance.getState()) + || !id.equals(instance.getBusinessNo())) { + return "申请任务不存在或已处理,请勿重复提交"; + } + excludedInstanceId = instance.getId(); + } + // 检查全部申请,避免较新的草稿遮蔽仍在审批中的旧申请。 + Sql sql = Sqls.create(""" + SELECT COUNT(*) + FROM member_apply_record r + INNER JOIN wf_process_instance p ON p.businessNo = r.id + WHERE r.userId = @userId AND p.state IN (@doing, @pending) + AND p.id <> @excludedInstanceId + """); + sql.setParam("userId", SecurityUtil.getUserId()); + sql.setParam("doing", ProcessInstanceStateEnum.DOING.getCode()); + sql.setParam("pending", ProcessInstanceStateEnum.PENDING.getCode()); + sql.setParam("excludedInstanceId", excludedInstanceId); + sql.setCallback(Sqls.callback.integer()); + dao.execute(sql); + if (sql.getInt() > 0) { + return "您已有入会申请正在处理中,请勿重复提交"; + } + if (taskId == null && StrUtil.isNotBlank(id) + && dao.count(ProcessInstance.class, Cnd.where("businessNo", "=", id)) > 0) { + return "该申请已提交,请勿重复提交"; + } + return null; } } diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/healthCheckup/list/index.html b/src/main/resources/views/platform/zhghh5/dayofficework/healthCheckup/list/index.html index e54a0ee8..90ea0ad0 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/healthCheckup/list/index.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/healthCheckup/list/index.html @@ -3,8 +3,45 @@ layout("/layouts/platform_h5.html"){ #-->