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.

539 lines
14 KiB

package tod
import (
"errors"
"fmt"
"leit.com/leit_seat_aps/common"
"strconv"
"strings"
"time"
)
/** TOD文件结构定义,用于TOD文件解析 **/
// TOD 数据交换头
type UNB struct {
Sender string // 发送方
Reciever string // 接收方
MsgTime time.Time // 消息时间
MsgRefId string // 消息参考号
MsgType int // 消息类型:1=生产用
ParseString string // 原始消息数据串
}
// TOD 数据消息头
type UNH struct {
MsgId string // 消息标识ID
MsgType string // 消息类型 DELJIT
MsgTypeVersion string // 消息类型版本号
MsgTypeRelNo string // 消息类型版本释放号
ParseString string // 原始数据串
}
// TOD 数据消息开始
type BGM struct {
MessageType int // 消息类型 30 = TOD / 242 = SEQ
DailyPackageId string // 日数据包ID
ParseString string // 原始数据串
}
// TOD 数据消息日期时间信息
type DTM struct {
DateTimeType int // 137 = 消息日期
DateTimeFormat int // 日期时间格式:203 = CCYYMMDDHHMM
MsgTime time.Time // 消息时间
MsgTimeFormat string // 消息时间格式
ParseString string // 原始数据串
}
// TOD 数据消息名称地址信息
type NAD struct {
Consignee string // 收货人
ConsigneePlant int // 收货厂编号
ParseString string // 原始数据串
}
// TOD 数据消息排序信息
type SEQ struct {
SeqType int // 3=新建;1=变更;2=取消
Dtm DTM // 日期时间
Gir GIR // 订单零件族供应组信息
LinList []LIN // 零件清单
ParseString string // 原始数据串
}
// TOD 数据消息订单、零件族和供应组的识别信息
type GIR struct {
PartFamily string // 零件族
SupplyGroup string // 供应组
CustOrderNr string // 客户订单号
CustOrderType int // 1=生产
ModifyVersion string // 修订版本号
ParseString string // 原始数据串
}
// TOD 数据消息零件信息
type LIN struct {
PartNr string // 零件号
Pia PIA // 零件号版本信息
Qty QTY // 零件数量信息
ParseString string // 原始数据串
}
// TOD 数据消息零件版本信息
type PIA struct {
Ai string // 版本号
ChangeReason string // 变更原因
ParseString string // 原始数据串
}
// TOD 数据消息数量信息
type QTY struct {
QtyType int // 数量类型: 131 = 交付数量
OriQty int // 文件定义数量(*1000)
Qty int // 零件数量 = OriQty / 1000
ParseString string // 原始数据串
}
// TOD 数据消息尾
type UNT struct {
DataRows int // 数据行数,从UNH到UNT总数
MsgId string // 消息标识
ParseString string // 原始数据串
}
// TOD 数据交换结束符
type UNZ struct {
MsgCount int // 消息数
MsgRefId string // 消息参考号
ParseString string // 原始数据串
}
// TOD 消息对象
type TOD struct {
FileName string // TOD文件名
DataRows int // 包含数据行 UNH->UNT
Unb UNB // 数据交换头
Unh UNH // 数据消息头
Bgm BGM // 数据消息开始
Dtm DTM // 数据消息日期时间信息
Nad NAD // 数据消息名称地址信息
SeqList []SEQ // 数据消息的零件族信息:零件、零件族、供应组、数量等信息
Unt UNT // 数据消息尾
Unz UNZ // 数据消息交换结束
}
func (unb *UNB) Parse(parseString string) (err error) {
var (
kvlist []string
kv4 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("UNB: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
if len(kvlist) < 5 {
return errors.New("UNB: Key value length less than 5, failed to parse!")
}
kv4 = strings.Split(kvlist[4], ":")
if len(kv4) < 2 {
return errors.New("UNB: Key4 value length less than 2, failed to parse!")
}
// 填充值
unb.Sender = kvlist[2] // 发送方
unb.Reciever = kvlist[3] // 接收方
if unb.MsgTime, err = common.DateParse(kv4[0]+kv4[1], "ymdHi"); err != nil {
return errors.New("UNB: Failed to get the MsgTime!")
}
unb.MsgRefId = kvlist[5] // 消息参考ID
unb.MsgType, _ = strconv.Atoi(kvlist[11]) // 消息类型
unb.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(unb.Sender) == "" {
return errors.New("UNB: Sender is empty!")
}
if strings.TrimSpace(unb.Reciever) == "" {
return errors.New("UNB: Reciever is empty!")
}
if strings.TrimSpace(unb.MsgRefId) == "" {
return errors.New("UNB: MsgRefId is empty!")
}
return
}
func (unb *UNB) Print() {
fmt.Println("UNB | Sender:", unb.Sender, " | Reciever:", unb.Reciever, " | MsgTime:", unb.MsgTime, " | MsgType:", unb.MsgType, " | MsgRefId:", unb.MsgRefId)
}
func (unh *UNH) Parse(parseString string) (err error) {
var (
kvlist []string
kv2 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("UNH: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv2 = strings.Split(kvlist[2], ":")
if len(kv2) < 3 {
return errors.New("UNH: kv2 value length less than 3, failed to parse!")
}
// 填充值
unh.MsgId = kvlist[1] // 消息ID
unh.MsgType = kv2[0] // 消息类型
unh.MsgTypeVersion = kv2[1]
unh.MsgTypeRelNo = kv2[2]
unh.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(unh.MsgId) == "" {
return errors.New("UNH: MsgId is empty!")
}
if strings.TrimSpace(unh.MsgType) == "" {
return errors.New("UNH: MsgType is empty!")
}
if strings.ToUpper(strings.TrimSpace(unh.MsgType)) != "DELJIT" {
return errors.New("UNH: MsgType is not DELJIT!")
}
return
}
func (unh *UNH) Print() {
fmt.Println("UNH | MsgId:", unh.MsgId, " | MsgType:", unh.MsgType)
}
func (bgm *BGM) Parse(parseString string) (err error) {
var (
kvlist []string
kv1 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("BGM: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv1 = strings.Split(kvlist[1], ":")
if len(kv1) < 3 {
return errors.New("BGM: kv1 value length less than 3, failed to parse!")
}
// 填充值
bgm.MessageType, _ = strconv.Atoi(kv1[0])
bgm.DailyPackageId = kvlist[2] // 日数据包ID
bgm.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(bgm.DailyPackageId) == "" {
return errors.New("BGM: DailyPackageId is empty!")
}
return
}
func (bgm *BGM) Print() {
fmt.Println("BGM | DailyPackageId:", bgm.DailyPackageId)
}
func (dtm *DTM) Parse(parseString string) (err error) {
var (
kvlist []string
kv1 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("DTM: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv1 = strings.Split(kvlist[1], ":")
if len(kv1) < 3 {
return errors.New("DTM: kv1 value length less than 3, failed to parse!")
}
// 填充值
dtm.DateTimeType, _ = strconv.Atoi(kv1[0]) // 时间格式
dtm.DateTimeFormat, _ = strconv.Atoi(kv1[2])
dtm.MsgTimeFormat = common.GetTimeFormatByType(dtm.DateTimeFormat)
if dtm.MsgTime, err = common.DateParse(kv1[1], dtm.MsgTimeFormat); err != nil {
return errors.New("DTM: Failed to get the MsgTime!")
}
dtm.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(dtm.MsgTimeFormat) == "" {
return errors.New("DTM: MsgTimeFormat is empty!")
}
return
}
func (dtm *DTM) Print() {
fmt.Println("DTM | DateTimeType:", dtm.DateTimeType, " | DateTimeFormat:", dtm.DateTimeFormat, " | MsgTime:", dtm.MsgTime)
}
func (nad *NAD) Parse(parseString string) (err error) {
var (
kvlist []string
kv2 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("NAD: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv2 = strings.Split(kvlist[2], ":")
if len(kv2) < 1 {
return errors.New("NAD: kv2 value length less than 1, failed to parse!")
}
// 填充值
nad.Consignee = kvlist[1] // 收货人
nad.ConsigneePlant, _ = strconv.Atoi(kv2[0]) // 收货厂编号
nad.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(nad.Consignee) == "" {
return errors.New("NAD: Consignee is empty!")
}
if nad.ConsigneePlant <= 0 {
return errors.New("NAD: ConsigneePlant is not existing!")
}
return
}
func (nad *NAD) Print() {
fmt.Println("NAD | Consignee:", nad.Consignee, " | ConsigneePlant:", nad.ConsigneePlant)
}
func (seq *SEQ) Parse(parseString string) (err error) {
var (
kvlist []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("SEQ: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
// 填充值
seq.SeqType, _ = strconv.Atoi(kvlist[1]) // 3=新建;1=更新;2=取消
seq.ParseString = parseString
// 校验关键字段是否为空
if seq.SeqType < 1 || seq.SeqType > 3 {
return errors.New("SEQ: Unvalid seq type!")
}
return
}
func (seq *SEQ) Print() {
fmt.Println("SEQ | SEQ + ", seq.SeqType)
}
func (gir *GIR) Parse(parseString string) (err error) {
var (
kvlist []string
kv2, kv3, kv4, kv5 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("GIR: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv2 = strings.Split(kvlist[2], ":")
kv3 = strings.Split(kvlist[3], ":")
kv4 = strings.Split(kvlist[4], ":")
kv5 = strings.Split(kvlist[5], ":")
if len(kv2) < 1 || len(kv3) < 1 || len(kv4) < 1 || len(kv5) < 1 {
return errors.New("GIR: kv2/3/4/5 value length less than 1, failed to parse!")
}
// 填充值
gir.PartFamily = kv2[0] // 零件族
gir.SupplyGroup = kv3[0] // 供应组
gir.CustOrderNr = kv4[0] // 客户订单号
if gir.CustOrderType, err = strconv.Atoi(gir.CustOrderNr[:1]); err != nil {
return errors.New("GIR: Failed to get the order type!")
}
gir.ModifyVersion = kv5[0]
gir.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(gir.PartFamily) == "" {
return errors.New("GIR: PartFamily is empty!")
}
if strings.TrimSpace(gir.SupplyGroup) == "" {
return errors.New("GIR: SupplyGroup is empty!")
}
if strings.TrimSpace(gir.CustOrderNr) == "" {
return errors.New("GIR: CustOrderNr is empty!")
}
return
}
func (gir *GIR) Print() {
fmt.Println("GIR | PartFamily:", gir.PartFamily, " | SupplyGroup:", gir.SupplyGroup, " | CustOrderNr:", gir.CustOrderNr)
}
func (lin *LIN) Parse(parseString string) (err error) {
var (
kvlist []string
kv3 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("LIN: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv3 = strings.Split(kvlist[3], ":")
if len(kv3) < 1 {
return errors.New("LIN: kv3 value length less than 1, failed to parse!")
}
// 填充值
lin.PartNr = kv3[0] // 零件号
lin.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(lin.PartNr) == "" {
return errors.New("LIN: PartNr is empty!")
}
return
}
func (lin *LIN) Print() {
return
fmt.Println("LIN | PartNr:", lin.PartNr)
}
func (pia *PIA) Parse(parseString string) (err error) {
var (
kvlist []string
kv2 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("PIA: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv2 = strings.Split(kvlist[2], ":")
if len(kv2) < 2 {
return errors.New("PIA: kv2 value length less than 2, failed to parse!")
}
// 填充值
pia.Ai = kv2[0] // 零件版本号
pia.ChangeReason = kv2[1]
pia.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(pia.Ai) == "" {
return errors.New("PIA: Part AI is empty!")
}
return
}
func (pia *PIA) Print() {
fmt.Println("PIA | AI:", pia.Ai)
}
func (qty *QTY) Parse(parseString string) (err error) {
var (
kvlist []string
kv1 []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("QTY: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
kv1 = strings.Split(kvlist[1], ":")
if len(kv1) < 2 {
return errors.New("QTY: kv1 value length less than 2, failed to parse!")
}
// 填充值
if qty.QtyType, err = strconv.Atoi(kv1[0]); err != nil {
return errors.New("QTY: Failed to get qty type!")
} // 零件版本号
if qty.OriQty, err = strconv.Atoi(kv1[1]); err != nil {
return errors.New("QTY: Failed to get original qty!")
}
qty.Qty = qty.OriQty / 1000
return
}
func (qty *QTY) Print() {
fmt.Println("QTY | Qty:", qty.Qty)
}
func (unt *UNT) Parse(parseString string) (err error) {
var (
kvlist []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("UNT: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
// 填充值
if unt.DataRows, err = strconv.Atoi(kvlist[1]); err != nil {
return errors.New("UNT: Failed to get data rows!")
}
unt.MsgId = kvlist[2]
unt.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(unt.MsgId) == "" {
return errors.New("UNT: MsgId is empty!")
}
return
}
func (unt *UNT) Print() {
fmt.Println("UNT | MsgId:", unt.MsgId, " | DataRows:", unt.DataRows)
}
func (unz *UNZ) Parse(parseString string) (err error) {
var (
kvlist []string
)
// 输入为空,返回错误
if strings.TrimSpace(parseString) == "" {
return errors.New("UNZ: parse string is empty!")
}
// 基于+分隔符来解析字符串
kvlist = strings.Split(parseString, "+")
// 填充值
if unz.MsgCount, err = strconv.Atoi(kvlist[1]); err != nil {
return errors.New("UNZ: Failed to get message count!")
}
unz.MsgRefId = kvlist[2]
unz.ParseString = parseString
// 校验关键字段是否为空
if strings.TrimSpace(unz.MsgRefId) == "" {
return errors.New("UNZ: MsgRefId is empty!")
}
return
}
func (unz *UNZ) Print() {
fmt.Println("UNZ | MsgRefId:", unz.MsgRefId, " | MsgCount:", unz.MsgCount)
}