syntax = "proto3"; package cloudprint; option go_package = "github.com/cloudprint/cloudprint-backend/proto/generated"; import "google/protobuf/empty.proto"; import "google/protobuf/timestamp.proto"; // ============ 通用消息 ============ message Empty {} message StatusResponse { int32 code = 1; string message = 2; } // ============ 用户相关 ============ message User { int32 id = 1; string openid = 2; string nickname = 3; string avatar = 4; double balance = 5; google.protobuf.Timestamp created_at = 6; } message LoginRequest { string code = 1; // 微信授权码 } message LoginResponse { string access_token = 1; string refresh_token = 2; User user = 3; } message RefreshRequest { string refresh_token = 1; } message RefreshResponse { string access_token = 1; } message GetUserInfoRequest {} message UpdateUserRequest { string nickname = 1; string avatar = 2; } // ============ 文件相关 ============ message FileInfo { int32 id = 1; string file_name = 2; string file_path = 3; string file_type = 4; int64 file_size = 5; string uploader_type = 6; int32 uploader_id = 7; google.protobuf.Timestamp created_at = 8; } message UploadRequest { string file_name = 1; string file_type = 2; int64 file_size = 3; bytes data = 4; bool is_last_chunk = 5; string chunk_id = 6; int32 chunk_index = 7; int32 total_chunks = 8; } message UploadResponse { int32 file_id = 1; string file_path = 2; string file_url = 3; } message GetFileRequest { int32 file_id = 1; } message FileData { bytes data = 1; bool is_last = 2; } message DeleteFileRequest { int32 file_id = 1; } message WatermarkRequest { int32 file_id = 1; string text = 2; float opacity = 3; int32 position = 4; // 1: 左上 2: 右上 3: 左下 4: 右下 5: 居中 int32 font_size = 5; } message WatermarkResponse { int32 file_id = 1; string file_path = 2; } message GetFileListRequest { string uploader_type = 1; int32 uploader_id = 2; int32 page = 3; int32 page_size = 4; } message FileListResponse { repeated FileInfo files = 1; int32 total = 2; } // ============ 订单相关 ============ message Order { int32 id = 1; string order_no = 2; int32 user_id = 3; int32 status = 4; double total_amount = 5; string remark = 6; google.protobuf.Timestamp created_at = 7; google.protobuf.Timestamp paid_at = 8; repeated OrderItem items = 9; } message OrderItem { int32 id = 1; int32 order_id = 2; int32 file_id = 3; FileInfo file = 4; int32 printer_id = 5; int32 copies = 6; bool color = 7; bool duplex = 8; string page_range = 9; double price = 10; } message CreateOrderRequest { repeated CreateOrderItem items = 1; string remark = 2; } message CreateOrderItem { int32 file_id = 1; int32 printer_id = 2; int32 copies = 3; bool color = 4; bool duplex = 5; string page_range = 6; } message CreateOrderResponse { string order_no = 1; double total_amount = 2; } message GetOrderRequest { string order_no = 1; } message GetOrderListRequest { int32 user_id = 1; int32 status = 2; int32 page = 3; int32 page_size = 4; } message OrderListResponse { repeated Order orders = 1; int32 total = 2; } message UpdateOrderStatusRequest { string order_no = 1; int32 status = 2; } message CancelOrderRequest { string order_no = 1; } // ============ 打印机相关 ============ message Printer { int32 id = 1; string name = 2; string display_name = 3; bool is_active = 4; int32 status = 5; // 0: 空闲 1: 打印中 2: 离线 google.protobuf.Timestamp last_heartbeat = 6; } message GetPrintersRequest {} message PrinterListResponse { repeated Printer printers = 1; } message GetPrinterStatusRequest { int32 printer_id = 1; } message PrinterStatusResponse { Printer printer = 1; int32 queue_count = 2; } message RegisterPrinterRequest { string name = 1; string display_name = 2; string api_key = 3; } message RegisterPrinterResponse { int32 printer_id = 1; string token = 2; } message PrinterHeartbeatRequest { int32 printer_id = 1; int32 status = 2; string token = 3; } // ============ 打印任务相关 ============ message PrintJob { int32 id = 1; string job_no = 2; int32 printer_id = 3; int32 order_item_id = 4; string status = 5; // pending/printing/completed/failed/cancelled int32 progress = 6; string error_msg = 7; google.protobuf.Timestamp started_at = 8; google.protobuf.Timestamp completed_at = 9; OrderItem order_item = 10; } message SubmitPrintJobRequest { int32 order_item_id = 1; int32 printer_id = 2; string file_path = 3; int32 copies = 4; bool color = 5; bool duplex = 6; string page_range = 7; } message SubmitPrintJobResponse { string job_no = 1; } message CancelPrintJobRequest { string job_no = 1; } message SubscribeJobsRequest { int32 printer_id = 1; string token = 2; } message ReportJobStatusRequest { string job_no = 1; string status = 2; int32 progress = 3; string error_msg = 4; } // ============ 文库相关 ============ message LibraryCategory { int32 id = 1; string name = 2; string icon = 3; int32 sort_order = 4; } message LibraryFile { int32 id = 1; int32 category_id = 2; int32 file_id = 3; string title = 4; string description = 5; int32 page_count = 6; int32 download_count = 7; FileInfo file = 8; google.protobuf.Timestamp created_at = 9; } message GetCategoriesRequest {} message CategoryListResponse { repeated LibraryCategory categories = 1; } message GetLibraryFilesRequest { int32 category_id = 1; int32 page = 2; int32 page_size = 3; } message LibraryFileListResponse { repeated LibraryFile files = 1; int32 total = 2; } message UploadLibraryFileRequest { int32 category_id = 1; string title = 2; string description = 3; bytes data = 4; string file_name = 5; string file_type = 6; } message UploadLibraryFileResponse { int32 library_file_id = 1; } message DeleteLibraryFileRequest { int32 library_file_id = 1; } // ============ 价目表相关 ============ message PriceItem { int32 id = 1; string name = 2; string type = 3; double price = 4; string unit = 5; bool color_enabled = 6; bool is_active = 7; } message GetPriceListRequest {} message PriceListResponse { repeated PriceItem items = 1; } message CreatePriceItemRequest { string name = 1; string type = 2; double price = 3; string unit = 4; bool color_enabled = 5; } message UpdatePriceItemRequest { int32 id = 1; string name = 2; string type = 3; double price = 4; string unit = 5; bool color_enabled = 6; bool is_active = 7; } // ============ 支付相关 ============ message WxPayRequest { string order_no = 1; double amount = 2; string description = 3; string openid = 4; string client_ip = 5; } message WxPayResponse { string prepay_id = 1; string code_url = 2; string mweb_url = 3; } message QueryPayStatusRequest { string order_no = 1; } message PayStatusResponse { int32 status = 1; // 0: 待支付 1: 支付中 2: 成功 3: 失败 string transaction_id = 2; } message PayCallbackRequest { string body = 1; } message PayCallbackResponse { string return_code = 1; string return_msg = 2; } message PayByBalanceRequest { string order_no = 1; int32 user_id = 2; } // ============ 管理后台相关 ============ message Admin { int32 id = 1; string username = 2; string nickname = 3; int32 role = 4; google.protobuf.Timestamp created_at = 5; } message AdminLoginRequest { string username = 1; string password = 2; } message AdminLoginResponse { string access_token = 1; Admin admin = 2; } message GetStatisticsRequest {} message Statistics { int32 total_users = 1; int32 total_orders = 2; int32 today_orders = 3; double today_revenue = 4; int32 pending_orders = 5; int32 active_printers = 6; } // ============ 服务定义 ============ service AuthService { rpc Login(LoginRequest) returns (LoginResponse); rpc RefreshToken(RefreshRequest) returns (RefreshResponse); rpc GetUserInfo(GetUserInfoRequest) returns (User); rpc UpdateUser(UpdateUserRequest) returns (User); } service FileService { rpc Upload(stream UploadRequest) returns (UploadResponse); rpc GetFile(GetFileRequest) returns (stream FileData); rpc DeleteFile(DeleteFileRequest) returns (Empty); rpc AddWatermark(WatermarkRequest) returns (WatermarkResponse); rpc GetFileList(GetFileListRequest) returns (FileListResponse); } service OrderService { rpc CreateOrder(CreateOrderRequest) returns (CreateOrderResponse); rpc GetOrder(GetOrderRequest) returns (Order); rpc GetOrderList(GetOrderListRequest) returns (OrderListResponse); rpc UpdateOrderStatus(UpdateOrderStatusRequest) returns (Empty); rpc CancelOrder(CancelOrderRequest) returns (Empty); } service PrintService { rpc GetPrinters(GetPrintersRequest) returns (PrinterListResponse); rpc GetPrinterStatus(GetPrinterStatusRequest) returns (PrinterStatusResponse); rpc RegisterPrinter(RegisterPrinterRequest) returns (RegisterPrinterResponse); rpc PrinterHeartbeat(PrinterHeartbeatRequest) returns (Empty); rpc SubmitPrintJob(SubmitPrintJobRequest) returns (SubmitPrintJobResponse); rpc CancelPrintJob(CancelPrintJobRequest) returns (Empty); rpc SubscribeJobs(SubscribeJobsRequest) returns (stream PrintJob); rpc ReportJobStatus(ReportJobStatusRequest) returns (Empty); } service LibraryService { rpc GetCategories(GetCategoriesRequest) returns (CategoryListResponse); rpc GetFiles(GetLibraryFilesRequest) returns (LibraryFileListResponse); rpc UploadFile(stream UploadLibraryFileRequest) returns (UploadLibraryFileResponse); rpc DeleteFile(DeleteLibraryFileRequest) returns (Empty); } service PriceService { rpc GetPriceList(GetPriceListRequest) returns (PriceListResponse); rpc CreatePriceItem(CreatePriceItemRequest) returns (PriceItem); rpc UpdatePriceItem(UpdatePriceItemRequest) returns (PriceItem); } service PayService { rpc CreateWxPayOrder(WxPayRequest) returns (WxPayResponse); rpc QueryPayStatus(QueryPayStatusRequest) returns (PayStatusResponse); rpc HandlePayCallback(PayCallbackRequest) returns (PayCallbackResponse); rpc PayByBalance(PayByBalanceRequest) returns (StatusResponse); } service AdminService { rpc Login(AdminLoginRequest) returns (AdminLoginResponse); rpc GetStatistics(GetStatisticsRequest) returns (Statistics); }