diff --git a/api/controller/OrderMember.go b/api/controller/OrderMember.go index d774ad3..b3d9407 100644 --- a/api/controller/OrderMember.go +++ b/api/controller/OrderMember.go @@ -264,3 +264,52 @@ func (b *OrderMember) GetOrderMemberPayStatus(c *gin.Context) { responses.OkWithData(g, c) } + +// GetOrderMemberRecentList 获取会员订单列表-最近下单 +func (b *OrderMember) GetOrderMemberRecentList(c *gin.Context) { + // 获取数据 + orderMemberDao := dao.OrderMemberDao{} + + maps := make(map[string]interface{}) + maps["order_status"] = 2 + maps["is_delete"] = 0 + maps["pay_status"] = 2 + orderMembers, err := orderMemberDao.GetOrderMemberPreloadOrderLimitList(maps, "created_at desc", 20) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := make([]*dto.OrderMemberRecentListDto, len(orderMembers)) + + userDao := dao.UserDao{} + for i, member := range orderMembers { + response := &dto.OrderMemberRecentListDto{ + OrderId: fmt.Sprintf("%d", member.OrderId), + UserId: fmt.Sprintf("%d", member.UserId), + SystemMemberId: fmt.Sprintf("%d", member.SystemMemberId), + CreatedAt: member.CreatedAt, + } + + // 获取用户数据 + maps = make(map[string]interface{}) + maps["user_id"] = member.UserId + user, err := userDao.GetUser(maps) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + response.UserName = user.UserName + + response.MemberDays = member.SystemMember.MemberDays + + // 处理时间 + createdAt := time.Time(member.CreatedAt) + response.TimeDesc = utils.TimeToAgoString(createdAt) + + g[i] = response + } + + responses.OkWithData(g, c) +} diff --git a/api/dao/OrderMember.go b/api/dao/OrderMember.go index dcab610..61459c3 100644 --- a/api/dao/OrderMember.go +++ b/api/dao/OrderMember.go @@ -185,3 +185,21 @@ func (r *OrderMemberDao) GetUserFirstTimeBuyOrderMember(userId int64) (m *model. } return m, nil } + +// GetOrderMemberOrderLimitList 获取列表-排序、限制数量 +func (r *OrderMemberDao) GetOrderMemberOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.OrderMember, err error) { + err = global.Db.Where(maps).Order(orderField).Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderMemberPreloadOrderLimitList 获取列表-加载全部关联-排序、限制数量 +func (r *OrderMemberDao) GetOrderMemberPreloadOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.OrderMember, err error) { + err = global.Db.Preload(clause.Associations).Where(maps).Order(orderField).Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dto/OrderMember.go b/api/dto/OrderMember.go index 72417cd..5443632 100644 --- a/api/dto/OrderMember.go +++ b/api/dto/OrderMember.go @@ -52,6 +52,17 @@ type OrderMemberPayStatusDto struct { ValidDate *model.LocalTime `json:"valid_date"` // 到期时间 } +// OrderMemberRecentListDto 会员订单列表-最近下单 +type OrderMemberRecentListDto struct { + OrderId string `json:"order_id"` // 主键id + UserId string `json:"user_id"` // 用户id + SystemMemberId string `json:"system_member_id"` // 会员id + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UserName string `json:"user_name"` // 用户id + MemberDays uint `json:"member_days"` // 会员天数 + TimeDesc string `json:"time_desc"` // 时间描述 +} + // GetOrderMemberListDto 列表 func GetOrderMemberListDto(m []*model.OrderMember) []*OrderMemberDto { // 处理返回值 @@ -116,6 +127,28 @@ func GetOrderMemberPayStatus(m *model.OrderMember) *OrderMemberPayStatusDto { } } +// GetOrderMemberRecentListDto 获取会员订单列表-最近下单 +func GetOrderMemberRecentListDto(m []*model.OrderMember) []*OrderMemberRecentListDto { + // 处理返回值 + responses := make([]*OrderMemberRecentListDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderMemberRecentListDto{ + OrderId: fmt.Sprintf("%d", v.OrderId), + UserId: fmt.Sprintf("%d", v.UserId), + SystemMemberId: fmt.Sprintf("%d", v.SystemMemberId), + CreatedAt: v.CreatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + // LoadSystemMember 加载会员数据 func (r *OrderMemberDto) LoadSystemMember(m *model.SystemMember) *OrderMemberDto { if m != nil { diff --git a/api/router/router.go b/api/router/router.go index cd6c40a..d515eef 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -235,6 +235,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 查询订单支付状态-单项 singleGroup.GET("/pay/status/:order_id", api.OrderSingle.GetOrderSinglePayStatus) + } // 会员订单 @@ -251,6 +252,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 查询订单支付状态-会员 memberGroup.GET("/pay/status/:order_id", api.OrderMember.GetOrderMemberPayStatus) + + // 获取会员订单列表-最近下单 + memberGroup.GET("/recent/list", api.OrderMember.GetOrderMemberRecentList) } } diff --git a/utils/tz.go b/utils/tz.go index 1792a48..e62666e 100644 --- a/utils/tz.go +++ b/utils/tz.go @@ -1,6 +1,7 @@ package utils import ( + "fmt" "hepa-calc-api/api/model" "time" ) @@ -22,3 +23,28 @@ func StrToLocalTime(s string) (*model.LocalTime, error) { return &t, nil } + +// TimeToAgoString 根据给定的时间返回一个描述性的字符串 +func TimeToAgoString(t time.Time) string { + now := time.Now() + diffTime := now.Sub(t) + + switch { + case diffTime < time.Minute: + return "1分钟前" + case diffTime < time.Hour: + minutes := int(diffTime.Minutes()) + return fmt.Sprintf("%d分钟前", minutes) + case diffTime < 24*time.Hour: + return "一小时前" + case diffTime < 48*time.Hour: + return "两天前" + case diffTime < 72*time.Hour: + return "三天前" + case diffTime < 10*time.Hour*24: + days := int(diffTime.Hours()) / 24 + return fmt.Sprintf("%d天前", days) + default: + return "十天前" + } +}