232 lines
10 KiB
Go
232 lines
10 KiB
Go
package common
|
|
|
|
import (
|
|
"encoding/json"
|
|
"encoding/xml"
|
|
"time"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/grpc/kafka_grpc"
|
|
)
|
|
|
|
type OrderUpdated struct {
|
|
XMLName xml.Name `xml:"VehicleOrderReplicate"`
|
|
Header HeaderArea `xml:"HeaderArea" validate:"required"`
|
|
VehicleOrder VehicleOrder `xml:"DataArea>VehicleOrder" validate:"required"`
|
|
}
|
|
|
|
type HeaderArea struct {
|
|
CreationDateTime CreationDateTime `xml:"CreationDateTime" json:"creation_date_time"`
|
|
MessageIdentifier string `xml:"MessageIdentifier" json:"message_identifier"`
|
|
InterfaceID int `xml:"InterfaceId" json:"interface_id"`
|
|
SourceSystem string `xml:"Sender>SourceSystem" json:"source_system"`
|
|
TargetSystem string `xml:"Sender>TargetSystem" json:"target_system"`
|
|
}
|
|
|
|
type VehicleOrder struct {
|
|
SpecID int `xml:"SpecId" json:"spec_id"`
|
|
OrderNumber int `xml:"VehicleOrderNumber" json:"order_number"`
|
|
MessageIdentifier string `xml:"-" json:"message_identifier"`
|
|
VehicleSpecification VehicleSpecification `xml:"VehicleSpecification" json:"vehicle_specification"`
|
|
}
|
|
|
|
type VehicleSpecification struct {
|
|
OrderIndicator string `xml:"OrderIndicator" json:"order_indicator"`
|
|
FleetOrderIndicator string `xml:"FleetOrderIndicator" json:"fleet_order_indicator"`
|
|
ProductionPhaseIndicator string `xml:"ProductionPhaseIndicator" json:"production_phase_indicator"`
|
|
VehicleIndicator string `xml:"VehicleIndicator" json:"vehicle_indicator"`
|
|
ManufacturingPlant string `xml:"ManufacturingPlant" json:"manufacturing_plant"`
|
|
ExpectedReferenceDate ExpectedReferenceDate `xml:"ExpectedReferenceDate" json:"expected_reference_date"`
|
|
ModelType string `xml:"ModelType" json:"model_type"`
|
|
ModelYearIndicator int `xml:"ModelYearIndicator" json:"model_year_indicator"`
|
|
ModelYear int `xml:"ModelYear" json:"model_year"`
|
|
SequenceNumber string `xml:"SequenceNumber" json:"sequence_number"`
|
|
VersionDuringModelYear int `xml:"VersionDuringModelYear" json:"version_during_model_year"`
|
|
VehicleModel string `xml:"VehicleModel" json:"vehicle_model"`
|
|
VinPrefix string `xml:"VinPrefix" json:"vin_prefix"`
|
|
VehicleFeatures []FeatureCodes `xml:"VehicleFeatures>FeatureCodes" json:"vehicle_features"`
|
|
DestinationCountry string `xml:"DestinationCountry" json:"destination_country"`
|
|
}
|
|
|
|
type FeatureCodes struct {
|
|
FamilyCode string `xml:"FamilyCode" json:"family_code"`
|
|
FeatureCode string `xml:"FeatureCode" json:"feature_code"`
|
|
}
|
|
|
|
type ExpectedReferenceDate struct {
|
|
time.Time
|
|
}
|
|
|
|
func (t *ExpectedReferenceDate) UnmarshalText(data []byte) error {
|
|
// Fractional seconds are handled implicitly by Parse.
|
|
var err error
|
|
t.Time, err = time.Parse("2006-01-02", string(data))
|
|
|
|
return err
|
|
}
|
|
|
|
func (t ExpectedReferenceDate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
|
|
s := t.Format("2006-01-02")
|
|
return e.EncodeElement(s, start)
|
|
}
|
|
|
|
type CreationDateTime struct {
|
|
time.Time
|
|
}
|
|
|
|
func (t *CreationDateTime) UnmarshalText(data []byte) error {
|
|
// Fractional seconds are handled implicitly by Parse.
|
|
var err error
|
|
t.Time, err = time.Parse("2006-01-02T15:04", string(data))
|
|
|
|
return err
|
|
}
|
|
|
|
func (t CreationDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
|
|
s := t.Format("2006-01-02T15:04")
|
|
return e.EncodeElement(s, start)
|
|
}
|
|
|
|
// OrderUpdatedSwag is used ONLY to represent OrderUpdated in swagger.
|
|
type OrderUpdatedSwag struct {
|
|
Header struct {
|
|
CreationDateTime CreationDateTime `json:"CreationDateTime" swaggertype:"string"`
|
|
MessageIdentifier string `json:"MessageIdentifier"`
|
|
InterfaceID int `json:"InterfaceId"`
|
|
Sender struct {
|
|
SourceSystem string `json:"SourceSystem"`
|
|
TargetSystem string `json:"TargetSystem"`
|
|
} `json:"Sender"`
|
|
} `json:"HeaderArea" validate:"required"`
|
|
DataArea struct {
|
|
VehicleOrder struct {
|
|
SpecID int `json:"SpecId"`
|
|
OrderNumber int `json:"VehicleOrderNumber"`
|
|
VehicleSpecification struct {
|
|
OrderIndicator string `json:"OrderIndicator"`
|
|
FleetOrderIndicator string `json:"FleetOrderIndicator"`
|
|
ProductionPhaseIndicator string `json:"ProductionPhaseIndicator"`
|
|
VehicleIndicator string `json:"VehicleIndicator"`
|
|
ManufacturingPlant string `json:"ManufacturingPlant"`
|
|
ExpectedReferenceDate ExpectedReferenceDate `json:"ExpectedReferenceDate" swaggertype:"string"`
|
|
ModelType string `json:"ModelType"`
|
|
ModelYearIndicator int `json:"ModelYearIndicator"`
|
|
SequenceNumber string `json:"SequenceNumber"`
|
|
VehicleModel string `json:"VehicleModel"`
|
|
VinPrefix string `json:"VinPrefix"`
|
|
VehicleFeatures []struct {
|
|
FeatureCodes struct {
|
|
FamilyCode string `json:"FamilyCode" `
|
|
FeatureCode string `json:"FeatureCode"`
|
|
} `json:"FeatureCodes"`
|
|
} `json:"VehicleFeatures"`
|
|
DestinationCountry string `json:"DestinationCountry"`
|
|
} `json:"VehicleSpecification"`
|
|
} `json:"VehicleOrder" validate:"required"`
|
|
} `json:"DataArea"`
|
|
} // @name VehicleOrderReplicate
|
|
|
|
func OrderToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload {
|
|
grpcPayload := &kafka_grpc.GRPC_AttendantPayload{
|
|
Handler: input.Handler,
|
|
}
|
|
var order VehicleOrder
|
|
err := json.Unmarshal(input.Data, &order)
|
|
if err != nil {
|
|
return grpcPayload
|
|
}
|
|
orderObj := &kafka_grpc.Order{
|
|
VehicleSpecification: &kafka_grpc.VehicleSpecification{},
|
|
}
|
|
orderObj.VehicleSpecification.Date = order.VehicleSpecification.ExpectedReferenceDate.UnixMilli()
|
|
orderObj.MsgIdentifier = order.MessageIdentifier
|
|
orderObj.SpecId = int64(order.SpecID)
|
|
orderObj.VehicleSpecification.OrderId = order.VehicleSpecification.OrderIndicator
|
|
orderObj.VehicleSpecification.FOrderId = order.VehicleSpecification.FleetOrderIndicator
|
|
orderObj.VehicleSpecification.MfPlant = order.VehicleSpecification.ManufacturingPlant
|
|
orderObj.VehicleSpecification.DestCon = order.VehicleSpecification.DestinationCountry
|
|
orderObj.VehicleSpecification.ModelType = order.VehicleSpecification.ModelType
|
|
orderObj.VehicleSpecification.ProductId = order.VehicleSpecification.ProductionPhaseIndicator
|
|
orderObj.VehicleSpecification.Sn = order.VehicleSpecification.SequenceNumber
|
|
orderObj.VehicleSpecification.VehicleId = order.VehicleSpecification.VehicleIndicator
|
|
orderObj.VehicleSpecification.Model = order.VehicleSpecification.VehicleModel
|
|
orderObj.VehicleSpecification.VinPre = order.VehicleSpecification.VinPrefix
|
|
orderObj.VehicleSpecification.ModelYear = int64(order.VehicleSpecification.ModelYear)
|
|
orderObj.VehicleSpecification.ModelId = int64(order.VehicleSpecification.ModelYearIndicator)
|
|
orderObj.VehicleSpecification.Version = int64(order.VehicleSpecification.VersionDuringModelYear)
|
|
|
|
if len(order.VehicleSpecification.VehicleFeatures) > 0 {
|
|
var features []*kafka_grpc.FeatureCodes
|
|
for _, feature := range order.VehicleSpecification.VehicleFeatures {
|
|
features = append(features, &kafka_grpc.FeatureCodes{
|
|
FamilyCode: feature.FamilyCode,
|
|
FeatureCode: feature.FeatureCode,
|
|
})
|
|
}
|
|
orderObj.VehicleSpecification.Feature = features
|
|
}
|
|
|
|
payload := &kafka_grpc.GRPC_AttendantPayload_Order{
|
|
Order: orderObj,
|
|
}
|
|
grpcPayload.Data = payload
|
|
return grpcPayload
|
|
}
|
|
|
|
func GRPCToOrder(payload *kafka_grpc.GRPC_AttendantPayload) *VehicleOrder {
|
|
if payload.Data == nil {
|
|
return nil
|
|
}
|
|
data := payload.Data.(*kafka_grpc.GRPC_AttendantPayload_Order)
|
|
order := &VehicleOrder{}
|
|
order.OrderNumber = int(data.Order.OrderNo)
|
|
order.MessageIdentifier = data.Order.MsgIdentifier
|
|
order.SpecID = int(data.Order.SpecId)
|
|
order.VehicleSpecification = VehicleSpecification{}
|
|
if data.Order.VehicleSpecification != nil {
|
|
order.VehicleSpecification.DestinationCountry = data.Order.VehicleSpecification.DestCon
|
|
order.VehicleSpecification.FleetOrderIndicator = data.Order.VehicleSpecification.FOrderId
|
|
order.VehicleSpecification.FleetOrderIndicator = data.Order.VehicleSpecification.FOrderId
|
|
|
|
order.VehicleSpecification.ManufacturingPlant = data.Order.VehicleSpecification.MfPlant
|
|
|
|
order.VehicleSpecification.ModelType = data.Order.VehicleSpecification.ModelType
|
|
|
|
order.VehicleSpecification.ModelYear = int(data.Order.VehicleSpecification.ModelYear)
|
|
|
|
order.VehicleSpecification.ModelYearIndicator = int(data.Order.VehicleSpecification.ModelId)
|
|
|
|
order.VehicleSpecification.OrderIndicator = data.Order.VehicleSpecification.OrderId
|
|
|
|
order.VehicleSpecification.ProductionPhaseIndicator = data.Order.VehicleSpecification.ProductId
|
|
|
|
order.VehicleSpecification.FleetOrderIndicator = data.Order.VehicleSpecification.FOrderId
|
|
|
|
order.VehicleSpecification.SequenceNumber = data.Order.VehicleSpecification.Sn
|
|
|
|
order.VehicleSpecification.VehicleIndicator = data.Order.VehicleSpecification.VehicleId
|
|
|
|
order.VehicleSpecification.VehicleModel = data.Order.VehicleSpecification.Model
|
|
|
|
order.VehicleSpecification.VinPrefix = data.Order.VehicleSpecification.VinPre
|
|
|
|
order.VehicleSpecification.VersionDuringModelYear = int(data.Order.VehicleSpecification.Version)
|
|
|
|
seconds := data.Order.VehicleSpecification.Date / 1000
|
|
nanoseconds := (data.Order.VehicleSpecification.Date % 1000) * int64(time.Millisecond)
|
|
order.VehicleSpecification.ExpectedReferenceDate = ExpectedReferenceDate{time.Unix(seconds, nanoseconds)}
|
|
|
|
if data.Order.VehicleSpecification.Feature != nil && len(data.Order.VehicleSpecification.Feature) > 0 {
|
|
var features []FeatureCodes
|
|
for _, feature := range data.Order.VehicleSpecification.Feature {
|
|
features = append(features, FeatureCodes{
|
|
FamilyCode: feature.FamilyCode,
|
|
FeatureCode: feature.FeatureCode,
|
|
})
|
|
}
|
|
order.VehicleSpecification.VehicleFeatures = features
|
|
}
|
|
}
|
|
|
|
return order
|
|
}
|