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.

176 lines
3.5 KiB

  1. package calloff
  2. import (
  3. "errors"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "strings"
  8. )
  9. // 解析CALLOFF文件
  10. func ParseCalloffEdi(ediFile string, calloff *CALLOFF) (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. rff RFF
  20. seq SEQ
  21. gir GIR
  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. calloff.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 = getCallOffDataRowObj(row)
  42. switch rowObj {
  43. case "UNB":
  44. if err = calloff.Unb.Parse(row); err != nil {
  45. goto ERR
  46. }
  47. case "UNH":
  48. if err = calloff.Unh.Parse(row); err != nil {
  49. goto ERR
  50. }
  51. calloff.DataRows++
  52. case "BGM":
  53. if err = calloff.Bgm.Parse(row); err != nil {
  54. goto ERR
  55. }
  56. calloff.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消息时间;2是客户要求的发运时间
  64. switch dtm.DateTimeType {
  65. case 137:
  66. calloff.DtmMsg = dtm
  67. case 2:
  68. calloff.DtmDelivery = dtm
  69. default:
  70. err = errors.New("Unknown datetime type in DTM : " + string(dtm.DateTimeType))
  71. goto ERR
  72. }
  73. calloff.DataRows++
  74. case "RFF":
  75. rff = RFF{}
  76. if err = rff.Parse(row); err != nil {
  77. goto ERR
  78. }
  79. switch rff.RefType {
  80. case "CALLOFF":
  81. calloff.RffCF = rff
  82. case "PARTFAMILY":
  83. calloff.RffPF = rff
  84. }
  85. calloff.DataRows++
  86. case "NAD":
  87. if err = calloff.Nad.Parse(row); err != nil {
  88. goto ERR
  89. }
  90. calloff.DataRows++
  91. case "LOC":
  92. if err = calloff.Loc.Parse(row); err != nil {
  93. goto ERR
  94. }
  95. calloff.DataRows++
  96. case "SEQ":
  97. seq = SEQ{}
  98. if err = seq.Parse(row); err != nil {
  99. goto ERR
  100. }
  101. calloff.SeqList = append(calloff.SeqList, seq)
  102. calloff.DataRows++
  103. case "GIR":
  104. gir = GIR{}
  105. if err = gir.Parse(row); err != nil {
  106. goto ERR
  107. }
  108. ilen = len(calloff.SeqList)
  109. if ilen < 1 {
  110. err = errors.New("SEQ gir is existed before the 1st SEQ!")
  111. goto ERR
  112. }
  113. calloff.SeqList[ilen-1].Gir = gir
  114. calloff.DataRows++
  115. case "UNT":
  116. calloff.Unt = UNT{}
  117. if err = calloff.Unt.Parse(row); err != nil {
  118. goto ERR
  119. }
  120. calloff.DataRows++
  121. case "UNZ":
  122. calloff.Unz = UNZ{}
  123. if err = calloff.Unz.Parse(row); err != nil {
  124. goto ERR
  125. }
  126. break
  127. default:
  128. err = errors.New("Unknown SEQ object : " + rowObj)
  129. goto ERR
  130. }
  131. }
  132. if calloff.Unt.DataRows != calloff.DataRows {
  133. err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", calloff.Unt.DataRows, calloff.DataRows))
  134. goto ERR
  135. }
  136. ERR:
  137. fmt.Println(err)
  138. return
  139. }
  140. func getCallOffDataRowObj(row string) (obj string) {
  141. if len(row) < 3 {
  142. return ""
  143. }
  144. return strings.ToUpper(row[:3])
  145. }
  146. // 打印解析的Calloff对象
  147. func PrintCalloffEdi(calloff *CALLOFF) {
  148. var (
  149. seq SEQ
  150. )
  151. calloff.Unb.Print()
  152. calloff.Unh.Print()
  153. calloff.Bgm.Print()
  154. calloff.DtmMsg.Print()
  155. calloff.DtmDelivery.Print()
  156. calloff.RffCF.Print()
  157. calloff.RffPF.Print()
  158. calloff.Nad.Print()
  159. calloff.Loc.Print()
  160. for _, seq = range calloff.SeqList {
  161. seq.Print()
  162. seq.Gir.Print()
  163. }
  164. calloff.Unt.Print()
  165. calloff.Unz.Print()
  166. }