package cn.iocoder.yudao.module.ums.service.member;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.module.ums.controller.admin.member.vo.profile.UmsMemberProfileChangePageReqVO;
|
import cn.iocoder.yudao.module.ums.controller.admin.member.vo.profile.UmsMemberProfileChangeSaveReqVO;
|
import cn.iocoder.yudao.module.ums.dal.dataobject.member.UmsMemberDO;
|
import cn.iocoder.yudao.module.ums.dal.dataobject.member.UmsMemberProfileChangeDO;
|
import cn.iocoder.yudao.module.ums.dal.mysql.member.UmsMemberMapper;
|
import cn.iocoder.yudao.module.ums.dal.mysql.member.UmsMemberProfileChangeMapper;
|
import cn.iocoder.yudao.module.ums.enums.UmsMemberProfileChangeStatusEnum;
|
import jakarta.annotation.Resource;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.validation.annotation.Validated;
|
|
import java.time.LocalDateTime;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.module.ums.enums.ErrorCodeConstants.*;
|
|
/**
|
* 会员资料变更申请 Service 实现类
|
*/
|
@Service
|
@Validated
|
@Slf4j
|
public class UmsMemberProfileChangeServiceImpl implements UmsMemberProfileChangeService {
|
|
private static final int SUMMARY_MAX_LENGTH = 1000;
|
|
@Resource
|
private UmsMemberMapper memberMapper;
|
|
@Resource
|
private UmsMemberProfileChangeMapper changeMapper;
|
|
@Override
|
public UmsMemberDO getMyProfile() {
|
return getLoginMember();
|
}
|
|
@Override
|
public UmsMemberProfileChangeDO getLatestChange() {
|
return changeMapper.selectLatestByMemberId(getLoginMember().getId());
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public Long applyChange(UmsMemberProfileChangeSaveReqVO reqVO) {
|
UmsMemberDO member = getLoginMember();
|
if (changeMapper.selectPendingByMemberId(member.getId()) != null) {
|
throw exception(MEMBER_PROFILE_CHANGE_PENDING_EXISTS);
|
}
|
String summary = buildChangeSummary(member, reqVO);
|
if (StrUtil.isBlank(summary)) {
|
throw exception(MEMBER_PROFILE_CHANGE_EMPTY);
|
}
|
UmsMemberProfileChangeDO change = BeanUtils.toBean(reqVO, UmsMemberProfileChangeDO.class, in -> in
|
.setMemberId(member.getId())
|
.setMemberNo(member.getNo())
|
.setMemberName(member.getName())
|
.setUserId(getLoginUserId())
|
.setStatus(UmsMemberProfileChangeStatusEnum.PENDING.getStatus())
|
.setChangeSummary(StrUtil.sub(summary, 0, SUMMARY_MAX_LENGTH)));
|
changeMapper.insert(change);
|
return change.getId();
|
}
|
|
@Override
|
public PageResult<UmsMemberProfileChangeDO> getChangePage(UmsMemberProfileChangePageReqVO reqVO) {
|
return changeMapper.selectPage(reqVO);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void approve(Long id) {
|
UmsMemberProfileChangeDO change = validatePendingChange(id);
|
// 显式 set 每个字段:允许把资料清空(updateById 会忽略 null)
|
memberMapper.update(null, new LambdaUpdateWrapper<UmsMemberDO>()
|
.eq(UmsMemberDO::getId, change.getMemberId())
|
.set(UmsMemberDO::getContactUser, change.getContactUser())
|
.set(UmsMemberDO::getContactPhone, change.getContactPhone())
|
.set(UmsMemberDO::getContactEmail, change.getContactEmail())
|
.set(UmsMemberDO::getWorkUnit, change.getWorkUnit())
|
.set(UmsMemberDO::getTitle, change.getTitle())
|
.set(UmsMemberDO::getResearchDirection, change.getResearchDirection())
|
.set(UmsMemberDO::getUnitIntro, change.getUnitIntro())
|
.set(UmsMemberDO::getLegalPerson, change.getLegalPerson())
|
.set(UmsMemberDO::getOrganizationCode, change.getOrganizationCode())
|
.set(UmsMemberDO::getRegionCode, change.getRegionCode())
|
.set(UmsMemberDO::getIndustry, change.getIndustry()));
|
updateAudit(change.getId(), UmsMemberProfileChangeStatusEnum.APPROVED, "审核通过");
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void reject(Long id, String remark) {
|
UmsMemberProfileChangeDO change = validatePendingChange(id);
|
if (StrUtil.isBlank(remark)) {
|
throw exception(MEMBER_PROFILE_CHANGE_REJECT_REASON_REQUIRED);
|
}
|
updateAudit(change.getId(), UmsMemberProfileChangeStatusEnum.REJECTED, StrUtil.trim(remark));
|
}
|
|
private UmsMemberDO getLoginMember() {
|
Long userId = getLoginUserId();
|
UmsMemberDO member = userId != null ? memberMapper.selectByUserId(userId) : null;
|
if (member == null) {
|
throw exception(MEMBER_PROFILE_NOT_LINKED);
|
}
|
return member;
|
}
|
|
private UmsMemberProfileChangeDO validatePendingChange(Long id) {
|
UmsMemberProfileChangeDO change = changeMapper.selectById(id);
|
if (change == null) {
|
throw exception(MEMBER_PROFILE_CHANGE_NOT_EXISTS);
|
}
|
if (!UmsMemberProfileChangeStatusEnum.PENDING.getStatus().equals(change.getStatus())) {
|
throw exception(MEMBER_PROFILE_CHANGE_STATUS_INVALID, id,
|
UmsMemberProfileChangeStatusEnum.nameOf(change.getStatus()));
|
}
|
return change;
|
}
|
|
private void updateAudit(Long id, UmsMemberProfileChangeStatusEnum status, String remark) {
|
changeMapper.updateById(new UmsMemberProfileChangeDO()
|
.setId(id)
|
.setStatus(status.getStatus())
|
.setAuditUserId(getLoginUserId())
|
.setAuditTime(LocalDateTime.now())
|
.setAuditRemark(remark));
|
}
|
|
/** 生成字段级变更摘要,供管理员审核时快速查看 */
|
private String buildChangeSummary(UmsMemberDO member, UmsMemberProfileChangeSaveReqVO reqVO) {
|
List<String> changes = new ArrayList<>();
|
appendChange(changes, "联系人", member.getContactUser(), reqVO.getContactUser());
|
appendChange(changes, "联系电话", member.getContactPhone(), reqVO.getContactPhone());
|
appendChange(changes, "邮箱", member.getContactEmail(), reqVO.getContactEmail());
|
appendChange(changes, "工作单位", member.getWorkUnit(), reqVO.getWorkUnit());
|
appendChange(changes, "职称", member.getTitle(), reqVO.getTitle());
|
appendChange(changes, "研究方向", member.getResearchDirection(), reqVO.getResearchDirection());
|
appendChange(changes, "单位简介", member.getUnitIntro(), reqVO.getUnitIntro());
|
appendChange(changes, "法定代表人", member.getLegalPerson(), reqVO.getLegalPerson());
|
appendChange(changes, "统一社会信用代码", member.getOrganizationCode(), reqVO.getOrganizationCode());
|
appendChange(changes, "地区编码", member.getRegionCode(), reqVO.getRegionCode());
|
appendChange(changes, "行业", member.getIndustry(), reqVO.getIndustry());
|
return String.join(";", changes);
|
}
|
|
private void appendChange(List<String> changes, String label, String oldValue, String newValue) {
|
String oldText = StrUtil.blankToDefault(oldValue, "-");
|
String newText = StrUtil.blankToDefault(newValue, "-");
|
if (!oldText.equals(newText)) {
|
changes.add(label + ":" + StrUtil.sub(oldText, 0, 60) + " → " + StrUtil.sub(newText, 0, 60));
|
}
|
}
|
|
}
|