findme-backend-merchant-java/src/main/java/com/xjhs/findmemerchant/entity/Member.java

128 lines
2.9 KiB
Java
Raw Normal View History

2026-01-09 12:20:24 +08:00
package com.xjhs.findmemerchant.entity;
import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.Comment;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 会员实体C 端用户
* 对应表members
*/
@Getter
@Setter
@Entity
@Table(
name = "members",
indexes = {
@Index(name = "idx_members_phone", columnList = "phone")
},
uniqueConstraints = {
@UniqueConstraint(
name = "idx_merchant_phone",
columnNames = {"merchant_id", "phone"}
)
}
)
public class Member extends AbstractBaseEntity {
/**
* 手机号
*/
2026-01-09 12:20:44 +08:00
@Column(name = "phone", length = 11)
2026-01-09 12:20:24 +08:00
@Comment("手机号")
private String phone;
/**
* 昵称
*/
@Column(name = "nickname", length = 50)
@Comment("昵称")
private String nickname;
/**
* 头像地址
*/
@Column(name = "avatar", length = 500)
@Comment("头像URL")
private String avatar;
/**
* 累计订单数
*/
2026-01-09 12:20:44 +08:00
@Column(name = "total_orders")
2026-01-09 12:20:24 +08:00
@Comment("累计订单数")
private Integer totalOrders = 0;
/**
* 累计消费金额
*/
2026-01-09 12:20:44 +08:00
@Column(name = "total_amount", precision = 12, scale = 2)
2026-01-09 12:20:24 +08:00
@Comment("累计消费金额")
private BigDecimal totalAmount = BigDecimal.ZERO;
/**
* 最后一次下单时间
*/
@Column(name = "last_order_at")
@Comment("最后下单时间")
private LocalDateTime lastOrderAt;
// ============ 关联关系 ============
/**
2026-01-09 12:20:44 +08:00
* 商家
2026-01-09 12:20:24 +08:00
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "merchant_id", insertable = false, updatable = false)
private Merchant merchant;
/**
* 拥有的券码
*/
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
private List<CouponCode> couponCodes;
/**
* 订单列表
*/
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
private List<Order> orders;
// ============ 业务方法 ============
/**
* 返回脱敏手机号例如138****1234
*/
public String maskPhone() {
if (phone == null || phone.length() != 11) {
return phone;
}
return phone.substring(0, 3) + "****" + phone.substring(7);
}
/**
* 展示用名称优先昵称否则使用脱敏手机号
*/
public String getDisplayName() {
if (nickname != null && !nickname.isBlank()) {
return nickname;
}
return maskPhone();
}
/**
* 返回头像URL若为空则返回默认头像
*/
public String getAvatarOrDefault() {
if (avatar != null && !avatar.isBlank()) {
return avatar;
}
return "/static/default-avatar.png";
}
}