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.archive.api.document.ArchiveDocumentApi; import cn.iocoder.yudao.module.archive.api.document.dto.ArchiveDocumentCreateReqDTO; import cn.iocoder.yudao.module.archive.api.document.dto.ArchiveDocumentRespDTO; import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; import cn.iocoder.yudao.module.ums.controller.admin.member.vo.UmsMemberPageReqVO; import cn.iocoder.yudao.module.ums.controller.admin.member.vo.UmsMemberSaveReqVO; import cn.iocoder.yudao.module.ums.dal.dataobject.application.UmsApplicationDO; import cn.iocoder.yudao.module.ums.dal.dataobject.member.UmsMemberDO; import cn.iocoder.yudao.module.ums.dal.mysql.member.UmsMemberMapper; import cn.iocoder.yudao.module.ums.dal.redis.UmsNoRedisDAO; 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.LocalDate; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.ums.enums.ErrorCodeConstants.*; @Service @Validated @Slf4j public class UmsMemberServiceImpl implements UmsMemberService { /** * 会员系统账号默认部门 ID(system_dept 中「学会会员」) */ private static final Long MEMBER_DEPT_ID = 129L; /** * 普通会员角色 ID(system_role「普通会员」) * *
该角色只分配「我的资料」菜单,不包含档案管理等后台菜单,用于实现权限隔离。
*/
private static final Long MEMBER_ROLE_ID = 9100L;
public static final String MEMBER_RECORD_TYPE = "ums_member";
/** 会员状态:正常(可归档) */
private static final Integer MEMBER_STATUS_NORMAL = 1;
/** 归档来源类型:3-会员(对应 archive 模块 source_type) */
private static final Integer ARCHIVE_SOURCE_TYPE_MEMBER = 3;
/** 归档密级:2-内部 */
private static final Integer ARCHIVE_SECRET_LEVEL_INTERNAL = 2;
/** 会员档案分类编码(对应 archive_category.code) */
private static final String ARCHIVE_CATEGORY_CODE_MEMBER = "member";
@Resource
private UmsMemberMapper memberMapper;
@Resource
private UmsNoRedisDAO noRedisDAO;
@Resource
private AdminUserApi adminUserApi;
@Resource
private StorageAttachmentApi storageAttachmentApi;
@Resource
private ArchiveDocumentApi archiveDocumentApi;
@Override
@Transactional(rollbackFor = Exception.class)
public UmsMemberDO createMemberFromApplication(UmsApplicationDO application) {
// 1. 生成会员编号
String no = noRedisDAO.generate(UmsNoRedisDAO.MEMBER_NO_PREFIX);
if (memberMapper.selectByNo(no) != null) {
throw exception(MEMBER_NO_EXISTS);
}
// 2. 创建系统用户账号
Long userId = createSystemUser(application);
// 3. 创建会员记录
UmsMemberDO member = UmsMemberDO.builder()
.no(no)
.userId(userId)
.applicationId(application.getId())
.memberType(application.getMemberType())
.memberGrade(application.getMemberGrade())
.name(application.getApplicantName())
.contactPhone(application.getContactPhone())
.contactEmail(application.getContactEmail())
.legalPerson(application.getLegalPerson())
.organizationCode(application.getOrganizationCode())
.researchDirection(application.getResearchDirection())
.workUnit(application.getWorkUnit())
.title(application.getTitle())
.regionCode(application.getRegionCode())
.industry(application.getIndustry())
.joinDate(LocalDate.now())
.status(1) // 正常
.build();
memberMapper.insert(member);
return member;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long createMember(UmsMemberSaveReqVO createReqVO) {
String no = noRedisDAO.generate(UmsNoRedisDAO.MEMBER_NO_PREFIX);
if (memberMapper.selectByNo(no) != null) {
throw exception(MEMBER_NO_EXISTS);
}
// 会员等级与类型匹配校验
validateMemberGrade(createReqVO.getMemberType(), createReqVO.getMemberGrade());
validateFeePaid(createReqVO);
UmsMemberDO member = BeanUtils.toBean(createReqVO, UmsMemberDO.class, in -> in
.setNo(no)
.setStatus(createReqVO.getStatus() != null ? createReqVO.getStatus() : 1)
.setJoinDate(createReqVO.getJoinDate() != null ? createReqVO.getJoinDate() : LocalDate.now()));
memberMapper.insert(member);
storageAttachmentApi.bindAttachments("file", MEMBER_RECORD_TYPE,
member.getId(), createReqVO.getBlobIds());
return member.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMember(UmsMemberSaveReqVO updateReqVO) {
validateMemberExists(updateReqVO.getId());
validateMemberGrade(updateReqVO.getMemberType(), updateReqVO.getMemberGrade());
validateFeePaid(updateReqVO);
// 取消「已缴纳会费」时需要把缴费年度真正清空(updateById 会忽略 null 字段)
boolean clearFeeYear = Boolean.FALSE.equals(updateReqVO.getFeePaid());
if (clearFeeYear) {
updateReqVO.setFeeYear(null);
}
UmsMemberDO updateObj = BeanUtils.toBean(updateReqVO, UmsMemberDO.class);
memberMapper.updateById(updateObj);
if (clearFeeYear) {
memberMapper.update(null, new LambdaUpdateWrapper