package reorder import ( "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "log" "path/filepath" "strings" "time" ) // REORDER 解析的数据对象 type BL_Reorder struct { Reordernr string // Reorder订单号 Rejectionnr string Projnr string // 项目号 Edifile string // EDI 文件名 Partfamilyid string // 零件族 Plantsitecode int // 客户车间号 Consigee string Msgid string Msgtime time.Time Reorderlandtab db.Pln_reorderdata_landing // Reorder消息 SgDict map[string]BL_ReorderSupplygroup } type BL_ReorderSupplygroup struct { Reordernr string // Reorder订单号 Oemordernr string // 客户订单号 SeqType int // 3=新建;1=变更;2=取消 Partfamilyid string // 零件族 Supplygroupid string // 供应组 PartDict map[string]BL_ReorderPart } type BL_ReorderPart struct { Reordernr string // Reorder订单号 Oemordernr string // 客户订单号 Supplygroupid string // 供应组 Partid string Partqty int } // Reorder 缓存数据对象定义 type ReorderLandData struct { Projnr string // 项目号 Edifile string // EDI 文件名 Bl_Reorder BL_Reorder // 解析的REORDER订单对象 Reorderlandtablst []db.Pln_reorderdata_landing // Reorder消息 } // 加载Reorder文件并将文件中的Reorder订单数据解析到Reorder订单字典 func (rld *ReorderLandData) ReadReorderData(reorder_file string) (err error) { var ( reorder REORDER seq SEQ bl_reorder BL_Reorder bl_reosg BL_ReorderSupplygroup bl_reopart BL_ReorderPart ediFile string i int ) // 解析EDI文件 reorder = REORDER{} if err = ParseReorderEdi(reorder_file, &reorder); err != nil { log.Printf("Failed to load REORDER file: %s due to: %v", reorder_file, err) return } PrintReorderEdi(&reorder) // 获取SEQ文件名 _, ediFile = filepath.Split(reorder_file) // 遍历 bl_reorder = BL_Reorder{} bl_reorder.Reordernr = reorder.Bgm.ReorderNum bl_reorder.Rejectionnr = reorder.Ftx.RejectionNum bl_reorder.Edifile = ediFile bl_reorder.Projnr = rld.Projnr bl_reorder.Partfamilyid = reorder.Rff.PartFamily bl_reorder.Plantsitecode = reorder.Nad.ConsigneePlant bl_reorder.Consigee = reorder.Nad.Consignee bl_reorder.Msgid = reorder.Unh.MsgId bl_reorder.Msgtime = reorder.Dtm.MsgTime bl_reorder.SgDict = make(map[string]BL_ReorderSupplygroup) for _, seq = range reorder.SeqList { bl_reosg = BL_ReorderSupplygroup{} bl_reosg.Reordernr = reorder.Bgm.ReorderNum bl_reosg.Partfamilyid = reorder.Rff.PartFamily bl_reosg.Oemordernr = strings.TrimSpace(seq.Gir.CustOrderNr) bl_reosg.Supplygroupid = seq.Gir.SupplyGroup bl_reosg.SeqType = seq.SeqType bl_reosg.PartDict = make(map[string]BL_ReorderPart) for i = 0; i < len(seq.LinList); i++ { bl_reopart = BL_ReorderPart{} bl_reopart.Reordernr = reorder.Bgm.ReorderNum bl_reopart.Oemordernr = strings.TrimSpace(seq.Gir.CustOrderNr) bl_reopart.Supplygroupid = seq.Gir.SupplyGroup bl_reopart.Partid = seq.LinList[i].PartNr + "-" + seq.LinList[i].Pia.Ai // 零件号 bl_reopart.Partqty = seq.LinList[i].Qty.Qty bl_reosg.PartDict[bl_reopart.Partid] = bl_reopart } bl_reorder.SgDict[bl_reosg.Supplygroupid] = bl_reosg } rld.Bl_Reorder = bl_reorder return } // 保存REORDER解析数据 func (rld *ReorderLandData) SaveReorderData() (err error) { var ( bl_reosg BL_ReorderSupplygroup bl_reopart BL_ReorderPart reolandtab db.Pln_reorderdata_landing reosgtab db.Pln_reordersupplygroup_landing reoparttab db.Pln_reorderpart_landing session *xorm.Session flag bool ) // 遍历每一条SEQ信息,检查是否存在,如果存在则更新它 session = db.G_DbEngine.NewSession() defer session.Close() // 新建 reolandtab = db.Pln_reorderdata_landing{} reolandtab.Finr = db.G_FINR reolandtab.Reordernr = rld.Bl_Reorder.Reordernr reolandtab.Rejectionnr = rld.Bl_Reorder.Rejectionnr reolandtab.Partfamilyid = rld.Bl_Reorder.Partfamilyid reolandtab.Projnr = rld.Bl_Reorder.Projnr reolandtab.Consignee = rld.Bl_Reorder.Consigee reolandtab.Consigneeplant = rld.Bl_Reorder.Plantsitecode reolandtab.Parsed = 0 // 默认未解析 reolandtab.Edifile = rld.Bl_Reorder.Edifile reolandtab.Msgid = rld.Bl_Reorder.Msgid reolandtab.Msgtime = common.Date(rld.Bl_Reorder.Msgtime.Unix(), "YYYYMMDDHHmmss") reolandtab.Lastuser = "service" reolandtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") reolandtab.Lastmodif = reolandtab.Credatuz if _, err = session.Insert(reolandtab); err != nil { session.Rollback() return } flag = true for _, bl_reosg = range rld.Bl_Reorder.SgDict { reosgtab = db.Pln_reordersupplygroup_landing{} reosgtab.Finr = db.G_FINR reosgtab.Reordernr = bl_reosg.Reordernr reosgtab.Oemordernr = bl_reosg.Oemordernr reosgtab.Supplygroupid = bl_reosg.Supplygroupid reosgtab.Seqmode = bl_reosg.SeqType reosgtab.Lastuser = "service" reosgtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") reosgtab.Lastmodif = reosgtab.Credatuz if _, err = session.Insert(reosgtab); err != nil { flag = false break } for _, bl_reopart = range bl_reosg.PartDict { reoparttab = db.Pln_reorderpart_landing{} reoparttab.Finr = db.G_FINR reoparttab.Reordernr = bl_reopart.Reordernr reoparttab.Oemordernr = bl_reopart.Oemordernr reoparttab.Supplygroupid = bl_reopart.Supplygroupid reoparttab.Partid = bl_reopart.Partid reoparttab.Partqty = bl_reopart.Partqty reoparttab.Lastuser = "service" reoparttab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") reoparttab.Lastmodif = reoparttab.Credatuz if _, err = session.Insert(reoparttab); err != nil { flag = false break } } if !flag { break } } if flag { session.Commit() } else { session.Rollback() } return }