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 }