package service
|
|
|
|
import (
|
|
"leit.com/leit_seat_aps/db"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// 用于SEQ解析的项目主数据对象
|
|
type SeqProject struct {
|
|
Projectid string
|
|
Projecttab db.Me_project // 项目表
|
|
Attrdict map[int]BL_Attribute // 所有的用于解析的产品属性
|
|
Partdict map[string]BL_Part // 所有的用于解析的零件清单
|
|
Partfamdict map[string]BL_PartFamily // 所有的用于解析的零件族
|
|
Supplygrpdict map[string]BL_SupplyGroup // 所有的用于解析的供应组
|
|
Partruledict map[string]BL_PartAssignRule // Key = 零件号+零件族+待分配数量
|
|
Carmodeldict map[string]BL_Carmodel // 车型字典
|
|
Materialdict map[string]db.Pln_material // 计算需求的二级物料主数据字典
|
|
Bomdict map[string]BL_BomHead // 二级物料BOM
|
|
Pfseqdict map[string]int // 用于存储各零件族最大的OEMSEQ号
|
|
}
|
|
|
|
// 获取项目指定属性类型的属性主数据字典
|
|
func (sp *SeqProject) GetAttributeList(attrtype int) (err error) {
|
|
var (
|
|
attrtab db.Me_attribute
|
|
attrtablist []db.Me_attribute
|
|
bl_attr BL_Attribute
|
|
i int
|
|
)
|
|
|
|
// 初始化项目的属性字典
|
|
sp.Attrdict = make(map[int]BL_Attribute)
|
|
attrtab = db.Me_attribute{}
|
|
|
|
if attrtablist, err = attrtab.GetTypeAttributes(attrtype); err != nil {
|
|
return
|
|
}
|
|
|
|
// 遍历属性列表并写入属性字典
|
|
for i = 0; i < len(attrtablist); i++ {
|
|
attrtablist[i].Clipped()
|
|
bl_attr = BL_Attribute{}
|
|
bl_attr.Attrcode = attrtablist[i].Attrcode
|
|
bl_attr.Attrname = attrtablist[i].Attrname
|
|
bl_attr.Descr = attrtablist[i].Descr
|
|
bl_attr.Attrtype = attrtablist[i].Attrtype
|
|
bl_attr.Attrtab = attrtablist[i]
|
|
bl_attr.Atvaltablst = attrtablist[i].Valst
|
|
sp.Attrdict[bl_attr.Attrcode] = bl_attr
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取项目的零件字典
|
|
func (sp *SeqProject) GetPartList() (err error) {
|
|
var (
|
|
partab db.Me_part
|
|
partablst []db.Me_part
|
|
i, j int
|
|
bl_pt BL_Part
|
|
bl_ptattr BL_PartAttribute
|
|
)
|
|
|
|
// 初始化项目的零件字典
|
|
sp.Partdict = make(map[string]BL_Part)
|
|
partab = db.Me_part{}
|
|
if partablst, err = partab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
|
|
// 遍历零件列表并写入字典
|
|
for i = 0; i < len(partablst); i++ {
|
|
bl_pt = BL_Part{}
|
|
bl_pt.Partid = partablst[i].Partid
|
|
bl_pt.Projnr = partablst[i].Projnr
|
|
bl_pt.AtcodDict = make(map[int]BL_PartAttribute)
|
|
for j = 0; j < len(partablst[i].Attrlst); j++ {
|
|
bl_ptattr = BL_PartAttribute{}
|
|
bl_ptattr.Attrcode = partablst[i].Attrlst[j].Attrcode
|
|
bl_ptattr.Attrvalue = partablst[i].Attrlst[j].Attrvalue
|
|
bl_ptattr.Partattrtab = partablst[i].Attrlst[j]
|
|
bl_pt.AtcodDict[bl_ptattr.Attrcode] = bl_ptattr
|
|
}
|
|
sp.Partdict[bl_pt.Partid] = bl_pt
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取项目的零件族字典
|
|
func (sp *SeqProject) GetPartFamilyList() (err error) {
|
|
var (
|
|
pftab db.Me_partfamily
|
|
pftablst []db.Me_partfamily
|
|
i, j int
|
|
bl_pf BL_PartFamily
|
|
bl_pfattr BL_PartFamily_Atcod
|
|
)
|
|
|
|
// 初始化项目的零件族字典
|
|
sp.Partfamdict = make(map[string]BL_PartFamily)
|
|
pftab = db.Me_partfamily{}
|
|
if pftablst, err = pftab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
|
|
// 遍历零件族列表并写入字典
|
|
for i = 0; i < len(pftablst); i++ {
|
|
bl_pf = BL_PartFamily{}
|
|
bl_pf.Partfamilyid = pftablst[i].Partfamilyid
|
|
bl_pf.Pf_attr_dict = make(map[int]BL_PartFamily_Atcod)
|
|
for j = 0; j < len(pftablst[i].Atcodlst); j++ {
|
|
bl_pfattr = BL_PartFamily_Atcod{}
|
|
bl_pfattr.Attrcode = pftablst[i].Atcodlst[j].Attrcode
|
|
bl_pfattr.Mandatory = pftablst[i].Atcodlst[j].Mandatory
|
|
bl_pfattr.Verifyrule = pftablst[i].Atcodlst[j].Verifyrule
|
|
bl_pfattr.Partfamily_attrtab = pftablst[i].Atcodlst[j]
|
|
bl_pf.Pf_attr_dict[bl_pfattr.Attrcode] = bl_pfattr
|
|
}
|
|
sp.Partfamdict[bl_pf.Partfamilyid] = bl_pf
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取项目的供应组字典
|
|
func (sp *SeqProject) GetSupplyGroupList() (err error) {
|
|
var (
|
|
sgtab db.Me_supplygroup
|
|
sgtablst []db.Me_supplygroup
|
|
i, j int
|
|
bl_sg BL_SupplyGroup
|
|
bl_sgattr BL_SupplyGroup_Atcod
|
|
)
|
|
|
|
// 初始化项目的供应组字典
|
|
sp.Supplygrpdict = make(map[string]BL_SupplyGroup)
|
|
sgtab = db.Me_supplygroup{}
|
|
if sgtablst, err = sgtab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
|
|
// 遍历供应组列表并写入字典
|
|
for i = 0; i < len(sgtablst); i++ {
|
|
bl_sg = BL_SupplyGroup{}
|
|
bl_sg.Supplygroupid = sgtablst[i].Supplygroupid
|
|
bl_sg.Partfamilyid = sgtablst[i].Partfamilyid
|
|
bl_sg.Worklineid = sgtablst[i].Worklineid
|
|
bl_sg.Sgtype = strings.ToUpper(sgtablst[i].Sgtype)
|
|
bl_sg.Supplygrouptab = sgtablst[i]
|
|
bl_sg.Sg_attr_dict = make(map[int]BL_SupplyGroup_Atcod)
|
|
for j = 0; j < len(sgtablst[i].Atcodlst); j++ {
|
|
bl_sgattr = BL_SupplyGroup_Atcod{}
|
|
bl_sgattr.Attrcode = sgtablst[i].Atcodlst[j].Attrcode
|
|
bl_sgattr.Mandatory = sgtablst[i].Atcodlst[j].Mandatory
|
|
bl_sgattr.Verifyrule = sgtablst[i].Atcodlst[j].Verifyrule
|
|
bl_sgattr.Supplygroup_attrtab = sgtablst[i].Atcodlst[j]
|
|
bl_sg.Sg_attr_dict[bl_sgattr.Attrcode] = bl_sgattr
|
|
}
|
|
sp.Supplygrpdict[bl_sg.Supplygroupid] = bl_sg
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取项目的零件分配规则字典
|
|
func (sp *SeqProject) GetPartRuleList() (err error) {
|
|
var (
|
|
ptruletab db.Me_partrule
|
|
ptruletablst []db.Me_partrule
|
|
i, j int
|
|
key string
|
|
bl_ptrule BL_PartAssignRule
|
|
)
|
|
|
|
// 初始化项目的零件规则字典
|
|
sp.Partruledict = make(map[string]BL_PartAssignRule)
|
|
ptruletab = db.Me_partrule{}
|
|
if ptruletablst, err = ptruletab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
|
|
// 遍历零件数量分配规则列表并写入字典
|
|
for i = 0; i < len(ptruletablst); i++ {
|
|
bl_ptrule = BL_PartAssignRule{}
|
|
bl_ptrule.Ruleid = ptruletablst[i].Ruleid
|
|
bl_ptrule.Partid = ptruletablst[i].Partid
|
|
bl_ptrule.Partfamilyid = ptruletablst[i].Partrule_cprecond
|
|
bl_ptrule.Qty = ptruletablst[i].Partrule_iprecond
|
|
bl_ptrule.Partruletab = ptruletablst[i]
|
|
bl_ptrule.Assignnruledict = make(map[string]db.Me_partrule_qtyassign)
|
|
for j = 0; j < len(ptruletablst[i].Qtyasnlst); j++ {
|
|
ptruletablst[i].Qtyasnlst[j].Clipped()
|
|
key = ptruletablst[i].Qtyasnlst[j].Supplygroupid
|
|
bl_ptrule.Assignnruledict[key] = ptruletablst[i].Qtyasnlst[j]
|
|
}
|
|
// 项目零件分配规则Key = 零件ID+数量
|
|
key = bl_ptrule.Partid + "+" + strconv.Itoa(bl_ptrule.Qty)
|
|
sp.Partruledict[key] = bl_ptrule
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取指定项目的零件族主数据字典
|
|
func (sp *SeqProject) LoadCarmodelData() (err error) {
|
|
var (
|
|
cmtab db.Me_carmodel
|
|
cmtablst []db.Me_carmodel
|
|
bl_cm BL_Carmodel
|
|
bl_cmattr BL_Carmodel_Atcod
|
|
i, j, k int
|
|
)
|
|
|
|
sp.Carmodeldict = make(map[string]BL_Carmodel)
|
|
cmtab = db.Me_carmodel{}
|
|
|
|
if cmtablst, err = cmtab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
|
|
// 遍历车型
|
|
for i = 0; i < len(cmtablst); i++ {
|
|
bl_cm = BL_Carmodel{}
|
|
bl_cm.Carmodelid = cmtablst[i].Carmodelid
|
|
bl_cm.Carmodeltab = cmtablst[i]
|
|
bl_cm.Cm_pf_dict = make(map[string]string)
|
|
bl_cm.Cm_attr_dict = make(map[int]BL_Carmodel_Atcod)
|
|
// 加载车型的零件族
|
|
for j = 0; j < len(cmtablst[i].Pflst); j++ {
|
|
bl_cm.Cm_pf_dict[cmtablst[i].Pflst[j].Partfamilyid] = cmtablst[i].Pflst[j].Partfamilyid
|
|
}
|
|
// 加载车型的属性
|
|
for k = 0; k < len(cmtablst[i].Atcodlst); k++ {
|
|
bl_cmattr = BL_Carmodel_Atcod{}
|
|
bl_cmattr.Carmodelid = cmtablst[i].Carmodelid
|
|
bl_cmattr.Attrcode = cmtablst[i].Atcodlst[k].Attrcode
|
|
bl_cmattr.Mandatory = cmtablst[i].Atcodlst[k].Mandatory
|
|
bl_cmattr.Verifyrule = cmtablst[i].Atcodlst[k].Verifyrule
|
|
bl_cmattr.Carmodel_attrtab = cmtablst[i].Atcodlst[k]
|
|
bl_cm.Cm_attr_dict[bl_cmattr.Attrcode] = bl_cmattr
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载项目二级物料主数据
|
|
func (sp *SeqProject) LoadMaterialData() (err error) {
|
|
var (
|
|
mattab db.Pln_material
|
|
mattablst []db.Pln_material
|
|
i int
|
|
)
|
|
|
|
// 初始化
|
|
sp.Materialdict = make(map[string]db.Pln_material)
|
|
|
|
// 加载物料主数据
|
|
mattab = db.Pln_material{}
|
|
if mattablst, err = mattab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
for i = 0; i < len(mattablst); i++ {
|
|
sp.Materialdict[mattablst[i].Materialid] = mattablst[i]
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载二级物料BOM主数据
|
|
func (sp *SeqProject) LoadBomData() (err error) {
|
|
var (
|
|
bomheadtab db.Me_bomhead
|
|
bomheadtablst []db.Me_bomhead
|
|
i, j int
|
|
bl_bomhead BL_BomHead
|
|
bl_bomitem BL_BomItem
|
|
)
|
|
|
|
// 初始化
|
|
sp.Bomdict = make(map[string]BL_BomHead)
|
|
|
|
bomheadtab = db.Me_bomhead{}
|
|
if bomheadtablst, err = bomheadtab.GetAll(); err != nil {
|
|
return
|
|
}
|
|
for i = 0; i < len(bomheadtablst); i++ {
|
|
bl_bomhead = BL_BomHead{}
|
|
bl_bomhead.Bomid = bomheadtablst[i].Bomid
|
|
bl_bomhead.Materialid = bomheadtablst[i].Matnr
|
|
bl_bomhead.bomheadtab = bomheadtablst[i]
|
|
bl_bomhead.Bomitemlst = []BL_BomItem{}
|
|
for j = 0; j < len(bomheadtablst[i].Itemlst); j++ {
|
|
bl_bomitem = BL_BomItem{}
|
|
bl_bomitem.Fmaterialid = bomheadtablst[i].Itemlst[j].Fmatnr
|
|
bl_bomitem.Cmaterialid = bomheadtablst[i].Itemlst[j].Cmatnr
|
|
bl_bomitem.Fmatqty = bomheadtablst[i].Itemlst[j].Fmatqty
|
|
bl_bomitem.Cmatqty = bomheadtablst[i].Itemlst[j].Cmatqty
|
|
bl_bomitem.Leadtime = bomheadtablst[i].Itemlst[j].Leadtime
|
|
bl_bomitem.Timeuom = bomheadtablst[i].Itemlst[j].Timeuom
|
|
bl_bomitem.bomitemtab = bomheadtablst[i].Itemlst[j]
|
|
bl_bomhead.Bomitemlst = append(bl_bomhead.Bomitemlst, bl_bomitem)
|
|
}
|
|
sp.Bomdict[bl_bomhead.Materialid] = bl_bomhead
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 加载项目各零件族已计划的最大的OEMSEQ信息
|
|
func (sp *SeqProject) GetPartFamilyMaxOemseq() (err error) {
|
|
var (
|
|
pftab db.Me_partfamily
|
|
pftablst []db.Me_partfamily
|
|
cotab db.Pln_custorder
|
|
i int
|
|
maxoemseq int
|
|
)
|
|
|
|
// 初始化
|
|
sp.Pfseqdict = make(map[string]int)
|
|
|
|
// 加载项目零件族
|
|
pftab = db.Me_partfamily{}
|
|
if pftablst, err = pftab.GetProjectAll(sp.Projectid); err != nil {
|
|
return
|
|
}
|
|
|
|
// 查询各项目已解析的最大的CheckSequence号
|
|
for i = 0; i < len(pftablst); i++ {
|
|
cotab = db.Pln_custorder{Projnr: sp.Projectid, Partfamilyid: pftablst[i].Partfamilyid}
|
|
if maxoemseq, _, err = cotab.GetMaxOemSeqByPartFamily(); err != nil {
|
|
return
|
|
}
|
|
sp.Pfseqdict[pftablst[i].Partfamilyid] = maxoemseq
|
|
//fmt.Println("在客户订单上:",conr,"获取零件族:",pftablst[i].Partfamilyid,"的最大OEMSEQ:",maxoemseq)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 判断指定零件族是否需要校验顺序
|
|
func (sp *SeqProject) IsPartFamilyNeedToContinue(pfid string)(bcont bool){
|
|
var (
|
|
i int
|
|
pflist []string
|
|
)
|
|
|
|
bcont = false
|
|
pflist = strings.Split(sp.Projecttab.Seq_verfiy_partfamily, ",")
|
|
for i = 0; i < len(pflist); i++ {
|
|
if strings.TrimSpace(pfid) == strings.TrimSpace(pflist[i]){
|
|
bcont = true
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|