修复编译问题和版本兼容问题

This commit is contained in:
WuYuuuub
2026-03-29 14:29:43 +08:00
parent 89a7c87bf6
commit a630ae733e
12 changed files with 157 additions and 118 deletions

View File

@@ -5,7 +5,6 @@ import (
"net"
"github.com/cloudprint/cloudprint-backend/internal/grpc/interceptor"
pb "github.com/cloudprint/cloudprint-backend/proto/generated"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
@@ -45,7 +44,7 @@ func (s *Server) Start() error {
}
s.grpcServer = grpc.NewServer(
grpc.UnaryInterceptor(interceptor.AuthInterceptor{}.UnaryServerInterceptor()),
grpc.UnaryInterceptor((&interceptor.AuthInterceptor{}).UnaryServerInterceptor()),
)
// Register reflection service for debugging

View File

@@ -58,11 +58,11 @@ func (s *AdminServiceServer) GetStatistics(ctx context.Context, req *pb.GetStati
}
return &pb.Statistics{
TotalUsers: totalUsers,
TotalOrders: totalOrders,
TodayOrders: todayOrders,
TotalUsers: int32(totalUsers),
TotalOrders: int32(totalOrders),
TodayOrders: int32(todayOrders),
TodayRevenue: todayRevenue,
PendingOrders: pendingOrders,
PendingOrders: int32(pendingOrders),
ActivePrinters: int32(activePrinters),
}, nil
}

View File

