云
5 天以前 d0cf2cb2c352bdeb146aad2bb57ba7d39cef3bbd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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);
    }
}