wip
This commit is contained in:
parent
135e0326f7
commit
da7777c78b
31
cmd/labeler.go
Normal file
31
cmd/labeler.go
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
Copyright © 2024 NAME HERE <EMAIL ADDRESS>
|
||||
*/
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"git.espin.casa/albert/cml04-falcon-system/labeler/app"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// labelerCmd represents the labeler command
|
||||
var labelerCmd = &cobra.Command{
|
||||
Use: "labeler",
|
||||
Short: "Label service",
|
||||
Long: "Label servicce",
|
||||
Run: app.Run,
|
||||
}
|
||||
|
||||
func init() {
|
||||
rootCmd.AddCommand(labelerCmd)
|
||||
|
||||
// Here you will define your flags and configuration settings.
|
||||
|
||||
// Cobra supports Persistent Flags which will work for this command
|
||||
// and all subcommands, e.g.:
|
||||
// labelerCmd.PersistentFlags().String("foo", "", "A help for foo")
|
||||
|
||||
// Cobra supports local flags which will only run when this command
|
||||
// is called directly, e.g.:
|
||||
// labelerCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
|
||||
}
|
36
internal/types/label.go
Normal file
36
internal/types/label.go
Normal file
@ -0,0 +1,36 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Label struct {
|
||||
ID string `gorm:"primaryKey"`
|
||||
DateTime string
|
||||
L2PackageId int16
|
||||
L3PackageId string
|
||||
ProductionOrderNo int32
|
||||
CustomerOrderNo int32
|
||||
CustomerName string
|
||||
LogoCode string
|
||||
SteelGrade string
|
||||
MaterialCode string
|
||||
HeatId string
|
||||
SectionType string
|
||||
PackageDimenA float32
|
||||
PackageDimenB float32
|
||||
PackageDimenC float32
|
||||
PackageWeight float32
|
||||
SectionDimenA float32
|
||||
SectionDimenB float32
|
||||
SectionDimenC float32
|
||||
NumberSections int32
|
||||
NumberLayers int32
|
||||
NumberSectionsInLayer int32
|
||||
FreeTxtLp string
|
||||
CreatedAt time.Time `gorm:"->;<-:create" json:"createdat,omitempty"`
|
||||
UpdatedAt time.Time `json:"updated_at,omitempty"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index"`
|
||||
}
|
71
labeler/app/app.go
Normal file
71
labeler/app/app.go
Normal file
@ -0,0 +1,71 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"git.espin.casa/albert/cml04-falcon-system/labeler/service"
|
||||
"git.espin.casa/albert/logger"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func Run(cmd *cobra.Command, args []string) {
|
||||
// read flags
|
||||
logLevel, _ := cmd.Flags().GetString("log-level")
|
||||
userName, _ := cmd.Flags().GetString("db-username")
|
||||
userPass, _ := cmd.Flags().GetString("db-password")
|
||||
dbHost, _ := cmd.Flags().GetString("db-host")
|
||||
dbPort, _ := cmd.Flags().GetInt("db-port")
|
||||
dbName, _ := cmd.Flags().GetString("db-name")
|
||||
natsHost, _ := cmd.Flags().GetString("nats-host")
|
||||
natsPort, _ := cmd.Flags().GetInt("nats-port")
|
||||
// setup logger
|
||||
log := logger.New(os.Stdout, logLevel)
|
||||
// log fields
|
||||
logFields := logger.LogFields{
|
||||
"nats_host": natsHost,
|
||||
"nats_port": natsPort,
|
||||
"log_level": logLevel,
|
||||
}
|
||||
// create service
|
||||
svc, err := service.New(&service.DBConfig{
|
||||
Username: userName,
|
||||
Password: userPass,
|
||||
Host: dbHost,
|
||||
Port: dbPort,
|
||||
Name: dbName,
|
||||
}, &service.NATSconfig{
|
||||
Host: natsHost,
|
||||
Port: natsPort,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error("create service failed", err, logFields)
|
||||
return
|
||||
}
|
||||
// info banner
|
||||
log.Info("started cml04-falcon-labeler service", logFields)
|
||||
// wait signal to finish
|
||||
signal := WaitSignal()
|
||||
log.Info("signal received", logFields.Add(logger.LogFields{
|
||||
"signal": signal,
|
||||
}))
|
||||
}
|
||||
|
||||
// WaitSignal catching exit signal
|
||||
func WaitSignal() os.Signal {
|
||||
ch := make(chan os.Signal, 2)
|
||||
signal.Notify(
|
||||
ch,
|
||||
syscall.SIGINT,
|
||||
syscall.SIGQUIT,
|
||||
syscall.SIGTERM,
|
||||
)
|
||||
for {
|
||||
sig := <-ch
|
||||
switch sig {
|
||||
case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM:
|
||||
return sig
|
||||
}
|
||||
}
|
||||
}
|
56
labeler/server/server.go
Normal file
56
labeler/server/server.go
Normal file
@ -0,0 +1,56 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"io"
|
||||
|
||||
"git.espin.casa/albert/cml04-falcon-system/labeler/service"
|
||||
)
|
||||
|
||||
type Header struct {
|
||||
MessageLenght int16
|
||||
TelegramID int16
|
||||
SequenceCounter int16
|
||||
Flags int16
|
||||
TimeStamp [8]int16
|
||||
}
|
||||
|
||||
type LabelData struct {
|
||||
Header Header
|
||||
DateTime [23]byte
|
||||
L2PackageId int16
|
||||
L3PackageId [6]byte
|
||||
ProductionOrderNo int32
|
||||
CustomerOrderNo int32
|
||||
CustomerName [30]byte
|
||||
LogoCode [3]byte
|
||||
SteelGrade [15]byte
|
||||
MaterialCode [18]byte
|
||||
HeatId [10]byte
|
||||
SectionType [20]byte
|
||||
PackageDimensions [3]float32
|
||||
PackageWeight float32
|
||||
SectionDimensions [3]float32
|
||||
NumberSections int32
|
||||
NumberLayers int32
|
||||
NumberSectionsInLayer int32
|
||||
FreeTxtLp [180]byte
|
||||
}
|
||||
|
||||
func (l *LabelData) FillTelegram(reader io.Reader) error {
|
||||
if err := binary.Read(reader, binary.LittleEndian, &l); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Server struct{}
|
||||
|
||||
func (s *Server) Start() error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func New(svc service.Service) *Server {
|
||||
return &Server{}
|
||||
}
|
112
labeler/service/service.go
Normal file
112
labeler/service/service.go
Normal file
@ -0,0 +1,112 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.espin.casa/albert/cml04-falcon-system/internal/types"
|
||||
"github.com/nats-io/nats.go"
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const TimeOut time.Duration = time.Second * 2
|
||||
|
||||
type DBConfig struct {
|
||||
Username string
|
||||
Password string
|
||||
Host string
|
||||
Port int
|
||||
Name string
|
||||
}
|
||||
|
||||
type NATSconfig struct {
|
||||
Host string
|
||||
Port int
|
||||
}
|
||||
|
||||
func Nats(conf *NATSconfig) (*nats.Conn, error) {
|
||||
// NATS connect
|
||||
nc, err := nats.Connect(fmt.Sprintf("nats://%s:%d", conf.Host, conf.Port))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return nc, nil
|
||||
}
|
||||
|
||||
func DataBase(conf *DBConfig) (*gorm.DB, error) {
|
||||
// create dsn string
|
||||
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Europe/Madrid",
|
||||
conf.Host,
|
||||
conf.Username,
|
||||
conf.Password,
|
||||
conf.Name,
|
||||
conf.Port,
|
||||
)
|
||||
// create open database connection
|
||||
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return db, nil
|
||||
}
|
||||
|
||||
type Service interface {
|
||||
Close(ctx context.Context) error
|
||||
StoreLabelData(ctx context.Context, data *types.Label) error
|
||||
PublishNewLabelData(ctx context.Context, id string) error
|
||||
}
|
||||
|
||||
type service struct {
|
||||
db *gorm.DB
|
||||
nc *nats.Conn
|
||||
}
|
||||
|
||||
// Close implements Service.
|
||||
func (s *service) Close(ctx context.Context) error {
|
||||
if err := s.nc.Flush(); err != nil {
|
||||
return err
|
||||
}
|
||||
s.nc.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
// PublishNewLabelData implements Service.
|
||||
func (s *service) PublishNewLabelData(ctx context.Context, id string) error {
|
||||
_, err := s.nc.Request("new.label.data", []byte(id), TimeOut)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// StoreLabelData implements Service.
|
||||
func (s *service) StoreLabelData(ctx context.Context, data *types.Label) error {
|
||||
return s.db.WithContext(ctx).Save(data).Error
|
||||
}
|
||||
|
||||
func AutoMigrate(db *gorm.DB) error {
|
||||
return db.AutoMigrate(&types.Label{})
|
||||
}
|
||||
|
||||
func New(dbConf *DBConfig, natsConf *NATSconfig) (Service, error) {
|
||||
// create data base
|
||||
db, err := DataBase(dbConf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// auto migrate
|
||||
if err := AutoMigrate(db); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// create nc connection
|
||||
nc, err := Nats(natsConf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &service{
|
||||
db: db,
|
||||
nc: nc,
|
||||
}, nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user