diff --git a/go.mod b/go.mod index 587cc98..a2089a0 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module shtrih-kkt -go 1.23.4 +go 1.17 require ( github.com/go-ole/go-ole v1.3.0 diff --git a/go.sum b/go.sum index b51f1cd..fbf919a 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,17 @@ github.com/creack/goselect v0.1.2 h1:2DNy14+JPjRBgPzAd1thbQp4BSIihxcBf0IXhQXDRa0= github.com/creack/goselect v0.1.2/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= go.bug.st/serial v1.6.4 h1:7FmqNPgVp3pu2Jz5PoPtbZ9jJO5gnEnZIvnI1lzve8A= @@ -13,7 +19,9 @@ go.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index eccef3e..39eb830 100644 --- a/main.go +++ b/main.go @@ -117,6 +117,9 @@ func loadServiceConfig() *ServiceConfig { } func setupLogger(config *ServiceConfig) { + // setupLogger настраивает систему логирования на основе конфигурации. + // Если конфигурация не передана или повреждена, логирование продолжается в консоль. + // Создает директорию для логов и настраивает ротацию с использованием lumberjack. if config == nil { log.Printf("Предупреждение: файл настроек '%s' не найден или некорректен. Логирование продолжится в консоль.", serviceConfigName) return @@ -147,7 +150,9 @@ func setupLogger(config *ServiceConfig) { } func runConfigMode(data []byte) { - // setupLogger() // <--- УДАЛИТЕ ЭТУ СТРОКУ + // runConfigMode запускает приложение в стационарном режиме с использованием + // конфигурации из файла connect.json. Парсит настройки устройств и запускает + // процесс опроса ККТ. При ошибках парсинга переключается на режим автопоиска. var configFile ConfigFile if err := json.Unmarshal(data, &configFile); err != nil { @@ -182,6 +187,9 @@ func runConfigMode(data []byte) { } func runDiscoveryMode() { + // runDiscoveryMode запускает приложение в режиме автопоиска устройств. + // Выполняет сканирование COM-портов и TCP-сетей для обнаружения ККТ Штрих-М. + // При обнаружении устройств сохраняет их конфигурацию для последующих запусков. configs, err := shtrih.SearchDevices(comSearchTimeout, tcpSearchTimeout) if err != nil { log.Printf("Во время поиска устройств произошла ошибка: %v", err) @@ -476,6 +484,9 @@ func saveEmptyShtrihConfig() { } func saveConfiguration(polledDevices []PolledDevice) { + // saveConfiguration сохраняет конфигурацию найденных устройств в файл connect.json. + // Функция работает неразрушающим образом, сохраняя все остальные секции файла. + // Преобразует внутренние структуры shtrih.Config в формат ConnectionSettings для JSON. log.Printf("Сохранение %d найденных конфигураций в файл '%s'...", len(polledDevices), configFileName) // Используем map[string]interface{} для неразрушающего редактирования JSON. @@ -519,6 +530,9 @@ func saveConfiguration(polledDevices []PolledDevice) { // --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ --- func convertSettingsToConfigs(settings []ConnectionSettings) []shtrih.Config { + // convertSettingsToConfigs преобразует настройки подключения из JSON-формата + // в внутренние структуры shtrih.Config. Выполняет валидацию параметров + // и пропускает некорректные конфигурации с соответствующим логированием. var configs []shtrih.Config baudRateMap := map[string]int32{ "115200": 6, "57600": 5, "38400": 4, "19200": 3, "9600": 2, "4800": 1, diff --git a/pkg/shtrih/driver.go b/pkg/shtrih/driver.go index 36752cb..53c9b15 100644 --- a/pkg/shtrih/driver.go +++ b/pkg/shtrih/driver.go @@ -41,6 +41,7 @@ type FiscalInfo struct { SerialNumber string `json:"serialNumber"` // Заводской номер ККТ RNM string `json:"RNM"` // Регистрационный номер машины (РНМ) OrganizationName string `json:"organizationName"` // Наименование организации пользователя + Address string `json:"address"` // Адрес установки ККТ Inn string `json:"INN"` // ИНН пользователя FnSerial string `json:"fn_serial"` // Серийный номер фискального накопителя RegistrationDate string `json:"datetime_reg"` // Дата и время регистрации ККТ @@ -299,6 +300,10 @@ func (d *comDriver) getInfoFromTables(info *FiscalInfo) error { if err == nil { info.OfdName = strings.TrimSpace(ofdName) } + address, err := d.readTableField(18, 1, 9) + if err == nil { + info.Address = strings.TrimSpace(address) + } // Версия ФФД хранится в виде кода: 2 - "1.05", 4 - "1.2" ffdValueStr, err := d.readTableField(17, 1, 17)