fix: 调整创建订单的uuid

This commit is contained in:
周俊耀 2026-02-04 12:13:00 +08:00
parent 1809d98cdb
commit 2155d56187
7 changed files with 917 additions and 601 deletions

View File

@ -130,3 +130,10 @@ func (b *BundleProvider) SoftDeleteUnfinishedInfo(_ context.Context, req *bundle
func (b *BundleProvider) ReSignTheContract(_ context.Context, req *bundle.ReSignTheContractRequest) (res *bundle.CommonResponse, err error) { func (b *BundleProvider) ReSignTheContract(_ context.Context, req *bundle.ReSignTheContractRequest) (res *bundle.CommonResponse, err error) {
return logic.ReSignTheContract(req) return logic.ReSignTheContract(req)
} }
func (b *BundleProvider) OrderListByOrderUuid(_ context.Context, req *bundle.OrderInfoByOrderUuidRequest) (res *bundle.OrderInfoByOrderNoResp, err error) {
return logic.OrderListByOrderUuid(req)
}
func (b *BundleProvider) UpdateOrderRecordByOrderUuid(_ context.Context, req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
return logic.UpdateOrderRecordByOrderUuid(req)
}

View File

@ -979,3 +979,108 @@ func ReSignTheContract(req *bundle.ReSignTheContractRequest) (*bundle.CommonResp
return res, nil return res, nil
} }
func UpdateOrderRecordByOrderUuid(orderRecord *model.BundleOrderRecords) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
// Step 1: 先更新子订单(增值服务)的支付状态
valueAdd := &model.BundleOrderValueAdd{
PaymentStatus: int(orderRecord.Status),
PaymentTime: orderRecord.PayTime,
}
if orderRecord.CheckoutSessionId != "" {
valueAdd.CheckoutSessionId = orderRecord.CheckoutSessionId
valueAdd.CheckoutSessionUrl = orderRecord.CheckoutSessionUrl
}
if orderRecord.Status == 2 {
tempValues := make([]*model.BundleOrderValueAdd, 0)
err = app.ModuleClients.BundleDB.Model(&model.BundleOrderValueAdd{}).
Where("order_uuid = ?", orderRecord.UUID).
Find(&tempValues).Error
if len(tempValues) > 0 {
for _, value := range tempValues {
if value.PaymentStatus == 2 {
fmt.Println("====================已经付过了")
return nil, errors.New("已付款了")
}
}
}
tempRecord := new(model.BundleOrderRecords)
if err := app.ModuleClients.BundleDB.Where("deleted_at is null and uuid = ?", orderRecord.UUID).First(&tempRecord).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("订单记录不存在")
}
return nil, fmt.Errorf("查询订单失败: %v", err)
}
if orderRecord.Status == 2 && tempRecord.AmountType == 2 && tempRecord.TotalAmount > 0 {
// 当回调支付成功币种是美元且订单金额大于0计算美元手续费订单金额*0.019(四舍五入保留两位小数字)+0.1
amount := decimal.NewFromFloat32(tempRecord.TotalAmount)
rate, _ := decimal.NewFromString("0.019")
fee := amount.Mul(rate)
// 4. 四舍五入保留两位小数
feeRounded := fee.Round(2)
addition, _ := decimal.NewFromString("0.1")
result := feeRounded.Add(addition)
valueAdd.HandlingFee = result.String()
}
}
err = app.ModuleClients.BundleDB.Model(&model.BundleOrderValueAdd{}).
Where("order_uuid = ?", orderRecord.UUID).
Updates(valueAdd).Error
if err != nil {
res.Msg = msg.ErrorUpdateOrderInfo
return res, commonErr.ReturnError(err, msg.ErrorUpdateOrderInfo, "更新增值服务支付状态失败: ")
}
// Step 2: 再更新主订单信息(如果存在)
err = app.ModuleClients.BundleDB.Model(&model.BundleOrderRecords{}).
Where("uuid = ?", orderRecord.UUID).
Updates(orderRecord).Error
// Step 3: 返回结果(即使主订单更新失败,也视为成功)
res.Uuid = orderRecord.UUID
res.Msg = msg.SuccessUpdateOrderInfo
return res, nil
}
func OrderListByOrderUuid(req *bundle.OrderInfoByOrderUuidRequest) (*bundle.OrderInfoByOrderNoResp, error) {
if req == nil || req.OrderUuid == "" {
return nil, errors.New("invalid request")
}
var addOrder []*model.BundleOrderValueAdd
if err := app.ModuleClients.BundleDB.Model(&model.BundleOrderValueAdd{}).
Where("order_uuid = ?", req.OrderUuid).
Find(&addOrder).Error; err != nil {
return nil, err
}
if len(addOrder) == 0 {
return &bundle.OrderInfoByOrderNoResp{}, nil
}
//订单类型 1:套餐 2:单独购买
userID, err := strconv.ParseInt(addOrder[0].CustomerID, 10, 64)
if err != nil {
return nil, err
}
res := &bundle.OrderInfoByOrderNoResp{
Type: int32(addOrder[0].Source),
UserId: uint64(userID),
OrderUUID: addOrder[0].OrderUUID,
UserName: addOrder[0].CustomerName,
}
for _, item := range addOrder {
switch item.ServiceType {
case 1:
res.VideoNumber += item.Num // 使用 += 而不是直接赋值
case 2:
res.ImageNumber += item.Num
case 3:
res.DataNumber += item.Num
case 4:
res.AccountNumber += item.Num
case 5:
res.Duration += item.Num
res.Unit = item.Unit // 如果有多个duration记录最后一个unit会覆盖前面的
}
}
return res, nil
}

