修复编译问题和版本兼容问题
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/cloudprint/cloudprint-backend/config"
|
||||
"github.com/cloudprint/cloudprint-backend/internal/model"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user