package asn
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"log"
|
|
"path/filepath"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// 接受Grammer 发过来的ASN
|
|
// SEQ 缓存数据对象定义
|
|
type AsnLandData struct {
|
|
Asnfile string // ASN 文件名
|
|
Asnlandtab db.Jit_asnhead_landing
|
|
}
|
|
|
|
// 加载并解析ASN文件
|
|
func (ald *AsnLandData) ReadAsnData(asnfile string) (err error) {
|
|
var (
|
|
asn ASN
|
|
asnfilename string
|
|
ao ASN_ORDER
|
|
ap ASN_PACKLABEL
|
|
asnitemtab db.Jit_asnitem_landing
|
|
asnordertab db.Jit_asnorder_landing
|
|
)
|
|
|
|
// 解析ASN文件
|
|
asn = ASN{}
|
|
if err = ParseGrammerAsn(asnfile, &asn); err != nil {
|
|
log.Printf("Failed to load ASN file: %s due to: %v", asnfile, err)
|
|
return
|
|
}
|
|
// PrintGrammerAsn(&sequence)
|
|
|
|
// 获取ASN文件名
|
|
_, asnfilename = filepath.Split(asnfile)
|
|
|
|
// 初始化
|
|
ald.Asnfile = asnfilename
|
|
ald.Asnlandtab = db.Jit_asnhead_landing{}
|
|
|
|
// 读取头信息
|
|
ald.Asnlandtab.Tradepartnerid = asn.Separator.TradePartnerId.Content
|
|
ald.Asnlandtab.Senderappid = asn.Separator.SenderAppId.Content
|
|
ald.Asnlandtab.Recieverappid = asn.Separator.RecieverAppId.Content
|
|
ald.Asnlandtab.Doctype = asn.Separator.DocType.Content
|
|
ald.Asnlandtab.Asnnr = asn.Header.AsnNr.Content
|
|
ald.Asnlandtab.Asnfile = asnfilename
|
|
ald.Asnlandtab.Parsed = 0
|
|
ald.Asnlandtab.Asndate = asn.Header.AsnDate.Content
|
|
ald.Asnlandtab.Asntime = asn.Header.AsnTime.Content
|
|
ald.Asnlandtab.Shipdate = asn.Header.ShipDate.Content
|
|
ald.Asnlandtab.Shiptime = asn.Header.ShipTime.Content
|
|
ald.Asnlandtab.Shipfromid = asn.Shipment.ShipFromId.Content
|
|
ald.Asnlandtab.Shiptoid = asn.Shipment.ShipToId.Content
|
|
ald.Asnlandtab.Supplierid = asn.Shipment.SupplierId.Content
|
|
ald.Asnlandtab.Dockcode = asn.Shipment.DockCode.Content
|
|
|
|
// 遍历
|
|
ald.Asnlandtab.Itemlst = []db.Jit_asnitem_landing{}
|
|
for _, ao = range asn.OrderList {
|
|
asnitemtab = db.Jit_asnitem_landing{}
|
|
// 更新零件信息
|
|
asnitemtab.Asnnr = ald.Asnlandtab.Asnnr
|
|
asnitemtab.Partid = ao.CustPartId.Content
|
|
asnitemtab.Partdescr = ao.AsnItem.PartDescr.Content
|
|
asnitemtab.Shipqty, _ = strconv.Atoi(ao.ShipQty.Content)
|
|
asnitemtab.Qtyuom = ao.QtyUom.Content
|
|
asnitemtab.Purchaseordernr = ao.PONr.Content
|
|
|
|
for _, ap = range ao.AsnPackLabellst {
|
|
asnordertab = db.Jit_asnorder_landing{}
|
|
// 更新订单信息
|
|
asnordertab.Asnnr = asnitemtab.Asnnr
|
|
asnordertab.Partid = asnitemtab.Partid
|
|
asnordertab.Ordernr = ap.OrderNr.Content
|
|
asnordertab.Oemordernr = ap.OemOrderNr
|
|
asnordertab.Partfamilyid = ap.PartFamily.Content
|
|
asnordertab.Supplygroupid = ap.SupplyGroup.Content
|
|
asnordertab.Shipqty, _ = strconv.Atoi(ap.ShipQty.Content)
|
|
asnordertab.Swetyear = ap.SwetYear
|
|
|
|
asnitemtab.Orderlst = append(asnitemtab.Orderlst, asnordertab)
|
|
}
|
|
ald.Asnlandtab.Itemlst = append(ald.Asnlandtab.Itemlst, asnitemtab)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 保存解析后的ASN结果到数据库
|
|
func (ald *AsnLandData) SaveAsnData() (err error) {
|
|
var (
|
|
asnitemtab db.Jit_asnitem_landing
|
|
asnordertab db.Jit_asnorder_landing
|
|
asnordercache db.Jit_asnorder_cache
|
|
session *xorm.Session
|
|
flag bool
|
|
)
|
|
|
|
// 遍历每一条SEQ信息,检查是否存在,如果存在则更新它
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 查找ASN如果存在先删除
|
|
if !ald.Asnlandtab.Delelte(session) {
|
|
err = errors.New("删除已有ASN记录失败!")
|
|
return
|
|
}
|
|
// 插入ASN头
|
|
ald.Asnlandtab.Finr = db.G_FINR
|
|
ald.Asnlandtab.Lastuser = "service"
|
|
ald.Asnlandtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = ald.Asnlandtab.Insert(session); err != nil {
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
// 插入ASN零件行
|
|
flag = true
|
|
for _, asnitemtab = range ald.Asnlandtab.Itemlst {
|
|
// 新建
|
|
asnitemtab.Finr = db.G_FINR
|
|
asnitemtab.Lastuser = "service"
|
|
asnitemtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = asnitemtab.Insert(session); err != nil {
|
|
flag = false
|
|
break
|
|
} else {
|
|
for _, asnordertab = range asnitemtab.Orderlst {
|
|
asnordertab.Finr = db.G_FINR
|
|
asnordertab.Lastuser = "service"
|
|
asnordertab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = asnordertab.Insert(session); err != nil {
|
|
flag = false
|
|
break
|
|
}
|
|
//添加缓存
|
|
asnordercache.Finr = db.G_FINR
|
|
asnordercache.Asnnr = asnordertab.Asnnr
|
|
asnordercache.Partid = asnordertab.Partid
|
|
asnordercache.Ordernr = asnordertab.Ordernr
|
|
asnordercache.Oemordernr = asnordertab.Oemordernr
|
|
asnordercache.Shipqty = asnordertab.Shipqty
|
|
asnordercache.Partfamilyid = asnordertab.Partfamilyid
|
|
asnordercache.Supplygroupid = asnordertab.Supplygroupid
|
|
asnordercache.Swetyear = asnordertab.Swetyear
|
|
asnordercache.Flag = 0
|
|
asnordercache.Lastuser = "service"
|
|
asnordercache.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
if err = asnordercache.Insert(session); err != nil {
|
|
flag = false
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if !flag {
|
|
break
|
|
}
|
|
}
|
|
if flag {
|
|
session.Commit()
|
|
} else {
|
|
session.Rollback()
|
|
}
|
|
|
|
return
|
|
}
|