View File

@ -1,7 +1,9 @@
package logic package logic
import ( import (
"errors"
"fmt" "fmt"
uuid "github.com/satori/go.uuid"
"micro-bundle/internal/dao" "micro-bundle/internal/dao"
"micro-bundle/internal/model" "micro-bundle/internal/model"
"micro-bundle/pb/bundle" "micro-bundle/pb/bundle"
@ -13,7 +15,13 @@ import (
func CreateOrderRecord(req *bundle.OrderCreateRecord) (res *bundle.CommonResponse, err error) { func CreateOrderRecord(req *bundle.OrderCreateRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse) res = new(bundle.CommonResponse)
orderUUID := app.ModuleClients.SfNode.Generate().Base64() //orderUUID := app.ModuleClients.SfNode.Generate().Base64()
uuidV4, err := uuid.NewV4()
if err != nil {
fmt.Println("生成错误", err)
return nil, errors.New("生成uuid失败")
}
orderUUID := uuidV4.String()
orderNo := utils.GetOrderNo() orderNo := utils.GetOrderNo()
if req.OrderNo != "" { if req.OrderNo != "" {
orderNo = req.OrderNo orderNo = req.OrderNo
@ -192,3 +200,20 @@ func ReSignTheContract(req *bundle.ReSignTheContractRequest) (res *bundle.Common
res, err = dao.ReSignTheContract(req) res, err = dao.ReSignTheContract(req)
return return
} }
func UpdateOrderRecordByOrderUuid(req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord := new(model.BundleOrderRecords)
_ = copier.CopyWithOption(&orderRecord, req, copier.Option{DeepCopy: true})
orderRecord.UUID = req.Uuid
orderRecord.BundleUUID = req.BundleUuid
orderRecord.Status = req.Status
fmt.Println("UpdateOrderRecordByOrderUuid Status:", req.Status)
res, err = dao.UpdateOrderRecordByOrderUuid(orderRecord)
return
}
func OrderListByOrderUuid(req *bundle.OrderInfoByOrderUuidRequest) (res *bundle.OrderInfoByOrderNoResp, err error) {
res = new(bundle.OrderInfoByOrderNoResp)
res, err = dao.OrderListByOrderUuid(req)
return
}

View File

@ -128,6 +128,10 @@ service Bundle {
rpc GetContractDetail(ContractDetailRequest) returns (ContractDetailResponse) {} // UUID查询详情 rpc GetContractDetail(ContractDetailRequest) returns (ContractDetailResponse) {} // UUID查询详情
rpc GetDevelopmentCyclesByContractUUID(GetDevelopmentCyclesByContractUUIDRequest) returns (GetDevelopmentCyclesByContractUUIDResponse) {} // UUID查询开发周期 rpc GetDevelopmentCyclesByContractUUID(GetDevelopmentCyclesByContractUUIDRequest) returns (GetDevelopmentCyclesByContractUUIDResponse) {} // UUID查询开发周期
rpc GetPaymentCyclesByContractUUID(GetPaymentCyclesByContractUUIDRequest) returns (GetPaymentCyclesByContractUUIDResponse) {} // UUID查询支付周期 rpc GetPaymentCyclesByContractUUID(GetPaymentCyclesByContractUUIDRequest) returns (GetPaymentCyclesByContractUUIDResponse) {} // UUID查询支付周期
rpc UpdateOrderRecordByOrderUuid(OrderRecord) returns (CommonResponse) {}
rpc OrderListByOrderUuid(OrderInfoByOrderUuidRequest) returns (OrderInfoByOrderNoResp) {}
} }
message QueryTheOrderSnapshotInformationReq{ message QueryTheOrderSnapshotInformationReq{
string orderNo = 1; string orderNo = 1;
@ -2129,4 +2133,7 @@ message ExportWorkCastInfoReq{
message ExportWorkCastInfoResp{ message ExportWorkCastInfoResp{
repeated WorkCastInfo data = 1; repeated WorkCastInfo data = 1;
}
message OrderInfoByOrderUuidRequest{
string orderUuid = 1;
} }

File diff suppressed because it is too large Load Diff

View File

@ -5,11 +5,11 @@ package bundle
import ( import (
fmt "fmt" fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
_ "github.com/mwitkow/go-proto-validators" _ "github.com/mwitkow/go-proto-validators"
_ "google.golang.org/protobuf/types/descriptorpb"
github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators"
_ "google.golang.org/protobuf/types/descriptorpb"
math "math"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -994,3 +994,6 @@ func (this *ExportWorkCastInfoResp) Validate() error {
} }
return nil return nil
} }
func (this *OrderInfoByOrderUuidRequest) Validate() error {
return nil
}

View File

@ -1,7 +1,7 @@
// Code generated by protoc-gen-go-triple. DO NOT EDIT. // Code generated by protoc-gen-go-triple. DO NOT EDIT.
// versions: // versions:
// - protoc-gen-go-triple v1.0.8 // - protoc-gen-go-triple v1.0.8
// - protoc v3.21.1 // - protoc v5.26.1
// source: pb/bundle.proto // source: pb/bundle.proto
package bundle package bundle
@ -132,6 +132,8 @@ type BundleClient interface {
GetContractDetail(ctx context.Context, in *ContractDetailRequest, opts ...grpc_go.CallOption) (*ContractDetailResponse, common.ErrorWithAttachment) GetContractDetail(ctx context.Context, in *ContractDetailRequest, opts ...grpc_go.CallOption) (*ContractDetailResponse, common.ErrorWithAttachment)
GetDevelopmentCyclesByContractUUID(ctx context.Context, in *GetDevelopmentCyclesByContractUUIDRequest, opts ...grpc_go.CallOption) (*GetDevelopmentCyclesByContractUUIDResponse, common.ErrorWithAttachment) GetDevelopmentCyclesByContractUUID(ctx context.Context, in *GetDevelopmentCyclesByContractUUIDRequest, opts ...grpc_go.CallOption) (*GetDevelopmentCyclesByContractUUIDResponse, common.ErrorWithAttachment)
GetPaymentCyclesByContractUUID(ctx context.Context, in *GetPaymentCyclesByContractUUIDRequest, opts ...grpc_go.CallOption) (*GetPaymentCyclesByContractUUIDResponse, common.ErrorWithAttachment) GetPaymentCyclesByContractUUID(ctx context.Context, in *GetPaymentCyclesByContractUUIDRequest, opts ...grpc_go.CallOption) (*GetPaymentCyclesByContractUUIDResponse, common.ErrorWithAttachment)
UpdateOrderRecordByOrderUuid(ctx context.Context, in *OrderRecord, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
OrderListByOrderUuid(ctx context.Context, in *OrderInfoByOrderUuidRequest, opts ...grpc_go.CallOption) (*OrderInfoByOrderNoResp, common.ErrorWithAttachment)
} }
type bundleClient struct { type bundleClient struct {
@ -232,6 +234,8 @@ type BundleClientImpl struct {
GetContractDetail func(ctx context.Context, in *ContractDetailRequest) (*ContractDetailResponse, error) GetContractDetail func(ctx context.Context, in *ContractDetailRequest) (*ContractDetailResponse, error)
GetDevelopmentCyclesByContractUUID func(ctx context.Context, in *GetDevelopmentCyclesByContractUUIDRequest) (*GetDevelopmentCyclesByContractUUIDResponse, error) GetDevelopmentCyclesByContractUUID func(ctx context.Context, in *GetDevelopmentCyclesByContractUUIDRequest) (*GetDevelopmentCyclesByContractUUIDResponse, error)
GetPaymentCyclesByContractUUID func(ctx context.Context, in *GetPaymentCyclesByContractUUIDRequest) (*GetPaymentCyclesByContractUUIDResponse, error) GetPaymentCyclesByContractUUID func(ctx context.Context, in *GetPaymentCyclesByContractUUIDRequest) (*GetPaymentCyclesByContractUUIDResponse, error)
UpdateOrderRecordByOrderUuid func(ctx context.Context, in *OrderRecord) (*CommonResponse, error)
OrderListByOrderUuid func(ctx context.Context, in *OrderInfoByOrderUuidRequest) (*OrderInfoByOrderNoResp, error)
} }
func (c *BundleClientImpl) GetDubboStub(cc *triple.TripleConn) BundleClient { func (c *BundleClientImpl) GetDubboStub(cc *triple.TripleConn) BundleClient {
@ -804,6 +808,18 @@ func (c *bundleClient) GetPaymentCyclesByContractUUID(ctx context.Context, in *G
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/GetPaymentCyclesByContractUUID", in, out) return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/GetPaymentCyclesByContractUUID", in, out)
} }
func (c *bundleClient) UpdateOrderRecordByOrderUuid(ctx context.Context, in *OrderRecord, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/UpdateOrderRecordByOrderUuid", in, out)
}
func (c *bundleClient) OrderListByOrderUuid(ctx context.Context, in *OrderInfoByOrderUuidRequest, opts ...grpc_go.CallOption) (*OrderInfoByOrderNoResp, common.ErrorWithAttachment) {
out := new(OrderInfoByOrderNoResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/OrderListByOrderUuid", in, out)
}
// BundleServer is the server API for Bundle service. // BundleServer is the server API for Bundle service.
// All implementations must embed UnimplementedBundleServer // All implementations must embed UnimplementedBundleServer
// for forward compatibility // for forward compatibility
@ -912,6 +928,8 @@ type BundleServer interface {
GetContractDetail(context.Context, *ContractDetailRequest) (*ContractDetailResponse, error) GetContractDetail(context.Context, *ContractDetailRequest) (*ContractDetailResponse, error)
GetDevelopmentCyclesByContractUUID(context.Context, *GetDevelopmentCyclesByContractUUIDRequest) (*GetDevelopmentCyclesByContractUUIDResponse, error) GetDevelopmentCyclesByContractUUID(context.Context, *GetDevelopmentCyclesByContractUUIDRequest) (*GetDevelopmentCyclesByContractUUIDResponse, error)
GetPaymentCyclesByContractUUID(context.Context, *GetPaymentCyclesByContractUUIDRequest) (*GetPaymentCyclesByContractUUIDResponse, error) GetPaymentCyclesByContractUUID(context.Context, *GetPaymentCyclesByContractUUIDRequest) (*GetPaymentCyclesByContractUUIDResponse, error)
UpdateOrderRecordByOrderUuid(context.Context, *OrderRecord) (*CommonResponse, error)
OrderListByOrderUuid(context.Context, *OrderInfoByOrderUuidRequest) (*OrderInfoByOrderNoResp, error)
mustEmbedUnimplementedBundleServer() mustEmbedUnimplementedBundleServer()
} }
@ -1199,6 +1217,12 @@ func (UnimplementedBundleServer) GetDevelopmentCyclesByContractUUID(context.Cont
func (UnimplementedBundleServer) GetPaymentCyclesByContractUUID(context.Context, *GetPaymentCyclesByContractUUIDRequest) (*GetPaymentCyclesByContractUUIDResponse, error) { func (UnimplementedBundleServer) GetPaymentCyclesByContractUUID(context.Context, *GetPaymentCyclesByContractUUIDRequest) (*GetPaymentCyclesByContractUUIDResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetPaymentCyclesByContractUUID not implemented") return nil, status.Errorf(codes.Unimplemented, "method GetPaymentCyclesByContractUUID not implemented")
} }
func (UnimplementedBundleServer) UpdateOrderRecordByOrderUuid(context.Context, *OrderRecord) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateOrderRecordByOrderUuid not implemented")
}
func (UnimplementedBundleServer) OrderListByOrderUuid(context.Context, *OrderInfoByOrderUuidRequest) (*OrderInfoByOrderNoResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method OrderListByOrderUuid not implemented")
}
func (s *UnimplementedBundleServer) XXX_SetProxyImpl(impl protocol.Invoker) { func (s *UnimplementedBundleServer) XXX_SetProxyImpl(impl protocol.Invoker) {
s.proxyImpl = impl s.proxyImpl = impl
} }
@ -3924,6 +3948,64 @@ func _Bundle_GetPaymentCyclesByContractUUID_Handler(srv interface{}, ctx context
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Bundle_UpdateOrderRecordByOrderUuid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(OrderRecord)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("UpdateOrderRecordByOrderUuid", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_OrderListByOrderUuid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(OrderInfoByOrderUuidRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("OrderListByOrderUuid", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
// Bundle_ServiceDesc is the grpc_go.ServiceDesc for Bundle service. // Bundle_ServiceDesc is the grpc_go.ServiceDesc for Bundle service.
// It's only intended for direct use with grpc_go.RegisterService, // It's only intended for direct use with grpc_go.RegisterService,
// and not to be introspected or modified (even as a copy) // and not to be introspected or modified (even as a copy)
@ -4303,6 +4385,14 @@ var Bundle_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "GetPaymentCyclesByContractUUID", MethodName: "GetPaymentCyclesByContractUUID",
Handler: _Bundle_GetPaymentCyclesByContractUUID_Handler, Handler: _Bundle_GetPaymentCyclesByContractUUID_Handler,
}, },
{
MethodName: "UpdateOrderRecordByOrderUuid",
Handler: _Bundle_UpdateOrderRecordByOrderUuid_Handler,
},
{
MethodName: "OrderListByOrderUuid",
Handler: _Bundle_OrderListByOrderUuid_Handler,
},
}, },
Streams: []grpc_go.StreamDesc{}, Streams: []grpc_go.StreamDesc{},
Metadata: "pb/bundle.proto", Metadata: "pb/bundle.proto",