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<UmsApplicationDO>()
|
.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<UmsApplicationDO>()
|
.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<UmsApplicationDO>()
|
.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);
|
}
|
}
|