package com.gym.manage.application.service; import com.gym.manage.api.dto.request.MemberCreateRequest; import com.gym.manage.api.dto.request.MemberUpdateRequest; import com.gym.manage.api.dto.response.MemberResponse; import com.gym.manage.common.constant.ErrorCode; import com.gym.manage.common.exception.BusinessException; import com.gym.manage.domain.entity.Member; import com.gym.manage.domain.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; @Slf4j @Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; public Mono createMember(MemberCreateRequest request) { log.info("创建会员: phone={}", request.getPhone()); return memberRepository.findByPhoneAndDeletedAtIsNull(request.getPhone()) .flatMap(existingMember -> Mono.error( new BusinessException(ErrorCode.MEMBER_ALREADY_EXISTS, "该手机号已注册") )) .switchIfEmpty(Mono.defer(() -> { Member member = new Member(); member.setTenantId(request.getTenantId()); member.setStoreId(request.getStoreId()); member.setName(request.getName()); member.setPhone(request.getPhone()); member.setGender(request.getGender()); member.setBirthday(request.getBirthday()); member.setIdCard(request.getIdCard()); member.setEmergencyContact(request.getEmergencyContact()); member.setEmergencyPhone(request.getEmergencyPhone()); member.setLevel(request.getLevel()); member.setStatus("ACTIVE"); member.setSource(request.getSource()); member.setRemark(request.getRemark()); member.setCreatedAt(LocalDateTime.now()); member.setUpdatedAt(LocalDateTime.now()); return memberRepository.save(member); })) .map(this::toMemberResponse) .doOnSuccess(response -> log.info("会员创建成功: memberId={}", response.getId())) .doOnError(e -> log.error("会员创建失败: phone={}, error={}", request.getPhone(), e.getMessage())); } public Mono getMember(Long id) { log.info("查询会员: memberId={}", id); return memberRepository.findByIdAndDeletedAtIsNull(id) .switchIfEmpty(Mono.error(new BusinessException(ErrorCode.MEMBER_NOT_FOUND, "会员不存在"))) .map(this::toMemberResponse) .doOnSuccess(response -> log.info("查询会员成功: memberId={}", id)) .doOnError(e -> log.error("查询会员失败: memberId={}, error={}", id, e.getMessage())); } public Flux listMembers(Long tenantId, Long storeId, int page, int size) { log.info("查询会员列表: tenantId={}, storeId={}, page={}, size={}", tenantId, storeId, page, size); return memberRepository.findByTenantIdAndStoreIdAndDeletedAtIsNull( tenantId, storeId, PageRequest.of(page, size) ).map(this::toMemberResponse); } public Mono updateMember(Long id, MemberUpdateRequest request) { log.info("更新会员: memberId={}", id); return memberRepository.findByIdAndDeletedAtIsNull(id) .switchIfEmpty(Mono.error(new BusinessException(ErrorCode.MEMBER_NOT_FOUND, "会员不存在"))) .flatMap(member -> { member.setName(request.getName()); member.setGender(request.getGender()); member.setBirthday(request.getBirthday()); member.setIdCard(request.getIdCard()); member.setEmergencyContact(request.getEmergencyContact()); member.setEmergencyPhone(request.getEmergencyPhone()); member.setLevel(request.getLevel()); member.setStatus(request.getStatus()); member.setRemark(request.getRemark()); member.setUpdatedAt(LocalDateTime.now()); return memberRepository.save(member); }) .map(this::toMemberResponse) .doOnSuccess(response -> log.info("会员更新成功: memberId={}", id)) .doOnError(e -> log.error("会员更新失败: memberId={}, error={}", id, e.getMessage())); } public Mono deleteMember(Long id) { log.info("删除会员: memberId={}", id); return memberRepository.softDeleteById(id) .flatMap(rows -> { if (rows > 0) { log.info("会员删除成功: memberId={}", id); return Mono.empty(); } else { return Mono.error(new BusinessException(ErrorCode.MEMBER_NOT_FOUND, "会员不存在")); } }); } private MemberResponse toMemberResponse(Member member) { return MemberResponse.builder() .id(member.getId()) .tenantId(member.getTenantId()) .storeId(member.getStoreId()) .name(member.getName()) .phone(member.getPhone()) .gender(member.getGender()) .birthday(member.getBirthday()) .idCard(member.getIdCard()) .emergencyContact(member.getEmergencyContact()) .emergencyPhone(member.getEmergencyPhone()) .level(member.getLevel()) .status(member.getStatus()) .source(member.getSource()) .remark(member.getRemark()) .createdAt(member.getCreatedAt()) .updatedAt(member.getUpdatedAt()) .build(); } }