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.

649 lines
19 KiB

  1. package reorder
  2. import (
  3. "errors"
  4. "fmt"
  5. "leit.com/leit_seat_aps/common"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. // REORDER 数据交换头
  11. // 示例:UNB+UNOA:1+ODX0SENDER00A+ODX0RECEIVER001+140123:2057+149401140123'
  12. // 说明:Interchange header + Translator value + Sender’s Odette Code + Supplier’s Odette Code + Date:Time + Unique number
  13. type UNB struct {
  14. Sender string // 发送方
  15. Reciever string // 接收方
  16. MsgTime time.Time // 消息时间
  17. MsgRefId string // 消息参考号
  18. ParseString string // 原始消息数据串
  19. }
  20. // REORDER 数据消息头
  21. // 示例:UNH+1494012057+DELJIT:D:96A:UN'
  22. // 说明:Message header 2 + Message Number + UN Standard
  23. type UNH struct {
  24. MsgId string // 消息标识ID
  25. MsgType string // 消息类型 DELJIT
  26. MsgTypeVersion string // 消息类型版本号
  27. MsgTypeRelNo string // 消息类型版本释放号
  28. ParseString string // 原始数据串
  29. }
  30. // REORDER 数据消息开始
  31. // 示例:BGM+39::92+00017131'
  32. // 说明:Begin of message + 39=Re-Order:: 92=BMW + Detective goods number (Similar to call off number)
  33. type BGM struct {
  34. MessageType int // 消息类型 39 = REORDER
  35. ReorderNum string // Reorder号
  36. ParseString string // 原始数据串
  37. }
  38. // REORDER 数据消息日期时间信息
  39. // 示例:DTM+137:201506021252:203'
  40. // 说明:Date / Time / Period + 137=Date and Time : Date / Time : 203=Format Date / Time
  41. type DTM struct {
  42. DateTimeType int // 137 = 消息日期
  43. DateTimeFormat int // 日期时间格式:203 = CCYYMMDDHHMM
  44. MsgTimeFormat string
  45. MsgTime time.Time // 消息时间
  46. ParseString string // 原始数据串
  47. }
  48. // REORDER 参考信息
  49. // 示例:RFF+ZZZ:TVKKBR1'
  50. // 说明:Reference Serial Number + ZZZ=User defined Text : Name of Parts Family
  51. type RFF struct {
  52. RefType string // CALLOFF = AAN / PARTFAMILY = ZZZ
  53. PartFamily string // 零件族
  54. ParseString string // 原始数据串
  55. }
  56. // REORDER 数据消息名称地址信息
  57. // 示例:NAD+CN+88'
  58. // 说明:Name and Address + CN=consignee + Plant site code
  59. type NAD struct {
  60. Consignee string // 收货人
  61. ConsigneePlant int // 收货厂编号
  62. ParseString string // 原始数据串
  63. }
  64. // REORDER 文本区
  65. // 示例:FTX+ZZZ+++202104731:2015:0001'
  66. // 说明:Free text + ZZZ to be entered as the default value for identification of reason for scraping / comment +++ Rejection number : Year : Version number
  67. type FTX struct {
  68. RejectionNum string // 返工号
  69. Year int // 年份
  70. VerNum string //版本号
  71. ParseString string // 原始数据串
  72. }
  73. // REORDER 排序号
  74. // 示例:SEQ+3'
  75. // 说明:Sequence details + 3=Generation
  76. type SEQ struct {
  77. SeqType int // 3=新建;1=变更;2=取消
  78. Gir GIR
  79. LinList []LIN
  80. ParseString string // 原始数据串
  81. }
  82. // REORDER 排序订单相关信息
  83. // 示例:GIR+4+32091571:AN+TVKH2K:VG'
  84. // 说明:Related Identification Numbers + 4=vehicle identification set + EINSTEIN order number : AN=Manufacturing reference number
  85. // + Name of Supply Group : VG=Supply Group
  86. type GIR struct {
  87. VehicleIdSet string // 车辆识别集
  88. CustOrderNr string // 客户订单号
  89. SupplyGroup string // 供应组
  90. ParseString string // 原始数据串
  91. }
  92. // REORDER 数据消息零件信息
  93. // 示例:LIN+++2992888:IN'
  94. // 说明:LIN=line item +++ Part number : IN= Buyers item number
  95. type LIN struct {
  96. PartNr string // 零件号
  97. Pia PIA // 零件号版本信息
  98. Qty QTY // 零件数量信息
  99. ParseString string // 原始数据串
  100. }
  101. // REORDER 数据消息零件版本信息
  102. // 示例:PIA+1+11:EC'
  103. // 说明:PIA=Additional product ID + 1 = Product + Additional Identificaiton – E.g. 00, 01, 02… : EC=engineering change level
  104. type PIA struct {
  105. Ai string // 版本号
  106. ChangeReason string // 变更原因
  107. ParseString string // 原始数据串
  108. }
  109. // REORDER 数据消息数量信息
  110. // 示例:QTY+131:1000'
  111. // 说明:QTY=Quantity + 131=Quantity unit in pieces : Quantity including 3 decimal places without dot (1000=1 2000=2)
  112. type QTY struct {
  113. QtyType int // 数量类型: 131 = 交付数量
  114. OriQty int // 文件定义数量(*1000)
  115. Qty int // 零件数量 = OriQty / 1000
  116. ParseString string // 原始数据串
  117. }
  118. // REORDER 数据消息尾
  119. // 示例:UNT+21+1494012057'
  120. // 说明:Message Trailer + Number of segments + Message Reference Number like UNH
  121. type UNT struct {
  122. DataRows int // 数据行数,从UNH到UNT总数
  123. MsgId string // 消息标识
  124. ParseString string // 原始数据串
  125. }
  126. // REORDER 数据交换结束符
  127. // 示例:UNZ+1+149401140123'
  128. // 说明:End of message + 1 + Transmission Number like UNB
  129. type UNZ struct {
  130. MsgCount int // 消息数
  131. MsgRefId string // 消息参考号
  132. ParseString string // 原始数据串
  133. }
  134. // REORDER 消息对象
  135. type REORDER struct {
  136. FileName string // REORDER
  137. DataRows int // 包含数据行 UNH->UNT
  138. Unb UNB // 数据交换头
  139. Unh UNH // 数据消息头
  140. Bgm BGM // 数据消息开始
  141. Dtm DTM // 数据消息日期时间信息
  142. Rff RFF
  143. Nad NAD // 数据消息名称地址信息
  144. Ftx FTX
  145. SeqList []SEQ // 数据消息的零件族信息:零件、零件族、供应组、数量等信息
  146. Unt UNT // 数据消息尾
  147. Unz UNZ // 数据消息交换结束
  148. }
  149. // 示例:UNB+UNOA:1+ODX0SENDER00A+ODX0RECEIVER001+140123:2057+149401140123'
  150. // 说明:Interchange header + Translator value + Sender’s Odette Code + Supplier’s Odette Code + Date:Time + Unique number
  151. func (unb *UNB) Parse(parseString string) (err error) {
  152. var (
  153. kvlist []string
  154. kv4 []string
  155. )
  156. // 输入为空,返回错误
  157. if strings.TrimSpace(parseString) == "" {
  158. return errors.New("UNB: parse string is empty!")
  159. }
  160. // 基于+分隔符来解析字符串
  161. kvlist = strings.Split(parseString, "+")
  162. if len(kvlist) < 6 {
  163. return errors.New("UNB: Key value length less than 6, failed to parse!")
  164. }
  165. kv4 = strings.Split(kvlist[4], ":")
  166. if len(kv4) < 2 {
  167. return errors.New("UNB: Key4 value length less than 2, failed to parse!")
  168. }
  169. // 填充值
  170. unb.Sender = kvlist[2] // 发送方
  171. unb.Reciever = kvlist[3] // 接收方
  172. if unb.MsgTime, err = common.DateParse(kv4[0]+kv4[1], "ymdHi"); err != nil {
  173. return errors.New("UNB: Failed to get the MsgTime!")
  174. }
  175. unb.MsgRefId = kvlist[5] // 消息参考ID
  176. unb.ParseString = parseString
  177. // 校验关键字段是否为空
  178. if strings.TrimSpace(unb.Sender) == "" {
  179. return errors.New("UNB: Sender is empty!")
  180. }
  181. if strings.TrimSpace(unb.Reciever) == "" {
  182. return errors.New("UNB: Reciever is empty!")
  183. }
  184. if strings.TrimSpace(unb.MsgRefId) == "" {
  185. return errors.New("UNB: MsgRefId is empty!")
  186. }
  187. return
  188. }
  189. func (unb *UNB) Print() {
  190. fmt.Println("UNB | Sender:", unb.Sender, " | Reciever:", unb.Reciever, " | MsgTime:", unb.MsgTime, " | MsgRefId:", unb.MsgRefId)
  191. }
  192. // 示例:UNH+1494012057+DELJIT:D:96A:UN'
  193. // 说明:Message header 2 + Message Number + UN Standard
  194. func (unh *UNH) Parse(parseString string) (err error) {
  195. var (
  196. kvlist []string
  197. kv2 []string
  198. )
  199. // 输入为空,返回错误
  200. if strings.TrimSpace(parseString) == "" {
  201. return errors.New("UNH: parse string is empty!")
  202. }
  203. // 基于+分隔符来解析字符串
  204. kvlist = strings.Split(parseString, "+")
  205. kv2 = strings.Split(kvlist[2], ":")
  206. if len(kv2) < 3 {
  207. return errors.New("UNH: kv2 value length less than 3, failed to parse!")
  208. }
  209. // 填充值
  210. unh.MsgId = kvlist[1] // 消息ID
  211. unh.MsgType = kv2[0] // 消息类型
  212. unh.MsgTypeVersion = kv2[1]
  213. unh.MsgTypeRelNo = kv2[2]
  214. unh.ParseString = parseString
  215. // 校验关键字段是否为空
  216. if strings.TrimSpace(unh.MsgId) == "" {
  217. return errors.New("UNH: MsgId is empty!")
  218. }
  219. if strings.TrimSpace(unh.MsgType) == "" {
  220. return errors.New("UNH: MsgType is empty!")
  221. }
  222. if strings.ToUpper(strings.TrimSpace(unh.MsgType)) != "DELJIT" {
  223. return errors.New("UNH: MsgType is not DELJIT!")
  224. }
  225. return
  226. }
  227. func (unh *UNH) Print() {
  228. fmt.Println("UNH | MsgId:", unh.MsgId, " | MsgType:", unh.MsgType)
  229. }
  230. // 示例:BGM+39::92+00017131'
  231. // 说明:Begin of message + 39=Re-Order:: 92=BMW + Detective goods number (Similar to call off number)
  232. func (bgm *BGM) Parse(parseString string) (err error) {
  233. var (
  234. kvlist []string
  235. kv1 []string
  236. )
  237. // 输入为空,返回错误
  238. if strings.TrimSpace(parseString) == "" {
  239. return errors.New("BGM: parse string is empty!")
  240. }
  241. // 基于+分隔符来解析字符串
  242. kvlist = strings.Split(parseString, "+")
  243. kv1 = strings.Split(kvlist[1], ":")
  244. if len(kv1) < 3 {
  245. return errors.New("BGM: kv1 value length less than 3, failed to parse!")
  246. }
  247. // 填充值
  248. bgm.MessageType, _ = strconv.Atoi(kv1[0])
  249. bgm.ReorderNum = kvlist[2]
  250. bgm.ParseString = parseString
  251. // 校验关键字段是否为空
  252. if strings.TrimSpace(bgm.ReorderNum) == "" {
  253. return errors.New("BGM: ReorderNum is empty!")
  254. }
  255. return
  256. }
  257. func (bgm *BGM) Print() {
  258. fmt.Println("BGM | ReorderNum:", bgm.ReorderNum)
  259. }
  260. // 示例:DTM+137:201506021252:203'
  261. // 说明:Date / Time / Period + 137=Date and Time : Date / Time : 203=Format Date / Time
  262. func (dtm *DTM) Parse(parseString string) (err error) {
  263. var (
  264. kvlist []string
  265. kv1 []string
  266. )
  267. // 输入为空,返回错误
  268. if strings.TrimSpace(parseString) == "" {
  269. return errors.New("DTM: parse string is empty!")
  270. }
  271. // 基于+分隔符来解析字符串
  272. kvlist = strings.Split(parseString, "+")
  273. kv1 = strings.Split(kvlist[1], ":")
  274. if len(kv1) < 2 {
  275. return errors.New("DTM: kv1 value length less than 2, failed to parse!")
  276. }
  277. // 填充值
  278. dtm.DateTimeType, _ = strconv.Atoi(kv1[0]) // 时间格式
  279. dtm.DateTimeFormat, _ = strconv.Atoi(kv1[2])
  280. dtm.MsgTimeFormat = common.GetTimeFormatByType(dtm.DateTimeFormat)
  281. if dtm.MsgTime, err = common.DateParse(kv1[1], dtm.MsgTimeFormat); err != nil {
  282. return errors.New("DTM: Failed to get the MsgTime!")
  283. }
  284. dtm.ParseString = parseString
  285. // 校验关键字段是否为空
  286. if strings.TrimSpace(dtm.MsgTimeFormat) == "" {
  287. return errors.New("DTM: MsgTimeFormat is empty!")
  288. }
  289. return
  290. }
  291. func (dtm *DTM) Print() {
  292. fmt.Println("DTM | DateTimeType:", dtm.DateTimeType, " | DateTimeFormat:", dtm.DateTimeFormat, " | MsgTime:", dtm.MsgTime)
  293. }
  294. // 示例:RFF+ZZZ:TVKKBR1'
  295. // 说明:Reference Serial Number + ZZZ=User defined Text : Name of Parts Family
  296. func (rff *RFF) Parse(parseString string) (err error) {
  297. var (
  298. kvlist []string
  299. kv1 []string
  300. )
  301. // 输入为空,返回错误
  302. if strings.TrimSpace(parseString) == "" {
  303. return errors.New("RFF: parse string is empty!")
  304. }
  305. // 基于+分隔符来解析字符串
  306. kvlist = strings.Split(parseString, "+")
  307. kv1 = strings.Split(kvlist[1], ":")
  308. if len(kv1) < 2 {
  309. return errors.New("RFF: kv1 value length less than 2, failed to parse!")
  310. }
  311. // 填充值
  312. rff.ParseString = parseString
  313. switch strings.TrimSpace(kv1[0]) {
  314. case "AAN":
  315. rff.RefType = "CALLOFF"
  316. case "ZZZ":
  317. rff.RefType = "PARTFAMILY"
  318. rff.PartFamily = kv1[1] // 零件族
  319. if strings.TrimSpace(rff.PartFamily) == "" {
  320. return errors.New("RFF: Partfamily is empty!")
  321. }
  322. default:
  323. }
  324. return
  325. }
  326. func (rff *RFF) Print() {
  327. fmt.Println("RFF | Partfamily:", rff.PartFamily)
  328. }
  329. // 示例:NAD+CN+88'
  330. // 说明:Name and Address + CN=consignee + Plant site code
  331. func (nad *NAD) Parse(parseString string) (err error) {
  332. var (
  333. kvlist []string
  334. )
  335. // 输入为空,返回错误
  336. if strings.TrimSpace(parseString) == "" {
  337. return errors.New("NAD: parse string is empty!")
  338. }
  339. // 基于+分隔符来解析字符串
  340. kvlist = strings.Split(parseString, "+")
  341. // 填充值
  342. nad.Consignee = kvlist[1] // 收货人
  343. nad.ConsigneePlant, _ = strconv.Atoi(kvlist[2]) // 收货厂编号
  344. nad.ParseString = parseString
  345. // 校验关键字段是否为空
  346. if strings.TrimSpace(nad.Consignee) == "" {
  347. return errors.New("NAD: Consignee is empty!")
  348. }
  349. if nad.ConsigneePlant <= 0 {
  350. return errors.New("NAD: ConsigneePlant is not existing!")
  351. }
  352. return
  353. }
  354. func (nad *NAD) Print() {
  355. fmt.Println("NAD | Consignee:", nad.Consignee, " | ConsigneePlant:", nad.ConsigneePlant)
  356. }
  357. // 示例:FTX+ZZZ+++202104731:2015:0001'
  358. // 说明:Free text + ZZZ to be entered as the default value for identification of reason for scraping / comment +++ Rejection number : Year : Version number
  359. func (ftx *FTX) Parse(parseString string) (err error) {
  360. var (
  361. kvlist []string
  362. kv4 []string
  363. )
  364. // 输入为空,返回错误
  365. if strings.TrimSpace(parseString) == "" {
  366. return errors.New("FTX: parse string is empty!")
  367. }
  368. // 基于+分隔符来解析字符串
  369. kvlist = strings.Split(parseString, "+")
  370. kv4 = strings.Split(kvlist[4], ":")
  371. if len(kv4) < 3 {
  372. return errors.New("FTX: kv4 value length less than 3, failed to parse!")
  373. }
  374. // 填充值
  375. ftx.RejectionNum = kv4[0] // 返工号
  376. ftx.Year, _ = strconv.Atoi(kv4[1])
  377. ftx.VerNum = kv4[2]
  378. ftx.ParseString = parseString
  379. // 校验关键字段是否为空
  380. if strings.TrimSpace(ftx.RejectionNum) == "" {
  381. return errors.New("FTX: RejectionNum is empty!")
  382. }
  383. return
  384. }
  385. func (ftx *FTX) Print() {
  386. fmt.Println("FTX | RejectionNum:", ftx.RejectionNum)
  387. }
  388. // 示例:SEQ+3'
  389. // 说明:Sequence details + 3=Generation
  390. func (seq *SEQ) Parse(parseString string) (err error) {
  391. var (
  392. kvlist []string
  393. )
  394. // 输入为空,返回错误
  395. if strings.TrimSpace(parseString) == "" {
  396. return errors.New("SEQ: parse string is empty!")
  397. }
  398. // 基于+分隔符来解析字符串
  399. kvlist = strings.Split(parseString, "+")
  400. // 填充值
  401. seq.SeqType, _ = strconv.Atoi(kvlist[1]) // 3=新建;1=更新;2=取消
  402. seq.ParseString = parseString
  403. // 校验关键字段是否为空
  404. if seq.SeqType < 1 || seq.SeqType > 3 {
  405. return errors.New("SEQ: Unvalid seq type!")
  406. }
  407. return
  408. }
  409. func (seq *SEQ) Print() {
  410. fmt.Println("SEQ | SEQ + ", seq.SeqType)
  411. }
  412. // 示例:GIR+4+32091571:AN+TVKH2K:VG'
  413. // 说明:Related Identification Numbers + 4=vehicle identification set + EINSTEIN order number : AN=Manufacturing reference number
  414. // + Name of Supply Group : VG=Supply Group
  415. func (gir *GIR) Parse(parseString string) (err error) {
  416. var (
  417. kvlist []string
  418. kv2, kv3 []string
  419. )
  420. // 输入为空,返回错误
  421. if strings.TrimSpace(parseString) == "" {
  422. return errors.New("GIR: parse string is empty!")
  423. }
  424. // 基于+分隔符来解析字符串
  425. kvlist = strings.Split(parseString, "+")
  426. kv2 = strings.Split(kvlist[2], ":")
  427. kv3 = strings.Split(kvlist[3], ":")
  428. if len(kv2) < 1 || len(kv3) < 1 {
  429. return errors.New("GIR: kv2/3 value length less than 1, failed to parse!")
  430. }
  431. // 填充值
  432. gir.VehicleIdSet = kvlist[1] // 车辆集号
  433. gir.SupplyGroup = kv3[0] // 供应组
  434. gir.CustOrderNr = kv2[0] // 客户订单号
  435. gir.ParseString = parseString
  436. // 校验关键字段是否为空
  437. if strings.TrimSpace(gir.SupplyGroup) == "" {
  438. return errors.New("GIR: SupplyGroup is empty!")
  439. }
  440. if strings.TrimSpace(gir.CustOrderNr) == "" {
  441. return errors.New("GIR: CustOrderNr is empty!")
  442. }
  443. return
  444. }
  445. func (gir *GIR) Print() {
  446. fmt.Println("GIR | SupplyGroup:", gir.SupplyGroup, " | CustOrderNr:", gir.CustOrderNr)
  447. }
  448. // 示例:LIN+++2992888:IN'
  449. // 说明:LIN=line item +++ Part number : IN= Buyers item number
  450. func (lin *LIN) Parse(parseString string) (err error) {
  451. var (
  452. kvlist []string
  453. kv3 []string
  454. )
  455. // 输入为空,返回错误
  456. if strings.TrimSpace(parseString) == "" {
  457. return errors.New("LIN: parse string is empty!")
  458. }
  459. // 基于+分隔符来解析字符串
  460. kvlist = strings.Split(parseString, "+")
  461. kv3 = strings.Split(kvlist[3], ":")
  462. if len(kv3) < 1 {
  463. return errors.New("LIN: kv3 value length less than 1, failed to parse!")
  464. }
  465. // 填充值
  466. lin.PartNr = kv3[0] // 零件号
  467. lin.ParseString = parseString
  468. // 校验关键字段是否为空
  469. if strings.TrimSpace(lin.PartNr) == "" {
  470. return errors.New("LIN: PartNr is empty!")
  471. }
  472. return
  473. }
  474. func (lin *LIN) Print() {
  475. fmt.Println("LIN | PartNr:", lin.PartNr)
  476. }
  477. // 示例:PIA+1+11:EC'
  478. // 说明:PIA=Additional product ID + 1 = Product + Additional Identificaiton – E.g. 00, 01, 02… : EC=engineering change level
  479. func (pia *PIA) Parse(parseString string) (err error) {
  480. var (
  481. kvlist []string
  482. kv2 []string
  483. )
  484. // 输入为空,返回错误
  485. if strings.TrimSpace(parseString) == "" {
  486. return errors.New("PIA: parse string is empty!")
  487. }
  488. // 基于+分隔符来解析字符串
  489. kvlist = strings.Split(parseString, "+")
  490. kv2 = strings.Split(kvlist[2], ":")
  491. if len(kv2) < 2 {
  492. return errors.New("PIA: kv2 value length less than 2, failed to parse!")
  493. }
  494. // 填充值
  495. pia.Ai = kv2[0] // 零件版本号
  496. pia.ChangeReason = kv2[1]
  497. pia.ParseString = parseString
  498. // 校验关键字段是否为空
  499. if strings.TrimSpace(pia.Ai) == "" {
  500. return errors.New("PIA: Part AI is empty!")
  501. }
  502. return
  503. }
  504. func (pia *PIA) Print() {
  505. fmt.Println("PIA | AI:", pia.Ai)
  506. }
  507. // 示例:QTY+131:1000'
  508. // 说明:QTY=Quantity + 131=Quantity unit in pieces : Quantity including 3 decimal places without dot (1000=1 2000=2)
  509. func (qty *QTY) Parse(parseString string) (err error) {
  510. var (
  511. kvlist []string
  512. kv1 []string
  513. )
  514. // 输入为空,返回错误
  515. if strings.TrimSpace(parseString) == "" {
  516. return errors.New("QTY: parse string is empty!")
  517. }
  518. // 基于+分隔符来解析字符串
  519. kvlist = strings.Split(parseString, "+")
  520. kv1 = strings.Split(kvlist[1], ":")
  521. if len(kv1) < 2 {
  522. return errors.New("QTY: kv1 value length less than 2, failed to parse!")
  523. }
  524. // 填充值
  525. if qty.QtyType, err = strconv.Atoi(kv1[0]); err != nil {
  526. return errors.New("QTY: Failed to get qty type!")
  527. } // 零件版本号
  528. if qty.OriQty, err = strconv.Atoi(kv1[1]); err != nil {
  529. return errors.New("QTY: Failed to get original qty!")
  530. }
  531. qty.Qty = qty.OriQty / 1000
  532. return
  533. }
  534. func (qty *QTY) Print() {
  535. fmt.Println("QTY | Qty:", qty.Qty)
  536. }
  537. // 示例:UNT+21+1494012057'
  538. // 说明:Message Trailer + Number of segments + Message Reference Number like UNH
  539. func (unt *UNT) Parse(parseString string) (err error) {
  540. var (
  541. kvlist []string
  542. )
  543. // 输入为空,返回错误
  544. if strings.TrimSpace(parseString) == "" {
  545. return errors.New("UNT: parse string is empty!")
  546. }
  547. // 基于+分隔符来解析字符串
  548. kvlist = strings.Split(parseString, "+")
  549. // 填充值
  550. if unt.DataRows, err = strconv.Atoi(kvlist[1]); err != nil {
  551. return errors.New("UNT: Failed to get data rows!")
  552. }
  553. unt.MsgId = kvlist[2]
  554. unt.ParseString = parseString
  555. // 校验关键字段是否为空
  556. if strings.TrimSpace(unt.MsgId) == "" {
  557. return errors.New("UNT: MsgId is empty!")
  558. }
  559. return
  560. }
  561. func (unt *UNT) Print() {
  562. fmt.Println("UNT | MsgId:", unt.MsgId, " | DataRows:", unt.DataRows)
  563. }
  564. // 示例:UNZ+1+149401140123'
  565. // 说明:End of message + 1 + Transmission Number like UNB
  566. func (unz *UNZ) Parse(parseString string) (err error) {
  567. var (
  568. kvlist []string
  569. )
  570. // 输入为空,返回错误
  571. if strings.TrimSpace(parseString) == "" {
  572. return errors.New("UNZ: parse string is empty!")
  573. }
  574. // 基于+分隔符来解析字符串
  575. kvlist = strings.Split(parseString, "+")
  576. // 填充值
  577. if unz.MsgCount, err = strconv.Atoi(kvlist[1]); err != nil {
  578. return errors.New("UNZ: Failed to get message count!")
  579. }
  580. unz.MsgRefId = kvlist[2]
  581. unz.ParseString = parseString
  582. // 校验关键字段是否为空
  583. if strings.TrimSpace(unz.MsgRefId) == "" {
  584. return errors.New("UNZ: MsgRefId is empty!")
  585. }
  586. return
  587. }
  588. func (unz *UNZ) Print() {
  589. fmt.Println("UNZ | MsgRefId:", unz.MsgRefId, " | MsgCount:", unz.MsgCount)
  590. }