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.

207 lines
4.2 KiB

  1. package reorder
  2. import (
  3. "errors"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "strings"
  8. )
  9. /** REORDER文件解析器,将REORDER文件解析成预定义的数据格式以便于后续的数据处理 **/
  10. // 解析REORDER文件
  11. func ParseReorderEdi(ediFile string, reorder *REORDER)(err error){
  12. var(
  13. f *os.File
  14. fd []byte
  15. datalist []string
  16. row string
  17. rowObj string
  18. ilen, jlen int
  19. seq SEQ
  20. gir GIR
  21. lin LIN
  22. pia PIA
  23. qty QTY
  24. )
  25. // 打开文件
  26. if f, err = os.Open(ediFile); err != nil{
  27. goto ERR
  28. }
  29. defer f.Close()
  30. // 读取文件数据
  31. if fd, err = ioutil.ReadAll(f); err != nil{
  32. goto ERR
  33. }
  34. // 切割数据
  35. datalist = strings.Split(string(fd), "'")
  36. // 遍历数据,生成TOD对象
  37. reorder.DataRows = 0
  38. fmt.Println("Total data row = ",len(datalist))
  39. for _, row = range datalist {
  40. if strings.TrimSpace(row) == "" {
  41. continue
  42. }
  43. rowObj = getReorderDataRowObj(row)
  44. switch rowObj{
  45. case "UNB":
  46. if err = reorder.Unb.Parse(row); err != nil {
  47. goto ERR
  48. }
  49. case "UNH":
  50. if err = reorder.Unh.Parse(row); err != nil {
  51. goto ERR
  52. }
  53. reorder.DataRows++
  54. case "BGM":
  55. if err = reorder.Bgm.Parse(row); err != nil {
  56. goto ERR
  57. }
  58. reorder.DataRows++
  59. case "DTM":
  60. if err = reorder.Dtm.Parse(row); err != nil {
  61. goto ERR
  62. }
  63. reorder.DataRows++
  64. case "RFF":
  65. if err = reorder.Rff.Parse(row); err != nil {
  66. goto ERR
  67. }
  68. reorder.DataRows++
  69. case "NAD":
  70. if err = reorder.Nad.Parse(row); err != nil {
  71. goto ERR
  72. }
  73. reorder.DataRows++
  74. case "FTX":
  75. if err = reorder.Ftx.Parse(row); err != nil {
  76. goto ERR
  77. }
  78. reorder.DataRows++
  79. case "SEQ":
  80. seq = SEQ{}
  81. if err = seq.Parse(row); err != nil {
  82. goto ERR
  83. }
  84. reorder.SeqList = append(reorder.SeqList, seq)
  85. reorder.DataRows++
  86. case "GIR":
  87. gir = GIR{}
  88. if err = gir.Parse(row); err != nil {
  89. goto ERR
  90. }
  91. ilen = len(reorder.SeqList)
  92. if ilen < 1 {
  93. err = errors.New("SEQ gir is existed before the 1st SEQ!")
  94. goto ERR
  95. }
  96. reorder.SeqList[ilen-1].Gir = gir
  97. reorder.DataRows++
  98. case "LIN":
  99. lin = LIN{}
  100. if err = lin.Parse(row); err != nil {
  101. goto ERR
  102. }
  103. ilen = len(reorder.SeqList)
  104. if ilen < 1 {
  105. err = errors.New("SEQ lin is existed before the 1st SEQ!")
  106. goto ERR
  107. }
  108. reorder.SeqList[ilen-1].LinList = append(reorder.SeqList[ilen-1].LinList, lin)
  109. reorder.DataRows++
  110. case "PIA":
  111. pia = PIA{}
  112. if err = pia.Parse(row); err != nil {
  113. goto ERR
  114. }
  115. ilen = len(reorder.SeqList)
  116. if ilen < 1 {
  117. err = errors.New("SEQ pia is existed before the 1st SEQ!")
  118. goto ERR
  119. }
  120. jlen = len(reorder.SeqList[ilen-1].LinList)
  121. if jlen < 1 {
  122. err = errors.New("SEQ pia is existed before the 1st LIN!")
  123. goto ERR
  124. }
  125. reorder.SeqList[ilen-1].LinList[jlen-1].Pia = pia
  126. reorder.DataRows++
  127. case "QTY":
  128. qty = QTY{}
  129. if err = qty.Parse(row); err != nil {
  130. goto ERR
  131. }
  132. ilen = len(reorder.SeqList)
  133. if ilen < 1 {
  134. err = errors.New("SEQ qty is existed before the 1st SEQ!")
  135. goto ERR
  136. }
  137. jlen = len(reorder.SeqList[ilen-1].LinList)
  138. if jlen < 1 {
  139. err = errors.New("SEQ qty is existed before the 1st LIN!")
  140. goto ERR
  141. }
  142. reorder.SeqList[ilen-1].LinList[jlen-1].Qty = qty
  143. reorder.DataRows++
  144. case "UNT":
  145. reorder.Unt = UNT{}
  146. if err = reorder.Unt.Parse(row); err != nil {
  147. goto ERR
  148. }
  149. reorder.DataRows++
  150. case "UNZ":
  151. reorder.Unz = UNZ{}
  152. if err = reorder.Unz.Parse(row); err != nil {
  153. goto ERR
  154. }
  155. break
  156. default:
  157. err = errors.New("Unknown TOD object : "+rowObj)
  158. goto ERR
  159. }
  160. }
  161. if reorder.Unt.DataRows != reorder.DataRows {
  162. err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", reorder.Unt.DataRows, reorder.DataRows))
  163. goto ERR
  164. }
  165. ERR:
  166. fmt.Println(err)
  167. return
  168. }
  169. func getReorderDataRowObj(row string)( obj string){
  170. if len(row) < 3 {
  171. return ""
  172. }
  173. return strings.ToUpper(row[:3])
  174. }
  175. // 打印解析的REORDER对象
  176. func PrintReorderEdi(reorder *REORDER){
  177. var(
  178. seq SEQ
  179. lin LIN
  180. )
  181. reorder.Unb.Print()
  182. reorder.Unh.Print()
  183. reorder.Bgm.Print()
  184. reorder.Dtm.Print()
  185. reorder.Rff.Print()
  186. reorder.Nad.Print()
  187. reorder.Ftx.Print()
  188. for _, seq = range reorder.SeqList {
  189. seq.Print()
  190. seq.Gir.Print()
  191. for _, lin = range seq.LinList {
  192. lin.Print()
  193. }
  194. }
  195. reorder.Unt.Print()
  196. reorder.Unz.Print()
  197. }