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 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 的 会跳过 // 空值列,个人主体的企业字段(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); } }