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