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