Order 枚举

This commit is contained in:
eson 2023-06-20 16:46:56 +08:00
parent 8a4e122a0a
commit 2d3c394c73
7 changed files with 172 additions and 60 deletions

9
constants/delivery.go Normal file
View File

@ -0,0 +1,9 @@
package constants
type DeliveryMethod int
const (
// 配送方式
DELIVERY_METHOD_ADDRESS DeliveryMethod = 1 // 直接发货到收获地址
DELIVERY_METHOD_CLOUD DeliveryMethod = 2 // 云仓
)

View File

@ -68,13 +68,9 @@ package constants
// // 云仓完成 // // 云仓完成
// const STATUS_FONT_COMPLETED_CLOUD = 8 // const STATUS_FONT_COMPLETED_CLOUD = 8
type Order int type DELIVERY_METHOD int
const ( type Order int
// 配送方式
DELIVERY_METHOD_ADDRESS Order = 1 // 直接发货到收获地址
DELIVERY_METHOD_CLOUD Order = 2 // 云仓
)
// 订单状态 // 订单状态
const ( const (
@ -87,7 +83,7 @@ const (
// 订单已确认 // 订单已确认
STATUS_NEW_SURE Order = 3 STATUS_NEW_SURE Order = 3
// 订单生产中 // 订单生产中
STATUS_NEW_PRODUCING Order = 4 STATUS_NEW_PRODUTING Order = 4
// 订单生产完成 // 订单生产完成
STATUS_NEW_PRODUT_COMPLETED Order = 5 STATUS_NEW_PRODUT_COMPLETED Order = 5
// 订单已到库 // 订单已到库

View File

@ -8,12 +8,18 @@ import (
) )
func (o *FsOrderModel) FindOneBySn(ctx context.Context, userId int64, sn string) (resp FsOrder, err error) { func (o *FsOrderModel) FindOneBySn(ctx context.Context, userId int64, sn string) (resp FsOrder, err error) {
err = o.db.WithContext(ctx).Model(&FsOrder{}).Where(" `user_id` = ? and `sn` = ? ", userId, sn).First(&resp).Error err = o.db.WithContext(ctx).Model(&FsOrder{}).Where(" `user_id` = ? and `sn` = ? ", userId, sn).Take(&resp).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return FsOrder{}, err return FsOrder{}, err
} }
return resp, nil return resp, nil
} }
func (o *FsOrderModel) FindOne(ctx context.Context, userId int64, OrderId int64) (order FsOrder, err error) {
err = o.db.WithContext(ctx).Model(&order).Where("`user_id` = ? and `id` = ?", userId, OrderId).Take(&order).Error
return order, err
}
func (o *FsOrderModel) Update(ctx context.Context, id int64, data FsOrder) error { func (o *FsOrderModel) Update(ctx context.Context, id int64, data FsOrder) error {
return o.db.WithContext(ctx).Model(&FsOrder{}).Where("`id` = ?", id).Updates(data).Error return o.db.WithContext(ctx).Model(&FsOrder{}).Where("`id` = ?", id).Updates(data).Error
} }

View File

