package cn.iocoder.yudao.module.ums.service.application; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import cn.iocoder.yudao.module.system.service.auth.WxcpMembershipRegistration; import cn.iocoder.yudao.module.ums.dal.dataobject.application.UmsApplicationDO; import cn.iocoder.yudao.module.ums.dal.mysql.application.UmsApplicationMapper; import cn.iocoder.yudao.module.ums.dal.redis.UmsNoRedisDAO; import cn.iocoder.yudao.module.ums.enums.UmsApplicationStatusEnum; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.UUID; @Service public class WxcpMembershipRegistrationImpl implements WxcpMembershipRegistration { @Resource private UmsApplicationMapper mapper; @Resource private UmsNoRedisDAO noRedisDAO; @Resource private BpmProcessInstanceApi processInstanceApi; @Resource private AdminUserService userService; @Resource private PermissionService permissionService; @Override public boolean hasPendingApplication(String openid) { UmsApplicationDO application = mapper.selectOne(new LambdaQueryWrapperX() .eq(UmsApplicationDO::getWxcpOpenid, openid)); return application != null && !UmsApplicationStatusEnum.APPROVED.getStatus().equals(application.getStatus()); } @Override @Transactional(rollbackFor = Exception.class) @DataPermission(enable = false) public void startIfAbsent(String openid, String nickname, String mobile) { if (StrUtil.isBlank(openid)) throw new IllegalArgumentException("企业微信身份为空"); UmsApplicationDO existing = mapper.selectOne(new LambdaQueryWrapperX() .eq(UmsApplicationDO::getWxcpOpenid, openid)); if (existing != null) { // 兼容旧版本首次扫码产生的草稿;已在审批或已结束的申请不重复发起。 if (UmsApplicationStatusEnum.DRAFT.getStatus().equals(existing.getStatus()) && StrUtil.isBlank(existing.getProcessInstanceId())) { existing.setStatus(UmsApplicationStatusEnum.APPROVING.getStatus()); if (StrUtil.isBlank(existing.getMemberGrade())) existing.setMemberGrade("1"); if (StrUtil.isBlank(existing.getContactPhone()) && StrUtil.isNotBlank(mobile) && mobile.trim().matches("^1[3-9]\\d{9}$")) existing.setContactPhone(mobile.trim()); int claimed = mapper.update(null, new LambdaUpdateWrapper() .eq(UmsApplicationDO::getId, existing.getId()) .eq(UmsApplicationDO::getStatus, UmsApplicationStatusEnum.DRAFT.getStatus()) .set(UmsApplicationDO::getStatus, UmsApplicationStatusEnum.APPROVING.getStatus()) .set(UmsApplicationDO::getMemberGrade, existing.getMemberGrade()) .set(UmsApplicationDO::getContactPhone, existing.getContactPhone())); if (claimed == 1) startProcess(existing); } return; } UmsApplicationDO application = new UmsApplicationDO(); application.setNo(noRedisDAO.generate(UmsNoRedisDAO.APPLICATION_NO_PREFIX)); application.setWxcpOpenid(openid); application.setApplicantName(StrUtil.maxLength(StrUtil.blankToDefault(nickname, "待完善"), 64)); application.setMemberType(1); application.setMemberGrade("1"); if (StrUtil.isNotBlank(mobile) && mobile.trim().matches("^1[3-9]\\d{9}$")) { application.setContactPhone(mobile.trim()); } application.setStatus(UmsApplicationStatusEnum.APPROVING.getStatus()); mapper.insert(application); startProcess(application); } private void startProcess(UmsApplicationDO application) { Long initiatorId = getServiceUserId(); String processId = processInstanceApi.createProcessInstance(initiatorId, new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey("ums_membership_approve") .setBusinessKey(String.valueOf(application.getId()))); mapper.updateById(new UmsApplicationDO().setId(application.getId()).setProcessInstanceId(processId)); } private Long getServiceUserId() { String username = "wxcpservice"; AdminUserDO existing = userService.getUserByUsername(username); if (existing != null) { if (cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.isDisable(existing.getStatus())) throw new IllegalStateException("入会审批服务账号已停用"); if (!"仅用于系统自动发起入会审批".equals(existing.getRemark()) || !permissionService.getUserRoleIdListByUserId(existing.getId()).isEmpty()) throw new IllegalStateException("入会审批服务账号配置不符合要求,请联系管理员核查"); return existing.getId(); } UserSaveReqVO req = new UserSaveReqVO(); req.setUsername(username); req.setNickname("入会审批服务"); req.setPassword(UUID.randomUUID().toString().replace("-", "").substring(0, 16)); req.setPostIds(Collections.emptySet()); req.setRoleIds(Collections.emptySet()); req.setRemark("仅用于系统自动发起入会审批"); return userService.createUser(req); } }