124 lines
5.2 KiB
Go
124 lines
5.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"github.com/wmms/wmms/internal/model"
|
|
"github.com/wmms/wmms/pkg/database"
|
|
)
|
|
|
|
type MasterDataRepository struct{}
|
|
|
|
func NewMasterDataRepository() *MasterDataRepository { return &MasterDataRepository{} }
|
|
|
|
func (r *MasterDataRepository) ListCategories(organizationID int64) ([]model.MaterialCategory, error) {
|
|
rows, err := database.DB.Query(`SELECT id, organization_id, code, name, description, parent_id, status FROM material_categories WHERE organization_id = ? ORDER BY code`, organizationID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := make([]model.MaterialCategory, 0)
|
|
for rows.Next() {
|
|
var item model.MaterialCategory
|
|
if err := rows.Scan(&item.ID, &item.OrganizationID, &item.Code, &item.Name, &item.Description, &item.ParentID, &item.Status); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, item)
|
|
}
|
|
return items, rows.Err()
|
|
}
|
|
|
|
func (r *MasterDataRepository) CreateCategory(item *model.MaterialCategory) error {
|
|
result, err := database.DB.Exec(`INSERT INTO material_categories (organization_id, code, name, description, parent_id, status) VALUES (?, ?, ?, ?, ?, ?)`, item.OrganizationID, item.Code, item.Name, item.Description, item.ParentID, item.Status)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
item.ID, err = result.LastInsertId()
|
|
return err
|
|
}
|
|
|
|
func (r *MasterDataRepository) UpdateCategory(item *model.MaterialCategory) error {
|
|
_, err := database.DB.Exec(`UPDATE material_categories SET name = ?, description = ?, parent_id = ?, status = ? WHERE id = ? AND organization_id = ?`, item.Name, item.Description, item.ParentID, item.Status, item.ID, item.OrganizationID)
|
|
return err
|
|
}
|
|
|
|
func (r *MasterDataRepository) ListUnits(organizationID int64) ([]model.Unit, error) {
|
|
rows, err := database.DB.Query(`SELECT id, organization_id, code, name, precision_scale, status FROM units WHERE organization_id = ? ORDER BY code`, organizationID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := make([]model.Unit, 0)
|
|
for rows.Next() {
|
|
var item model.Unit
|
|
if err := rows.Scan(&item.ID, &item.OrganizationID, &item.Code, &item.Name, &item.PrecisionScale, &item.Status); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, item)
|
|
}
|
|
return items, rows.Err()
|
|
}
|
|
|
|
func (r *MasterDataRepository) CreateUnit(item *model.Unit) error {
|
|
result, err := database.DB.Exec(`INSERT INTO units (organization_id, code, name, precision_scale, status) VALUES (?, ?, ?, ?, ?)`, item.OrganizationID, item.Code, item.Name, item.PrecisionScale, item.Status)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
item.ID, err = result.LastInsertId()
|
|
return err
|
|
}
|
|
|
|
func (r *MasterDataRepository) UpdateUnit(item *model.Unit) error {
|
|
_, err := database.DB.Exec(`UPDATE units SET name = ?, precision_scale = ?, status = ? WHERE id = ? AND organization_id = ?`, item.Name, item.PrecisionScale, item.Status, item.ID, item.OrganizationID)
|
|
return err
|
|
}
|
|
|
|
func (r *MasterDataRepository) ListCodeRules(organizationID int64) ([]model.CodeRule, error) {
|
|
rows, err := database.DB.Query(`SELECT cr.id, cr.organization_id, cr.category_id, c.code, c.name, cr.prefix, cr.sequence_length, cr.next_sequence, cr.status
|
|
FROM code_rules cr JOIN material_categories c ON c.id = cr.category_id
|
|
WHERE cr.organization_id = ? ORDER BY c.code`, organizationID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := make([]model.CodeRule, 0)
|
|
for rows.Next() {
|
|
var item model.CodeRule
|
|
if err := rows.Scan(&item.ID, &item.OrganizationID, &item.CategoryID, &item.CategoryCode, &item.CategoryName, &item.Prefix, &item.SequenceLength, &item.NextSequence, &item.Status); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, item)
|
|
}
|
|
return items, rows.Err()
|
|
}
|
|
|
|
func (r *MasterDataRepository) CreateCodeRule(item *model.CodeRule) error {
|
|
result, err := database.DB.Exec(`INSERT INTO code_rules (organization_id, category_id, prefix, sequence_length, next_sequence, status) VALUES (?, ?, ?, ?, ?, ?)`, item.OrganizationID, item.CategoryID, item.Prefix, item.SequenceLength, item.NextSequence, item.Status)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
item.ID, err = result.LastInsertId()
|
|
return err
|
|
}
|
|
|
|
func (r *MasterDataRepository) UpdateCodeRule(item *model.CodeRule) error {
|
|
_, err := database.DB.Exec(`UPDATE code_rules SET prefix = ?, sequence_length = ?, next_sequence = ?, status = ? WHERE id = ? AND organization_id = ?`, item.Prefix, item.SequenceLength, item.NextSequence, item.Status, item.ID, item.OrganizationID)
|
|
return err
|
|
}
|
|
|
|
// FindActiveCodeRule 取小类当前启用的编码规则,没有规则时返回 (nil, nil)。
|
|
// 只读,不加锁:占号发生在创建物料的事务里。
|
|
func (r *MasterDataRepository) FindActiveCodeRule(organizationID, categoryID int64) (*model.CodeRule, error) {
|
|
query := `SELECT id, organization_id, category_id, prefix, sequence_length, next_sequence, status FROM code_rules WHERE organization_id = ? AND category_id = ? AND status = 'active'`
|
|
rule := &model.CodeRule{}
|
|
err := database.DB.QueryRow(query, organizationID, categoryID).Scan(&rule.ID, &rule.OrganizationID,
|
|
&rule.CategoryID, &rule.Prefix, &rule.SequenceLength, &rule.NextSequence, &rule.Status)
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return rule, nil
|
|
}
|