hepa-calc-api/api/controller/OrderMember.go

483 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}