package com.tourguide.modules.user.dto; import com.tourguide.modules.user.entity.MiniUser; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.time.LocalDateTime; /** 后台游客详情,消费统计字段将在订单模块接入后由聚合查询填充。 */ public class MiniUserDetailResponse { private final Long id; private final String username; private final String nickname; private final String mobile; private final String avatar; private final String realName; private final String idCardNoMasked; private final boolean realNameVerified; private final Integer status; private final LocalDateTime createdAt; private final long orderCount; private final BigDecimal totalConsumption; private final long reviewCount; private MiniUserDetailResponse(MiniUser user, long orderCount, BigDecimal totalConsumption, long reviewCount) { this.id = user.getId(); this.username = user.getUsername(); this.nickname = user.getNickname(); this.mobile = user.getMobile(); this.avatar = user.getAvatar(); this.realName = user.getRealName(); this.idCardNoMasked = maskIdCardNo(user.getIdCardNo()); this.realNameVerified = StringUtils.hasText(user.getRealName()) && StringUtils.hasText(user.getIdCardNo()); this.status = user.getStatus(); this.createdAt = user.getCreatedAt(); this.orderCount = orderCount; this.totalConsumption = totalConsumption == null ? BigDecimal.ZERO : totalConsumption; this.reviewCount = reviewCount; } public static MiniUserDetailResponse from(MiniUser user) { return from(user, 0L, BigDecimal.ZERO, 0L); } public static MiniUserDetailResponse from(MiniUser user, long orderCount, BigDecimal totalConsumption, long reviewCount) { return new MiniUserDetailResponse(user, orderCount, totalConsumption, reviewCount); } public Long getId() { return id; } public String getUsername() { return username; } public String getNickname() { return nickname; } public String getMobile() { return mobile; } public String getAvatar() { return avatar; } public String getRealName() { return realName; } public String getIdCardNoMasked() { return idCardNoMasked; } public boolean isRealNameVerified() { return realNameVerified; } public Integer getStatus() { return status; } public LocalDateTime getCreatedAt() { return createdAt; } public long getOrderCount() { return orderCount; } public BigDecimal getTotalConsumption() { return totalConsumption; } public long getReviewCount() { return reviewCount; } private static String maskIdCardNo(String idCardNo) { if (!StringUtils.hasText(idCardNo) || idCardNo.length() != 18) { return ""; } return idCardNo.substring(0, 6) + "********" + idCardNo.substring(14); } }