inventory

package
v0.261016.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 16, 2026 License: CC0-1.0 Imports: 15 Imported by: 0

Documentation

Index

Constants

View Source
const RegexLevels = `([0-9]*[.,]?[0-9]+)\(([0-9]*[.,]?[0-9]+)\)`

Variables

This section is empty.

Functions

This section is empty.

Types

type CTXkey added in v0.250106.0

type CTXkey string

структура для контекста should not use built-in type string as key for value; define your own type to avoid collisions (SA1029)

type Ingredient added in v0.250104.0

type Ingredient struct {
	// name - название ингридиента ( иникальное значение)
	Name string `hcl:"name,label"`
	// min - минимальный остаток ( если остаток меньше минимума, то будет отказ в отгрузке.
	//       если минимум не указан то огружает в минус. может быть отрицательным числом)
	Min int `hcl:"min,optional"`
	// расход на единицу. какое количество ингридиента расходуется при отгрузке 1 единицы товара.
	SpendRate float32 `hcl:"spend_rate,optional"`
	// level - уровень (плотность) ингридиента
	// указыватеся как "x(y)"
	// x - метка на бункере, y - вес
	// пример: "0.5(200) 1(360) 2(680) 3.1(1020)"
	Level string `hcl:"level,optional"`
	// tuning_key - название кнопки коррекции отгрузки. подробне в описании кнопки коррекции
	//    кнопка коррекции. имеет название и значение по умолчанию (обычно 4) можно указать максимальное значение.
	//    единица значения равна 25%.
	//    например: базовое = 4 и это 100% если указать 2 то это 50%. если 8 то это 200%
	TuneKey string `hcl:"tuning_key,optional"`
	// cost - закупочная цена. нужна дял расчета себестоимости
	Cost float64 `hcl:"cost,optional"`
	// contains filtered or unexported fields
}

if the minimum ingredient is not specified (equal to zero), then the consumption check is disabled если минимум ингридиента не указан (равен нулю), тогда проверка расхода выключена

type Inventory

type Inventory struct {
	ReportInv int

	// Файл для хранения инвентаря. В нем хранится количество каждого склада в виде int32 (для возможности сохранения в CMOS). Код склада соответствует позиции в файле.
	// Example: если у вас 3 склада, то в файле будет 12 байт. Первые 4 байта - количество первого склада, следующие 4 байта - количество второго склада, и т.д.
	File string `hcl:"stock_file,optional"`
	// список бункеров. название склада и код одинаковые.
	// название ингридиента. должно соответствовать названию в блоке ингридиентов. нужно для связи склада и ингридиента. пока движок не переделан - это уникальное значение
	Stocks []Stock `hcl:"stock,block"`

	// список ингридиентов. название ингридиента должно быть уникальным. нужно для связи склада и ингридиента. пока движок не переделан - это уникальное значение
	Ingredient     []Ingredient `hcl:"ingredient,block"`
	XXX_Stocks     map[string]Stock
	XXX_Ingredient map[string]Ingredient
	// contains filtered or unexported fields
}

Inventory - main struct for inventory system. Contains stocks and ingredients. Also contains methods for loading and saving inventory, and for getting stock and ingredient by name.

func (*Inventory) FillAll added in v0.260830.0

func (inv *Inventory) FillAll(v float32)

FillAll sets every stock's value to v. Used for menu scenario validation (see state.CheckMenuExecution) and in tests to bring stocks to a known level before exercising add.*/spend actions.

func (*Inventory) GetIngredientByName added in v0.250104.0

func (inv *Inventory) GetIngredientByName(ingredientName string) (*Ingredient, bool)

func (*Inventory) GetStockByingredientName added in v0.250106.0

func (inv *Inventory) GetStockByingredientName(name string) (*Stock, bool)

func (*Inventory) Init

func (inv *Inventory) Init(ctx context.Context, e *engine.Engine, log *log2.Log) (errs error)

func (*Inventory) InventoryLoad added in v0.220611.0

func (inv *Inventory) InventoryLoad()

store file инвентарь храниться как int32 ( для возможности сохраннения в CMOS) код соответствует позиции в файле

func (*Inventory) InventorySave added in v0.220611.0

func (inv *Inventory) InventorySave() error

InventorySave сохраняет остатки всех складов в файл атомарно.