@ -1,9 +1,12 @@
package logic package logic
import ( import (
"fusenapi/constants"
"fusenapi/model/gmodel" "fusenapi/model/gmodel"
"fusenapi/utils/auth" "fusenapi/utils/auth"
"fusenapi/utils/basic" "fusenapi/utils/basic"
"log"
"time"
"context" "context"
@ -11,6 +14,7 @@ import (
"fusenapi/server/home-user-auth/internal/types" "fusenapi/server/home-user-auth/internal/types"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
) )
type UserOderDeleteLogic struct { type UserOderDeleteLogic struct {
@ -30,50 +34,77 @@ func NewUserOderDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Us
func (l *UserOderDeleteLogic) UserOderDelete(req *types.RequestOrderId, userinfo *auth.UserInfo) (resp *basic.Response) { func (l *UserOderDeleteLogic) UserOderDelete(req *types.RequestOrderId, userinfo *auth.UserInfo) (resp *basic.Response) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null // userinfo 传入值时, 一定不为null
log.Println(req)
if !userinfo.IsUser() { if !userinfo.IsUser() {
return resp.SetStatus(basic.CodeUnAuth) // 如果不是用户信息, 返回未授权错误 return resp.SetStatus(basic.CodeUnAuth) // 如果不是用户信息, 返回未授权错误
} }
//订单id //订单id
orderId := req.OrderId orderId := req.OrderId
if orderId < 0 { if orderId < 1 {
return resp.SetStatus(basic.CodeRequestParamsErr) return resp.SetStatus(basic.CodeRequestParamsErr)
} }
m := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn)
order, err := m.FindOne(l.ctx, userinfo.UserId, orderId)
if err != nil {
if err == gorm.ErrRecordNotFound {
return resp.SetStatus(basic.CodeOrderNotFoundErr)
}
logx.Error(err)
return resp.SetStatus(basic.CodeDbSqlErr)
}
if auth.CheckValueRange[constants.Order](
constants.Order(*order.Status),
constants.STATUS_NEW_NOT_PAY,
constants.STATUS_NEW_PAY_COMPLETED,
constants.STATUS_NEW_PART_PAY,
) {
return resp.SetStatus(basic.CodeOrderNotCancelledErr)
}
if *order.IsPayCompleted == 1 &&
time.Now().After(time.Unix(*order.Ctime, 0).Add(48*time.Hour)) {
return resp.SetStatus(basic.CodeOrderNotCancelledErr)
}
return resp.SetStatus(basic.CodeOK) return resp.SetStatus(basic.CodeOK)
} }
func (l *OrderLogic) CancelOrder(req *types.RequestCancelOrder, userinfo *auth.UserInfo) (resp *basic.Response) { // func (l *OrderLogic) CancelOrder(req *types.RequestCancelOrder, userinfo *auth.UserInfo) (resp *basic.Response) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null // // userinfo 传入值时, 一定不为null
if !userinfo.IsUser() { // if !userinfo.IsUser() {
return resp.SetStatus(basic.CodeUnAuth) // 如果不是用户信息, 返回未授权错误 // return resp.SetStatus(basic.CodeUnAuth) // 如果不是用户信息, 返回未授权错误
} // }
//订单id // //订单id
id := req.ReqParam.Get("id") // id := req.ReqParam.Get("id")
if id == "" { // if id == "" {
return resp.SetStatus(basic.CodeParamErr) // return resp.SetStatus(basic.CodeParamErr)
} // }
//验证当前订单是否可以取消 // //验证当前订单是否可以取消
order, err := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn).GetOne(l.ctx, map[string]interface{}{"user_id": userinfo.UserId, "id": id}) // order, err := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn).GetOne(l.ctx, map[string]interface{}{"user_id": userinfo.UserId, "id": id})
if err != nil { // if err != nil {
return resp.SetStatus(basic.CodeDbQueryErr) // return resp.SetStatus(basic.CodeDbQueryErr)
} // }
if order == nil { // if order == nil {
return resp.SetStatus(basic.CodeNotFound) // return resp.SetStatus(basic.CodeNotFound)
} // }
//那些状态下是不能关闭的? (订单完成,退款完成,关闭订单) // //那些状态下是不能关闭的? (订单完成,退款完成,关闭订单)
if order.Status == gconst.OrderStatusComplete || // if order.Status == gconst.OrderStatusComplete ||
order.Status == gconst.OrderStatusRefund || // order.Status == gconst.OrderStatusRefund ||
order.Status == gconst.OrderStatusClose { // order.Status == gconst.OrderStatusClose {
return resp.SetStatus(basic.CodeCannotOperate) // return resp.SetStatus(basic.CodeCannotOperate)
} // }
//订单状态修改 // //订单状态修改
order.Status = gconst.OrderStatusDelete // order.Status = gconst.OrderStatusDelete
order.IsDeleted = 1 // order.IsDeleted = 1
result, err := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn).UpdateOne(l.ctx, order) // result, err := gmodel.NewFsOrderModel(l.svcCtx.MysqlConn).UpdateOne(l.ctx, order)
if err != nil { // if err != nil {
return resp.SetStatus(basic.CodeDbUpdateErr) // return resp.SetStatus(basic.CodeDbUpdateErr)
} // }
return resp.SetStatus(basic.CodeOK, result) // return resp.SetStatus(basic.CodeOK, result)
} // }

View File

@ -0,0 +1,66 @@
package logic
import (
"fmt"
"fusenapi/server/home-user-auth/internal/types"
"testing"
"github.com/474420502/requests"
"github.com/tidwall/gjson"
)
func TestCaseLogic(t *testing.T) {
var err error
var resp *requests.Response
var result gjson.Result
// 获取 session并携带 JWT token
ses := GetSesssionWithUserToken(t, gserver)
// 向服务器发送 GET 请求,获取用户类型信息
tp := ses.Post(fmt.Sprintf("http://%s:%d/user/order-delete", cnf.Host, cnf.Port))
reqO := types.RequestOrderId{
OrderId: 12,
}
tp.SetBodyJson(reqO)
resp, err = tp.TestExecute(gserver)
if err != nil {
t.Error(err)
}
// 使用 gjson 解析返回的 json 数据
result = gjson.Parse(resp.ContentString())
// 检查返回值中的 code 字段是否存在,并且值是否为 200
code := result.Get("code").Int()
if code != 200 {
t.Errorf("Invalid code value: %d", code)
}
// 检查返回值中的 msg 字段是否存在,并且值是否为 "success"
msg := result.Get("msg").String()
if msg != "success" {
t.Errorf(`Invalid msg value: "%s"`, msg)
}
// 检查返回值中的 data 字段是否存在,并且值是否为数组类型
dataArray := result.Get("data").Array()
if len(dataArray) == 0 {
t.Error("Empty data field")
}
// 遍历每个元素,检查其 key 和 name 字段是否存在,并且值是否符合预期
for i, item := range dataArray {
key := item.Get("key").Int()
name := item.Get("name").String()
if key != int64(i+1) {
t.Errorf("Unexpected key value at index %d: %d", i, key)
}
if len(name) == 0 {
t.Errorf("Missing name value at index %d", i)
}
}
}

