135 lines
5.9 KiB
Java
135 lines
5.9 KiB
Java
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<MemberResponse> createMember(MemberCreateRequest request) {
|
|
log.info("创建会员: phone={}", request.getPhone());
|
|
|
|
return memberRepository.findByPhoneAndDeletedAtIsNull(request.getPhone())
|
|
.flatMap(existingMember -> Mono.<Member>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<MemberResponse> 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<MemberResponse> 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<MemberResponse> 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<Void> 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();
|
|
}
|
|
}
|