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 }