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";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|