liujie
昨天 c983a0a398504697a777ffae48e59961b5ee2bd7
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.ruoyi.user.service.impl;
 
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.user.domain.AccountCertification;
import com.ruoyi.user.domain.AccountCertificationApply;
import com.ruoyi.user.domain.AccountUser;
import com.ruoyi.user.domain.vo.AccountCertificationApplyDetailVo;
import com.ruoyi.user.domain.vo.AccountCertificationApplyVo;
import com.ruoyi.user.mapper.AccountCertificationApplyMapper;
import com.ruoyi.user.mapper.AccountCertificationMapper;
import com.ruoyi.user.mapper.AccountUserMapper;
import com.ruoyi.user.service.IAccountCertificationApplyService;
 
/**
 * 会员主体认证申请 业务层实现
 *
 * @author ruoyi
 */
@Service
public class AccountCertificationApplyServiceImpl implements IAccountCertificationApplyService
{
    /** 审核结果:通过 */
    private static final String AUDIT_PASS = "1";
 
    /** 审核结果:驳回 */
    private static final String AUDIT_REJECT = "2";
 
    /** account_user.auth_status:已认证 */
    private static final String AUTH_VERIFIED = "2";
 
    /** account_user.auth_status:认证失败 */
    private static final String AUTH_FAILED = "3";
 
    @Autowired
    private AccountCertificationApplyMapper certificationApplyMapper;
 
    @Autowired
    private AccountCertificationMapper certificationMapper;
 
    @Autowired
    private AccountUserMapper accountUserMapper;
 
    @Override
    public List<AccountCertificationApplyVo> selectCertificationApplyList(AccountCertificationApplyVo apply)
    {
        return certificationApplyMapper.selectCertificationApplyList(apply);
    }
 
    @Override
    public AccountCertificationApplyDetailVo selectCertificationApplyDetail(Long id)
    {
        AccountCertificationApply apply = certificationApplyMapper.selectCertificationApplyById(id);
        if (StringUtils.isNull(apply))
        {
            return null;
        }
        AccountCertificationApplyDetailVo detail = new AccountCertificationApplyDetailVo();
        detail.setApply(apply);
        // 用户信息/关系取 account_user 的实时值而非申请快照:审核要看会员当下的系统等级与
        // 推荐/供货关系,这两项申请快照里根本没有。
        detail.setUser(accountUserMapper.selectAccountUserVoById(apply.getUserId()));
        return detail;
    }
 
    @Override
    @Transactional
    public int auditCertificationApply(Long id, String auditStatus, String auditRemark)
    {
        boolean pass = AUDIT_PASS.equals(auditStatus);
        if (!pass && !AUDIT_REJECT.equals(auditStatus))
        {
            throw new ServiceException("审核结果只能是「通过」或「驳回」");
        }
        // 驳回不写原因,会员端只看到「认证失败」无从修改,等于把人卡死
        if (!pass && StringUtils.isEmpty(auditRemark))
        {
            throw new ServiceException("驳回时必须填写审核意见");
        }
        AccountCertificationApply apply = certificationApplyMapper.selectCertificationApplyById(id);
        if (StringUtils.isNull(apply))
        {
            throw new ServiceException("认证申请不存在");
        }
 
        String operator = SecurityUtils.getUsername();
        AccountCertificationApply update = new AccountCertificationApply();
        update.setId(id);
        update.setAuditStatus(auditStatus);
        update.setAuditBy(operator);
        update.setAuditRemark(auditRemark);
        update.setUpdateBy(operator);
        // 更新条件带 audit_status='0',重复审核(或两人同时点)会更新 0 行,据此抛异常回滚,
        // 避免下面几步用陈旧状态把 auth_status 改错。
        if (certificationApplyMapper.auditCertificationApply(update) == 0)
        {
            throw new ServiceException("该申请已审核,不能重复处理");
        }
 
        // 同步到 account_user.auth_status:会员列表的「认证状态」列取的就是它
        AccountUser user = new AccountUser();
        user.setUserId(apply.getUserId());
        user.setAuthStatus(pass ? AUTH_VERIFIED : AUTH_FAILED);
        user.setUpdateBy(operator);
        accountUserMapper.updateUserAuthStatus(user);
 
        if (pass)
        {
            saveCertificationSnapshot(apply, operator);
        }
        return 1;
    }
 
    /**
     * 审核通过后,把申请快照落成 account_certification 的当前有效资料
     *
     * 详情页「主体资料」读的是 account_certification,不落这一步会出现
     * "审核已通过但详情页主体资料仍为空"的割裂。
     */
    private void saveCertificationSnapshot(AccountCertificationApply apply, String operator)
    {
        AccountCertification old = certificationMapper.selectCertificationByUserId(apply.getUserId());
        if (StringUtils.isNotNull(old))
        {
            // 旧行逻辑删除后新插一行,而不是原地 update:updateCertification 的 <if> 会跳过
            // 空值列,个人主体的企业字段(company_name 等为 null)会残留上一份企业资料的值。
            // 表上刻意没建 UNIQUE(user_id),本就允许留历史行。
            certificationMapper.deleteCertificationByIds(new Long[] { old.getId() });
        }
        AccountCertification certification = new AccountCertification();
        certification.setUserId(apply.getUserId());
        certification.setRealName(apply.getRealName());
        certification.setIdCard(apply.getIdCard());
        certification.setCompanyName(apply.getCompanyName());
        certification.setCreditCode(apply.getCreditCode());
        certification.setLegalPerson(apply.getLegalPerson());
        certification.setRegisteredRegion(apply.getRegisteredRegion());
        certification.setCompanyAddress(apply.getCompanyAddress());
        certification.setRegisterDate(apply.getRegisterDate());
        certification.setLicenseValidPeriod(apply.getLicenseValidPeriod());
        certification.setLicenseImage(apply.getLicenseImage());
        certification.setCreateBy(operator);
        certification.setRemark("由认证申请(申请号 " + apply.getId() + ")审核通过生成");
        certificationMapper.insertCertification(certification);
    }
}