Files
bj_power/bj_power_mes/internal/logic/bom.go
T
SunYF 6ee131a4bd feat: 新增装机绑定功能与权限、BOM工序配置
1.  新增装机绑定实体与相关CRUD逻辑,支持工件工序物料绑定/解绑
2.  为BOM物料新增装配工序字段,支持按工序校验绑定
3.  扩展权限表,新增父权限码字段支持菜单按钮关联
4.  统一各页面帮助弹窗参数,新增角色管理帮助文档
5.  新增公共格式化工具函数,优化侧边栏菜单展开逻辑
6.  新增工位终端绑定代理接口与MES内部绑定API
7.  修复主入口数据库连接与schema初始化逻辑,新增一键迁移工具
2026-09-07 11:58:19 +08:00

74 lines
2.6 KiB
Go

package logic
import (
"context"
"fmt"
"bj_power_mes/ent"
"bj_power_mes/ent/bomitem"
)
type BomItemReq struct {
ProductCode string `json:"productCode"`
MaterialCode string `json:"materialCode"`
MaterialName string `json:"materialName"`
Spec string `json:"spec"`
Unit string `json:"unit"`
ManageMode string `json:"manageMode"`
ProcessCode *int `json:"processCode"` // 装配工序 1~12;nil=不修改(兼容旧调用/移除时保留);0=显式清除
UnitQty float64 `json:"unitQty"`
LossRate float64 `json:"lossRate"`
RequiredQty float64 `json:"requiredQty"`
SerialSns []string `json:"serialSns"`
}
// SaveBom 保存产品 BOM(覆盖式:按 产品编码+物料编码 做 upsert)
func (s *Service) SaveBom(ctx context.Context, productCode string, items []BomItemReq, operator string) error {
for _, it := range items {
if it.ManageMode == "" {
it.ManageMode = "2"
}
exist, err := s.ctx.EntClient.BomItem.Query().
Where(bomitem.ProductCode(productCode), bomitem.MaterialCode(it.MaterialCode)).First(ctx)
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)
if it.ProcessCode != nil {
u = u.SetProcessCode(*it.ProcessCode) // nil 时不覆盖既有工序配置
}
if len(it.SerialSns) > 0 {
u.SetSerialSns(it.SerialSns)
}
if _, err := u.Save(ctx); err != nil {
return fmt.Errorf("更新BOM物料 %s 失败: %w", it.MaterialCode, err)
}
} else {
pc := 0
if it.ProcessCode != nil {
pc = *it.ProcessCode
}
b := s.ctx.EntClient.BomItem.Create().
SetProductCode(productCode).SetMaterialCode(it.MaterialCode).
SetMaterialName(it.MaterialName).SetSpec(it.Spec).SetUnit(it.Unit).
SetManageMode(it.ManageMode).SetProcessCode(pc).
SetUnitQty(it.UnitQty).SetLossRate(it.LossRate)
if len(it.SerialSns) > 0 {
b.SetSerialSns(it.SerialSns)
}
if _, err := b.Save(ctx); err != nil {
return fmt.Errorf("保存BOM物料 %s 失败: %w", it.MaterialCode, err)
}
}
}
s.ctx.EventLog.Write(ctx, "bom.save", "", operator, "product_bom", productCode, "保存产品BOM", map[string]any{"count": len(items)})
return nil
}
func (s *Service) ListBom(ctx context.Context, productCode string) ([]*ent.BomItem, error) {
q := s.ctx.EntClient.BomItem.Query()
if productCode != "" {
q = q.Where(bomitem.ProductCode(productCode))
}
return q.Order(ent.Asc(bomitem.FieldID)).All(ctx)
}