Атомарность нужна из-за работы на Orange Pi с SD-картой: обычная запись через O_TRUNC оставляет файл пустым/обрезанным, если питание пропадет в момент записи. Поэтому данные пишутся во временный файл рядом с целевым, сбрасываются на диск (fsync), затем временный файл переименовывается поверх целевого (rename атомарен в пределах одной файловой системы), и синхронизируется уже каталог. После этого старый файл не может оказаться "полусостоянием".

Также исправлена ошибка порядка defer: Close вызывается только при успешно открытом файле, иначе было бы обращение к nil (panic).

func (*Inventory) Iter

func (inv *Inventory) Iter(fun func(s *Stock))

Iter вызывает fun для каждого склада.

ВАЖНО: fun вызывается БЕЗ удержания inv.mu. Если fun обращается к методам Inventory (GetStockByingredientName, Tele, FillAll...), это безопасно; если бы мы держали inv.mu, такой повторный вход привел бы к самоблокировке. Сами поля Stocks[] во время итерации не изменяются (Init выполняется до старта горут).

func (*Inventory) Tele

func (inv *Inventory) Tele() *tele_api.Inventory

func (*Inventory) WithTuning

func (inv *Inventory) WithTuning(ctx context.Context, ingredientName string, adj float32) (context.Context, error)

type Pool added in v0.261016.0

type Pool struct {
	Ingredient *Ingredient
	Stocks     []*Stock
	Doers      []engine.Doer // Doers[i] - register_add склада Stocks[i]; nil, если сценария нет
	// contains filtered or unexported fields
}

Pool - все бункеры одного ингредиента. Команда add.<ingredient>(?) регистрируется на пул. Stocks отсортированы по Code; позиция в срезе - номер бункера в пуле (с 0).

func (*Pool) Doer added in v0.261016.0

func (p *Pool) Doer() engine.Doer

Doer возвращает команду add.<ingredient>(?) по пулу.

type Stock

type Stock struct {
	Log       *log2.Log
	ErrorSend bool
	Label     string `hcl:",label"`
	Code      int    `hcl:"code,optional"`
	// название ингридиента. должно соответствовать названию в блоке ингридиентов. нужно для связи склада и ингридиента. пока движок не переделан - это уникальное значение
	XXX_Ingredient string `hcl:"ingredient"`
	// дейсвия при отгрузке. создается команда: название_ингридиента.run(?) которая выполняет эти действия.
	RegisterAdd string `hcl:"register_add,optional"`
	Ingredient  *Ingredient
	// State - защищаемое состояние склада (остаток). Указатель, потому что
	// Stock копируется по значению на этапе конфигурации; саму структуру с
	// мьютексом копировать нельзя (go vet copylocks). Инициализируется в
	// Inventory.prepareInventory перед попаданием склада в рабочий массив.
	State *StockState
}

func (*Stock) Free added in v0.261016.0

func (s *Stock) Free() float32

Free - сколько ингредиента можно списать, не опустив остаток ниже Min.

func (*Stock) GetSpendRate added in v0.240430.0

func (s *Stock) GetSpendRate() float32

func (*Stock) Has

func (s *Stock) Has(v float32) bool

func (*Stock) Set

func (s *Stock) Set(v float32)

func (*Stock) SetLevel added in v0.230101.1

func (s *Stock) SetLevel(level int)

func (*Stock) ShowLevel added in v0.230101.1

func (s *Stock) ShowLevel() string

func (*Stock) SpendValue added in v0.240430.0

func (s *Stock) SpendValue(value byte)

func (*Stock) String

func (s *Stock) String() string

func (*Stock) TranslateSpend

func (s *Stock) TranslateSpend(arg engine.Arg) float32

func (*Stock) Unlimited added in v0.261016.0

func (s *Stock) Unlimited() bool

Unlimited - без ограничения остатка (min == 0).

func (*Stock) Value

func (s *Stock) Value() float32

func (*Stock) Wrap

func (s *Stock) Wrap(d engine.Doer) *custom

type StockState added in v0.261016.0

type StockState struct {
	// contains filtered or unexported fields
}

StockState - защищаемое состояние склада (остаток). Вынесено в отдельную структуру с указателем, потому что Stock копируется по значению при конфигурации (HCL-декодирование, XXX_Stocks, append в Stocks): sync.Mutex/atomic внутри копируемой структуры нарушил бы синхронизацию (go vet copylocks).

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL