127 lines
2.9 KiB
Java
127 lines
2.9 KiB
Java
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 {
|
||
|
||
/**
|
||
* 手机号
|
||
*/
|
||
@Column(name = "phone", length = 11)
|
||
@Comment("手机号")
|
||
private String phone;
|
||
|
||
/**
|
||
* 昵称
|
||
*/
|
||
@Column(name = "nickname", length = 50)
|
||
@Comment("昵称")
|
||
private String nickname;
|
||
|
||
/**
|
||
* 头像地址
|
||
*/
|
||
@Column(name = "avatar", length = 500)
|
||
@Comment("头像URL")
|
||
private String avatar;
|
||
|
||
/**
|
||
* 累计订单数
|
||
*/
|
||
@Column(name = "total_orders")
|
||
@Comment("累计订单数")
|
||
private Integer totalOrders = 0;
|
||
|
||
/**
|
||
* 累计消费金额
|
||
*/
|
||
@Column(name = "total_amount", precision = 12, scale = 2)
|
||
@Comment("累计消费金额")
|
||
private BigDecimal totalAmount = BigDecimal.ZERO;
|
||
|
||
/**
|
||
* 最后一次下单时间
|
||
*/
|
||
@Column(name = "last_order_at")
|
||
@Comment("最后下单时间")
|
||
private LocalDateTime lastOrderAt;
|
||
|
||
// ============ 关联关系 ============
|
||
/**
|
||
* 商家
|
||
*/
|
||
@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";
|
||
}
|
||
}
|