package controller import ( "fmt" "github.com/gin-gonic/gin" "hepa-calc-api/api/dao" "hepa-calc-api/api/dto" "hepa-calc-api/api/model" "hepa-calc-api/api/requests" "hepa-calc-api/api/responses" "hepa-calc-api/api/service" "hepa-calc-api/global" "hepa-calc-api/utils" "math" "strconv" "time" ) type OrderMember struct{} // GetOrderMemberPage 获取会员订单列表-分页 func (b *OrderMember) GetOrderMemberPage(c *gin.Context) { orderMemberRequest := requests.OrderMemberRequest{} req := orderMemberRequest.GetOrderMemberPage if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } if req.Page == 0 { req.Page = 1 } if req.PageSize == 0 { req.PageSize = 20 } userId := c.GetInt64("UserId") req.UserId = userId // 获取数据 orderMemberDao := dao.OrderMemberDao{} orderMember, total, err := orderMemberDao.GetOrderMemberPageSearch(req, req.Page, req.PageSize) if err != nil { responses.FailWithMessage(err.Error(), c) return } // 处理返回值 g := dto.GetOrderMemberListDto(orderMember) result := make(map[string]interface{}) result["page"] = req.Page result["page_size"] = req.PageSize result["total"] = total result["data"] = g responses.OkWithData(result, c) } // AddOrderMember 创建会员订单 func (b *OrderMember) AddOrderMember(c *gin.Context) { orderMemberRequest := requests.OrderMemberRequest{} req := orderMemberRequest.AddOrderMember if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } userId := c.GetInt64("UserId") // 将 id 转换为 int64 类型 systemMemberId, err := strconv.ParseInt(req.SystemMemberId, 10, 64) if err != nil { responses.Fail(c) return } // 用户优惠卷id var userCouponId *int64 if req.UserCouponId != "" { id, err := strconv.ParseInt(req.UserCouponId, 10, 64) if err != nil { responses.Fail(c) return } userCouponId = &id } if req.OrderPrice == nil { responses.FailWithMessage("订单金额错误", c) return } if *req.OrderPrice < 0 { responses.FailWithMessage("价格错误", c) return } // 开始事务 tx := global.Db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() utils.LogJsonErr("订单创建失败1", r) responses.FailWithMessage("订单创建失败2", c) return } }() // 创建会员订单 orderMemberService := service.OrderMemberService{} orderMember, err := orderMemberService.AddOrderMember(tx, userId, systemMemberId, userCouponId, req.PayChannel, req.OrderPrice) if err != nil { tx.Rollback() responses.FailWithMessage(err.Error(), c) return } tx.Commit() // 处理返回值 g := &dto.AddOrderMemberDto{} g.OrderId = fmt.Sprintf("%d", orderMember.OrderId) g.OrderNo = orderMember.OrderNo responses.OkWithData(g, c) } // GetOrderMemberPay 获取会员订单支付数据 func (b *OrderMember) GetOrderMemberPay(c *gin.Context) { orderMemberRequest := requests.OrderMemberRequest{} req := orderMemberRequest.GetOrderMemberPay if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } userId := c.GetInt64("UserId") id := c.Param("order_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 orderId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 获取订单数据 orderMemberDao := dao.OrderMemberDao{} maps := make(map[string]interface{}) maps["user_id"] = userId maps["order_id"] = orderId orderMember, err := orderMemberDao.GetOrderMember(maps) if err != nil { responses.FailWithMessage("订单异常", c) return } // 检测订单状态(1:待支付 2:已完成 3:已取消) if orderMember.OrderStatus != 1 { responses.FailWithMessage("订单状态异常", c) return } // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) if orderMember.PayStatus != 1 { responses.FailWithMessage("订单支付状态异常", c) return } // 验证订单过期支付时间 now := time.Now() validTime := time.Time(orderMember.CreatedAt).Add(30 * time.Minute) if validTime.Before(now) { responses.FailWithMessage("订单已过期", c) return } // 处理返回值 g := dto.GetOrderMemberPayDto(orderMember) // 获取预支付交易会话标识 if req.ClientType == 1 { orderMemberService := service.OrderMemberService{} prepay, err := orderMemberService.GetJsapiPrepay(orderMember) if err != nil { responses.FailWithMessage("发起支付失败", c) return } g.PrepayJsapi = prepay } else { orderMemberService := service.OrderMemberService{} prepay, err := orderMemberService.GetAppPrepay(orderMember) if err != nil { responses.FailWithMessage("发起支付失败", c) return } g.PrepayApp = prepay } responses.OkWithData(g, c) } // DeleteOrderMember 删除会员订单支付数据 func (b *OrderMember) DeleteOrderMember(c *gin.Context) { userId := c.GetInt64("UserId") id := c.Param("order_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 orderId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 获取订单数据 orderMemberDao := dao.OrderMemberDao{} maps := make(map[string]interface{}) maps["user_id"] = userId maps["order_id"] = orderId orderMember, err := orderMemberDao.GetOrderMember(maps) if err != nil { responses.FailWithMessage("订单异常", c) return } // 检测订单状态 if orderMember.OrderStatus != 2 { responses.FailWithMessage("订单不允许删除", c) return } // 检测订单删除状态 if orderMember.IsDelete == 1 { responses.Ok(c) return } // 开始事务 tx := global.Db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() utils.LogJsonErr("操作失败", r) responses.FailWithMessage("操作失败", c) return } }() orderMemberData := make(map[string]interface{}) orderMemberData["is_delete"] = 1 orderMemberData["updated_at"] = time.Now().Format("2006-01-02 15:04:05") err = orderMemberDao.EditOrderMemberById(tx, orderId, orderMemberData) if err != nil { tx.Rollback() responses.FailWithMessage("删除失败", c) return } tx.Commit() responses.Ok(c) } // GetOrderMemberPayStatus 查询订单支付状态-会员 func (b *OrderMember) GetOrderMemberPayStatus(c *gin.Context) { userId := c.GetInt64("UserId") id := c.Param("order_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 orderId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 获取订单数据 orderMemberDao := dao.OrderMemberDao{} maps := make(map[string]interface{}) maps["user_id"] = userId maps["order_id"] = orderId orderMember, err := orderMemberDao.GetOrderMember(maps) if err != nil { responses.FailWithMessage("订单异常", c) return } // 处理返回值 g := dto.GetOrderMemberPayStatus(orderMember) // 处理有效期 if g.PayStatus == 2 { // 获取用户数据 userDao := dao.UserDao{} user, err := userDao.GetUserById(orderMember.UserId) if err != nil { responses.FailWithMessage("用户数据错误", c) return } if user.MemberExpireDate != nil { // 加载到期时间 g.LoadValidDate(user.MemberExpireDate) } } 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 } // 增加虚假数据 createdAt := []model.LocalTime{ model.LocalTime(time.Now()), model.LocalTime(time.Now().Add(-10 * time.Hour)), model.LocalTime(time.Now().Add(-20 * time.Hour)), model.LocalTime(time.Now().Add(-30 * time.Hour)), model.LocalTime(time.Now().Add(-40 * time.Hour)), model.LocalTime(time.Now().Add(-50 * time.Hour)), model.LocalTime(time.Now().Add(-70 * time.Hour)), model.LocalTime(time.Now().Add(-90 * time.Hour)), model.LocalTime(time.Now().Add(-100 * time.Hour)), model.LocalTime(time.Now().Add(-105 * time.Hour)), model.LocalTime(time.Now().Add(-110 * time.Hour)), model.LocalTime(time.Now().Add(-115 * time.Hour)), model.LocalTime(time.Now().Add(-120 * time.Hour)), model.LocalTime(time.Now().Add(-125 * time.Hour)), model.LocalTime(time.Now().Add(-130 * time.Hour)), model.LocalTime(time.Now().Add(-135 * time.Hour)), } userName := []string{ "邹**", "王**", "刘**", "吴*", "欧*", "国**", "图**", "赵**", "刘*", "陈**", "郝*", "杨*", "魏*", "周*", "宋**", "马**", } avatar := []string{ "/user/avatar/999999.jpeg", "/user/avatar/888888.jpeg", "/user/avatar/7777777.jpeg", "/user/avatar/666666.jpeg", "/user/avatar/555555.jpeg", "/user/avatar/444444.jpeg", "/user/avatar/161616.jpeg", "/user/avatar/151515.jpeg", "/user/avatar/151515.jpeg", "/user/avatar/141414.jpeg", "/user/avatar/12121212.jpeg", "/user/avatar/131313.jpeg", "/user/avatar/111111.jpeg", "/user/avatar/100000.jpeg", "/user/avatar/444444.jpeg", "/user/avatar/151515.jpeg", } // 处理返回值 g := make([]*dto.OrderMemberRecentDto, 15) systemMemberDao := dao.SystemMemberDao{} maps = make(map[string]interface{}) systemMembers, err := systemMemberDao.GetSystemMemberList(maps) if err != nil { responses.FailWithMessage(err.Error(), c) return } userDao := dao.UserDao{} for i := 0; i < 15; i++ { if len(orderMembers) > i { response := &dto.OrderMemberRecentDto{ OrderId: fmt.Sprintf("%d", orderMembers[i].OrderId), UserId: fmt.Sprintf("%d", orderMembers[i].UserId), SystemMemberId: fmt.Sprintf("%d", orderMembers[i].SystemMemberId), CreatedAt: orderMembers[i].CreatedAt, } // 获取用户数据 maps = make(map[string]interface{}) maps["user_id"] = orderMembers[i].UserId user, err := userDao.GetUser(maps) if err != nil { responses.FailWithMessage(err.Error(), c) return } response.UserName = utils.MaskNameStr(user.UserName, 2) response.UserAvatar = utils.AddOssDomain(user.Avatar) response.MemberDays = orderMembers[i].SystemMember.MemberDays // 处理时间 createdAt := time.Time(orderMembers[i].CreatedAt) response.TimeDesc = utils.TimeToAgoString(createdAt) g[i] = response } else { response := &dto.OrderMemberRecentDto{ OrderId: fmt.Sprintf("%d", i), UserId: fmt.Sprintf("%d", i), SystemMemberId: fmt.Sprintf("%d", 1), CreatedAt: createdAt[i], } response.UserName = utils.MaskNameStr(userName[i], 2) response.UserAvatar = utils.AddOssDomain(avatar[i]) if i == 0 { response.MemberDays = systemMembers[0].MemberDays } else { response.MemberDays = systemMembers[int(math.Floor(float64(i)/4))].MemberDays } // 处理时间 createdAt := time.Time(createdAt[i]) response.TimeDesc = utils.TimeToAgoString(createdAt) g[i] = response } } responses.OkWithData(g, c) }