material_manage_system/internal/repository/master_data.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
}