@@ -24,7 +24,6 @@ func NewFileServiceServer(fileService *service.FileService) *FileServiceServer {
func (s *FileServiceServer) Upload(stream pb.FileService_UploadServer) (*pb.UploadResponse, error) {
var fileName, fileType, uploaderType string
var uploaderID int32
var totalSize int64
var chunks [][]byte
for {
@@ -41,7 +40,6 @@ func (s *FileServiceServer) Upload(stream pb.FileService_UploadServer) (*pb.Uplo
fileType = req.FileType
uploaderType = "user" // Extract from context in production
uploaderID = 1 // Extract from context in production
totalSize = req.FileSize
}
chunks = append(chunks, req.Data)

View File

@@ -3,10 +3,12 @@ package service
import (
"context"
"github.com/cloudprint/cloudprint-backend/internal/model"
"github.com/cloudprint/cloudprint-backend/internal/service"
pb "github.com/cloudprint/cloudprint-backend/proto/generated"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb"
)
type OrderServiceServer struct {
@@ -57,7 +59,7 @@ func (s *OrderServiceServer) GetOrder(ctx context.Context, req *pb.GetOrderReque
}
func (s *OrderServiceServer) GetOrderList(ctx context.Context, req *pb.GetOrderListRequest) (*pb.OrderListResponse, error) {
orders, total, err := s.orderService.GetOrderList(ctx, req.UserId, req.Status, int(req.Page), int(req.PageSize))
orders, total, err := s.orderService.GetOrderList(ctx, req.UserId, int8(req.Status), int(req.Page), int(req.PageSize))
if err != nil {
return nil, status.Errorf(codes.Internal, "get order list failed: %v", err)
}
@@ -91,8 +93,17 @@ func (s *OrderServiceServer) CancelOrder(ctx context.Context, req *pb.CancelOrde
return &pb.Empty{}, nil
}
func convertOrderToPB(order *service.Order) *pb.Order {
// Note: This is a simplified conversion. In production, you would need to handle all fields properly.
// The service.Order type here is the model, not the protobuf type.
return nil // Placeholder
func convertOrderToPB(order *model.Order) *pb.Order {
if order == nil {
return nil
}
return &pb.Order{
Id: order.ID,
OrderNo: order.OrderNo,
UserId: order.UserID,
Status: int32(order.Status),
TotalAmount: order.TotalAmount,
Remark: order.Remark,
CreatedAt: timestamppb.New(order.CreatedAt),
}
}

View File

@@ -35,7 +35,7 @@ func NewPayServiceServer(
}
func (s *PayServiceServer) CreateWxPayOrder(ctx context.Context, req *pb.WxPayRequest) (*pb.WxPayResponse, error) {
resp, err := s.weChatPay.UnifiedOrder(ctx, req.OrderNo, req.Amount, req.Description, req.Openid, req.ClientIp)
resp, err := s.weChatPay.UnifiedOrder(req.OrderNo, req.Amount, req.Description, req.Openid, req.ClientIp)
if err != nil {
return nil, status.Errorf(codes.Internal, "create pay order failed: %v", err)
}
@@ -62,7 +62,7 @@ func (s *PayServiceServer) CreateWxPayOrder(ctx context.Context, req *pb.WxPayRe
}
func (s *PayServiceServer) QueryPayStatus(ctx context.Context, req *pb.QueryPayStatusRequest) (*pb.PayStatusResponse, error) {
tradeState, _, err := s.weChatPay.QueryOrder(ctx, req.OrderNo)
tradeState, _, err := s.weChatPay.QueryOrder(req.OrderNo)
if err != nil {
return nil, status.Errorf(codes.Internal, "query pay status failed: %v", err)
}

View File

@@ -3,6 +3,7 @@ package service
import (
"context"
"github.com/cloudprint/cloudprint-backend/internal/model"
"github.com/cloudprint/cloudprint-backend/internal/repository"
pb "github.com/cloudprint/cloudprint-backend/proto/generated"
"google.golang.org/grpc/codes"

View File

@@ -100,7 +100,7 @@ func (r *OrderRepository) UpdateStatus(ctx context.Context, orderNo string, stat
Where("order_no = ?", orderNo).Updates(updates).Error
}
func (r *OrderRepository) GetStatistics(ctx context.Context) (totalUsers, totalOrders, todayOrders int32, todayRevenue float64, pendingOrders int32, err error) {
func (r *OrderRepository) GetStatistics(ctx context.Context) (totalUsers, totalOrders, todayOrders int64, todayRevenue float64, pendingOrders int64, err error) {
// 总用户数
if err = r.db.WithContext(ctx).Model(&model.User{}).Count(&totalUsers).Error; err != nil {
return 0, 0, 0, 0, 0, fmt.Errorf("count users failed: %w", err)

View File

@@ -6,7 +6,6 @@ import (
"errors"
"fmt"
"net/http"
"time"
"github.com/cloudprint/cloudprint-backend/config"
"github.com/cloudprint/cloudprint-backend/internal/model"

View File

@@ -60,7 +60,7 @@ func (s *OrderService) CreateOrder(ctx context.Context, userID int32, items []*C
// Calculate total amount
var totalAmount float64
orderItems := make([]*model.OrderItem, 0, len(items))
orderItems := make([]model.OrderItem, 0, len(items))
for _, item := range items {
// Verify file exists
@@ -69,13 +69,13 @@ func (s *OrderService) CreateOrder(ctx context.Context, userID int32, items []*C
return nil, fmt.Errorf("file not found: %d", item.FileID)
}
// Calculate price
price, err := s.calculatePrice(ctx, item)
// Calculate price based on file type and settings
price, err := s.calculatePrice(ctx, item, file.FileType)
if err != nil {
return nil, err
}
orderItem := &model.OrderItem{
orderItem := model.OrderItem{
FileID: item.FileID,
PrinterID: intPtr(item.PrinterID),
Copies: item.Copies,
@@ -98,43 +98,64 @@ func (s *OrderService) CreateOrder(ctx context.Context, userID int32, items []*C
Items: orderItems,
}
// Convert to pointer slice for repository
orderItemsPtr := make([]*model.OrderItem, len(orderItems))
for i := range orderItems {
orderItemsPtr[i] = &orderItems[i]
}
// Save order with items
if err := s.orderRepo.CreateWithItems(ctx, order, orderItems); err != nil {
if err := s.orderRepo.CreateWithItems(ctx, order, orderItemsPtr); err != nil {
return nil, fmt.Errorf("failed to create order: %w", err)
}
return order, nil
}
func (s *OrderService) calculatePrice(ctx context.Context, item *CreateOrderItem) (float64, error) {
// Get price list
func (s *OrderService) calculatePrice(ctx context.Context, item *CreateOrderItem, fileType string) (float64, error) {
// Get price list from database
prices, err := s.priceRepo.GetAllActive(ctx)
if err != nil {
return 0, err
return 0, fmt.Errorf("failed to get price list: %w", err)
}
// Default price calculation (A4 B&W per page)
defaultPrice := 0.10
colorMultiplier := 3.0
duplexDiscount := 0.8
if len(prices) == 0 {
return 0, fmt.Errorf("no active price items found")
}
// Calculate based on file type and settings
// For simplicity, using default values
// In production, look up from price list based on file type
// Find matching price based on file type and color setting
var basePrice float64
for _, p := range prices {
// Match by type (A4/A3/照片纸) - default to A4 if no match
if p.Type == "A4" || (p.Type == "" && basePrice == 0) {
if !item.Color || (item.Color && p.ColorEnabled) {
basePrice = p.Price
break
}
}
}
pageCount := 1 // Default, should get actual page count from file
// Fallback to first available price if no match found
if basePrice == 0 {
basePrice = prices[0].Price
}
// Default values if not set
if item.Copies <= 0 {
item.Copies = 1
}
price := float64(pageCount) * defaultPrice * float64(item.Copies)
// Calculate total price
price := basePrice * float64(item.Copies)
// Apply color multiplier if color printing
if item.Color {
price *= colorMultiplier
price *= 3.0 // Color costs 3x
}
// Apply duplex discount
if item.Duplex {
price *= duplexDiscount
price *= 0.8 // Duplex gets 20% off
}
return price, nil