Files
bj_power/bj_power_mes/internal/logic/bom.go
T

62 lines
2.1 KiB
Go
Raw Normal View History

2026-08-28 15:06:01 +08:00
package logic
import (
"context"
"bj_power_mes/ent"
"bj_power_mes/ent/bomitem"
)
type BomItemReq struct {
2026-08-29 15:30:25 +08:00
ProductCode string `json:"productCode"`
MaterialCode string `json:"materialCode"`
MaterialName string `json:"materialName"`
Spec string `json:"spec"`
Unit string `json:"unit"`
ManageMode string `json:"manageMode"`
2026-08-28 15:06:01 +08:00
UnitQty float64 `json:"unitQty"`
LossRate float64 `json:"lossRate"`
RequiredQty float64 `json:"requiredQty"`
SerialSns []string `json:"serialSns"`
}
2026-08-29 15:30:25 +08:00
// SaveBom 保存产品 BOM(覆盖式:按 产品编码+物料编码 做 upsert)
func (s *Service) SaveBom(ctx context.Context, productCode string, items []BomItemReq, operator string) error {
2026-08-28 15:06:01 +08:00
for _, it := range items {
if it.ManageMode == "" {
it.ManageMode = "2"
}
exist, err := s.ctx.EntClient.BomItem.Query().
2026-08-29 15:30:25 +08:00
Where(bomitem.ProductCode(productCode), bomitem.MaterialCode(it.MaterialCode)).First(ctx)
2026-08-28 15:06:01 +08:00
if err == nil && exist != nil {
u := s.ctx.EntClient.BomItem.UpdateOneID(exist.ID).
SetMaterialName(it.MaterialName).SetSpec(it.Spec).SetUnit(it.Unit).
SetManageMode(it.ManageMode).SetUnitQty(it.UnitQty).SetLossRate(it.LossRate).
SetRequiredQty(it.RequiredQty)
if len(it.SerialSns) > 0 {
u.SetSerialSns(it.SerialSns)
}
_ = u.Exec(ctx)
} else {
b := s.ctx.EntClient.BomItem.Create().
2026-08-29 15:30:25 +08:00
SetProductCode(productCode).SetMaterialCode(it.MaterialCode).
2026-08-28 15:06:01 +08:00
SetMaterialName(it.MaterialName).SetSpec(it.Spec).SetUnit(it.Unit).
SetManageMode(it.ManageMode).SetUnitQty(it.UnitQty).SetLossRate(it.LossRate).
SetRequiredQty(it.RequiredQty)
if len(it.SerialSns) > 0 {
b.SetSerialSns(it.SerialSns)
}
_ = b.Exec(ctx)
}
}
2026-08-29 15:30:25 +08:00
s.ctx.EventLog.Write(ctx, "bom.save", "", operator, "product_bom", productCode, "保存产品BOM", map[string]any{"count": len(items)})
2026-08-28 15:06:01 +08:00
return nil
}
2026-08-29 15:30:25 +08:00
func (s *Service) ListBom(ctx context.Context, productCode string) ([]*ent.BomItem, error) {
2026-08-28 15:06:01 +08:00
q := s.ctx.EntClient.BomItem.Query()
2026-08-29 15:30:25 +08:00
if productCode != "" {
q = q.Where(bomitem.ProductCode(productCode))
2026-08-28 15:06:01 +08:00
}
return q.Order(ent.Asc(bomitem.FieldID)).All(ctx)
}