SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
3.7 KiB

  1. package seq
  2. import (
  3. "errors"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "strings"
  8. )
  9. // 解析SEQ文件
  10. func ParseSeqEdi(ediFile string, sequence *SEQUENCE) (err error) {
  11. var (
  12. f *os.File
  13. fd []byte
  14. datalist []string
  15. row string
  16. rowObj string
  17. ilen int
  18. dtm DTM
  19. seq SEQ
  20. gir GIR
  21. loc LOC
  22. )
  23. // 打开文件
  24. if f, err = os.Open(ediFile); err != nil {
  25. goto ERR
  26. }
  27. defer f.Close()
  28. // 读取文件数据
  29. if fd, err = ioutil.ReadAll(f); err != nil {
  30. goto ERR
  31. }
  32. // 切割数据
  33. datalist = strings.Split(string(fd), "'")
  34. // 遍历数据,生成SEQ对象
  35. sequence.DataRows = 0
  36. fmt.Println("Total data row = ", len(datalist))
  37. for _, row = range datalist {
  38. if strings.TrimSpace(row) == "" {
  39. continue
  40. }
  41. rowObj = getSeqDataRowObj(row)
  42. switch rowObj {
  43. case "UNB":
  44. if err = sequence.Unb.Parse(row); err != nil {
  45. goto ERR
  46. }
  47. case "UNH":
  48. if err = sequence.Unh.Parse(row); err != nil {
  49. goto ERR
  50. }
  51. sequence.DataRows++
  52. case "BGM":
  53. if err = sequence.Bgm.Parse(row); err != nil {
  54. goto ERR
  55. }
  56. sequence.DataRows++
  57. case "DTM":
  58. dtm = DTM{}
  59. if err = dtm.Parse(row); err != nil {
  60. goto ERR
  61. }
  62. // 基于日期时间类型判定是TOD还是SEQ订单时间
  63. // 137 是TOD消息时间;194是订单开始时间
  64. switch dtm.DateTimeType {
  65. case 137:
  66. sequence.Dtm = dtm
  67. case 42:
  68. ilen = len(sequence.SeqList)
  69. if ilen < 1 {
  70. err = errors.New("SEQ dtm is existed before the 1st SEQ!")
  71. goto ERR
  72. }
  73. sequence.SeqList[ilen-1].Dtm = dtm
  74. default:
  75. err = errors.New("Unknown datetime type in DTM : " + string(dtm.DateTimeType))
  76. goto ERR
  77. }
  78. sequence.DataRows++
  79. case "FTX":
  80. if err = sequence.Ftx.Parse(row); err != nil {
  81. goto ERR
  82. }
  83. sequence.DataRows++
  84. case "NAD":
  85. if err = sequence.Nad.Parse(row); err != nil {
  86. goto ERR
  87. }
  88. sequence.DataRows++
  89. case "SEQ":
  90. seq = SEQ{}
  91. if err = seq.Parse(row); err != nil {
  92. goto ERR
  93. }
  94. sequence.SeqList = append(sequence.SeqList, seq)
  95. sequence.DataRows++
  96. case "GIR":
  97. gir = GIR{}
  98. if err = gir.Parse(row); err != nil {
  99. goto ERR
  100. }
  101. ilen = len(sequence.SeqList)
  102. if ilen < 1 {
  103. err = errors.New("SEQ gir is existed before the 1st SEQ!")
  104. goto ERR
  105. }
  106. sequence.SeqList[ilen-1].Gir = gir
  107. sequence.DataRows++
  108. case "LOC":
  109. loc = LOC{}
  110. if err = loc.Parse(row); err != nil {
  111. goto ERR
  112. }
  113. ilen = len(sequence.SeqList)
  114. if ilen < 1 {
  115. err = errors.New("SEQ loc is existed before the 1st SEQ!")
  116. goto ERR
  117. }
  118. switch loc.LocType {
  119. case 44:
  120. sequence.SeqList[ilen-1].Loc44 = loc
  121. case 83:
  122. sequence.SeqList[ilen-1].Loc83 = loc
  123. }
  124. sequence.DataRows++
  125. case "UNT":
  126. sequence.Unt = UNT{}
  127. if err = sequence.Unt.Parse(row); err != nil {
  128. goto ERR
  129. }
  130. sequence.DataRows++
  131. case "UNZ":
  132. sequence.Unz = UNZ{}
  133. if err = sequence.Unz.Parse(row); err != nil {
  134. goto ERR
  135. }
  136. break
  137. default:
  138. err = errors.New("Unknown SEQ object : " + rowObj)
  139. goto ERR
  140. }
  141. }
  142. if sequence.Unt.DataRows != sequence.DataRows {
  143. err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", sequence.Unt.DataRows, sequence.DataRows))
  144. goto ERR
  145. }
  146. ERR:
  147. fmt.Println(err)
  148. return
  149. }
  150. func getSeqDataRowObj(row string) (obj string) {
  151. if len(row) < 3 {
  152. return ""
  153. }
  154. return strings.ToUpper(row[:3])
  155. }
  156. // 打印解析的SEQ对象
  157. func PrintSeqEdi(sequence *SEQUENCE) {
  158. var (
  159. seq SEQ
  160. )
  161. sequence.Unb.Print()
  162. sequence.Unh.Print()
  163. sequence.Bgm.Print()
  164. sequence.Dtm.Print()
  165. sequence.Ftx.Print()
  166. sequence.Nad.Print()
  167. for _, seq = range sequence.SeqList {
  168. seq.Print()
  169. seq.Dtm.Print()
  170. seq.Gir.Print()
  171. seq.Loc44.Print()
  172. seq.Loc83.Print()
  173. }
  174. sequence.Unt.Print()
  175. sequence.Unz.Print()
  176. }