View File

@ -2,31 +2,35 @@ package basic
// StatusResponse 公司自定义状态码 // StatusResponse 公司自定义状态码
type StatusResponse struct { type StatusResponse struct {
Code int Code int // 状态码
Message string Message string // 状态码相关解析
} }
var ( var (
CodeOK = &StatusResponse{200, "success"} // 成功 CodeOK = &StatusResponse{200, "success"} // 成功
CodeApiErr = &StatusResponse{500, "api error"} // api 错误 CodeApiErr = &StatusResponse{500, "api error"} // API错误
CodeSaveErr = &StatusResponse{501, "fail to save"} // 储存错误 CodeSaveErr = &StatusResponse{501, "fail to save"} // 保存失败
CodeServiceErr = &StatusResponse{510, "server logic error"} // server logic 错误 CodeServiceErr = &StatusResponse{510, "server logic error"} // 服务逻辑错误
CodeUnAuth = &StatusResponse{401, "unauthorized"} // 未授权 CodeUnAuth = &StatusResponse{401, "unauthorized"} // 未授权
CodeEmailNotFoundErr = &StatusResponse{5050, "the email was not found"} // email 不存在 CodeEmailNotFoundErr = &StatusResponse{5050, "the email was not found"} // 未找到email
CodeUserIdNotFoundErr = &StatusResponse{5051, "the user was not found"} // userid 不存在 CodeUserIdNotFoundErr = &StatusResponse{5051, "the user was not found"} // 未找到用户
CodePasswordErr = &StatusResponse{5052, "invalid password"} // 密码错误 CodePasswordErr = &StatusResponse{5052, "invalid password"} // 无效密码
CodeSafeValueRangeErr = &StatusResponse{5040, "the value was not in values"} // 值不在范围内 CodeSafeValueRangeErr = &StatusResponse{5040, "the value was not in values"} // 值不在范围内
CodeGuestDupErr = &StatusResponse{5010, "the user is already a guest user and does not need to apply again"} // 用户已经是guest用户不需要重复申请 错误 CodeOrderNotFoundErr = &StatusResponse{5030, "the order not found"} //未找到订单
CodeGuestGenErr = &StatusResponse{5011, "serialization failed for guest_id of the visitor"} // 游客guest_id序列化失败 CodeOrderNotCancelledErr = &StatusResponse{5031, "The current order cannot be cancelled"} // 当前订单无法取消
CodeDbUpdateErr = &StatusResponse{5000, "update database error"} // update database logic 错误 CodeGuestDupErr = &StatusResponse{5010, "the user is already a guest user and does not need to apply again"} // 用户已经是访客用户,不需要重复申请
CodeDupGuestErr = &StatusResponse{5001, "the user is already a guest user and does not need to apply again"} // 用户已经是guest用户不需要重复申请 错误 CodeGuestGenErr = &StatusResponse{5011, "serialization failed for guest_id of the visitor"} // 访客ID序列化失败
CodeRequestParamsErr = &StatusResponse{5002, "invalid request param"} // api参数校验 错误
CodeDbRecordNotFoundErr = &StatusResponse{5003, "db record not found"} CodeDbUpdateErr = &StatusResponse{5000, "update database error"} // 数据库更新错误
CodeDbCreateErr = &StatusResponse{5004, "create one in database error"} CodeDupGuestErr = &StatusResponse{5001, "the user is already a guest user and does not need to apply again"} // 用户已经是访客用户,不需要重复申请
CodeRequestParamsErr = &StatusResponse{5002, "invalid request param"} // 请求参数无效
CodeDbRecordNotFoundErr = &StatusResponse{5003, "db record not found"} //未在数据库中找到记录
CodeDbCreateErr = &StatusResponse{5004, "create one in database error"} // 在数据库中创建错误
CodeDbSqlErr = &StatusResponse{5005, "database is error"} // 数据库错误
) )
type Response struct { type Response struct {

View File

@ -3,7 +3,7 @@ package order
import "fusenapi/constants" import "fusenapi/constants"
// 获取订单生产状态 // 获取订单生产状态
func GetOrderStatus(orderStatus int64, deliveryMethod int64) int64 { func GetOrderStatus(orderStatus constants.Order, deliveryMethod constants.DeliveryMethod) constants.Order {
switch orderStatus { switch orderStatus {
//已支付 //已支付
case constants.STATUS_NEW_PART_PAY, constants.STATUS_NEW_PAY_COMPLETED, constants.STATUS_NEW_SURE: case constants.STATUS_NEW_PART_PAY, constants.STATUS_NEW_PAY_COMPLETED, constants.STATUS_NEW_SURE: