|
package service
|
|
|
|
import (
|
|
"leit.com/leit_seat_aps/db"
|
|
"strconv"
|
|
)
|
|
|
|
// 零件业务对象
|
|
type BL_Part struct {
|
|
Partid string // 零件号
|
|
Projnr string // 项目号
|
|
AtcodDict map[int]BL_PartAttribute
|
|
Parttab db.Me_part // 零件元数据对象
|
|
}
|
|
|
|
// 零件属性业务对象
|
|
type BL_PartAttribute struct {
|
|
Partid string // 零件号
|
|
Projnr string // 项目号
|
|
Attrcode int // 属性ID
|
|
Attrvalue string // 属性值
|
|
Partattrtab db.Me_part_atcodlst // 零件元数据对象
|
|
}
|
|
|
|
// 共用件分配规则
|
|
type BL_PartAssignRule struct {
|
|
Partid string
|
|
Partfamilyid string
|
|
Ruleid string
|
|
Qty int // 待分配数量
|
|
Partruletab db.Me_partrule
|
|
Assignnruledict map[string]db.Me_partrule_qtyassign // 零件数量分配字典,Key = Supplygroupid
|
|
}
|
|
|
|
// 获取零件列表
|
|
func GetParttabList() (partlist []db.Me_part, err error) {
|
|
if err = db.G_DbEngine.Where("finr = ?", db.G_FINR).Find(&partlist); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取零件列表
|
|
func GetPartAtcodtabList() (partatcodlist []db.Me_part_atcodlst, err error) {
|
|
if err = db.G_DbEngine.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? and me_part_atcodver.version = ?", db.G_FINR, 1).Find(&partatcodlist); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取项目的零件列表
|
|
func GetProjectParttabList(projnr string) (partlist []db.Me_part, err error) {
|
|
if err = db.G_DbEngine.Where("finr = ? AND projnr = ?", db.G_FINR, projnr).Find(&partlist); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取项目的零件列表
|
|
func GetProjectPartAtcodtabList(projnr string) (partatcodlist []db.Me_part_atcodlst, err error) {
|
|
if err = db.G_DbEngine.Table("me_part_atcodlst").Join("left", "me_part_atcodver", "me_part_atcodlst.finr = me_part_atcodver.finr and me_part_atcodlst.version = me_part_atcodver.version").Where("me_part_atcodlst.finr = ? AND me_part_atcodlst.projnr = ? and me_part_atcodver.version = ?", db.G_FINR, projnr, 1).Find(&partatcodlist); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取项目的零件分配规则列表
|
|
func GetProjectPartRuletabList(projnr string) (partrulelist []db.Me_partrule, err error) {
|
|
if err = db.G_DbEngine.Where("finr = ? AND projnr = ?", db.G_FINR, projnr).Find(&partrulelist); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取项目零件的分配规则明细数据
|
|
func GetProjectPartRuleDatatabList(partid, projnr, ruleid string) (partruledatalist []db.Me_partrule_qtyassign, err error) {
|
|
if err = db.G_DbEngine.Where("finr = ? AND partid = ? AND projnr = ? AND ruleid = ?", 100, partid, projnr, ruleid).Asc("pos").Find(&partruledatalist); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取指定项目的零件主数据字典,包括零件分配的属性
|
|
func GetProjectPartListDict(projnr string) (partDict map[string]BL_Part, err error) {
|
|
var (
|
|
ptlst []db.Me_part
|
|
ptatlst []db.Me_part_atcodlst
|
|
bl_pt BL_Part
|
|
bl_partattr BL_PartAttribute
|
|
i int
|
|
ok bool
|
|
)
|
|
partDict = make(map[string]BL_Part)
|
|
if ptlst, err = GetProjectParttabList(projnr); err != nil {
|
|
return
|
|
}
|
|
if ptatlst, err = GetProjectPartAtcodtabList(projnr); err != nil {
|
|
return
|
|
}
|
|
//fmt.Println("Read ",len(ptlst)," parts with ",len(ptatlst)," attributes!")
|
|
// 遍历零件列表并写入零件字典
|
|
for i = 0; i < len(ptlst); i++ {
|
|
ptlst[i].Clipped()
|
|
bl_pt = BL_Part{}
|
|
bl_pt.Partid = ptlst[i].Partid
|
|
bl_pt.AtcodDict = make(map[int]BL_PartAttribute)
|
|
bl_pt.Parttab = ptlst[i]
|
|
partDict[bl_pt.Partid] = bl_pt
|
|
}
|
|
// 遍历零件属性列表
|
|
for i = 0; i < len(ptatlst); i++ {
|
|
ptatlst[i].Clipped()
|
|
if bl_pt, ok = partDict[ptatlst[i].Partid]; !ok {
|
|
continue
|
|
}
|
|
bl_partattr = BL_PartAttribute{}
|
|
bl_partattr.Attrcode = ptatlst[i].Attrcode
|
|
bl_partattr.Attrvalue = ptatlst[i].Attrvalue
|
|
bl_partattr.Partid = ptatlst[i].Partid
|
|
bl_partattr.Partattrtab = ptatlst[i]
|
|
bl_pt.AtcodDict[bl_partattr.Attrcode] = bl_partattr
|
|
// 更新回零件字典
|
|
partDict[bl_pt.Partid] = bl_pt
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取指定项目的零件分配规则集字典
|
|
func GetProjectPartRuleListDict(projnr string) (part_rule_dict map[string]BL_PartAssignRule, err error) {
|
|
var (
|
|
partrulelist []db.Me_partrule
|
|
partruledatalist []db.Me_partrule_qtyassign
|
|
bl_part_rule BL_PartAssignRule
|
|
i, j int
|
|
key string
|
|
)
|
|
// 初始化字典
|
|
part_rule_dict = make(map[string]BL_PartAssignRule)
|
|
if partrulelist, err = GetProjectPartRuletabList(projnr); err != nil {
|
|
return
|
|
}
|
|
// 遍历项目零件规则加载明细数据
|
|
for i = 0; i < len(partrulelist); i++ {
|
|
partrulelist[i].Clipped()
|
|
if partrulelist[i].Partrule_iprecond <= 0 {
|
|
continue
|
|
}
|
|
if partruledatalist, err = GetProjectPartRuleDatatabList(partrulelist[i].Partid, partrulelist[i].Projnr, partrulelist[i].Ruleid); err != nil {
|
|
return
|
|
}
|
|
bl_part_rule = BL_PartAssignRule{}
|
|
bl_part_rule.Ruleid = partrulelist[i].Ruleid
|
|
bl_part_rule.Partid = partrulelist[i].Partid
|
|
bl_part_rule.Partfamilyid = partrulelist[i].Partrule_cprecond
|
|
bl_part_rule.Qty = partrulelist[i].Partrule_iprecond
|
|
bl_part_rule.Partruletab = partrulelist[i]
|
|
bl_part_rule.Assignnruledict = make(map[string]db.Me_partrule_qtyassign)
|
|
for j = 0; j < len(partruledatalist); j++ {
|
|
partruledatalist[j].Clipped()
|
|
bl_part_rule.Assignnruledict[partruledatalist[j].Supplygroupid] = partruledatalist[j]
|
|
}
|
|
// 项目零件分配规则Key = 零件ID+数量
|
|
key = bl_part_rule.Partid + "+" + strconv.Itoa(bl_part_rule.Qty)
|
|
part_rule_dict[key] = bl_part_rule
|
|
}
|
|
return
|
|
}
|