diff --git a/pkg/utils/log.go b/pkg/utils/log.go index 0c5df4d..13f6f94 100644 --- a/pkg/utils/log.go +++ b/pkg/utils/log.go @@ -91,7 +91,11 @@ func SetActionLog(adminInfo UserInfo, info ActionAdd) { "old_content": info.OldContent, "new_content": info.NewContent, } - jsonData, _ := jsoniter.Marshal(content) + jsonData, jerr := jsoniter.Marshal(content) + if jerr != nil { + logx.Errorf("marshal content failed: %v", jerr) + return + } log := ActionLog{ Content: string(jsonData), AdminId: adminInfo.ID, @@ -111,8 +115,11 @@ func SetActionLog(adminInfo UserInfo, info ActionAdd) { logx.Errorf("marshal ActionLog failed: %v", err) return } - logRedis.LogRedisClient.LPush(context.Background(), LogActionQueueKey, string(logJson)).Result() - + _, rerr := logRedis.LogRedisClient.LPush(context.Background(), LogActionQueueKey, string(logJson)).Result() + if rerr != nil { + logx.Errorf("push ActionLog failed: %v", rerr) + return + } } func SetLoginLog(adminInfo UserInfo, status bool, reason string) { diff --git a/pkg/utils/status.go b/pkg/utils/status.go index fac08bd..6c9bda8 100644 --- a/pkg/utils/status.go +++ b/pkg/utils/status.go @@ -97,18 +97,19 @@ var ( ErrorAuthority = Status{Code: 10007, Msg: "没有权限"} ErrorNoLoginInfo = Status{Code: 10008, Msg: "没有获取到登录信息"} ErrorAuthorityChange = Status{Code: 10009, Msg: "该权限下有其它权限"} - ErrorJsonDataError = Status{Code: 11000, Msg: "json数据错误"} - + ErrorJsonDataError = Status{Code: 10010, Msg: "json数据错误"} + ErrorVerifyReview = Status{Code: 10011, Msg: "不能重复审核"} + ErrorOrderOver = Status{Code: 11012, Msg: "订单已完结"} // 数据类 ErrorDataIsExist = Status{Code: 11004, Msg: "数据已存在"} // 参数类 - ErrorReasonParams = Status{Code: 10001, Msg: "原因不能为空"} - ErrorMobileError = Status{Code: 10009, Msg: "手机号格式错误"} + ErrorReasonParams = Status{Code: 10012, Msg: "原因不能为空"} + ErrorMobileError = Status{Code: 10013, Msg: "手机号格式错误"} // ErrorNotFund 数据类 - ErrorFormatDataError = Status{Code: 11010, Msg: "格式化数据出错"} - ErrorStockNotEnough = Status{Code: 11014, Msg: "库存不足"} + ErrorFormatDataError = Status{Code: 11014, Msg: "格式化数据出错"} + ErrorStockNotEnough = Status{Code: 11015, Msg: "库存不足"} // —————————————————————————————————————————————————————————————————————————————————————— diff --git a/rpc/express/express.pb b/rpc/express/express.pb index 5fde36b..1c6ba26 100644 Binary files a/rpc/express/express.pb and b/rpc/express/express.pb differ diff --git a/rpc/express/express.proto b/rpc/express/express.proto index 8f765f5..5f00a5e 100644 --- a/rpc/express/express.proto +++ b/rpc/express/express.proto @@ -10,6 +10,9 @@ message Response { string msg = 2; string data = 3; } +message IdResponse { + int64 id = 1; +} message EmtpyRequest { } @@ -43,6 +46,44 @@ message StatusRequest { string reason = 3; } +message HistoryRequest { + int32 page = 1; + int32 size = 2; +} + +message DeliveryOrderCreateRequest { + string obj_id = 1; + string mobile = 2; + string address = 3; + string addressee = 4; + string province = 5; + string city = 6; + string county = 7; + repeated DeliverOrderProductInfo product_info = 8; + int64 group_id = 9; + string obj_sn = 10; + int32 type = 11; + int32 status = 12; +} + +message DeliverOrderProductInfo { + int32 number = 1; + string product_name = 2; + int32 type = 3; + double price = 4; + int64 product_id = 5; +} + +message DeliveringRequest { + int64 transit_id = 1; + int64 id = 2; +} + +message ExpressCompanyRequest { + string code = 1; +} + + service Express { rpc Items(EmtpyRequest) returns(Response){ option (google.api.http) = { @@ -80,4 +121,29 @@ service Express { body: "*" }; }; + + rpc History(HistoryRequest) returns(Response){ + option (google.api.http) = { + get: "/admin/v3/delivery/history" + body: "*" + }; + }; + + //获取可选的打印公司 + rpc ExpressCompany(ExpressCompanyRequest) returns(Response){ + option (google.api.http) = { + get: "/admin/v3/express/company" + body: "*" + }; + }; + //发货 + rpc ExpressDelivering(DeliveringRequest) returns(Response){ + option (google.api.http) = { + post: "/admin/v3/express/delivering" + body: "*" + }; + }; + + //添加生成订单的发货信息 + rpc DeliveryOrderCreate(DeliveryOrderCreateRequest) returns(IdResponse); } diff --git a/rpc/express/pb/express.pb.go b/rpc/express/pb/express.pb.go index 11d4e5f..8b98f98 100644 --- a/rpc/express/pb/express.pb.go +++ b/rpc/express/pb/express.pb.go @@ -82,6 +82,50 @@ func (x *Response) GetData() string { return "" } +type IdResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdResponse) Reset() { + *x = IdResponse{} + mi := &file_express_express_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdResponse) ProtoMessage() {} + +func (x *IdResponse) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IdResponse.ProtoReflect.Descriptor instead. +func (*IdResponse) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{1} +} + +func (x *IdResponse) GetId() int64 { + if x != nil { + return x.Id + } + return 0 +} + type EmtpyRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -90,7 +134,7 @@ type EmtpyRequest struct { func (x *EmtpyRequest) Reset() { *x = EmtpyRequest{} - mi := &file_express_express_proto_msgTypes[1] + mi := &file_express_express_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -102,7 +146,7 @@ func (x *EmtpyRequest) String() string { func (*EmtpyRequest) ProtoMessage() {} func (x *EmtpyRequest) ProtoReflect() protoreflect.Message { - mi := &file_express_express_proto_msgTypes[1] + mi := &file_express_express_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -115,7 +159,7 @@ func (x *EmtpyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EmtpyRequest.ProtoReflect.Descriptor instead. func (*EmtpyRequest) Descriptor() ([]byte, []int) { - return file_express_express_proto_rawDescGZIP(), []int{1} + return file_express_express_proto_rawDescGZIP(), []int{2} } type CreateRequest struct { @@ -142,7 +186,7 @@ type CreateRequest struct { func (x *CreateRequest) Reset() { *x = CreateRequest{} - mi := &file_express_express_proto_msgTypes[2] + mi := &file_express_express_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -154,7 +198,7 @@ func (x *CreateRequest) String() string { func (*CreateRequest) ProtoMessage() {} func (x *CreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_express_express_proto_msgTypes[2] + mi := &file_express_express_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -167,7 +211,7 @@ func (x *CreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateRequest.ProtoReflect.Descriptor instead. func (*CreateRequest) Descriptor() ([]byte, []int) { - return file_express_express_proto_rawDescGZIP(), []int{2} + return file_express_express_proto_rawDescGZIP(), []int{3} } func (x *CreateRequest) GetId() int64 { @@ -291,7 +335,7 @@ type IdRequest struct { func (x *IdRequest) Reset() { *x = IdRequest{} - mi := &file_express_express_proto_msgTypes[3] + mi := &file_express_express_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -303,7 +347,7 @@ func (x *IdRequest) String() string { func (*IdRequest) ProtoMessage() {} func (x *IdRequest) ProtoReflect() protoreflect.Message { - mi := &file_express_express_proto_msgTypes[3] + mi := &file_express_express_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -316,7 +360,7 @@ func (x *IdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdRequest.ProtoReflect.Descriptor instead. func (*IdRequest) Descriptor() ([]byte, []int) { - return file_express_express_proto_rawDescGZIP(), []int{3} + return file_express_express_proto_rawDescGZIP(), []int{4} } func (x *IdRequest) GetId() int64 { @@ -337,7 +381,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} - mi := &file_express_express_proto_msgTypes[4] + mi := &file_express_express_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -349,7 +393,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_express_express_proto_msgTypes[4] + mi := &file_express_express_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -362,7 +406,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_express_express_proto_rawDescGZIP(), []int{4} + return file_express_express_proto_rawDescGZIP(), []int{5} } func (x *StatusRequest) GetId() int64 { @@ -386,6 +430,362 @@ func (x *StatusRequest) GetReason() string { return "" } +type HistoryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Page int32 `protobuf:"varint,1,opt,name=page,proto3" json:"page,omitempty"` + Size int32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryRequest) Reset() { + *x = HistoryRequest{} + mi := &file_express_express_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequest) ProtoMessage() {} + +func (x *HistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. +func (*HistoryRequest) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{6} +} + +func (x *HistoryRequest) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *HistoryRequest) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +type DeliveryOrderCreateRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ObjId string `protobuf:"bytes,1,opt,name=obj_id,json=objId,proto3" json:"obj_id,omitempty"` + Mobile string `protobuf:"bytes,2,opt,name=mobile,proto3" json:"mobile,omitempty"` + Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` + Addressee string `protobuf:"bytes,4,opt,name=addressee,proto3" json:"addressee,omitempty"` + Province string `protobuf:"bytes,5,opt,name=province,proto3" json:"province,omitempty"` + City string `protobuf:"bytes,6,opt,name=city,proto3" json:"city,omitempty"` + County string `protobuf:"bytes,7,opt,name=county,proto3" json:"county,omitempty"` + ProductInfo []*DeliverOrderProductInfo `protobuf:"bytes,8,rep,name=product_info,json=productInfo,proto3" json:"product_info,omitempty"` + GroupId int64 `protobuf:"varint,9,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + ObjSn string `protobuf:"bytes,10,opt,name=obj_sn,json=objSn,proto3" json:"obj_sn,omitempty"` + Type int32 `protobuf:"varint,11,opt,name=type,proto3" json:"type,omitempty"` + Status int32 `protobuf:"varint,12,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeliveryOrderCreateRequest) Reset() { + *x = DeliveryOrderCreateRequest{} + mi := &file_express_express_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeliveryOrderCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeliveryOrderCreateRequest) ProtoMessage() {} + +func (x *DeliveryOrderCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeliveryOrderCreateRequest.ProtoReflect.Descriptor instead. +func (*DeliveryOrderCreateRequest) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{7} +} + +func (x *DeliveryOrderCreateRequest) GetObjId() string { + if x != nil { + return x.ObjId + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetMobile() string { + if x != nil { + return x.Mobile + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetAddressee() string { + if x != nil { + return x.Addressee + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetProvince() string { + if x != nil { + return x.Province + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetCity() string { + if x != nil { + return x.City + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetCounty() string { + if x != nil { + return x.County + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetProductInfo() []*DeliverOrderProductInfo { + if x != nil { + return x.ProductInfo + } + return nil +} + +func (x *DeliveryOrderCreateRequest) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *DeliveryOrderCreateRequest) GetObjSn() string { + if x != nil { + return x.ObjSn + } + return "" +} + +func (x *DeliveryOrderCreateRequest) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *DeliveryOrderCreateRequest) GetStatus() int32 { + if x != nil { + return x.Status + } + return 0 +} + +type DeliverOrderProductInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + Number int32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + ProductName string `protobuf:"bytes,2,opt,name=product_name,json=productName,proto3" json:"product_name,omitempty"` + Type int32 `protobuf:"varint,3,opt,name=type,proto3" json:"type,omitempty"` + Price float64 `protobuf:"fixed64,4,opt,name=price,proto3" json:"price,omitempty"` + ProductId int64 `protobuf:"varint,5,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeliverOrderProductInfo) Reset() { + *x = DeliverOrderProductInfo{} + mi := &file_express_express_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeliverOrderProductInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeliverOrderProductInfo) ProtoMessage() {} + +func (x *DeliverOrderProductInfo) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeliverOrderProductInfo.ProtoReflect.Descriptor instead. +func (*DeliverOrderProductInfo) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{8} +} + +func (x *DeliverOrderProductInfo) GetNumber() int32 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *DeliverOrderProductInfo) GetProductName() string { + if x != nil { + return x.ProductName + } + return "" +} + +func (x *DeliverOrderProductInfo) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *DeliverOrderProductInfo) GetPrice() float64 { + if x != nil { + return x.Price + } + return 0 +} + +func (x *DeliverOrderProductInfo) GetProductId() int64 { + if x != nil { + return x.ProductId + } + return 0 +} + +type DeliveringRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransitId int64 `protobuf:"varint,1,opt,name=transit_id,json=transitId,proto3" json:"transit_id,omitempty"` + Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeliveringRequest) Reset() { + *x = DeliveringRequest{} + mi := &file_express_express_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeliveringRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeliveringRequest) ProtoMessage() {} + +func (x *DeliveringRequest) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeliveringRequest.ProtoReflect.Descriptor instead. +func (*DeliveringRequest) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{9} +} + +func (x *DeliveringRequest) GetTransitId() int64 { + if x != nil { + return x.TransitId + } + return 0 +} + +func (x *DeliveringRequest) GetId() int64 { + if x != nil { + return x.Id + } + return 0 +} + +type ExpressCompanyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExpressCompanyRequest) Reset() { + *x = ExpressCompanyRequest{} + mi := &file_express_express_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExpressCompanyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExpressCompanyRequest) ProtoMessage() {} + +func (x *ExpressCompanyRequest) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExpressCompanyRequest.ProtoReflect.Descriptor instead. +func (*ExpressCompanyRequest) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{10} +} + +func (x *ExpressCompanyRequest) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + var File_express_express_proto protoreflect.FileDescriptor const file_express_express_proto_rawDesc = "" + @@ -394,7 +794,10 @@ const file_express_express_proto_rawDesc = "" + "\bResponse\x12\x12\n" + "\x04code\x18\x01 \x01(\x05R\x04code\x12\x10\n" + "\x03msg\x18\x02 \x01(\tR\x03msg\x12\x12\n" + - "\x04data\x18\x03 \x01(\tR\x04data\"\x0e\n" + + "\x04data\x18\x03 \x01(\tR\x04data\"\x1c\n" + + "\n" + + "IdResponse\x12\x0e\n" + + "\x02id\x18\x01 \x01(\x03R\x02id\"\x0e\n" + "\fEmtpyRequest\"\xb5\x03\n" + "\rCreateRequest\x12\x0e\n" + "\x02id\x18\x01 \x01(\x03R\x02id\x12\x12\n" + @@ -421,14 +824,48 @@ const file_express_express_proto_rawDesc = "" + "\rStatusRequest\x12\x0e\n" + "\x02id\x18\x01 \x01(\x03R\x02id\x12\x16\n" + "\x06status\x18\x02 \x01(\x05R\x06status\x12\x16\n" + - "\x06reason\x18\x03 \x01(\tR\x06reason2\x93\x04\n" + + "\x06reason\x18\x03 \x01(\tR\x06reason\"8\n" + + "\x0eHistoryRequest\x12\x12\n" + + "\x04page\x18\x01 \x01(\x05R\x04page\x12\x12\n" + + "\x04size\x18\x02 \x01(\x05R\x04size\"\xee\x02\n" + + "\x1aDeliveryOrderCreateRequest\x12\x15\n" + + "\x06obj_id\x18\x01 \x01(\tR\x05objId\x12\x16\n" + + "\x06mobile\x18\x02 \x01(\tR\x06mobile\x12\x18\n" + + "\aaddress\x18\x03 \x01(\tR\aaddress\x12\x1c\n" + + "\taddressee\x18\x04 \x01(\tR\taddressee\x12\x1a\n" + + "\bprovince\x18\x05 \x01(\tR\bprovince\x12\x12\n" + + "\x04city\x18\x06 \x01(\tR\x04city\x12\x16\n" + + "\x06county\x18\a \x01(\tR\x06county\x12C\n" + + "\fproduct_info\x18\b \x03(\v2 .express.DeliverOrderProductInfoR\vproductInfo\x12\x19\n" + + "\bgroup_id\x18\t \x01(\x03R\agroupId\x12\x15\n" + + "\x06obj_sn\x18\n" + + " \x01(\tR\x05objSn\x12\x12\n" + + "\x04type\x18\v \x01(\x05R\x04type\x12\x16\n" + + "\x06status\x18\f \x01(\x05R\x06status\"\x9d\x01\n" + + "\x17DeliverOrderProductInfo\x12\x16\n" + + "\x06number\x18\x01 \x01(\x05R\x06number\x12!\n" + + "\fproduct_name\x18\x02 \x01(\tR\vproductName\x12\x12\n" + + "\x04type\x18\x03 \x01(\x05R\x04type\x12\x14\n" + + "\x05price\x18\x04 \x01(\x01R\x05price\x12\x1d\n" + + "\n" + + "product_id\x18\x05 \x01(\x03R\tproductId\"B\n" + + "\x11DeliveringRequest\x12\x1d\n" + + "\n" + + "transit_id\x18\x01 \x01(\x03R\ttransitId\x12\x0e\n" + + "\x02id\x18\x02 \x01(\x03R\x02id\"+\n" + + "\x15ExpressCompanyRequest\x12\x12\n" + + "\x04code\x18\x01 \x01(\tR\x04code2\x9a\a\n" + "\aExpress\x12U\n" + "\x05Items\x12\x15.express.EmtpyRequest\x1a\x11.express.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\x12\x17/admin/v3/express/items\x12X\n" + "\x06Create\x12\x16.express.CreateRequest\x1a\x11.express.Response\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/admin/v3/express/create\x12T\n" + "\x04Edit\x12\x16.express.CreateRequest\x1a\x11.express.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/admin/v3/express/edit\x12P\n" + "\x04Info\x12\x12.express.IdRequest\x1a\x11.express.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\x12\x16/admin/v3/express/info\x12U\n" + "\x05Names\x12\x15.express.EmtpyRequest\x1a\x11.express.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\x12\x17/admin/v3/express/names\x12X\n" + - "\x06Status\x12\x16.express.StatusRequest\x1a\x11.express.Response\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/admin/v3/express/statusB\vZ\t./expressb\x06proto3" + "\x06Status\x12\x16.express.StatusRequest\x1a\x11.express.Response\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/admin/v3/express/status\x12\\\n" + + "\aHistory\x12\x17.express.HistoryRequest\x1a\x11.express.Response\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\x12\x1a/admin/v3/delivery/history\x12i\n" + + "\x0eExpressCompany\x12\x1e.express.ExpressCompanyRequest\x1a\x11.express.Response\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\x12\x19/admin/v3/express/company\x12k\n" + + "\x11ExpressDelivering\x12\x1a.express.DeliveringRequest\x1a\x11.express.Response\"'\x82\xd3\xe4\x93\x02!:\x01*\"\x1c/admin/v3/express/delivering\x12O\n" + + "\x13DeliveryOrderCreate\x12#.express.DeliveryOrderCreateRequest\x1a\x13.express.IdResponseB\vZ\t./expressb\x06proto3" var ( file_express_express_proto_rawDescOnce sync.Once @@ -442,32 +879,47 @@ func file_express_express_proto_rawDescGZIP() []byte { return file_express_express_proto_rawDescData } -var file_express_express_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_express_express_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_express_express_proto_goTypes = []any{ - (*Response)(nil), // 0: express.Response - (*EmtpyRequest)(nil), // 1: express.EmtpyRequest - (*CreateRequest)(nil), // 2: express.CreateRequest - (*IdRequest)(nil), // 3: express.IdRequest - (*StatusRequest)(nil), // 4: express.StatusRequest + (*Response)(nil), // 0: express.Response + (*IdResponse)(nil), // 1: express.IdResponse + (*EmtpyRequest)(nil), // 2: express.EmtpyRequest + (*CreateRequest)(nil), // 3: express.CreateRequest + (*IdRequest)(nil), // 4: express.IdRequest + (*StatusRequest)(nil), // 5: express.StatusRequest + (*HistoryRequest)(nil), // 6: express.HistoryRequest + (*DeliveryOrderCreateRequest)(nil), // 7: express.DeliveryOrderCreateRequest + (*DeliverOrderProductInfo)(nil), // 8: express.DeliverOrderProductInfo + (*DeliveringRequest)(nil), // 9: express.DeliveringRequest + (*ExpressCompanyRequest)(nil), // 10: express.ExpressCompanyRequest } var file_express_express_proto_depIdxs = []int32{ - 1, // 0: express.Express.Items:input_type -> express.EmtpyRequest - 2, // 1: express.Express.Create:input_type -> express.CreateRequest - 2, // 2: express.Express.Edit:input_type -> express.CreateRequest - 3, // 3: express.Express.Info:input_type -> express.IdRequest - 1, // 4: express.Express.Names:input_type -> express.EmtpyRequest - 4, // 5: express.Express.Status:input_type -> express.StatusRequest - 0, // 6: express.Express.Items:output_type -> express.Response - 0, // 7: express.Express.Create:output_type -> express.Response - 0, // 8: express.Express.Edit:output_type -> express.Response - 0, // 9: express.Express.Info:output_type -> express.Response - 0, // 10: express.Express.Names:output_type -> express.Response - 0, // 11: express.Express.Status:output_type -> express.Response - 6, // [6:12] is the sub-list for method output_type - 0, // [0:6] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 8, // 0: express.DeliveryOrderCreateRequest.product_info:type_name -> express.DeliverOrderProductInfo + 2, // 1: express.Express.Items:input_type -> express.EmtpyRequest + 3, // 2: express.Express.Create:input_type -> express.CreateRequest + 3, // 3: express.Express.Edit:input_type -> express.CreateRequest + 4, // 4: express.Express.Info:input_type -> express.IdRequest + 2, // 5: express.Express.Names:input_type -> express.EmtpyRequest + 5, // 6: express.Express.Status:input_type -> express.StatusRequest + 6, // 7: express.Express.History:input_type -> express.HistoryRequest + 10, // 8: express.Express.ExpressCompany:input_type -> express.ExpressCompanyRequest + 9, // 9: express.Express.ExpressDelivering:input_type -> express.DeliveringRequest + 7, // 10: express.Express.DeliveryOrderCreate:input_type -> express.DeliveryOrderCreateRequest + 0, // 11: express.Express.Items:output_type -> express.Response + 0, // 12: express.Express.Create:output_type -> express.Response + 0, // 13: express.Express.Edit:output_type -> express.Response + 0, // 14: express.Express.Info:output_type -> express.Response + 0, // 15: express.Express.Names:output_type -> express.Response + 0, // 16: express.Express.Status:output_type -> express.Response + 0, // 17: express.Express.History:output_type -> express.Response + 0, // 18: express.Express.ExpressCompany:output_type -> express.Response + 0, // 19: express.Express.ExpressDelivering:output_type -> express.Response + 1, // 20: express.Express.DeliveryOrderCreate:output_type -> express.IdResponse + 11, // [11:21] is the sub-list for method output_type + 1, // [1:11] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_express_express_proto_init() } @@ -481,7 +933,7 @@ func file_express_express_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_express_express_proto_rawDesc), len(file_express_express_proto_rawDesc)), NumEnums: 0, - NumMessages: 5, + NumMessages: 11, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/express/pb/express_grpc.pb.go b/rpc/express/pb/express_grpc.pb.go index 15d08db..a2190c1 100644 --- a/rpc/express/pb/express_grpc.pb.go +++ b/rpc/express/pb/express_grpc.pb.go @@ -19,12 +19,16 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Express_Items_FullMethodName = "/express.Express/Items" - Express_Create_FullMethodName = "/express.Express/Create" - Express_Edit_FullMethodName = "/express.Express/Edit" - Express_Info_FullMethodName = "/express.Express/Info" - Express_Names_FullMethodName = "/express.Express/Names" - Express_Status_FullMethodName = "/express.Express/Status" + Express_Items_FullMethodName = "/express.Express/Items" + Express_Create_FullMethodName = "/express.Express/Create" + Express_Edit_FullMethodName = "/express.Express/Edit" + Express_Info_FullMethodName = "/express.Express/Info" + Express_Names_FullMethodName = "/express.Express/Names" + Express_Status_FullMethodName = "/express.Express/Status" + Express_History_FullMethodName = "/express.Express/History" + Express_ExpressCompany_FullMethodName = "/express.Express/ExpressCompany" + Express_ExpressDelivering_FullMethodName = "/express.Express/ExpressDelivering" + Express_DeliveryOrderCreate_FullMethodName = "/express.Express/DeliveryOrderCreate" ) // ExpressClient is the client API for Express service. @@ -37,6 +41,13 @@ type ExpressClient interface { Info(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*Response, error) Names(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*Response, error) + History(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*Response, error) + // 获取可选的打印公司 + ExpressCompany(ctx context.Context, in *ExpressCompanyRequest, opts ...grpc.CallOption) (*Response, error) + // 发货 + ExpressDelivering(ctx context.Context, in *DeliveringRequest, opts ...grpc.CallOption) (*Response, error) + // 添加生成订单的发货信息 + DeliveryOrderCreate(ctx context.Context, in *DeliveryOrderCreateRequest, opts ...grpc.CallOption) (*IdResponse, error) } type expressClient struct { @@ -107,6 +118,46 @@ func (c *expressClient) Status(ctx context.Context, in *StatusRequest, opts ...g return out, nil } +func (c *expressClient) History(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Express_History_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *expressClient) ExpressCompany(ctx context.Context, in *ExpressCompanyRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Express_ExpressCompany_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *expressClient) ExpressDelivering(ctx context.Context, in *DeliveringRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Express_ExpressDelivering_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *expressClient) DeliveryOrderCreate(ctx context.Context, in *DeliveryOrderCreateRequest, opts ...grpc.CallOption) (*IdResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(IdResponse) + err := c.cc.Invoke(ctx, Express_DeliveryOrderCreate_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ExpressServer is the server API for Express service. // All implementations must embed UnimplementedExpressServer // for forward compatibility. @@ -117,6 +168,13 @@ type ExpressServer interface { Info(context.Context, *IdRequest) (*Response, error) Names(context.Context, *EmtpyRequest) (*Response, error) Status(context.Context, *StatusRequest) (*Response, error) + History(context.Context, *HistoryRequest) (*Response, error) + // 获取可选的打印公司 + ExpressCompany(context.Context, *ExpressCompanyRequest) (*Response, error) + // 发货 + ExpressDelivering(context.Context, *DeliveringRequest) (*Response, error) + // 添加生成订单的发货信息 + DeliveryOrderCreate(context.Context, *DeliveryOrderCreateRequest) (*IdResponse, error) mustEmbedUnimplementedExpressServer() } @@ -145,6 +203,18 @@ func (UnimplementedExpressServer) Names(context.Context, *EmtpyRequest) (*Respon func (UnimplementedExpressServer) Status(context.Context, *StatusRequest) (*Response, error) { return nil, status.Error(codes.Unimplemented, "method Status not implemented") } +func (UnimplementedExpressServer) History(context.Context, *HistoryRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method History not implemented") +} +func (UnimplementedExpressServer) ExpressCompany(context.Context, *ExpressCompanyRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method ExpressCompany not implemented") +} +func (UnimplementedExpressServer) ExpressDelivering(context.Context, *DeliveringRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method ExpressDelivering not implemented") +} +func (UnimplementedExpressServer) DeliveryOrderCreate(context.Context, *DeliveryOrderCreateRequest) (*IdResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DeliveryOrderCreate not implemented") +} func (UnimplementedExpressServer) mustEmbedUnimplementedExpressServer() {} func (UnimplementedExpressServer) testEmbeddedByValue() {} @@ -274,6 +344,78 @@ func _Express_Status_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Express_History_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HistoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExpressServer).History(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Express_History_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExpressServer).History(ctx, req.(*HistoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Express_ExpressCompany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExpressCompanyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExpressServer).ExpressCompany(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Express_ExpressCompany_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExpressServer).ExpressCompany(ctx, req.(*ExpressCompanyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Express_ExpressDelivering_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeliveringRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExpressServer).ExpressDelivering(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Express_ExpressDelivering_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExpressServer).ExpressDelivering(ctx, req.(*DeliveringRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Express_DeliveryOrderCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeliveryOrderCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExpressServer).DeliveryOrderCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Express_DeliveryOrderCreate_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExpressServer).DeliveryOrderCreate(ctx, req.(*DeliveryOrderCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Express_ServiceDesc is the grpc.ServiceDesc for Express service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -305,6 +447,22 @@ var Express_ServiceDesc = grpc.ServiceDesc{ MethodName: "Status", Handler: _Express_Status_Handler, }, + { + MethodName: "History", + Handler: _Express_History_Handler, + }, + { + MethodName: "ExpressCompany", + Handler: _Express_ExpressCompany_Handler, + }, + { + MethodName: "ExpressDelivering", + Handler: _Express_ExpressDelivering_Handler, + }, + { + MethodName: "DeliveryOrderCreate", + Handler: _Express_DeliveryOrderCreate_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "express/express.proto", diff --git a/rpc/order/order.pb b/rpc/order/order.pb index dcaebd2..291afcd 100644 Binary files a/rpc/order/order.pb and b/rpc/order/order.pb differ diff --git a/rpc/order/order.proto b/rpc/order/order.proto index 9a0a732..786dad3 100644 --- a/rpc/order/order.proto +++ b/rpc/order/order.proto @@ -106,6 +106,7 @@ message AdminCreateOrderRequest { int64 address_id = 1; string note = 2; string info = 3; + int32 type =4; } service order { diff --git a/rpc/order/pb/order.pb.go b/rpc/order/pb/order.pb.go index 2419dd4..7c10060 100644 --- a/rpc/order/pb/order.pb.go +++ b/rpc/order/pb/order.pb.go @@ -426,66 +426,6 @@ func (x *EditAddressRequest) GetType() int32 { return 0 } -type StatusAddressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"` - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *StatusAddressRequest) Reset() { - *x = StatusAddressRequest{} - mi := &file_order_order_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *StatusAddressRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusAddressRequest) ProtoMessage() {} - -func (x *StatusAddressRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusAddressRequest.ProtoReflect.Descriptor instead. -func (*StatusAddressRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{5} -} - -func (x *StatusAddressRequest) GetId() int64 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *StatusAddressRequest) GetStatus() int32 { - if x != nil { - return x.Status - } - return 0 -} - -func (x *StatusAddressRequest) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - type EmptyRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -494,7 +434,7 @@ type EmptyRequest struct { func (x *EmptyRequest) Reset() { *x = EmptyRequest{} - mi := &file_order_order_proto_msgTypes[6] + mi := &file_order_order_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -506,7 +446,7 @@ func (x *EmptyRequest) String() string { func (*EmptyRequest) ProtoMessage() {} func (x *EmptyRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[6] + mi := &file_order_order_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -519,7 +459,7 @@ func (x *EmptyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EmptyRequest.ProtoReflect.Descriptor instead. func (*EmptyRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{6} + return file_order_order_proto_rawDescGZIP(), []int{5} } type EditCartRequest struct { @@ -532,7 +472,7 @@ type EditCartRequest struct { func (x *EditCartRequest) Reset() { *x = EditCartRequest{} - mi := &file_order_order_proto_msgTypes[7] + mi := &file_order_order_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -544,7 +484,7 @@ func (x *EditCartRequest) String() string { func (*EditCartRequest) ProtoMessage() {} func (x *EditCartRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[7] + mi := &file_order_order_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -557,7 +497,7 @@ func (x *EditCartRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EditCartRequest.ProtoReflect.Descriptor instead. func (*EditCartRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{7} + return file_order_order_proto_rawDescGZIP(), []int{6} } func (x *EditCartRequest) GetInfo() string { @@ -583,7 +523,7 @@ type CartRequest struct { func (x *CartRequest) Reset() { *x = CartRequest{} - mi := &file_order_order_proto_msgTypes[8] + mi := &file_order_order_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -595,7 +535,7 @@ func (x *CartRequest) String() string { func (*CartRequest) ProtoMessage() {} func (x *CartRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[8] + mi := &file_order_order_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -608,7 +548,7 @@ func (x *CartRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CartRequest.ProtoReflect.Descriptor instead. func (*CartRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{8} + return file_order_order_proto_rawDescGZIP(), []int{7} } func (x *CartRequest) GetType() int32 { @@ -627,7 +567,7 @@ type IdRequest struct { func (x *IdRequest) Reset() { *x = IdRequest{} - mi := &file_order_order_proto_msgTypes[9] + mi := &file_order_order_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -639,7 +579,7 @@ func (x *IdRequest) String() string { func (*IdRequest) ProtoMessage() {} func (x *IdRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[9] + mi := &file_order_order_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -652,7 +592,7 @@ func (x *IdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdRequest.ProtoReflect.Descriptor instead. func (*IdRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{9} + return file_order_order_proto_rawDescGZIP(), []int{8} } func (x *IdRequest) GetId() int64 { @@ -672,7 +612,7 @@ type IdAndTypeRequest struct { func (x *IdAndTypeRequest) Reset() { *x = IdAndTypeRequest{} - mi := &file_order_order_proto_msgTypes[10] + mi := &file_order_order_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -684,7 +624,7 @@ func (x *IdAndTypeRequest) String() string { func (*IdAndTypeRequest) ProtoMessage() {} func (x *IdAndTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[10] + mi := &file_order_order_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -697,7 +637,7 @@ func (x *IdAndTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdAndTypeRequest.ProtoReflect.Descriptor instead. func (*IdAndTypeRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{10} + return file_order_order_proto_rawDescGZIP(), []int{9} } func (x *IdAndTypeRequest) GetId() int64 { @@ -723,7 +663,7 @@ type TypeRequest struct { func (x *TypeRequest) Reset() { *x = TypeRequest{} - mi := &file_order_order_proto_msgTypes[11] + mi := &file_order_order_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -735,7 +675,7 @@ func (x *TypeRequest) String() string { func (*TypeRequest) ProtoMessage() {} func (x *TypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[11] + mi := &file_order_order_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -748,7 +688,7 @@ func (x *TypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeRequest.ProtoReflect.Descriptor instead. func (*TypeRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{11} + return file_order_order_proto_rawDescGZIP(), []int{10} } func (x *TypeRequest) GetType() int32 { @@ -774,7 +714,7 @@ type AddressItemsRequest struct { func (x *AddressItemsRequest) Reset() { *x = AddressItemsRequest{} - mi := &file_order_order_proto_msgTypes[12] + mi := &file_order_order_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -786,7 +726,7 @@ func (x *AddressItemsRequest) String() string { func (*AddressItemsRequest) ProtoMessage() {} func (x *AddressItemsRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[12] + mi := &file_order_order_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -799,7 +739,7 @@ func (x *AddressItemsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddressItemsRequest.ProtoReflect.Descriptor instead. func (*AddressItemsRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{12} + return file_order_order_proto_rawDescGZIP(), []int{11} } func (x *AddressItemsRequest) GetPage() int32 { @@ -867,7 +807,7 @@ type AddressByStoreItemsRequest struct { func (x *AddressByStoreItemsRequest) Reset() { *x = AddressByStoreItemsRequest{} - mi := &file_order_order_proto_msgTypes[13] + mi := &file_order_order_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -879,7 +819,7 @@ func (x *AddressByStoreItemsRequest) String() string { func (*AddressByStoreItemsRequest) ProtoMessage() {} func (x *AddressByStoreItemsRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[13] + mi := &file_order_order_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -892,7 +832,7 @@ func (x *AddressByStoreItemsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddressByStoreItemsRequest.ProtoReflect.Descriptor instead. func (*AddressByStoreItemsRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{13} + return file_order_order_proto_rawDescGZIP(), []int{12} } func (x *AddressByStoreItemsRequest) GetStoreId() int64 { @@ -914,7 +854,7 @@ type OrderAuditingItemsRequest struct { func (x *OrderAuditingItemsRequest) Reset() { *x = OrderAuditingItemsRequest{} - mi := &file_order_order_proto_msgTypes[14] + mi := &file_order_order_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -926,7 +866,7 @@ func (x *OrderAuditingItemsRequest) String() string { func (*OrderAuditingItemsRequest) ProtoMessage() {} func (x *OrderAuditingItemsRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[14] + mi := &file_order_order_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -939,7 +879,7 @@ func (x *OrderAuditingItemsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderAuditingItemsRequest.ProtoReflect.Descriptor instead. func (*OrderAuditingItemsRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{14} + return file_order_order_proto_rawDescGZIP(), []int{13} } func (x *OrderAuditingItemsRequest) GetPage() int32 { @@ -981,7 +921,7 @@ type OrderAuditingRequest struct { func (x *OrderAuditingRequest) Reset() { *x = OrderAuditingRequest{} - mi := &file_order_order_proto_msgTypes[15] + mi := &file_order_order_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -993,7 +933,7 @@ func (x *OrderAuditingRequest) String() string { func (*OrderAuditingRequest) ProtoMessage() {} func (x *OrderAuditingRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[15] + mi := &file_order_order_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1006,7 +946,7 @@ func (x *OrderAuditingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderAuditingRequest.ProtoReflect.Descriptor instead. func (*OrderAuditingRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{15} + return file_order_order_proto_rawDescGZIP(), []int{14} } func (x *OrderAuditingRequest) GetId() int64 { @@ -1035,13 +975,14 @@ type AdminCreateOrderRequest struct { AddressId int64 `protobuf:"varint,1,opt,name=address_id,json=addressId,proto3" json:"address_id,omitempty"` Note string `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` Info string `protobuf:"bytes,3,opt,name=info,proto3" json:"info,omitempty"` + Type int32 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *AdminCreateOrderRequest) Reset() { *x = AdminCreateOrderRequest{} - mi := &file_order_order_proto_msgTypes[16] + mi := &file_order_order_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1053,7 +994,7 @@ func (x *AdminCreateOrderRequest) String() string { func (*AdminCreateOrderRequest) ProtoMessage() {} func (x *AdminCreateOrderRequest) ProtoReflect() protoreflect.Message { - mi := &file_order_order_proto_msgTypes[16] + mi := &file_order_order_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1066,7 +1007,7 @@ func (x *AdminCreateOrderRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminCreateOrderRequest.ProtoReflect.Descriptor instead. func (*AdminCreateOrderRequest) Descriptor() ([]byte, []int) { - return file_order_order_proto_rawDescGZIP(), []int{16} + return file_order_order_proto_rawDescGZIP(), []int{15} } func (x *AdminCreateOrderRequest) GetAddressId() int64 { @@ -1090,6 +1031,13 @@ func (x *AdminCreateOrderRequest) GetInfo() string { return "" } +func (x *AdminCreateOrderRequest) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + var File_order_order_proto protoreflect.FileDescriptor const file_order_order_proto_rawDesc = "" + @@ -1131,11 +1079,7 @@ const file_order_order_proto_rawDesc = "" + "\fdistrict_ids\x18\x05 \x01(\tR\vdistrictIds\x12\x18\n" + "\adefault\x18\x06 \x01(\bR\adefault\x12\x0e\n" + "\x02id\x18\a \x01(\x03R\x02id\x12\x12\n" + - "\x04type\x18\b \x01(\x05R\x04type\"V\n" + - "\x14StatusAddressRequest\x12\x0e\n" + - "\x02id\x18\x01 \x01(\x03R\x02id\x12\x16\n" + - "\x06status\x18\x02 \x01(\x05R\x06status\x12\x16\n" + - "\x06reason\x18\x03 \x01(\tR\x06reason\"\x0e\n" + + "\x04type\x18\b \x01(\x05R\x04type\"\x0e\n" + "\fEmptyRequest\"9\n" + "\x0fEditCartRequest\x12\x12\n" + "\x04info\x18\x01 \x01(\tR\x04info\x12\x12\n" + @@ -1169,12 +1113,13 @@ const file_order_order_proto_rawDesc = "" + "\x14OrderAuditingRequest\x12\x0e\n" + "\x02id\x18\x01 \x01(\x03R\x02id\x12\x16\n" + "\x06status\x18\x02 \x01(\x05R\x06status\x12\x16\n" + - "\x06reason\x18\x03 \x01(\tR\x06reason\"`\n" + + "\x06reason\x18\x03 \x01(\tR\x06reason\"t\n" + "\x17AdminCreateOrderRequest\x12\x1d\n" + "\n" + "address_id\x18\x01 \x01(\x03R\taddressId\x12\x12\n" + "\x04note\x18\x02 \x01(\tR\x04note\x12\x12\n" + - "\x04info\x18\x03 \x01(\tR\x04info2\xf4\v\n" + + "\x04info\x18\x03 \x01(\tR\x04info\x12\x12\n" + + "\x04type\x18\x04 \x01(\x05R\x04type2\xf4\v\n" + "\x05order\x12T\n" + "\x05Items\x12\x18.order.OrderItemsRequest\x1a\x0f.order.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\x12\x15/admin/v3/order/items\x12X\n" + "\tWebCreate\x12\x19.order.CreateOrderRequest\x1a\x0f.order.Response\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/api/v3/order/create\x12b\n" + @@ -1205,25 +1150,24 @@ func file_order_order_proto_rawDescGZIP() []byte { return file_order_order_proto_rawDescData } -var file_order_order_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_order_order_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_order_order_proto_goTypes = []any{ (*OrderItemsRequest)(nil), // 0: order.OrderItemsRequest (*Response)(nil), // 1: order.Response (*CreateOrderRequest)(nil), // 2: order.CreateOrderRequest (*CreateOrderOneRequest)(nil), // 3: order.CreateOrderOneRequest (*EditAddressRequest)(nil), // 4: order.EditAddressRequest - (*StatusAddressRequest)(nil), // 5: order.StatusAddressRequest - (*EmptyRequest)(nil), // 6: order.EmptyRequest - (*EditCartRequest)(nil), // 7: order.EditCartRequest - (*CartRequest)(nil), // 8: order.CartRequest - (*IdRequest)(nil), // 9: order.IdRequest - (*IdAndTypeRequest)(nil), // 10: order.IdAndTypeRequest - (*TypeRequest)(nil), // 11: order.TypeRequest - (*AddressItemsRequest)(nil), // 12: order.AddressItemsRequest - (*AddressByStoreItemsRequest)(nil), // 13: order.AddressByStoreItemsRequest - (*OrderAuditingItemsRequest)(nil), // 14: order.OrderAuditingItemsRequest - (*OrderAuditingRequest)(nil), // 15: order.OrderAuditingRequest - (*AdminCreateOrderRequest)(nil), // 16: order.AdminCreateOrderRequest + (*EmptyRequest)(nil), // 5: order.EmptyRequest + (*EditCartRequest)(nil), // 6: order.EditCartRequest + (*CartRequest)(nil), // 7: order.CartRequest + (*IdRequest)(nil), // 8: order.IdRequest + (*IdAndTypeRequest)(nil), // 9: order.IdAndTypeRequest + (*TypeRequest)(nil), // 10: order.TypeRequest + (*AddressItemsRequest)(nil), // 11: order.AddressItemsRequest + (*AddressByStoreItemsRequest)(nil), // 12: order.AddressByStoreItemsRequest + (*OrderAuditingItemsRequest)(nil), // 13: order.OrderAuditingItemsRequest + (*OrderAuditingRequest)(nil), // 14: order.OrderAuditingRequest + (*AdminCreateOrderRequest)(nil), // 15: order.AdminCreateOrderRequest } var file_order_order_proto_depIdxs = []int32{ 0, // 0: order.order.Items:input_type -> order.OrderItemsRequest @@ -1231,17 +1175,17 @@ var file_order_order_proto_depIdxs = []int32{ 3, // 2: order.order.WebCreateOne:input_type -> order.CreateOrderOneRequest 4, // 3: order.order.WebAddressCreate:input_type -> order.EditAddressRequest 4, // 4: order.order.WebAddressEdit:input_type -> order.EditAddressRequest - 10, // 5: order.order.WebAddressDel:input_type -> order.IdAndTypeRequest - 10, // 6: order.order.WebAddressDef:input_type -> order.IdAndTypeRequest - 10, // 7: order.order.WebAddressInfo:input_type -> order.IdAndTypeRequest - 11, // 8: order.order.WebAddressItems:input_type -> order.TypeRequest - 8, // 9: order.order.WebCart:input_type -> order.CartRequest - 7, // 10: order.order.WebCartEdit:input_type -> order.EditCartRequest - 12, // 11: order.order.AddressItem:input_type -> order.AddressItemsRequest - 13, // 12: order.order.AddressByStore:input_type -> order.AddressByStoreItemsRequest - 14, // 13: order.order.OrderAuditingItems:input_type -> order.OrderAuditingItemsRequest - 15, // 14: order.order.OrderAuditing:input_type -> order.OrderAuditingRequest - 16, // 15: order.order.OrderCreate:input_type -> order.AdminCreateOrderRequest + 9, // 5: order.order.WebAddressDel:input_type -> order.IdAndTypeRequest + 9, // 6: order.order.WebAddressDef:input_type -> order.IdAndTypeRequest + 9, // 7: order.order.WebAddressInfo:input_type -> order.IdAndTypeRequest + 10, // 8: order.order.WebAddressItems:input_type -> order.TypeRequest + 7, // 9: order.order.WebCart:input_type -> order.CartRequest + 6, // 10: order.order.WebCartEdit:input_type -> order.EditCartRequest + 11, // 11: order.order.AddressItem:input_type -> order.AddressItemsRequest + 12, // 12: order.order.AddressByStore:input_type -> order.AddressByStoreItemsRequest + 13, // 13: order.order.OrderAuditingItems:input_type -> order.OrderAuditingItemsRequest + 14, // 14: order.order.OrderAuditing:input_type -> order.OrderAuditingRequest + 15, // 15: order.order.OrderCreate:input_type -> order.AdminCreateOrderRequest 1, // 16: order.order.Items:output_type -> order.Response 1, // 17: order.order.WebCreate:output_type -> order.Response 1, // 18: order.order.WebCreateOne:output_type -> order.Response @@ -1276,7 +1220,7 @@ func file_order_order_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_order_order_proto_rawDesc), len(file_order_order_proto_rawDesc)), NumEnums: 0, - NumMessages: 17, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/services/chore/run.toml b/services/chore/run.toml index 08b1e59..84a5227 100644 --- a/services/chore/run.toml +++ b/services/chore/run.toml @@ -2,7 +2,7 @@ login_out_time=43200 #api接口超时时间分 login_refresh_out_time=83200 name = "chore-service" - listenOn = "0.0.0.0:10300" + listenOn = "0.0.0.0:10103" mode = "dev" [log] path = "logs" @@ -16,16 +16,16 @@ compress = false [oss] - accessKeyId = "LTAI5t7U8KvxSiPE5auwQUuu" - accessKeySecret = "xjfgbQQRpL4TcIspNuClg6bYADa3pk" - roleArn = "acs:ram::1663896742753915:role/oss-upload" - roleSessionName = "oss-upload" - region = "oss-cn-hangzhou" - bucketName = "lone-images" - endpoint = "https://lone-images.oss-accelerate.aliyuncs.com" - host = "https://images.ailuowan.com" - dir = "upload/" - expireSeconds = 3600 + accessKeyId = "LTAI5t7U8KvxSiPE5auwQUuu" + accessKeySecret = "xjfgbQQRpL4TcIspNuClg6bYADa3pk" + roleArn = "acs:ram::1663896742753915:role/oss-upload" + roleSessionName = "oss-upload" + region = "oss-cn-hangzhou" + bucketName = "lone-images" + endpoint = "https://oss-accelerate.aliyuncs.com" + host = "https://images.ailuowan.com" + dir = "upload/" + expireSeconds = 3600 [mysql] host = '39.106.171.204' @@ -53,7 +53,6 @@ [encrypt] data_key = "u2t9T3luZtoRfhBstkFN6TiIMW38BA8a" - [services] product = "product-service" sale = "sale-service" \ No newline at end of file diff --git a/services/express/expressclient/express.go b/services/express/expressclient/express.go index d842cde..63a3326 100644 --- a/services/express/expressclient/express.go +++ b/services/express/expressclient/express.go @@ -14,11 +14,17 @@ import ( ) type ( - CreateRequest = express.CreateRequest - EmtpyRequest = express.EmtpyRequest - IdRequest = express.IdRequest - Response = express.Response - StatusRequest = express.StatusRequest + CreateRequest = express.CreateRequest + DeliverOrderProductInfo = express.DeliverOrderProductInfo + DeliveringRequest = express.DeliveringRequest + DeliveryOrderCreateRequest = express.DeliveryOrderCreateRequest + EmtpyRequest = express.EmtpyRequest + ExpressCompanyRequest = express.ExpressCompanyRequest + HistoryRequest = express.HistoryRequest + IdRequest = express.IdRequest + IdResponse = express.IdResponse + Response = express.Response + StatusRequest = express.StatusRequest Express interface { Items(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) @@ -27,6 +33,13 @@ type ( Info(ctx context.Context, in *IdRequest, opts ...grpc.CallOption) (*Response, error) Names(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*Response, error) + History(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*Response, error) + // 获取可选的打印公司 + ExpressCompany(ctx context.Context, in *ExpressCompanyRequest, opts ...grpc.CallOption) (*Response, error) + // 发货 + ExpressDelivering(ctx context.Context, in *DeliveringRequest, opts ...grpc.CallOption) (*Response, error) + // 添加生成订单的发货信息 + DeliveryOrderCreate(ctx context.Context, in *DeliveryOrderCreateRequest, opts ...grpc.CallOption) (*IdResponse, error) } defaultExpress struct { @@ -69,3 +82,26 @@ func (m *defaultExpress) Status(ctx context.Context, in *StatusRequest, opts ... client := express.NewExpressClient(m.cli.Conn()) return client.Status(ctx, in, opts...) } + +func (m *defaultExpress) History(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*Response, error) { + client := express.NewExpressClient(m.cli.Conn()) + return client.History(ctx, in, opts...) +} + +// 获取可选的打印公司 +func (m *defaultExpress) ExpressCompany(ctx context.Context, in *ExpressCompanyRequest, opts ...grpc.CallOption) (*Response, error) { + client := express.NewExpressClient(m.cli.Conn()) + return client.ExpressCompany(ctx, in, opts...) +} + +// 发货 +func (m *defaultExpress) ExpressDelivering(ctx context.Context, in *DeliveringRequest, opts ...grpc.CallOption) (*Response, error) { + client := express.NewExpressClient(m.cli.Conn()) + return client.ExpressDelivering(ctx, in, opts...) +} + +// 添加生成订单的发货信息 +func (m *defaultExpress) DeliveryOrderCreate(ctx context.Context, in *DeliveryOrderCreateRequest, opts ...grpc.CallOption) (*IdResponse, error) { + client := express.NewExpressClient(m.cli.Conn()) + return client.DeliveryOrderCreate(ctx, in, opts...) +} diff --git a/services/express/internal/dao/deliveryBind.go b/services/express/internal/dao/deliveryBind.go new file mode 100644 index 0000000..e5c38c8 --- /dev/null +++ b/services/express/internal/dao/deliveryBind.go @@ -0,0 +1,9 @@ +package dao + +type DeliveryBindCreate struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + TransitSn string `gorm:"column:transit_sn;type:varchar(255);comment:快递号" json:"transit_sn"` + BoxCode string `gorm:"column:box_code;type:varchar(255);comment:箱号" json:"box_code"` + BoxId int `gorm:"column:box_id;type:int(11);comment:codeId" json:"box_id"` + DeliveryOrderId int `gorm:"column:delivery_order_id;type:int(11);comment:发货ID" json:"delivery_order_id"` +} diff --git a/services/express/internal/dao/deliveryExp.go b/services/express/internal/dao/deliveryExp.go new file mode 100644 index 0000000..0f092e0 --- /dev/null +++ b/services/express/internal/dao/deliveryExp.go @@ -0,0 +1,13 @@ +package dao + +type DeliveryExpCreate struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + DeliveryOrderId int `gorm:"column:delivery_order_id;type:varchar(255);comment:发货ID" json:"delivery_order_id"` + TransitType uint8 `gorm:"column:transit_type;type:tinyint(1);comment:快递公司,1为顺丰,2为京东,3为。。。" json:"transit_type"` + ExpSn string `gorm:"column:exp_sn;type:varchar(150);comment:快递单号" json:"exp_sn"` + OrderSn string `gorm:"column:order_sn;type:varchar(255);comment:订单SN" json:"order_sn"` +} + +type DeliveryExpStatus struct { + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:状态:1为已签收,2为待发货,3为发货中,4为已发货,5已取消;NOT NULL" json:"status"` +} diff --git a/services/express/internal/dao/deliveryHistory.go b/services/express/internal/dao/deliveryHistory.go new file mode 100644 index 0000000..665a5eb --- /dev/null +++ b/services/express/internal/dao/deliveryHistory.go @@ -0,0 +1,17 @@ +package dao + +type DeliveryHistoryCreate struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + DeliverId int `gorm:"column:deliver_id;type:int(11);comment:对像id" json:"deliver_id"` + TransitName string `gorm:"column:transit_name;type:varchar(50);comment:快递公司" json:"transit_name"` + TransitInfo string `gorm:"column:transit_info;type:text;comment:快递详情" json:"transit_info"` + TransitContent string `gorm:"column:transit_content;type:text;comment:发快递时的结果" json:"transit_content"` + TransitType uint8 `gorm:"column:transit_type;type:tinyint(1);default:1;comment:快递公司,1为顺丰,2为京东,3..。" json:"transit_type"` + OrderSn string `gorm:"column:order_sn;type:varchar(255);comment:订单SN" json:"order_sn"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:1;comment:类型,1为发货,2为取消;NOT NULL" json:"type"` +} + +type DeliveryHistory struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + DeliverId int `gorm:"column:deliver_id;type:int(11);comment:对像id" json:"deliver_id"` +} diff --git a/services/express/internal/dao/deliveryOrder.go b/services/express/internal/dao/deliveryOrder.go new file mode 100644 index 0000000..b22835d --- /dev/null +++ b/services/express/internal/dao/deliveryOrder.go @@ -0,0 +1,114 @@ +package dao + +import "lone-services/pkg/utils" + +const ( + DeliverTypeOrder = 1 //订单 + DeliverTypeSupply = 3 //补货 + + SendStatusOver = 1 //为已签收 + SendStatusWait = 2 //为待发货 + SendStatusIn = 3 //为发货中 + SendStatusOk = 4 //为已发货 + SendStatusCancel = 5 //已取消 +) + +type DeliveryOrderCreate struct { + Id int64 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + ObjId string `gorm:"column:obj_id;type:varchar(255);comment:对像id" json:"obj_id"` + Mobile string `gorm:"column:mobile;type:char(69);comment:收货人手机号" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(255);comment:收货人" json:"addressee"` + Province string `gorm:"column:province;type:varchar(255);comment:省" json:"province"` + GroupId int64 `gorm:"column:group_id;type:int(11);default:0;comment:分组ID" json:"group_id"` + City string `gorm:"column:city;type:varchar(255);comment:市" json:"city"` + County string `gorm:"column:county;type:varchar(255);comment:县" json:"county"` + ProductInfo string `gorm:"column:product_info;type:text;comment:产品信息" json:"product_info"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:状态:1为已签收,2为待发货,3为发货中,4为已发货,5已取消;NOT NULL" json:"status"` + ObjSn string `gorm:"column:obj_sn;type:varchar(255);comment:对像sn" json:"obj_sn"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:1;comment:类型,1为订单,2为试用,3为补货,4为个人试用;NOT NULL" json:"type"` +} + +type DeliveryOrderPrint struct { + DeliveryOrderPrintEdit + Weight float32 `gorm:"-:all" json:"weight"` + Number int `gorm:"-:all" json:"number"` + ProductItems []DeliveryOrderProduct `gorm:"-:all" json:"product_items"` + Url string `gorm:"-:all" json:"url"` +} + +type DeliveryOrderProduct struct { + ProductId int `json:"product_id"` + ProductName string `json:"product_name"` + ProductNumber int `json:"product_number"` + OrderSn string `json:"order_sn"` + Price float32 `json:"price"` + ProductWeight float32 `json:"product_weight"` + ProductCubage float32 `json:"product_cubage"` + ProductLength float32 `json:"product_length"` + ProductWidth float32 `json:"product_width"` + ProductHeight float32 `json:"product_height"` +} + +type DeliverItems struct { + Id int `json:"id"` + ObjID string `json:"obj_id"` + Mobile string `json:"mobile"` + OriginalMobile string `gorm:"-" json:"original_mobile"` + Address string `json:"address"` + Addressee string `json:"addressee"` + Type uint8 `json:"type"` + SendTime utils.CustomTime `gorm:"column:sign_time" json:"send_time"` + Status uint8 `json:"status"` + ProductInfo string `gorm:"column:product_info" json:"-"` + ProductData []DeliveryOrderItemsProduct `gorm:"-" json:"product_data"` + OrderSn string `gorm:"column:obj_sn" json:"order_sn"` + CreateTime utils.CustomTime `json:"create_time"` +} + +type DeliveryOrderItemsProduct struct { + ProductId int `json:"product_id"` + ProductName string `json:"product_name"` + Number int `json:"number"` +} + +type DeliveryOrderUpTransit struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + ObjId string `gorm:"column:obj_id;type:varchar(255);comment:对像id" json:"obj_id"` + EstimatedTime string `gorm:"column:estimated_time;type:varchar(30);comment:预计到达时间" json:"estimated_time"` + ChangeEstimatedTime uint8 `gorm:"column:change_estimated_time;type:tinyint(1);default:2;comment:是否更新快递预估时间,1为更新,2为不更新" json:"change_estimated_time"` + TransitQuery string `gorm:"column:transit_query;type:text;comment:查询快递信息" json:"transit_query"` + TransitId int `gorm:"column:transit_id;type:int(11);comment:快递表ID" json:"transit_id"` + TransitSn string `gorm:"column:transit_sn;type:varchar(255);comment:快递号" json:"transit_sn"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:1;comment:类型,1为订单,2为试用,3为补货,4为个人试用;NOT NULL" json:"type"` + SignTime utils.CustomTime `gorm:"column:sign_time;type:datetime;comment:签收时间" json:"sign_time"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:状态:1为已签收,2为待发货,3为发货中,4为已发货,5已取消;NOT NULL" json:"status"` + OrderSn string `gorm:"column:order_sn;type:varchar(50);comment:订单SN" json:"order_sn"` +} +type DeliveryOrderPrintEdit struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + ObjId string `gorm:"column:obj_id;type:varchar(255);comment:对像id" json:"obj_id"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(255);comment:收货人" json:"addressee"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:状态:1为已签收,2为待发货,3为发货中,4为已发货,5已取消;NOT NULL" json:"status"` + TransitName string `gorm:"column:transit_name;type:varchar(50);comment:快递公司" json:"transit_name"` + TransitSn string `gorm:"column:transit_sn;type:varchar(255);comment:快递号" json:"transit_sn"` + TransitInfo string `gorm:"column:transit_info;type:text;comment:快递详情" json:"transit_info"` + TransitContent string `gorm:"column:transit_content;type:text;comment:发快递时的结果" json:"transit_content"` + TransitType uint8 `gorm:"column:transit_type;type:tinyint(1);default:1;comment:快递公司,1为顺丰,2为京东,3为。。。" json:"transit_type"` + TransitId int `gorm:"column:transit_id;type:int(11);comment:快递表ID" json:"transit_id"` + PrintStatus uint8 `gorm:"column:print_status;type:tinyint(1);default:2;comment:打印状态,1为打印完,2为未打印,3为已绑定" json:"print_status"` + Express string `gorm:"column:express;type:varchar(255);comment:快递单地址" json:"express"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:1;comment:类型,1为订单,2为试用,3为补货,4为个人家里试用,5产品先付后用;NOT NULL" json:"type"` + OrderSn string `gorm:"column:order_sn;type:varchar(50);comment:订单SN" json:"order_sn"` + AdminName string `gorm:"column:admin_name;type:varchar(255)" json:"admin_name"` + AdminId int `gorm:"column:admin_id;type:int(11);default:0" json:"admin_id"` + Province string `gorm:"column:province;type:varchar(255);comment:省" json:"province"` + City string `gorm:"column:city;type:varchar(255);comment:市" json:"city"` + County string `gorm:"column:county;type:varchar(255);comment:县" json:"county"` + ProductInfo string `gorm:"column:product_info;type:text;comment:产品信息" json:"product_info"` + ObjSn string `gorm:"column:obj_sn;type:varchar(255);comment:对像sn" json:"obj_sn"` + SendTime utils.CustomTime `gorm:"column:send_time;type:datetime;comment:发货时间" json:"send_time"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:添加时间" json:"create_time"` +} diff --git a/services/express/internal/dao/express.go b/services/express/internal/dao/express.go index df64d58..e391fe0 100644 --- a/services/express/internal/dao/express.go +++ b/services/express/internal/dao/express.go @@ -55,3 +55,37 @@ type ExpressStatus struct { AdminId int64 `json:"admin_id" gorm:"admin_id"` // 操作人ID AdminName string `json:"admin_name" gorm:"admin_name"` // 操作人姓名 } + +type ExpressSend struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + Name string `gorm:"column:name;type:varchar(255);comment:名称;NOT NULL" json:"name"` + TransitId uint8 `gorm:"column:transit_id;type:tinyint(4);comment:快递公司,1为顺丰,2为京东,3为。。。;NOT NULL" json:"transit_id"` + AppCode string `gorm:"column:app_code;type:varchar(255);comment:app 代码;NOT NULL" json:"app_code"` + AppSecretKey string `gorm:"column:app_secret_key;type:varchar(255);comment:app 密钥;NOT NULL" json:"app_secret_key"` + AppUrl string `gorm:"column:app_url;type:varchar(255);comment:接口地址;NOT NULL" json:"app_url"` + PdfCode string `gorm:"column:pdf_code;type:varchar(255);comment:pdf文件编码;NOT NULL" json:"pdf_code"` + CardNumber string `gorm:"column:card_number;type:varchar(255);comment:月结卡号;NOT NULL" json:"card_number"` + Province string `gorm:"column:province;type:varchar(255);comment:省;NOT NULL" json:"province"` + City string `gorm:"column:city;type:varchar(255);comment:市;NOT NULL" json:"city"` + Other string `gorm:"column:other;type:text;comment:基它数据" json:"other"` + County string `gorm:"column:county;type:varchar(255);comment:县/区;NOT NULL" json:"county"` + Address string `gorm:"column:address;type:varchar(255);comment:地址;NOT NULL" json:"address"` + CompanyName string `gorm:"column:company_name;type:varchar(255);comment:公司名;NOT NULL" json:"company_name"` + Contact string `gorm:"column:contact;type:varchar(255);comment:联系人;NOT NULL" json:"contact"` + Mobile string `gorm:"column:mobile;type:varchar(255);comment:联系人手机号;NOT NULL" json:"mobile"` +} + +type ExpressQueryItems struct { + AcceptAddress string `json:"acceptAddress"` + AcceptTime string `json:"acceptTime"` + FirstStatusCode string `json:"firstStatusCode"` + FirstStatusName string `json:"firstStatusName"` + OpCode string `json:"opCode"` + Remark string `json:"remark"` + SecondaryStatusCode string `json:"secondaryStatusCode"` + SecondaryStatusName string `json:"secondaryStatusName"` + OperatorName string `json:"operatorName"` + OperationTitle string `json:"operationTitle"` + AllInfo string `json:"allInfo"` + LastMd5 string `json:"lastMd5"` +} diff --git a/services/express/internal/logic/deliveryOrderCreateLogic.go b/services/express/internal/logic/deliveryOrderCreateLogic.go new file mode 100644 index 0000000..c477f69 --- /dev/null +++ b/services/express/internal/logic/deliveryOrderCreateLogic.go @@ -0,0 +1,52 @@ +package logic + +import ( + "context" + "lone-services/pkg/utils" + "lone-services/services/express/internal/dao" + "lone-services/services/express/internal/model" + + "lone-services/rpc/express/pb" + "lone-services/services/express/internal/svc" + + jsoniter "github.com/json-iterator/go" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type DeliveryOrderCreateLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewDeliveryOrderCreateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeliveryOrderCreateLogic { + return &DeliveryOrderCreateLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *DeliveryOrderCreateLogic) DeliveryOrderCreate(in *express.DeliveryOrderCreateRequest) (*express.IdResponse, error) { + data := dao.DeliveryOrderCreate{ + Address: in.Address, + Addressee: in.Addressee, + City: in.City, + County: in.County, + GroupId: in.GroupId, + Mobile: in.Mobile, + ObjId: in.ObjId, + ObjSn: in.ObjSn, + ProductInfo: string(lo.Must(jsoniter.Marshal(in.ProductInfo))), + Province: in.Province, + Status: uint8(in.Status), + Type: uint8(in.Type)} + err := model.DeliveryOrderModel{}.Init().Create(&data) + if err != nil { + return nil, status.Error(codes.Internal, utils.Fail.Msg) + } + return &express.IdResponse{Id: data.Id}, nil +} diff --git a/services/express/internal/logic/expressCompanyLogic.go b/services/express/internal/logic/expressCompanyLogic.go new file mode 100644 index 0000000..f6e5e9b --- /dev/null +++ b/services/express/internal/logic/expressCompanyLogic.go @@ -0,0 +1,57 @@ +package logic + +import ( + "context" + "lone-services/pkg/utils" + "lone-services/rpc/express/pb" + "lone-services/services/express/internal/svc" + "lone-services/services/express/validator" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ExpressCompanyLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewExpressCompanyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ExpressCompanyLogic { + return &ExpressCompanyLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// ExpressCompany 获取可选的打印公司 +func (l *ExpressCompanyLogic) ExpressCompany(in *express.ExpressCompanyRequest) (*express.Response, error) { + var v validator.CompanyItemsValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + sf := utils.GetConfigInt("transit.sf_send_code_" + in.Code) + jd := utils.GetConfigInt("transit.jd_send_code_" + in.Code) + if sf < utils.NumberOne || jd < utils.NumberOne { + return l.fail(utils.ErrorNotFund) + } + type retData struct { + Name string `json:"name"` + Id int `json:"id"` + } + var data []retData + data = append(data, retData{ + Name: "顺丰", + Id: sf, + }) + data = append(data, retData{ + Name: "京东", + Id: jd, + }) + return l.ok(data) +} diff --git a/services/express/internal/logic/expressDeliveringLogic.go b/services/express/internal/logic/expressDeliveringLogic.go new file mode 100644 index 0000000..32ae23b --- /dev/null +++ b/services/express/internal/logic/expressDeliveringLogic.go @@ -0,0 +1,419 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/rpc/express/pb" + "lone-services/services/express/internal/dao" + "lone-services/services/express/internal/model" + "lone-services/services/express/internal/svc" + "strconv" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ExpressDeliveringLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewExpressDeliveringLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ExpressDeliveringLogic { + return &ExpressDeliveringLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// ExpressDelivering 发货 +func (l *ExpressDeliveringLogic) ExpressDelivering(in *express.DeliveringRequest) (*express.Response, error) { + var itemsEdit []dao.DeliveryOrderPrintEdit + w := modelbase.Params{ + Eq: map[string]string{"id": strconv.FormatInt(in.Id, utils.NumberTen)}} + modelObj := model.DeliveryOrderModel{}.Init() + err := modelObj.Items(w, &itemsEdit) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + + if len(itemsEdit) < utils.NumberOne { + return l.fail(utils.ErrorNotFund) + } + + if itemsEdit[utils.NumberZero].Status == dao.SendStatusOk || + itemsEdit[utils.NumberZero].Status == dao.SendStatusOver { + return l.fail(utils.ErrorOrderOver) + } + + //if transitId < dao.NumberOne { + // transitId = utils.GetConfigInt("transit.send_id") + //} + //tw := models.Params{Eq: map[string]string{"id": strconv.Itoa(transitId)}} + //var transitInfo dao.TransitSend + //err = models.TransitModel{}.Init().GetOne(tw, &transitInfo) + //if err != nil { + // utils.Logger.Error("发货地址信息没有找到", transitId, err) + // return dao.DeliverGoodsPrint{}, utils.Define(utils.ErrorNotFund, "没有查询到发货信息") + //} + //if transitInfo.Id < dao.NumberOne { + // return dao.DeliverGoodsPrint{}, utils.Define(utils.ErrorNotFund, "没有查询到发货信息") + //} + // + //var items []dao.DeliverGoodsPrint + //items = append(items, dao.DeliverGoodsPrint{ + // DeliverGoodsPrintEdit: itemsEdit[dao.NumberZero], + //}) + //s.getOrderInfo(&items) + //info := itemsEdit[dao.NumberZero] + ////更新使用的快递类型 + //info.TransitType = transitInfo.TransitId + // + //info.OrderSn = s.getOrderSn(info.TransitType, u.Id) + //items[dao.NumberZero].OrderSn = info.OrderSn + //status := info.Status + //client, res, cErr := s.createTransit(items[dao.NumberZero], transitInfo) + //if cErr != nil { + // return dao.DeliverGoodsPrint{}, cErr + //} + //info.TransitInfo = res.PostInfo + //info.TransitContent = res.RequestInfo + //info.TransitSn = strings.Join(res.WaybillNo, utils.DecollatorComma) + // + //items[dao.NumberZero].AdminName = u.Name + //res2, gErr := s.getDown(client, res.WaybillNo, items[dao.NumberZero]) + //if gErr != nil { + // s.cancel(client, w, info, status) + // utils.Logger.Error(res2, gErr) + // return dao.DeliverGoodsPrint{}, utils.Define(utils.ErrorNotFund, "下载发货单出错") + //} + // + //info.Express = utils.StructToJson(res2.Files) + //info.PrintStatus = dao.StatusOk + //info.AdminId = u.Id + //info.AdminName = u.Name + //info.TransitId = transitId + //info.TransitName = transitInfo.Name + //info.Status = models.SendStatusOk + //info.SendTime = utils.Now() + // + //items[dao.NumberZero].PrintStatus = info.PrintStatus + //items[dao.NumberZero].AdminId = info.AdminId + //items[dao.NumberZero].AdminName = info.AdminName + //items[dao.NumberZero].TransitId = info.TransitId + //items[dao.NumberZero].TransitInfo = info.TransitInfo + //items[dao.NumberZero].TransitContent = info.TransitContent + //items[dao.NumberZero].TransitSn = info.TransitSn + //items[dao.NumberZero].TransitName = info.TransitName + //items[dao.NumberZero].Status = info.Status + //items[dao.NumberZero].Express = info.Express + // + //var history dao.DeliverGoodsHistoryCreate + //history.DeliverId = info.Id + //history.TransitName = models.DeliverSendType[info.TransitType] + //history.TransitInfo = info.TransitInfo + //history.TransitContent = info.TransitContent + //history.TransitType = info.TransitType + //history.OrderSn = info.OrderSn + // + //var exps []dao.DeliverGoodsExpCreate + //for i := 0; i < len(res.WaybillNo); i++ { + // exps = append(exps, dao.DeliverGoodsExpCreate{ + // DeliverGoodsId: info.Id, + // TransitType: info.TransitType, + // ExpSn: res.WaybillNo[i], + // OrderSn: info.OrderSn, + // }) + //} + // + //sErr := s.saveDelever(w, &info, &history, &exps) + //if sErr != nil { + // s.cancel(client, w, info, status) + // utils.Logger.Error(res2, sErr) + // return dao.DeliverGoodsPrint{}, sErr + //} + // + //return items[dao.NumberZero], nil + + return &express.Response{}, nil +} + +//func (l *ExpressDeliveringLogic) createTransit(info dao.DeliverGoodsPrint, transitInfo dao.TransitSend) (transit.Transit, transit.TransitResult, utils.Error) { +// var client transit.Transit +// switch transitInfo.TransitId { +// case models.TransitCompanySf: +// client = transit.NewSfClient(transitInfo) +// case models.TransitCompanyJd: +// client = transit.NewJdClient(transitInfo) +// default: +// return client, transit.TransitResult{}, utils.Define(utils.Fail, "不支持的快递公司") +// } +// res, err := client.Create(info) +// if err != nil || res.ErrorCode != dao.StatusOkString { +// utils.Logger.Error("create transit err", err, res) +// return client, res, utils.Define(utils.Fail, res.ApiErrorMsg) +// } +// +// return client, res, nil +//} +// +//func (l *ExpressDeliveringLogic) saveDelever(w models.Params, info *dao.DeliverGoodsPrintEdit, history *dao.DeliverGoodsHistoryCreate, exps *[]dao.DeliverGoodsExpCreate) utils.Error { +// model := models.DeliverGoodsModel{}.Init() +// model.Begin() +// edit, err := model.Edit(w, info) +// if err != nil || edit < utils.NumberOne { +// model.Rollback() +// utils.Logger.Error("save deliver goods err ", err) +// return utils.Define(utils.Fail, "生成快递单失败") +// } +// +// err = models.DeliverGoodsExpModel{}.Init().CreateMulti(exps) +// if err != nil { +// model.Rollback() +// utils.Logger.Error("save exp err ", err) +// return utils.Define(utils.Fail, "生成EXP失败") +// } +// +// err = models.DeliverGoodsHistoryModel{}.Init().Create(history) +// if err != nil { +// model.Rollback() +// utils.Logger.Error("save history err ", err) +// return utils.Define(utils.Fail, "生成订单历史失败") +// } +// +// if info.Type == models.DeliverTypeOrder { +// w = models.Params{Eq: map[string]string{"id": info.ObjId}} +// orderStatus := dao.OrderDeliverGoodsStatus{ +// DeliverStatus: info.Status, +// } +// _, err = models.OrderModel{}.Init().Edit(w, &orderStatus) +// if err != nil { +// model.Rollback() +// utils.Logger.Error("save update order err ", err) +// return utils.Define(utils.Fail, "更新订单状态失败") +// } +// } +// +// model.Commit() +// return nil +//} + +//func (l *ExpressDeliveringLogic) getOrderInfo(items *[]dao.DeliverGoodsPrint) { +// products := s.getProducts() +// for value, item := range *items { +// obj := &(*items)[value] +// mobile, aErr := utils.Crypto{}.AESDecryptECB(item.Mobile) +// if aErr == nil { +// obj.Mobile = mobile +// } +// obj.Url = utils.GetConfigString("transit.url") +// obj.Number, obj.Weight, obj.ProductItems = s.getProductInfo(item.ObjSn, item.ProductInfo, &products) +// } +//} + +//func (l *ExpressDeliveringLogic) getOrderSn(orderType uint8, adminId int) string { +// first := models.DeliverSendType[orderType] +// +// sn := first + time.Now().Format("20060102150405") +// sn += fmt.Sprintf("%d%d", orderType, adminId) +// randomNum := rand.Intn(90000000) + 10000000 +// sn += fmt.Sprintf("%d", randomNum) +// +// return sn +//} +// +//func (l *ExpressDeliveringLogic) createTransit(info dao.DeliverGoodsPrint, transitInfo dao.TransitSend) (transit.Transit, transit.TransitResult, utils.Error) { +// var client transit.Transit +// switch transitInfo.TransitId { +// case models.TransitCompanySf: +// client = transit.NewSfClient(transitInfo) +// case models.TransitCompanyJd: +// client = transit.NewJdClient(transitInfo) +// default: +// return client, transit.TransitResult{}, utils.Define(utils.Fail, "不支持的快递公司") +// } +// res, err := client.Create(info) +// if err != nil || res.ErrorCode != dao.StatusOkString { +// utils.Logger.Error("create transit err", err, res) +// return client, res, utils.Define(utils.Fail, res.ApiErrorMsg) +// } +// +// return client, res, nil +//} + +//func (s PrintService) getDown(client transit.Transit, orders []string, info dao.DeliverGoodsPrint) (transit.TransitResult, error) { +// ret, err := client.DownSheet(orders, info) +// if err != nil || len(ret.Files) < dao.NumberOne { +// utils.Logger.Error("get down err ", orders, err, ret) +// if len(ret.Files) < dao.NumberOne { +// err = errors.New("files is empty") +// } +// return ret, err +// } +// path := utils.GetConfigString("transit.path") + "/" +// var tmpFiles []transit.TransitFiles +// for i := 0; i < len(ret.Files); i++ { +// tName := ret.Files[i].WaybillNo + ".pdf" +// err := s.downloadSfPDF(ret.Files[i], path+tName) +// if err != nil { +// utils.Logger.Error("get down err ", orders, err, ret) +// return ret, err +// } +// +// tmpFiles = append(tmpFiles, transit.TransitFiles{ +// File: tName, +// WaybillNo: ret.Files[i].WaybillNo, +// }) +// } +// +// ret.Files = tmpFiles +// +// return ret, nil +//} +// +//func (s PrintService) downloadSfPDF(file transit.TransitFiles, path string) error { +// req, err := http.NewRequest("GET", file.Url, nil) +// if err != nil { +// return err +// } +// +// // 2. 必须加这个请求头(顺丰强制) +// req.Header.Add("X-Auth-token", file.Token) +// // 3. 发送请求 +// client := &http.Client{} +// resp, err := client.Do(req) +// if err != nil { +// return err +// } +// defer func(Body io.ReadCloser) { +// err := Body.Close() +// if err != nil { +// utils.Logger.Error(err) +// } +// }(resp.Body) +// // 4. 创建目录 +// if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { +// return err +// } +// // 5. 创建文件并保存 +// outFile, err := os.Create(path) +// if err != nil { +// return err +// } +// defer func(outFile *os.File) { +// err = outFile.Close() +// if err != nil { +// utils.Logger.Error(err) +// } +// }(outFile) +// // 6. 拷贝数据 +// _, err = io.Copy(outFile, resp.Body) +// return err +//} +// +//func (s PrintService) cancel(client transit.Transit, w models.Params, info dao.DeliverGoodsPrintEdit, status uint8) { +// sn := info.OrderSn +// if info.TransitType == models.TransitCompanyJd { +// sn = info.TransitSn +// } +// +// ret, canErr := client.Cancel(sn) +// if canErr != nil || ret.ErrorCode != dao.StatusOkString { +// utils.Logger.Error("cancel order err ", sn, canErr, ret) +// return +// } +// var history dao.DeliverGoodsHistoryCreate +// history.DeliverId = info.Id +// history.TransitName = models.DeliverSendType[info.TransitType] +// history.TransitInfo = ret.PostInfo +// history.TransitContent = ret.RequestInfo +// history.TransitType = info.TransitType +// history.OrderSn = info.OrderSn +// +// info.OrderSn = dao.StringEmpty +// info.Status = status +// info.Express = dao.StringEmpty +// _, err := models.DeliverGoodsModel{}.Init().Edit(w, &info) +// models.DeliverGoodsHistoryModel{}.Init().Create(&history) +// ww := models.Params{Eq: map[string]string{"deliver_goods_id": strconv.Itoa(info.Id)}} +// editExp := dao.DeliverGoodsExpStatus{ +// Status: dao.StatusFail, +// } +// models.DeliverGoodsExpModel{}.Init().Edit(ww, &editExp) +// if err != nil { +// utils.Logger.Error("cancel up order err ", info.Id, err) +// } +// if info.Type == models.DeliverTypeOrder { +// w = models.Params{Eq: map[string]string{"id": info.ObjId}} +// up := dao.OrderDeliverGoodsStatus{ +// DeliverStatus: status, +// } +// _, err = models.OrderModel{}.Init().Edit(w, &up) +// if err != nil { +// utils.Logger.Error("cancel up order err ", info.ObjSn, err) +// } +// } +//} +// +//func (s PrintService) createTransit(info dao.DeliverGoodsPrint, transitInfo dao.TransitSend) (transit.Transit, transit.TransitResult, utils.Error) { +// var client transit.Transit +// switch transitInfo.TransitId { +// case models.TransitCompanySf: +// client = transit.NewSfClient(transitInfo) +// case models.TransitCompanyJd: +// client = transit.NewJdClient(transitInfo) +// default: +// return client, transit.TransitResult{}, utils.Define(utils.Fail, "不支持的快递公司") +// } +// res, err := client.Create(info) +// if err != nil || res.ErrorCode != dao.StatusOkString { +// utils.Logger.Error("create transit err", err, res) +// return client, res, utils.Define(utils.Fail, res.ApiErrorMsg) +// } +// +// return client, res, nil +//} +// +//func (s PrintService) saveDelever(w models.Params, info *dao.DeliverGoodsPrintEdit, history *dao.DeliverGoodsHistoryCreate, exps *[]dao.DeliverGoodsExpCreate) utils.Error { +// model := models.DeliverGoodsModel{}.Init() +// model.Begin() +// edit, err := model.Edit(w, info) +// if err != nil || edit < utils.NumberOne { +// model.Rollback() +// utils.Logger.Error("save deliver goods err ", err) +// return utils.Define(utils.Fail, "生成快递单失败") +// } +// +// err = models.DeliverGoodsExpModel{}.Init().CreateMulti(exps) +// if err != nil { +// model.Rollback() +// utils.Logger.Error("save exp err ", err) +// return utils.Define(utils.Fail, "生成EXP失败") +// } +// +// err = models.DeliverGoodsHistoryModel{}.Init().Create(history) +// if err != nil { +// model.Rollback() +// utils.Logger.Error("save history err ", err) +// return utils.Define(utils.Fail, "生成订单历史失败") +// } +// +// if info.Type == models.DeliverTypeOrder { +// w = models.Params{Eq: map[string]string{"id": info.ObjId}} +// orderStatus := dao.OrderDeliverGoodsStatus{ +// DeliverStatus: info.Status, +// } +// _, err = models.OrderModel{}.Init().Edit(w, &orderStatus) +// if err != nil { +// model.Rollback() +// utils.Logger.Error("save update order err ", err) +// return utils.Define(utils.Fail, "更新订单状态失败") +// } +// } +// +// model.Commit() +// return nil +//} diff --git a/services/express/internal/logic/historyLogic.go b/services/express/internal/logic/historyLogic.go new file mode 100644 index 0000000..c02a396 --- /dev/null +++ b/services/express/internal/logic/historyLogic.go @@ -0,0 +1,46 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/express/internal/dao" + "lone-services/services/express/internal/model" + + "lone-services/rpc/express/pb" + "lone-services/services/express/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type HistoryLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewHistoryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *HistoryLogic { + return &HistoryLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *HistoryLogic) History(in *express.HistoryRequest) (*express.Response, error) { + modelObj := model.DeliveryHistoryModel{}.Init() + w := modelbase.Params{ + Size: int(in.Size), + Page: int(in.Page), + Order: "id desc", + } + + var data []dao.DeliveryHistoryCreate + err := modelObj.Items(w, &data) + if err != nil { + return l.fail(utils.Fail) + } + + return l.ok(data) +} diff --git a/services/express/internal/model/deliveryHistory.go b/services/express/internal/model/deliveryHistory.go new file mode 100644 index 0000000..2544547 --- /dev/null +++ b/services/express/internal/model/deliveryHistory.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/express/internal/dao" +) + +type DeliveryHistoryModel struct { + modelbase.Base +} + +func (m DeliveryHistoryModel) TableName() string { + return modelbase.Prefix() + "delivery_history" +} + +func (m DeliveryHistoryModel) Init() DeliveryHistoryModel { + m.Table = m.TableName() + return m +} + +func (m DeliveryHistoryModel) Create(data *dao.DeliveryHistoryCreate) error { + return m.Base.Create(data) +} diff --git a/services/express/internal/model/deliveryOrder.go b/services/express/internal/model/deliveryOrder.go new file mode 100644 index 0000000..916628b --- /dev/null +++ b/services/express/internal/model/deliveryOrder.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/express/internal/dao" +) + +type DeliveryOrderModel struct { + modelbase.Base +} + +func (m DeliveryOrderModel) TableName() string { + return modelbase.Prefix() + "delivery_order" +} + +func (m DeliveryOrderModel) Init() DeliveryOrderModel { + m.Table = m.TableName() + return m +} + +func (m DeliveryOrderModel) Create(data *dao.DeliveryOrderCreate) error { + return m.Base.Create(data) +} diff --git a/services/express/internal/server/expressServer.go b/services/express/internal/server/expressServer.go index ddff4bf..28e575b 100644 --- a/services/express/internal/server/expressServer.go +++ b/services/express/internal/server/expressServer.go @@ -52,3 +52,26 @@ func (s *ExpressServer) Status(ctx context.Context, in *express.StatusRequest) ( l := logic.NewStatusLogic(ctx, s.svcCtx) return l.Status(in) } + +func (s *ExpressServer) History(ctx context.Context, in *express.HistoryRequest) (*express.Response, error) { + l := logic.NewHistoryLogic(ctx, s.svcCtx) + return l.History(in) +} + +// 获取可选的打印公司 +func (s *ExpressServer) ExpressCompany(ctx context.Context, in *express.ExpressCompanyRequest) (*express.Response, error) { + l := logic.NewExpressCompanyLogic(ctx, s.svcCtx) + return l.ExpressCompany(in) +} + +// 发货 +func (s *ExpressServer) ExpressDelivering(ctx context.Context, in *express.DeliveringRequest) (*express.Response, error) { + l := logic.NewExpressDeliveringLogic(ctx, s.svcCtx) + return l.ExpressDelivering(in) +} + +// 添加生成订单的发货信息 +func (s *ExpressServer) DeliveryOrderCreate(ctx context.Context, in *express.DeliveryOrderCreateRequest) (*express.IdResponse, error) { + l := logic.NewDeliveryOrderCreateLogic(ctx, s.svcCtx) + return l.DeliveryOrderCreate(in) +} diff --git a/services/express/internal/transit/base.go b/services/express/internal/transit/base.go new file mode 100644 index 0000000..ebbf57b --- /dev/null +++ b/services/express/internal/transit/base.go @@ -0,0 +1,31 @@ +package transit + +import "lone-services/services/express/internal/dao" + +type TransitResult struct { + ErrorCode string `json:"error_code"` + ApiErrorMsg string `json:"api_error_msg,omitempty"` + ApiResponseID string `json:"api_response_id,omitempty"` + RequestID string `json:"request_id"` + WaybillNo []string `json:"waybill_no,omitempty"` + PostInfo string `json:"post_info,omitempty"` + RequestInfo string `json:"request_info,omitempty"` + RequestQuery map[string]interface{} `json:"request_query,omitempty"` + OrderSn string `json:"order_sn,omitempty"` + Files []TransitFiles `json:"files,omitempty"` +} + +type TransitFiles struct { + File string `json:"file"` + Url string `json:"url"` + Token string `json:"token"` + WaybillNo string `json:"waybill_no"` +} + +type Transit interface { + Create(order dao.DeliveryOrderPrint) (TransitResult, error) + Query(orderId string) (TransitResult, error) // 改这里! + Cancel(orderId string) (TransitResult, error) // 改这里! + Estimated(orderId, card string) (TransitResult, error) + DownSheet(orders []string, info dao.DeliveryOrderPrint) (TransitResult, error) // 改这里! +} diff --git a/services/express/internal/transit/jd.go b/services/express/internal/transit/jd.go new file mode 100644 index 0000000..3a65a7b --- /dev/null +++ b/services/express/internal/transit/jd.go @@ -0,0 +1,555 @@ +package transit + +import ( + "bytes" + "crypto/hmac" + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "encoding/base64" + "fmt" + "io" + "lone-services/pkg/utils" + "lone-services/services/express/internal/dao" + "net/http" + "strconv" + "strings" + "time" + "unicode/utf8" + + jsoniter "github.com/json-iterator/go" +) + +// JdClient 顺丰快递客户端 +type JdClient struct { + config dao.ExpressSend + accessToken string + customerCode string +} + +const ( + JdServicePrecheckOrder = "/ecap/v1/orders/precheck" //预处理创建订单 + JdServiceOrder = "/ecap/v1/orders/create" //下订单 + JdServiceOrderConfirm = "/ecap/v1/orders/cancel" //取消订单 + JdServiceOrderQueryByMailNo = "/ecap/v1/orders/trace/query" //路由查询-通过运单号-通过订单号 + JdServiceOrderEstimated = "/ecap/v1/orders/info/query" //预计派送时间 + JdServiceOrderWaybills = "/cloud/print/render" //快递单下载 + JdServiceBackUrl = "/jd/tracking/subscribe" //回调订阅地址 + + JdAlgorithm = "md5-salt" //加密方式 + JdVersion = "2.0" + JdBtoC = 1 + JdCtoB = 2 + JdSettleType = 3 //付款方式-月结 + JdCodeFail = "fail" //失败标识 + JdMaxOrderNumber = 8 //最多箱子数 + JdProductCode = "ed-m-0001" //京东标快 支持 0-C2C;1-B2C;2-C2B + JdRemarkMaxLength = 200 //最大备注长度 + JdSheet76x130 = "jdkd76x130" + + // 以下是签收code + JdStatusDeliverySign = "10034" + JdStatusPartialDelivery = "10042" + JdStatusDeliveryBigSign = "300015" + + JdLopDNBackECAP = "Tracking_JD" + JdOrderECAP = "ECAP" + JdPrintECAP = "jdcloudprint" +) + +// JdSingedCodeMap 已签收CODE https://open.sf-express.com/developSupport/734349?activeIndex=589678 +var JdSingedCodeMap = map[string]bool{ + JdStatusDeliverySign: true, + JdStatusPartialDelivery: true, + JdStatusDeliveryBigSign: true, +} + +// NewJdClient 初始化顺丰客户端 +func NewJdClient(info dao.ExpressSend) *JdClient { + other := utils.StrToStrArr(info.Other, "|") + var accessToken, customerCode string + for i := utils.NumberZero; i < len(other); i++ { + tmp := strings.Split(other[i], ":") + if len(tmp) != utils.NumberTwo { + continue + } + switch tmp[0] { + case "token": + accessToken = tmp[1] + break + case "code": + customerCode = tmp[1] + break + } + } + return &JdClient{info, accessToken, customerCode} +} + +func (c *JdClient) Create(order dao.DeliveryOrderPrint) (TransitResult, error) { + result, err := c.getCheck(order) + if err != nil { + return result, err + } + if result.ErrorCode != utils.StringStatusOk { + return result, nil + } + + info := c.getCreateData(order, order.ProductItems) + //发送请求 + result, err = c.send(JdServiceOrder, info) + if err != nil { + utils.Logger.Error("Jd Create Order:", err) + return result, err + } + if result.ErrorCode != utils.StringStatusOk { + utils.Logger.Error("Jd Create Order:", err) + return result, nil + } + c.subscribe(result.WaybillNo[utils.NumberZero]) + result.PostInfo = utils.StructToJson(info) + return result, nil +} + +// Query 查询物流 +func (c *JdClient) Query(waybillCode string) (TransitResult, error) { + data := map[string]interface{}{ + //1:根据顺丰运单号查询,trackingNumber将被当作顺丰运单号处理 + //2:根据客户订单号查询,trackingNumber将被当作客户订单号处理 + //"trackingType": JdTrackingType, + "waybillCode": waybillCode, + "orderOrigin": JdBtoC, + } + //发送请求 + result, err := c.send(JdServiceOrderQueryByMailNo, data) + if err != nil { + utils.Logger.Error("Jd Query Order:", err) + return result, err + } + return result, nil +} + +// DownSheet 下载面单 +func (c *JdClient) DownSheet(orders []string, info dao.DeliveryOrderPrint) (TransitResult, error) { + data := map[string]interface{}{ + "customerCode": c.customerCode, + "templateCode": JdSheet76x130, + "operator": info.AdminName, //自定义操作人 + "taskId": strconv.FormatInt(time.Now().UnixMilli(), 10), //自定义任务ID + "printData": map[string]interface{}{ + "orderNumber": info.OrderSn, //订单号 + "carrierCode": "JD", + "billCodeValue": orders[0], + "billCodeType": "waybillCode", + "customerPrintData": map[string]interface{}{ + "productCode": JdProductCode, + }, + }, + "outputConfig": map[string]interface{}{ + "outputType": "1", //文件 + "dataFormat": "1", //当fileFormat=1时,枚举值填1(1代表URL) + "fileFormat": "1", //PDF + }, + } + //生成需要提交的数据 + //发送请求 + result, err := c.sendDown(JdServiceOrderWaybills, data, orders[0]) + if err != nil { + utils.Logger.Error("Jd Create Order:", err) + return result, err + } + result.PostInfo = utils.StructToJson(data) + + return result, nil +} + +// Estimated 获取预计时间 +func (c *JdClient) Estimated(orderId, card string) (TransitResult, error) { + data := map[string]interface{}{ + "customerCode": c.customerCode, + "deliveryId": orderId, + } + utils.Logger.Error(data) + //发送请求 + result, err := c.send(JdServiceOrderEstimated, data) + if err != nil { + utils.Logger.Error("Jd estimated Order:", err) + return result, err + } + utils.Logger.Error(result) + result.PostInfo = utils.StructToJson(data) + return result, nil +} + +// Cancel 取消订单 +func (c *JdClient) Cancel(waybillCode string) (TransitResult, error) { + data := map[string]interface{}{ + "waybillCode": waybillCode, + "orderOrigin": JdBtoC, + "cancelReason": "快递数据同步失败", + "cancelReasonCode": "1", + } + //发送请求 + result, err := c.send(JdServiceOrderConfirm, data) + if err != nil { + utils.Logger.Error("Jd cancel Order:", err) + return result, err + } + result.PostInfo = utils.StructToJson(data) + return result, nil +} + +// Edit 修改订单 +func (c *JdClient) Edit(waybillCode string) (TransitResult, error) { + data := map[string]interface{}{ + "waybillCode": waybillCode, + "orderOrigin": JdBtoC, + "cancelReason": "快递数据同步失败", + "cancelReasonCode": "1", + } + //发送请求 + result, err := c.send(JdServiceOrderConfirm, data) + if err != nil { + utils.Logger.Error("Jd cancel Order:", err) + return result, err + } + result.PostInfo = utils.StructToJson(data) + return result, nil +} + +func (c *JdClient) sendPost(apiUri, lop string, postData map[string]interface{}) (string, error) { + client := http.Client{} + baseUri := c.config.AppUrl + + bodyArr := []map[string]interface{}{ + postData, + } + body := utils.StructToJson(bodyArr) + timestamp := time.Now().Format(time.DateTime) + content := strings.Join([]string{ + c.config.AppSecretKey, + "access_token", c.accessToken, + "app_key", c.config.AppCode, + "method", apiUri, + "param_json", body, + "timestamp", timestamp, + "v", JdVersion, + c.config.AppSecretKey, + }, "") + sign, err := c.sign(JdAlgorithm, []byte(content), c.config.AppSecretKey) + if err != nil { + utils.Logger.Error("Jd:", err) + return "", err + } + postUrl := baseUri + apiUri + httpRequest, err := http.NewRequest("POST", postUrl, bytes.NewReader([]byte(body))) + if err != nil { + utils.Logger.Error("Jd:", err) + return "", err + } + query := httpRequest.URL.Query() + query.Add("LOP-DN", lop) + query.Add("access_token", c.accessToken) + query.Add("app_key", c.config.AppCode) + query.Add("timestamp", timestamp) + query.Add("v", JdVersion) + query.Add("sign", sign) + query.Add("algorithm", JdAlgorithm) + httpRequest.URL.RawQuery = query.Encode() + _, offset := time.Now().Zone() + // lop-tz代表时区,为接口调用当地的时区;删去后默认为东八区 + httpRequest.Header.Add("lop-tz", fmt.Sprintf("%d", offset/3600)) + // 用于开放平台识别客户调用API方式,客户无需修改 + httpRequest.Header.Add("User-Agent", "lop-http/go") + httpRequest.Header.Add("content-type", "application/json;charset=utf-8") + httpResponse, err := client.Do(httpRequest) + if err != nil { + utils.Logger.Error("Jd:", err) + return "", err + } + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + utils.Logger.Error(err) + } + }(httpResponse.Body) + + b, err := io.ReadAll(httpResponse.Body) + if err != nil { + utils.Logger.Error("Jd:", err) + return "", err + } + + return string(b), nil +} + +func (c *JdClient) sign(algorithm string, data []byte, secret string) (string, error) { + if algorithm == "md5-salt" { + h := md5.New() + if _, err := h.Write(data); err != nil { + return "", err + } + return fmt.Sprintf("%x", h.Sum(nil)), nil + } else if algorithm == "HMacMD5" { + h := hmac.New(md5.New, []byte(secret)) + if _, err := h.Write(data); err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil + } else if algorithm == "HMacSHA1" { + h := hmac.New(sha1.New, []byte(secret)) + if _, err := h.Write(data); err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil + } else if algorithm == "HMacSHA256" { + h := hmac.New(sha256.New, []byte(secret)) + if _, err := h.Write(data); err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil + } else if algorithm == "HMacSHA512" { + h := hmac.New(sha512.New, []byte(secret)) + if _, err := h.Write(data); err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil + } + return "", fmt.Errorf("algorithm %s not supported yet", algorithm) +} + +func (c *JdClient) getCreateData(order dao.DeliveryOrderPrint, products []dao.DeliveryOrderProduct) map[string]interface{} { + var weight, length, width, hight, volume float32 + var remark []string + + for _, item := range products { + weight += item.ProductWeight * float32(item.ProductNumber) + length += item.ProductLength * float32(item.ProductNumber) + width += item.ProductWidth * float32(item.ProductNumber) + hight += item.ProductHeight * float32(item.ProductNumber) + volume += item.ProductCubage * float32(item.ProductNumber) + remark = append(remark, fmt.Sprintf("%s×%d", item.ProductName, item.ProductNumber)) + } + + remarkStr := strings.Join(remark, ",") + if utf8.RuneCountInString(remarkStr) > JdRemarkMaxLength { + remarkStr = remarkStr[:JdRemarkMaxLength] + } + + name := utils.GetConfigString("transit.name") + if name == "" { + name = "化妆品" + } + + // 生成顺丰标准请求参数 + data := map[string]interface{}{ + "orderId": order.OrderSn, //订单号 + "senderContact": map[string]interface{}{ //发货人信息 + "name": c.config.Contact, + "mobile": c.config.Mobile, + "fullAddress": c.config.Address, + }, + "receiverContact": map[string]interface{}{ //收货人信息 + "name": order.Addressee, + "mobile": order.Mobile, + "fullAddress": order.Address, + }, + "orderOrigin": JdBtoC, + "customerCode": c.customerCode, // + "productsReq": map[string]interface{}{ + "productCode": JdProductCode, + }, + "settleType": JdSettleType, + "cargoes": []map[string]interface{}{ + { + "name": name, + "quantity": order.Number, + "weight": weight, + "length": length, + "width": width, + "hight": hight, + "volume": volume, + }, + }, + "extendProps": map[string]interface{}{ + "autoSubscribe": "1", //1为订阅推送,0为不订阅推送 + }, + "remark": remarkStr, + } + return data +} + +func (c *JdClient) getCheck(order dao.DeliveryOrderPrint) (TransitResult, error) { + //生成map对象 + info := c.getCheckCreateData(order, utils.NumberOne, order.ProductItems[:1]) + //发送请求 + result, err := c.send(JdServicePrecheckOrder, info) + result.PostInfo = utils.StructToJson(info) + return result, err +} + +func (c *JdClient) getCheckCreateData(order dao.DeliveryOrderPrint, number int, products []dao.DeliveryOrderProduct) map[string]interface{} { + var weight, length, width, hight, volume float32 + for _, item := range products { + weight += item.ProductWeight + length += item.ProductLength + width += item.ProductWidth + hight += item.ProductHeight + volume += item.ProductCubage + } + + name := utils.GetConfigString("transit.name") + if name == "" { + name = "化妆品" + } + + // 生成顺丰标准请求参数 + data := map[string]interface{}{ + "senderContact": map[string]interface{}{ + "name": c.config.Contact, + "mobile": c.config.Mobile, + "fullAddress": c.config.Address, + }, + "receiverContact": map[string]interface{}{ + "name": order.Addressee, + "mobile": order.Mobile, + "fullAddress": order.Address, + }, + "orderOrigin": JdBtoC, + "customerCode": c.customerCode, // 你的订单号 + "settleType": JdSettleType, + "cargoes": []map[string]interface{}{ + { + "name": name, + "quantity": number, + "weight": weight, + "length": length, + "width": width, + "hight": hight, + "volume": volume, + }, + }, + } + return data +} + +func (c *JdClient) send(uri string, postData map[string]interface{}) (TransitResult, error) { + res := TransitResult{} + // 发送请求 + resultStr, err := c.sendPost(uri, JdOrderECAP, postData) + if err != nil { + utils.Logger.Error(err) + return res, err + } + var result map[string]interface{} + if err = jsoniter.Unmarshal([]byte(resultStr), &result); err != nil { + utils.Logger.Error(err) + return res, err + } + res.RequestInfo = resultStr + res.ErrorCode = JdCodeFail + if _, ok := result["code"]; ok { + if result["success"].(bool) { + res.ErrorCode = utils.StringStatusOk + } + + res.ApiErrorMsg = utils.GetStringByMap(result, "subMsg") + if _, ok := postData["requestId"]; ok { + res.RequestID = postData["requestId"].(string) + } + + // 成功 → 提取运单号 + if res.ErrorCode == utils.StringStatusOk { + res.WaybillNo = append(res.WaybillNo, utils.GetStringByMap(result["data"].(map[string]interface{}), "waybillCode")) + } + } else if _, ok := result["statusCode"]; ok { + if result["statusCode"].(float64) == utils.NumberZero { + res.ErrorCode = utils.StringStatusOk + } + res.ApiErrorMsg = utils.GetStringByMap(result, "statusMessage") + } + if msgData, ok := result["data"].(map[string]interface{}); ok { + res.RequestQuery = msgData + } + utils.Logger.Error(res) + utils.Logger.Error(result) + return res, nil +} + +func (c *JdClient) subscribe(referenceNumber string) bool { + data := map[string]interface{}{ + "referenceNumber": referenceNumber, + "referenceType": "20000", + } + res := TransitResult{} + // 发送请求 + resultStr, err := c.sendPost(JdServiceBackUrl, JdLopDNBackECAP, data) + utils.Logger.Error(data) + if err != nil { + utils.Logger.Error(err) + return false + } + var result map[string]interface{} + if err = jsoniter.Unmarshal([]byte(resultStr), &result); err != nil { + utils.Logger.Error(err) + return false + } + res.RequestInfo = resultStr + res.ErrorCode = JdCodeFail + if _, ok := result["code"]; ok { + if result["code"].(float64) == 1000 { + res.ErrorCode = utils.StringStatusOk + } else { + utils.Logger.Error(result) + } + + res.ApiErrorMsg = utils.GetStringByMap(result, "msg") + } + utils.Logger.Error(resultStr) + + return true +} + +func (c *JdClient) sendDown(uri string, postData map[string]interface{}, billCodeValue string) (TransitResult, error) { + res := TransitResult{} + // 发送请求 + resultStr, err := c.sendPost(uri, JdPrintECAP, postData) + if err != nil { + return res, err + } + + var result map[string]interface{} + if err = jsoniter.Unmarshal([]byte(resultStr), &result); err != nil { + return res, err + } + res.RequestInfo = resultStr + res.ErrorCode = JdCodeFail + if _, ok := result["code"]; ok { + if result["code"].(float64) == 1000 { + res.ErrorCode = utils.StringStatusOk + } + + res.ApiErrorMsg = utils.GetStringByMap(result, "msg") + + // 成功 → 获取内容 + if res.ErrorCode == utils.StringStatusOk { + resultArr, ok := result["result"].([]interface{}) + if ok && len(resultArr) > utils.NumberZero { + firstItem, ok := resultArr[utils.NumberZero].(map[string]interface{}) + if ok { + // 3. 从第一条数据里取出 url + url := utils.GetStringByMap(firstItem, "url") + res.Files = append(res.Files, TransitFiles{ + Url: url, + WaybillNo: billCodeValue, + }) + } + } + } + } + if msgData, ok := result["data"].(map[string]interface{}); ok { + res.RequestQuery = msgData + } + + return res, nil +} diff --git a/services/express/internal/transit/sf.go b/services/express/internal/transit/sf.go new file mode 100644 index 0000000..46e66e1 --- /dev/null +++ b/services/express/internal/transit/sf.go @@ -0,0 +1,459 @@ +package transit + +import ( + "crypto/md5" + "encoding/base64" + "fmt" + "io" + "lone-services/pkg/utils" + "lone-services/services/express/internal/dao" + "math/rand" + "net/http" + "net/url" + "strings" + "time" + + jsoniter "github.com/json-iterator/go" +) + +// SfClient 顺丰快递客户端 +type SfClient struct { + config dao.ExpressSend +} + +const ( + SfServiceOrder = "EXP_RECE_CREATE_ORDER" //下订单 + SfServiceOrderConfirm = "EXP_RECE_UPDATE_ORDER" //取消订单 + SfServiceOrderQueryByMailNo = "EXP_RECE_SEARCH_ROUTES" //路由查询-通过运单号-通过订单号 + SfServiceOrderEstimated = "EXP_RECE_SEARCH_PROMITM" //预计派送时间 + SfServiceOrderWaybills = "COM_RECE_CLOUD_PRINT_WAYBILLS" //快递单下载 + + SfContactTypeA = 1 //发货方 + SfContactTypeB = 2 //收货方 + SfCN = "CN" + SfLanguage = "zh-CN" + SfWaybillTypeMaster = 1 //母订单 + SfWaybillTypeSublevel = 2 //子订单 + SfTrackingType = 2 //顾客订单号 + + SfServiceOrderConfirmKey = 2 //取消订单 + SfServiceCheckTypeCard = 2 //月结卡 + + // 以下是签收code + sfStatusThirdPartySign = "980" + sfStatusArriveHoldLost = "8000" + sfStatusExternalSign = "935" + sfStatusMultiPieceTakePhoto = "701" + sfStatusPartnerDelivered = "658" + sfStatusCustomerPickUp = "128" + sfStatusSigned = "80" +) + +// SfSingedCodeMap 已签收CODE https://open.sf-express.com/developSupport/734349?activeIndex=589678 +var SfSingedCodeMap = map[string]bool{ + sfStatusThirdPartySign: true, + sfStatusArriveHoldLost: true, + sfStatusExternalSign: true, + sfStatusMultiPieceTakePhoto: true, + sfStatusPartnerDelivered: true, + sfStatusCustomerPickUp: true, + sfStatusSigned: true, +} + +// NewSfClient 初始化顺丰客户端 +func NewSfClient(info dao.ExpressSend) *SfClient { + return &SfClient{info} +} + +func (c *SfClient) Create(order dao.DeliveryOrderPrint) (TransitResult, error) { + //生成map对象 + info := c.getCreateData(order) + //生成需要提交的数据 + postData := c.getPostData(SfServiceOrder, info) + //发送请求 + result, err := c.send(postData) + if err != nil { + utils.Logger.Error("SF Create Order:", err) + return result, nil + } + result.PostInfo = info + return result, nil +} + +// Query 查询物流 +func (c *SfClient) Query(orderId string) (TransitResult, error) { + data := map[string]interface{}{ + //1:根据顺丰运单号查询,trackingNumber将被当作顺丰运单号处理 + //2:根据客户订单号查询,trackingNumber将被当作客户订单号处理 + "trackingType": SfTrackingType, + "trackingNumber": orderId, + } + bytes, _ := jsoniter.Marshal(data) + //生成需要提交的数据 + postData := c.getPostData(SfServiceOrderQueryByMailNo, string(bytes)) + //发送请求 + result, err := c.send(postData) + if err != nil { + utils.Logger.Error("SF Query Order:", err) + return result, err + } + return result, nil +} + +// DownSheet 下载面单 +func (c *SfClient) DownSheet(orders []string, info dao.DeliveryOrderPrint) (TransitResult, error) { + var documents []map[string]interface{} + sum := len(orders) + for key, order := range orders { + tmp := make(map[string]interface{}) + tmp["masterWaybillNo"] = order + if sum > 1 { + tmp["branchWaybillNo"] = order + tmp["sum"] = sum + tmp["seq"] = key + 1 + } + documents = append(documents, tmp) + if utils.GetConfigBool("transit.sf_test") { + break + } + } + + data := map[string]interface{}{ + "templateCode": c.config.PdfCode, + "documents": documents, + "version": "2.0", + "sync": true, + } + bytes, _ := jsoniter.Marshal(data) + //生成需要提交的数据 + postData := c.getPostData(SfServiceOrderWaybills, string(bytes)) + //发送请求 + result, err := c.sendDown(postData) + if err != nil { + utils.Logger.Error("SF Create Order:", err) + return result, err + } + result.PostInfo = string(bytes) + + return result, nil +} + +// Estimated 获取预计时间 +func (c *SfClient) Estimated(orderId, card string) (TransitResult, error) { + data := map[string]interface{}{ + "checkType": SfServiceCheckTypeCard, + "searchNo": orderId, + "checkNos": []string{card}, + } + bytes, _ := jsoniter.Marshal(data) + //生成需要提交的数据 + postData := c.getPostData(SfServiceOrderEstimated, string(bytes)) + //发送请求 + result, err := c.send(postData) + if err != nil { + utils.Logger.Error("SF estimated Order:", err) + return result, err + } + result.PostInfo = string(bytes) + return result, nil +} + +// Cancel 取消订单 +func (c *SfClient) Cancel(orderId string) (TransitResult, error) { + data := map[string]interface{}{ + "dealType": SfServiceOrderConfirmKey, + "orderId": orderId, + } + bytes, _ := jsoniter.Marshal(data) + //生成需要提交的数据 + postData := c.getPostData(SfServiceOrderConfirm, string(bytes)) + //发送请求 + result, err := c.send(postData) + if err != nil { + utils.Logger.Error("SF cancel Order:", err) + return result, err + } + result.PostInfo = string(bytes) + return result, nil +} + +func (c *SfClient) createUUID() string { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + uniq := fmt.Sprintf("%d%d", r.Int(), time.Now().UnixNano()) + chars := fmt.Sprintf("%x", md5.Sum([]byte(uniq))) + + // 格式:8-4-4-4-12 + return fmt.Sprintf("%s-%s-%s-%s-%s", + chars[0:8], + chars[8:12], + chars[12:16], + chars[16:20], + chars[20:32], + ) +} + +func (c *SfClient) sendPost(apiUrl string, postData map[string]interface{}) (string, error) { + values := make(url.Values) + for k, v := range postData { + values.Set(k, fmt.Sprintf("%v", v)) + } + + client := &http.Client{Timeout: time.Duration(15*60) * time.Second} + req, _ := http.NewRequest("POST", apiUrl, strings.NewReader(values.Encode())) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=utf-8") + + resp, err := client.Do(req) + if err != nil { + utils.Logger.Error("Sf:", err) + return "", err + } + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + utils.Logger.Error(err) + } + }(resp.Body) + + body, _ := io.ReadAll(resp.Body) + return string(body), nil +} + +func (c *SfClient) getCreateData(order dao.DeliveryOrderPrint) string { + name := utils.GetConfigString("transit.name") + if name == "" { + name = "化妆品" + } + // 生成顺丰标准请求参数 + data := map[string]interface{}{ + "cargoDesc": name, + "expressTypeId": utils.NumberTwo, //顺丰顺丰标快 + "monthlyCard": c.config.CardNumber, // 你的月结卡号 + "orderId": order.OrderSn, // 你的订单号 + "language": SfLanguage, + "parcelQty": order.Number, + "isDocall": utils.GetConfigInt("transit.sf_call_type"), + "isReturnRoutelabel": utils.NumberOne, //是否返回路由标签: 默认1, 1:返回路由标签, 0:不返回;除部分特殊用户外,其余用户都默认返回 + "payMethod": utils.NumberOne, //付款方式,支持以下值: 1:寄方付 2:收方付 3:第三方付 + "waybillNoInfoList": []map[string]interface{}{}, + "cargoDetails": []map[string]interface{}{}, + // 寄件 + 收件 + "contactInfoList": []map[string]interface{}{ + // 寄件方 contactType=1 + { + "country": SfCN, + "company": c.config.CompanyName, + "province": c.config.Province, + "city": c.config.City, + "county": c.config.County, + "address": c.config.Address, + "contact": c.config.Contact, + "mobile": c.config.Mobile, + "contactType": SfContactTypeA, + }, + // 收件方 contactType=2 + { + "country": SfCN, + "province": order.Province, + "city": order.City, + "county": order.County, + "address": order.Address, + "contact": order.Addressee, + "mobile": order.Mobile, + "contactType": SfContactTypeB, + }, + }, + "totalWeight": order.Weight, // 用你的真实重量 + } + var nameInfo []string + if order.Number > utils.NumberZero { + num := utils.NumberZero + for _, item := range order.ProductItems { + nameInfo = append(nameInfo, fmt.Sprintf("%s*%d", item.ProductName, item.ProductNumber)) + for i := utils.NumberZero; i < item.ProductNumber; i++ { + Type := SfWaybillTypeMaster + if num > utils.NumberZero { + Type = SfWaybillTypeSublevel + } + info := make(map[string]interface{}) + info["waybillType"] = Type + if utils.GetConfigBool("transit.sf_test") { + info["waybillNo"] = "SF3191177193750" + } + info["boxNo"] = "Box" + fmt.Sprintf("%03d", num+1) + info["width"] = item.ProductWidth + info["height"] = item.ProductHeight + info["weight"] = item.ProductWeight + info["volume"] = item.ProductCubage + info["length"] = item.ProductLength + data["waybillNoInfoList"] = append(data["waybillNoInfoList"].([]map[string]interface{}), info) + num++ + if utils.GetConfigBool("transit.sf_test") { + break + } + } + if utils.GetConfigBool("transit.sf_test") { + break + } + } + } + cargoDetails := make(map[string]interface{}) + cargoDetails["name"] = name + if len(nameInfo) > utils.NumberZero { + cargoDetails["name"] = strings.Join(nameInfo, ",") + data["remark"] = strings.Join(nameInfo, ",") + } + cargoDetails["count"] = order.Number + data["cargoDetails"] = append(data["cargoDetails"].([]map[string]interface{}), cargoDetails) + + bytes, _ := jsoniter.Marshal(data) + return string(bytes) +} + +func (c *SfClient) getPostData(serviceCode string, msgData string) map[string]interface{} { + requestID := c.createUUID() + timestamp := fmt.Sprintf("%d", time.Now().Unix()) + + // 签名逻辑:md5( urlencode(msgData + timestamp + code ) ) → base64 + raw := url.QueryEscape(msgData + timestamp + c.config.AppSecretKey) + md5Val := md5.Sum([]byte(raw)) + msgDigest := base64.StdEncoding.EncodeToString(md5Val[:]) + + return map[string]interface{}{ + "partnerID": c.config.AppCode, + "requestID": requestID, + "serviceCode": serviceCode, + "timestamp": timestamp, + "msgDigest": msgDigest, + "msgData": msgData, + } +} + +func (c *SfClient) send(postData map[string]interface{}) (TransitResult, error) { + res := TransitResult{} + // 发送请求 + resultStr, err := c.sendPost(c.config.AppUrl, postData) + if err != nil { + return res, err + } + + // 解析第一层JSON + var result map[string]interface{} + if err := jsoniter.Unmarshal([]byte(resultStr), &result); err != nil { + return res, err + } + + res.RequestID = postData["requestID"].(string) + res.RequestInfo = resultStr + // 读取 apiResultData + if apiResultData, ok := result["apiResultData"].(string); ok && apiResultData != "" { + var dataMap map[string]interface{} + if err := jsoniter.Unmarshal([]byte(apiResultData), &dataMap); err != nil { + return res, err + } + + res.ErrorCode = dataMap["errorCode"].(string) + res.ApiErrorMsg = utils.GetStringByMap(dataMap, "errorMsg") + res.ApiResponseID = utils.GetStringByMap(result, "apiResponseID") + // 成功 → 提取运单号 + if res.ErrorCode == "S0000" { + res.ErrorCode = utils.StringStatusOk + if msgData, ok := dataMap["msgData"].(map[string]interface{}); ok { + res.RequestQuery = msgData + if list, ok := msgData["waybillNoInfoList"].([]interface{}); ok { + for _, item := range list { + if m, ok := item.(map[string]interface{}); ok { + no := utils.GetStringByMap(m, "waybillNo") + if no != "" { + res.WaybillNo = append(res.WaybillNo, no) + } + } + } + } + } + } + } else { + // 错误情况 + res.ErrorCode = utils.GetStringByMap(result, "apiResultCode") + if res.ErrorCode == "" { + res.ErrorCode = "A11111" + } + res.ApiErrorMsg = utils.GetStringByMap(result, "apiErrorMsg") + res.ApiResponseID = utils.GetStringByMap(result, "apiResponseID") + } + + return res, nil +} + +func (c *SfClient) sendDown(postData map[string]interface{}) (TransitResult, error) { + res := TransitResult{} + // 发送请求 + resultStr, err := c.sendPost(c.config.AppUrl, postData) + + if err != nil { + return res, err + } + + var result map[string]interface{} + if err := jsoniter.Unmarshal([]byte(resultStr), &result); err != nil { + return res, err + } + + res.RequestID = utils.GetStringByMap(postData, "requestID") + res.RequestInfo = resultStr + res.ApiResponseID = utils.GetStringByMap(result, "apiResponseID") + res.ApiErrorMsg = utils.GetStringByMap(result, "apiErrorMsg") + + // 外层状态 + apiResultCode := utils.GetStringByMap(result, "apiResultCode") + if apiResultCode == "A1000" { + // 接口调用成功 + res.ErrorCode = utils.StringStatusOk + } else { + res.ErrorCode = apiResultCode + return res, nil + } + + apiResultData := utils.GetStringByMap(result, "apiResultData") + if apiResultData == "" { + return res, nil + } + + var dataMap map[string]interface{} + if err := jsoniter.Unmarshal([]byte(apiResultData), &dataMap); err != nil { + return res, err + } + + // ====================== + // 正确解析顺丰云打印结构 + // ====================== + success := false + if val, ok := dataMap["success"].(bool); ok { + success = val + } + if success { + res.ErrorCode = utils.StringStatusOk + // 读取 obj -> files + if obj, ok := dataMap["obj"].(map[string]interface{}); ok { + if files, ok := obj["files"].([]interface{}); ok { + for _, item := range files { + if m, ok := item.(map[string]interface{}); ok { + + waybillNo := utils.GetStringByMap(m, "waybillNo") + res.Files = append(res.Files, TransitFiles{ + File: utils.GetStringByMap(m, "waybillNo"), + Url: utils.GetStringByMap(m, "url"), + Token: utils.GetStringByMap(m, "token"), + WaybillNo: waybillNo, + }) + + res.WaybillNo = append(res.WaybillNo, waybillNo) + } + } + } + } + } else { + res.ErrorCode = "FAIL" + } + + return res, nil +} diff --git a/services/express/validator/delivery.go b/services/express/validator/delivery.go new file mode 100644 index 0000000..0338c27 --- /dev/null +++ b/services/express/validator/delivery.go @@ -0,0 +1,26 @@ +package validator + +import "lone-services/pkg/validate" + +type DeliveringValidator struct { + Id int64 `form:"id" json:"id" validate:"required"` + TransitId int64 `form:"transit_id" json:"transit_id"` +} + +// GetMessage 提示消息 +func (p DeliveringValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + validate.FieldId: validate.FieldIdValue, + } +} + +type CompanyItemsValidator struct { + Code string `form:"code" json:"code" validate:"required"` +} + +// GetMessage 提示消息 +func (p CompanyItemsValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "Code.required": "请输入公司代码", + } +} diff --git a/services/express/validator/express.go b/services/express/validator/express.go index c2d6dfc..74921a0 100644 --- a/services/express/validator/express.go +++ b/services/express/validator/express.go @@ -58,3 +58,8 @@ func (p InfoValidator) GetMessage() validate.ValidatorMessages { "Id.required": "ID不能为空", } } + +type DeliveryHistoryValidator struct { + Page int `form:"page" json:"page"` + Size int `form:"size" json:"size"` +} diff --git a/services/order/internal/dao/order.go b/services/order/internal/dao/order.go index 639c60d..26b70a9 100644 --- a/services/order/internal/dao/order.go +++ b/services/order/internal/dao/order.go @@ -15,39 +15,58 @@ const ( OrderPayStatusFail = 4 //支付失败 OrderPayStatusLose = 5 //已失效 + OrderDeliverTypeSend = 1 //需要发货 + OrderDeliverTypeNotSend = 2 //不需要发货 + OrderTypeSale = 1 //销售 OrderTypeStore = 2 //为门店 OrderTypePersonal = 3 //为个人 OrderTypeHome = 4 //为个人家庭试用 + + DeliverTypeOrder = 1 //订单 + DeliverTypeSupply = 3 //补货 + + SendStatusOver = 1 //为已签收 + SendStatusWait = 2 //为待发货 + SendStatusIn = 3 //为发货中 + SendStatusOk = 4 //为已发货 + SendStatusCancel = 5 //已取消 + + OrderVerifyStatusOK = 1 + OrderVerifyStatusFail = 2 + OrderVerifyStatusWait = 3 ) type OrderCreate struct { - Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` - OrderSn string `gorm:"column:order_sn;type:varchar(100);comment:订单号;NOT NULL" json:"order_sn"` - StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` - StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` - SaleName string `gorm:"column:sale_name;type:varchar(50);comment:销售姓名" json:"sale_name"` - SaleMobile string `gorm:"column:sale_mobile;type:char(60);comment:销售电话" json:"sale_mobile"` - SaleProvince int `gorm:"column:sale_province;type:int(11);default:0;comment:销售到的地域" json:"sale_province"` - UserId int `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` - UserName string `gorm:"column:user_name;type:varchar(255);comment:用户名" json:"user_name"` - SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` - Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` - Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` - Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` - DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` - TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` - GroupId int `gorm:"column:group_id;type:int(11);default:0" json:"group_id"` - PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` - PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` - Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` - IsSupply uint8 `gorm:"column:is_supply;type:tinyint(1);default:1;comment:是否补过货,1为没有,2为补过" json:"is_supply"` - Note string `gorm:"column:note;type:varchar(255);comment:备注" json:"note"` - VerifyStatus uint8 `gorm:"column:verify_status;type:tinyint(1);default:0;comment:审核状态,1为通过,2为失败,3为待审核,0为正常订单不需要审核" json:"verify_status"` - ExpiredTime utils.CustomTime `json:"expired_time" gorm:"expired_time"` // 过期时间 - ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` - CreateType uint8 `gorm:"column:create_type;type:tinyint(1);default:1;comment:下单人类型,1为销售,2为门店,3为个人;NOT NULL" json:"create_type"` - Type uint8 `gorm:"column:type;type:tinyint(1);default:0;comment:类型 1 销售,2为门店,3为个人,4为个人家庭试用,5为个人门店试用" json:"type"` + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:order_sn;type:varchar(100);comment:订单号;NOT NULL" json:"order_sn"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` + StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` + SaleName string `gorm:"column:sale_name;type:varchar(50);comment:销售姓名" json:"sale_name"` + SaleMobile string `gorm:"column:sale_mobile;type:char(60);comment:销售电话" json:"sale_mobile"` + SaleProvince int `gorm:"column:sale_province;type:int(11);default:0;comment:销售到的地域" json:"sale_province"` + UserId int `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` + UserName string `gorm:"column:user_name;type:varchar(255);comment:用户名" json:"user_name"` + SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + GroupId int `gorm:"column:group_id;type:int(11);default:0" json:"group_id"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + IsSupply uint8 `gorm:"column:is_supply;type:tinyint(1);default:1;comment:是否补过货,1为没有,2为补过" json:"is_supply"` + Note string `gorm:"column:note;type:varchar(255);comment:备注" json:"note"` + DeliverStatus uint8 `json:"deliver_status" gorm:"deliver_status"` // 发货状态,1为已签收,2为待发货,3为发货中,4为已发货 + DeliverType uint8 `json:"deliver_type" gorm:"deliver_type"` // 发货类型,1为需要发货,2为不需要发货 + SignTime utils.CustomTime `json:"sign_time" gorm:"sign_time"` // 签收时间 + VerifyStatus uint8 `gorm:"column:verify_status;type:tinyint(1);default:0;comment:审核状态,1为通过,2为失败,3为待审核,0为正常订单不需要审核" json:"verify_status"` + ExpiredTime utils.CustomTime `json:"expired_time" gorm:"expired_time"` // 过期时间 + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + CreateType uint8 `gorm:"column:create_type;type:tinyint(1);default:1;comment:下单人类型,1为销售,2为门店,3为个人;NOT NULL" json:"create_type"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:0;comment:类型 1 销售,2为门店,3为个人,4为个人家庭试用,5为个人门店试用" json:"type"` } type OrderInfo struct { @@ -180,9 +199,13 @@ type OrderImitateInfo struct { DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` DeliverStatus uint8 `gorm:"column:deliver_status;type:tinyint(1);default:2;comment:发货状态,1为已签收,2为待发货,3为发货中,4为已发货" json:"deliver_status"` + DeliverType uint8 `json:"deliver_type" gorm:"deliver_type"` // 发货类型,1为需要发货,2为不需要发货 Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` VerifyStatus uint8 `gorm:"column:verify_status;type:tinyint(1);default:0;comment:审核状态,1为通过,2为失败,3为待审核,0为正常订单不需要审核" json:"verify_status"` ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + Reason string `json:"reason" gorm:"reason"` // 原因 + AdminId int64 `json:"admin_id" gorm:"admin_id"` // 操作人ID + AdminName string `json:"admin_name" gorm:"admin_name"` // 操作人姓名 } type OrderImitateItems struct { @@ -225,11 +248,3 @@ type OrderTaskAndAwardHalfYear struct { type OrderTaskAndAwardYear struct { TaskAwardYearStatus uint8 `gorm:"column:task_award_year_status;type:tinyint(1);default:2;comment:结算任务与奖励年,1 为已结算,2为未结算" json:"task_awark_year_status"` } - -type OrderAuditing struct { - Id int64 `json:"id" gorm:"id"` // ID - VerifyStatus uint8 `gorm:"column:verify_status;type:tinyint(1);default:0;comment:审核状态,1为通过,2为失败,3为待审核,0为正常订单不需要审核" json:"verify_status"` - Reason string `json:"reason" gorm:"reason"` // 原因 - AdminId int64 `json:"admin_id" gorm:"admin_id"` // 操作人ID - AdminName string `json:"admin_name" gorm:"admin_name"` // 操作人姓名 -} diff --git a/services/order/internal/dao/orderProduct.go b/services/order/internal/dao/orderProduct.go index a575279..639fb1a 100644 --- a/services/order/internal/dao/orderProduct.go +++ b/services/order/internal/dao/orderProduct.go @@ -16,7 +16,7 @@ type OrderProductCreate struct { type OrderProductInfo struct { Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` OrderSn string `gorm:"column:order_sn;type:varchar(100);comment:订单号;NOT NULL" json:"order_sn"` - ProductId int `gorm:"column:product_id;type:int(11);comment:产品ID;NOT NULL" json:"product_id"` + ProductId int64 `gorm:"column:product_id;type:int(11);comment:产品ID;NOT NULL" json:"product_id"` ProductName string `gorm:"column:product_name;type:varchar(255);comment:产品名;NOT NULL" json:"product_name"` Price float64 `gorm:"column:price;type:decimal(10,2);comment:产品单价格;NOT NULL" json:"price"` Number int `gorm:"column:number;type:int(11);default:0;comment:购买的数量;NOT NULL" json:"number"` diff --git a/services/order/internal/logic/orderAuditingLogic.go b/services/order/internal/logic/orderAuditingLogic.go index 69f0635..16571a3 100644 --- a/services/order/internal/logic/orderAuditingLogic.go +++ b/services/order/internal/logic/orderAuditingLogic.go @@ -4,13 +4,16 @@ import ( "context" "lone-services/pkg/modelbase" "lone-services/pkg/utils" + chore "lone-services/rpc/chore/pb" + express "lone-services/rpc/express/pb" + "lone-services/rpc/order/pb" + product "lone-services/rpc/product/pb" "lone-services/services/order/internal/dao" "lone-services/services/order/internal/model" + "lone-services/services/order/internal/svc" "lone-services/services/order/validator" "strconv" - - "lone-services/rpc/order/pb" - "lone-services/services/order/internal/svc" + "strings" "github.com/zeromicro/go-zero/core/logx" ) @@ -40,7 +43,7 @@ func (l *OrderAuditingLogic) OrderAuditing(in *order.OrderAuditingRequest) (*ord return l.fail(utils.ErrorNoLoginInfo) } var action = utils.ActionAdd{} - var info dao.OrderAuditing + var info dao.OrderImitateInfo w := modelbase.Params{Eq: map[string]string{"id": strconv.Itoa(int(in.Id))}} modelObj := model.OrderModel{}.Init() err := modelObj.GetOne(w, &info) @@ -51,22 +54,184 @@ func (l *OrderAuditingLogic) OrderAuditing(in *order.OrderAuditingRequest) (*ord if info.Id < utils.NumberOne { return l.fail(utils.ErrorNotFund) } + + if info.VerifyStatus != dao.OrderVerifyStatusWait { + return l.fail(utils.ErrorVerifyReview) + } + action.OldContent = info info.VerifyStatus = uint8(in.Status) info.Reason = in.Reason info.AdminName = adminInfo.Name info.AdminId = adminInfo.ID + + modelObj.Begin() row, editErr := modelObj.Edit(w, info) if editErr != nil { + modelObj.Rollback() l.Logger.Error(editErr) return l.fail(utils.Fail) } + + if in.Status == utils.StatusOk { + deliverGoods, status := l.getDeliveryInfo(info) + if status != utils.Ok { + modelObj.Rollback() + return l.fail(status) + } + status = l.setDeliverGoods(deliverGoods) + if status != utils.Ok { + modelObj.Rollback() + return l.fail(status) + } + } else { + status := l.recover(info.OrderSn) + if status != utils.Ok { + modelObj.Rollback() + return l.fail(status) + } + } + + modelObj.Commit() if row > utils.NumberZero { action.NewContent = info action.Reason = in.Reason action.Type = utils.LogActionTypeStatus action.ModuleName = utils.LogActionModuleOrder + l.Logger.Error("set action log", action) utils.SetActionLog(adminInfo, action) } return l.ok(utils.NumberOne) } + +func (l *OrderAuditingLogic) getDeliveryInfo(info dao.OrderImitateInfo) (express.DeliveryOrderCreateRequest, utils.Status) { + deliverGoods := express.DeliveryOrderCreateRequest{ + ObjId: strconv.FormatInt(info.Id, utils.NumberTen), + Mobile: info.Mobile, + Address: info.Address, + Addressee: info.Addressee, + ObjSn: info.OrderSn, + Type: dao.DeliverTypeOrder, + Status: dao.SendStatusWait, + } + if info.DeliverType == dao.OrderDeliverTypeSend { + deliverGoods.Status = dao.SendStatusOver + } + + w := modelbase.Params{Eq: map[string]string{"order_sn": info.OrderSn}} + var orderProducts []dao.OrderProductInfo + err := model.OrderProductModel{}.Init().Items(w, &orderProducts) + if err != nil || len(orderProducts) < utils.NumberOne { + logx.Errorf("get products err: %v", err) + return deliverGoods, utils.ErrorNotFund + } + var productIds []int64 + idsNumber := make(map[int64]int) + for _, item := range orderProducts { + productIds = append(productIds, item.ProductId) + idsNumber[item.ProductId] = item.Number + } + + cli, err := svc.GetRpcClient(l.svcCtx.ProductSvcName) + if err != nil { + logx.Errorf("get products err: %v", err) + return deliverGoods, utils.ErrorInternalServer + } + + productClient := product.NewProductClient(cli.Conn()) + productItems, err := productClient.ItemsByIds(l.ctx, &product.ItemsByIdsReq{Ids: productIds}) + if err != nil { + logx.Errorf("get products err: %v", err) + return deliverGoods, utils.ErrorInternalServer + } + + for _, item := range productItems.Items { + number := utils.NumberZero + if _, ok := idsNumber[item.Id]; ok { + number = idsNumber[item.Id] + } + deliverGoods.ProductInfo = append(deliverGoods.ProductInfo, &express.DeliverOrderProductInfo{ + ProductId: item.Id, + Number: int32(number), + Type: int32(item.Type), + ProductName: item.Name, + Price: item.Price, + }) + } + + clic, err := svc.GetRpcClient(l.svcCtx.ChoreSvcName) + if err != nil { + logx.Errorf("get region err: %v", err) + return deliverGoods, utils.ErrorInternalServer + } + + var regionIds []int64 + for _, item := range strings.Split(info.DistrictIds, utils.DecollatorComma) { + id, _ := strconv.Atoi(item) + regionIds = append(regionIds, int64(id)) + } + + clicClient := chore.NewChoreClient(clic.Conn()) + regionItems, err := clicClient.RegionsByIds(l.ctx, &chore.RegionsByIdsReq{Ids: regionIds}) + if err != nil { + logx.Errorf("get region err: %v", err) + return deliverGoods, utils.ErrorInternalServer + } + + switch len(regionItems.Items) { + case utils.NumberOne: + deliverGoods.Province = regionItems.Items[utils.NumberZero].Name + case utils.NumberTwo: + deliverGoods.Province = regionItems.Items[utils.NumberZero].Name + deliverGoods.City = regionItems.Items[utils.NumberOne].Name + case utils.NumberThree: + deliverGoods.Province = regionItems.Items[utils.NumberZero].Name + deliverGoods.City = regionItems.Items[utils.NumberOne].Name + deliverGoods.County = regionItems.Items[utils.NumberTwo].Name + } + + return deliverGoods, utils.Ok +} + +func (l *OrderAuditingLogic) setDeliverGoods(data express.DeliveryOrderCreateRequest) utils.Status { + cli, err := svc.GetRpcClient(l.svcCtx.ExpressSvcName) + if err != nil { + return utils.ErrorInternalServer + } + + client := express.NewExpressClient(cli.Conn()) + _, err = client.DeliveryOrderCreate(l.ctx, &data) + if err != nil { + logx.Errorf("set products err: %v", err) + return utils.ErrorInternalServer + } + return utils.Ok +} + +func (l *OrderAuditingLogic) recover(orderSn string) utils.Status { + w := modelbase.Params{Eq: map[string]string{"order_sn": orderSn}} + var orderProducts []dao.OrderProductInfo + err := model.OrderProductModel{}.Init().Items(w, &orderProducts) + if err != nil || len(orderProducts) < utils.NumberOne { + logx.Errorf("get products err: %v", err) + return utils.ErrorNotFund + } + var data product.NumberItemsReq + data.Type = utils.NumberTwo + for _, item := range orderProducts { + data.Items = append(data.Items, &product.NumberItem{Id: item.ProductId, Number: uint32(item.Number)}) + } + + cli, err := svc.GetRpcClient(l.svcCtx.ProductSvcName) + if err != nil { + return utils.ErrorInternalServer + } + + productClient := product.NewProductClient(cli.Conn()) + _, err = productClient.NumberItems(l.ctx, &data) + if err != nil { + logx.Errorf("set products err: %v", err) + return utils.ErrorInternalServer + } + return utils.Ok +} diff --git a/services/order/internal/logic/orderCreateLogic.go b/services/order/internal/logic/orderCreateLogic.go index 79514aa..e758472 100644 --- a/services/order/internal/logic/orderCreateLogic.go +++ b/services/order/internal/logic/orderCreateLogic.go @@ -44,9 +44,8 @@ func (l *OrderCreateLogic) OrderCreate(in *order.AdminCreateOrderRequest) (*orde w := modelbase.Params{ Eq: map[string]string{ - "id": strconv.FormatInt(in.AddressId, utils.NumberTen), - "type": strconv.Itoa(dao.OrderTypeStore), - "target_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen), + "id": strconv.FormatInt(in.AddressId, utils.NumberTen), + "type": strconv.Itoa(dao.OrderTypeStore), }, } var address dao.Address @@ -65,25 +64,18 @@ func (l *OrderCreateLogic) OrderCreate(in *order.AdminCreateOrderRequest) (*orde Address: address.Address, Addressee: address.Name, DistrictIds: address.DistrictIds, + DeliverType: dao.OrderDeliverTypeSend, } - ww := modelbase.Params{ - Eq: map[string]string{ - "type": strconv.Itoa(dao.OrderTypeStore), - "store_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen), - }, + if in.Type != dao.OrderDeliverTypeNotSend { + data.DeliverType = dao.OrderDeliverTypeNotSend + data.DeliverStatus = dao.SendStatusOver + data.SignTime = utils.Now() } - data.StoreId = int(adminInfo.ID) - data.StoreName = adminInfo.Name - data.SaleId = int(adminInfo.SaleId) - data.GroupId = int(adminInfo.GroupId) - data.SaleMobile = adminInfo.SaleMobile - data.SaleProvince = int(adminInfo.SaleProvince) + data.CreateType = dao.OrderTypeStore data.Type = dao.OrderTypeStore - data.OrderSn = svc.GetOrderSn(strconv.Itoa(dao.OrderTypeStore), adminInfo.ID) - - var cart dao.Cart + data.OrderSn = svc.GetOrderSn(strconv.Itoa(dao.OrderTypeStore), address.TargetId) ids, pErr := svc.GetCartInfo(in.Info) if pErr != utils.Ok { @@ -140,12 +132,6 @@ func (l *OrderCreateLogic) OrderCreate(in *order.AdminCreateOrderRequest) (*orde } } - _, err = model.CartModel{}.Init().Del(ww, &cart) - if err != nil { - mobileObj.Rollback() - return l.fail(utils.Fail) - } - cli, err := svc.GetRpcClient(l.svcCtx.ProductSvcName) if err != nil { mobileObj.Rollback() diff --git a/services/order/internal/logic/webCreateLogic.go b/services/order/internal/logic/webCreateLogic.go index 5a63666..fb2ea90 100644 --- a/services/order/internal/logic/webCreateLogic.go +++ b/services/order/internal/logic/webCreateLogic.go @@ -196,7 +196,6 @@ func (l *WebCreateLogic) WebCreate(in *order.CreateOrderRequest) (*order.Respons logx.Errorf("get products err: %v", err) return l.out(utils.Fail, "产品库存不足") } - mobileObj.Commit() return l.ok(utils.NumberOne) diff --git a/services/order/internal/logic/webCreateOneLogic.go b/services/order/internal/logic/webCreateOneLogic.go index e40ea47..e64f395 100644 --- a/services/order/internal/logic/webCreateOneLogic.go +++ b/services/order/internal/logic/webCreateOneLogic.go @@ -152,7 +152,6 @@ func (l *WebCreateOneLogic) WebCreateOne(in *order.CreateOrderOneRequest) (*orde return l.out(utils.Fail, productInfo.Name+"购买数量超出库存,目前可以够买:"+strconv.Itoa(int(in.Num))) } - mobileObj.Commit() return l.ok(utils.NumberOne) diff --git a/services/order/internal/svc/servicecontext.go b/services/order/internal/svc/servicecontext.go index ab2c079..505657a 100644 --- a/services/order/internal/svc/servicecontext.go +++ b/services/order/internal/svc/servicecontext.go @@ -74,26 +74,37 @@ func GetRpcClient(serviceName string) (zrpc.Client, error) { } type ServiceContext struct { - Config config.Config - DB *gorm.DB - Prefix string - + Config config.Config + DB *gorm.DB + Prefix string ProductSvcName string //服务名 + ExpressSvcName string + ChoreSvcName string } func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { //启动仅读取配置,不建立rpc连接 多个服务就多个 productSvc := utils.GetConfigString("services.product") + ExpressSvc := utils.GetConfigString("services.express") + ChoreSvc := utils.GetConfigString("services.chore") if productSvc == utils.StringEmpty { logx.Error("config services.product empty") } + if ExpressSvc == utils.StringEmpty { + logx.Error("config services.express empty") + } + if ChoreSvc == utils.StringEmpty { + logx.Error("config services.chore empty") + } svcCtx := &ServiceContext{ Config: c, DB: db, Prefix: utils.GetConfigString("mysql.prefix"), ProductSvcName: productSvc, + ExpressSvcName: ExpressSvc, + ChoreSvcName: ChoreSvc, } return svcCtx diff --git a/services/order/order.go b/services/order/order.go index 07b09b8..fb3e1b9 100644 --- a/services/order/order.go +++ b/services/order/order.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "lone-services/pkg/discovery" + "lone-services/pkg/logRedis" "lone-services/pkg/modelbase" "lone-services/pkg/mysql" "lone-services/pkg/redis" @@ -126,6 +127,16 @@ func main() { os.Exit(1) } + if err := logRedis.Init(logRedis.LogRedisConfig{ + Host: utils.GetConfigString("log-redis.host"), + Port: utils.GetConfigInt("log-redis.port"), + Password: utils.GetConfigString("log-redis.password"), + DB: utils.GetConfigInt("log-redis.db"), + }); err != nil { + logx.Errorf("log redis init: %v", err) + os.Exit(1) + } + debug := utils.GetConfigBool("mysql.debug") modelbase.Init(db, modelbase.Config{Prefix: utils.GetConfigString("mysql.prefix"), Debug: debug}) diff --git a/services/order/orderClient/order.go b/services/order/orderClient/order.go index 76def06..9f049a9 100644 --- a/services/order/orderClient/order.go +++ b/services/order/orderClient/order.go @@ -29,7 +29,6 @@ type ( OrderAuditingRequest = order.OrderAuditingRequest OrderItemsRequest = order.OrderItemsRequest Response = order.Response - StatusAddressRequest = order.StatusAddressRequest TypeRequest = order.TypeRequest Order interface { diff --git a/services/order/validator/order.go b/services/order/validator/order.go index 8b64974..5e3023e 100644 --- a/services/order/validator/order.go +++ b/services/order/validator/order.go @@ -34,6 +34,8 @@ type AdminOrderCreateValidator struct { AddressId int64 `validate:"required"` Info string `validate:"required"` Note string + Type int32 `validate:"required"` // 发货类型,1为需要发货,2为不需要发货 + } // GetMessage 修改状态 - 提示消息 @@ -41,6 +43,7 @@ func (p AdminOrderCreateValidator) GetMessage() validate.ValidatorMessages { return validate.ValidatorMessages{ "AddressId.required": "地址ID不能为空", "Info.required": "内容不能为空", + "Type.required": "类型不能为空", } }