package calloff import ( "errors" "fmt" "io/ioutil" "os" "strings" ) // 解析CALLOFF文件 func ParseCalloffEdi(ediFile string, calloff *CALLOFF) (err error) { var ( f *os.File fd []byte datalist []string row string rowObj string ilen int dtm DTM rff RFF seq SEQ gir GIR ) // 打开文件 if f, err = os.Open(ediFile); err != nil { goto ERR } defer f.Close() // 读取文件数据 if fd, err = ioutil.ReadAll(f); err != nil { goto ERR } // 切割数据 datalist = strings.Split(string(fd), "'") // 遍历数据,生成SEQ对象 calloff.DataRows = 0 fmt.Println("Total data row = ", len(datalist)) for _, row = range datalist { if strings.TrimSpace(row) == "" { continue } rowObj = getCallOffDataRowObj(row) switch rowObj { case "UNB": if err = calloff.Unb.Parse(row); err != nil { goto ERR } case "UNH": if err = calloff.Unh.Parse(row); err != nil { goto ERR } calloff.DataRows++ case "BGM": if err = calloff.Bgm.Parse(row); err != nil { goto ERR } calloff.DataRows++ case "DTM": dtm = DTM{} if err = dtm.Parse(row); err != nil { goto ERR } // 基于日期时间类型判定是TOD还是SEQ订单时间 // 137 是TOD消息时间;2是客户要求的发运时间 switch dtm.DateTimeType { case 137: calloff.DtmMsg = dtm case 2: calloff.DtmDelivery = dtm default: err = errors.New("Unknown datetime type in DTM : " + string(dtm.DateTimeType)) goto ERR } calloff.DataRows++ case "RFF": rff = RFF{} if err = rff.Parse(row); err != nil { goto ERR } switch rff.RefType { case "CALLOFF": calloff.RffCF = rff case "PARTFAMILY": calloff.RffPF = rff } calloff.DataRows++ case "NAD": if err = calloff.Nad.Parse(row); err != nil { goto ERR } calloff.DataRows++ case "LOC": if err = calloff.Loc.Parse(row); err != nil { goto ERR } calloff.DataRows++ case "SEQ": seq = SEQ{} if err = seq.Parse(row); err != nil { goto ERR } calloff.SeqList = append(calloff.SeqList, seq) calloff.DataRows++ case "GIR": gir = GIR{} if err = gir.Parse(row); err != nil { goto ERR } ilen = len(calloff.SeqList) if ilen < 1 { err = errors.New("SEQ gir is existed before the 1st SEQ!") goto ERR } calloff.SeqList[ilen-1].Gir = gir calloff.DataRows++ case "UNT": calloff.Unt = UNT{} if err = calloff.Unt.Parse(row); err != nil { goto ERR } calloff.DataRows++ case "UNZ": calloff.Unz = UNZ{} if err = calloff.Unz.Parse(row); err != nil { goto ERR } break default: err = errors.New("Unknown SEQ object : " + rowObj) goto ERR } } if calloff.Unt.DataRows != calloff.DataRows { err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", calloff.Unt.DataRows, calloff.DataRows)) goto ERR } ERR: fmt.Println(err) return } func getCallOffDataRowObj(row string) (obj string) { if len(row) < 3 { return "" } return strings.ToUpper(row[:3]) } // 打印解析的Calloff对象 func PrintCalloffEdi(calloff *CALLOFF) { var ( seq SEQ ) calloff.Unb.Print() calloff.Unh.Print() calloff.Bgm.Print() calloff.DtmMsg.Print() calloff.DtmDelivery.Print() calloff.RffCF.Print() calloff.RffPF.Print() calloff.Nad.Print() calloff.Loc.Print() for _, seq = range calloff.SeqList { seq.Print() seq.Gir.Print() } calloff.Unt.Print() calloff.Unz.Print() }