package msg
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/glog"
|
|
"leit.com/leit_seat_aps/service"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// 读取消息并遍历
|
|
// 获取表单主数据和对应模板
|
|
// 匹配模板生成打印头和明细
|
|
|
|
// 解析开口的打印消息
|
|
func ParseOpenPrintMsg(pe *service.BL_PrintEngine) (err error) {
|
|
var (
|
|
bl_ordmsg service.BL_Ordmsg
|
|
ordmsgtab db.Order_msg
|
|
ordmsgtablst []db.Order_msg
|
|
pickordtab db.Pln_pickorder
|
|
packordtab db.Jit_packorder
|
|
shipordtab db.Jit_shiporder
|
|
bbaasntab db.Jit_bbaasn
|
|
i int
|
|
msgtypes []string
|
|
session *xorm.Session
|
|
)
|
|
|
|
ordmsgtab = db.Order_msg{}
|
|
msgtypes = []string{"PICK", "PACK", "SHIP", "BBAASN"}
|
|
if ordmsgtablst, err = ordmsgtab.GetOpenPrintMessages(msgtypes); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
fmt.Println("加载:", len(ordmsgtablst), "条订单消息!")
|
|
for i = 0; i < len(ordmsgtablst); i++ {
|
|
bl_ordmsg = service.BL_Ordmsg{MsgType: ordmsgtablst[i].Msgtype, MsgObjid: ordmsgtablst[i].Msgobjid, MsgEvent: ordmsgtablst[i].Msgevent}
|
|
bl_ordmsg.Ordmsgtab = ordmsgtablst[i]
|
|
|
|
switch bl_ordmsg.MsgType {
|
|
case common.MSG_TYPE_PICK:
|
|
// 获取拣料单,基于打印模板生成打印数据
|
|
pickordtab = db.Pln_pickorder{Pickorderid: ordmsgtablst[i].Msgobjid}
|
|
if pickordtab, err = pickordtab.SelectOne(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
return
|
|
}
|
|
if err = bl_ordmsg.GeneratePrintDataForPickOrder(session, pickordtab, pe); err != nil {
|
|
session.Rollback()
|
|
session.Close()
|
|
// 更新订单消息的出错状态和出错消息
|
|
if err = bl_ordmsg.Pending(err.Error()); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
} else {
|
|
session.Commit()
|
|
session.Close()
|
|
// 关闭订单消息
|
|
if err = bl_ordmsg.Close(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
case common.MSG_TYPE_PACK:
|
|
// 获取包装单,基于打印模板生成打印数据
|
|
packordtab = db.Jit_packorder{Finr: db.G_FINR, Packorderid: ordmsgtablst[i].Msgobjid}
|
|
if packordtab, err = packordtab.SelectOne(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
if err = bl_ordmsg.GeneratePrintDataForPackOrder(session, packordtab, pe); err != nil {
|
|
session.Rollback()
|
|
session.Close()
|
|
// 更新订单消息的出错状态和出错消息
|
|
if err = bl_ordmsg.Pending(err.Error()); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
} else {
|
|
session.Commit()
|
|
session.Close()
|
|
// 关闭订单消息
|
|
if err = bl_ordmsg.Close(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
case common.MSG_TYPE_SHIP:
|
|
// 获取发运单,基于打印模板生成打印数据
|
|
shipordtab = db.Jit_shiporder{Shiporderid: ordmsgtablst[i].Msgobjid}
|
|
if shipordtab, err = shipordtab.SelectOne(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
if err = bl_ordmsg.GeneratePrintDataForShipOrder(session, shipordtab, pe); err != nil {
|
|
session.Rollback()
|
|
session.Close()
|
|
// 更新订单消息的出错状态和出错消息
|
|
if err = bl_ordmsg.Pending(err.Error()); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
} else {
|
|
session.Commit()
|
|
session.Close()
|
|
// 关闭订单消息
|
|
if err = bl_ordmsg.Close(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
case common.MSG_TYPE_BBAASN:
|
|
// 获取BBA ASN,基于打印模板生成打印数据
|
|
bbaasntab = db.Jit_bbaasn{Asn: ordmsgtablst[i].Msgobjid}
|
|
if bbaasntab, err = bbaasntab.SelectOne(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
if err = bl_ordmsg.GeneratePrintDataForBbaasn(session, bbaasntab, pe); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
session.Rollback()
|
|
session.Close()
|
|
// 更新订单消息的出错状态和出错消息
|
|
if err = bl_ordmsg.Pending(err.Error()); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
} else {
|
|
session.Commit()
|
|
session.Close()
|
|
// 关闭订单消息
|
|
if err = bl_ordmsg.Close(); err != nil {
|
|
glog.InfoExtln("Msg解析", "解析打印消息失败:", err)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 读取项目的发运单,将每个发运单按零件族分别生成独立的ASN文件,输出到指定目录
|
|
func ParseShipOrderMsg() (err error) {
|
|
var (
|
|
ordmsgtab db.Order_msg
|
|
ordmsgtablst []db.Order_msg
|
|
bl_ordmsg service.BL_Ordmsg
|
|
shipordtab db.Jit_shiporder
|
|
projtab db.Me_project
|
|
packordtab db.Jit_packorder
|
|
vdatalst []db.VCustorderPackorder
|
|
pfdict map[string]ASN_ARD_PF
|
|
asnsnr string
|
|
asnardpf ASN_ARD_PF
|
|
i, j, k, m int
|
|
ok, found bool
|
|
sgtab db.Me_supplygroup
|
|
sglst []db.Me_supplygroup
|
|
sgdict map[string]db.Me_supplygroup
|
|
pfid string
|
|
)
|
|
|
|
// 查询发运单消息
|
|
ordmsgtab = db.Order_msg{}
|
|
if ordmsgtablst, err = ordmsgtab.GetShipCloseMessages(); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
fmt.Println("加载:", len(ordmsgtablst), "条发运单消息!")
|
|
|
|
// 遍历发运消息
|
|
for i = 0; i < len(ordmsgtablst); i++ {
|
|
bl_ordmsg = service.BL_Ordmsg{MsgType: ordmsgtablst[i].Msgtype, MsgObjid: ordmsgtablst[i].Msgobjid, MsgEvent: ordmsgtablst[i].Msgevent}
|
|
bl_ordmsg.Ordmsgtab = ordmsgtablst[i]
|
|
// 查询发运单
|
|
shipordtab = db.Jit_shiporder{Finr: db.G_FINR, Shiporderid: ordmsgtablst[i].Msgobjid}
|
|
if shipordtab, err = shipordtab.SelectOne(); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
// 查询项目
|
|
projtab = db.Me_project{Finr: db.G_FINR, Projectid: shipordtab.Projnr}
|
|
if projtab, err = projtab.SelectOne(); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
projtab.Clipped()
|
|
|
|
// 查询项目的供应组
|
|
sgtab = db.Me_supplygroup{}
|
|
if sglst, err = sgtab.GetProjectAll(projtab.Projectid); err != nil {
|
|
glog.InfoExtln("BBAASN", "获取项目供应组失败: ", err)
|
|
return
|
|
}
|
|
sgdict = make(map[string]db.Me_supplygroup)
|
|
for j = 0; j < len(sglst); j++ {
|
|
sgdict[sglst[j].Supplygroupid] = sglst[j]
|
|
}
|
|
|
|
// 初始化缓存变量
|
|
pfdict = make(map[string]ASN_ARD_PF)
|
|
|
|
// 遍历发运单中的所有零件订单信息,并按零件族分类
|
|
for j = 0; j < len(shipordtab.Itemlst); j++ {
|
|
// 获取零件族ID
|
|
for k = 0; k < len(shipordtab.Itemlst[j].Itemlst); k++ {
|
|
packordtab = db.Jit_packorder{}
|
|
if vdatalst, err = packordtab.GetFullDataByPackorder(shipordtab.Itemlst[j].Itemlst[k].Packorderid); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
found = false
|
|
for m = 0; m < len(vdatalst); m++ {
|
|
if sgtab, ok = sgdict[vdatalst[m].Pln_workorder.Supplygroupid]; ok {
|
|
if sgtab.Sgtype != common.SG_TYPE_NORMAL {
|
|
continue
|
|
}
|
|
pfid = vdatalst[m].Pln_custorder.Partfamilyid
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if found {
|
|
break
|
|
}
|
|
}
|
|
|
|
for k = 0; k < len(shipordtab.Itemlst[j].Itemlst); k++ {
|
|
// 获取包装单内容
|
|
packordtab = db.Jit_packorder{}
|
|
if vdatalst, err = packordtab.GetFullDataByPackorder(shipordtab.Itemlst[j].Itemlst[k].Packorderid); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
// 遍历包装单中的每一项
|
|
for m = 0; m < len(vdatalst); m++ {
|
|
if sgtab, ok = sgdict[vdatalst[m].Pln_workorder.Supplygroupid]; ok {
|
|
if sgtab.Sgtype != common.SG_TYPE_NORMAL {
|
|
vdatalst[m].Pln_workorder.Supplygroupid = ""
|
|
}
|
|
}
|
|
|
|
if asnardpf, ok = pfdict[pfid]; !ok {
|
|
asnardpf = ASN_ARD_PF{Pfid: pfid}
|
|
asnardpf.DataList = []db.VCustorderPackorder{}
|
|
}
|
|
asnardpf.DataList = append(asnardpf.DataList, vdatalst[m])
|
|
pfdict[asnardpf.Pfid] = asnardpf
|
|
}
|
|
}
|
|
}
|
|
if shipordtab.Shiptype != "REO" {
|
|
// 获取ASN流水号
|
|
if asnsnr, err = service.SN_GetNextSnr(projtab.Asn_snr); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
}
|
|
// 按零件族生成ASN文件
|
|
for _, asnardpf = range pfdict {
|
|
if err = GenAsnFileForShipOrderByPartFamily(&asnardpf, shipordtab, asnsnr); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
// 关闭发运单消息
|
|
if err = bl_ordmsg.Close(); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 将发运单基于零件族归集的发运项生成对应的ASN文件,并放到项目指定的文件夹中
|
|
func GenAsnFileForShipOrderByPartFamily(asnardpf *ASN_ARD_PF, shipordtab db.Jit_shiporder, asnsnr string) (err error) {
|
|
var (
|
|
stdeftab db.Stdeftab
|
|
stdeftablst []db.Stdeftab
|
|
i int
|
|
mapval, bolnr string
|
|
ae ASN_EDI
|
|
ard ASN_ARD
|
|
asnnr string
|
|
asnfile string
|
|
f *os.File
|
|
projtab db.Me_project
|
|
vdata db.VCustorderPackorder
|
|
bbaasntab db.Jit_bbaasn
|
|
bbaasnitemtab db.Jit_bbaasn_itemlst
|
|
bbaasntmptab db.Jit_bbaasntemplate
|
|
session *xorm.Session
|
|
bl_asnmsg service.BL_Ordmsg
|
|
kvmap, binmap map[string]string
|
|
key,val string
|
|
ok bool
|
|
)
|
|
|
|
// 查询项目
|
|
projtab = db.Me_project{Finr: db.G_FINR, Projectid: shipordtab.Projnr}
|
|
if projtab, err = projtab.SelectOne(); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
projtab.Clipped()
|
|
|
|
mapval = ""
|
|
stdeftab = db.Stdeftab{}
|
|
if stdeftablst, err = stdeftab.GetStandardList(projtab.Asn_pfmapper); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
for i = 0; i < len(stdeftablst); i++ {
|
|
if stdeftablst[i].Statid == asnardpf.Pfid {
|
|
mapval = stdeftablst[i].Bez
|
|
break
|
|
}
|
|
}
|
|
// 获取项目零件族的ASN模板
|
|
bbaasntmptab = db.Jit_bbaasntemplate{}
|
|
if bbaasntmptab, err = bbaasntmptab.SelectByProjPartfamily(projtab.Projectid, asnardpf.Pfid); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
// 基于发运单类型获取流水号
|
|
if shipordtab.Shiptype == "REO" {
|
|
if asnsnr, err = service.SN_GetNextSnr(bbaasntmptab.Asnsnr); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析Reorder发运单消息失败: ", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
// 组合流水号
|
|
asnnr = asnsnr + mapval
|
|
|
|
// 初始化
|
|
ae = ASN_EDI{}
|
|
ae.unb.Read(asnnr)
|
|
ae.unh.Read(asnnr)
|
|
ae.mid.Read(asnnr)
|
|
ae.cdt.Read()
|
|
ae.csg.Read()
|
|
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
session.Begin()
|
|
|
|
// 初始化ASN表记录
|
|
bbaasntab = db.Jit_bbaasn{Finr: db.G_FINR, Asn: ae.mid.Field1, Projnr: projtab.Projectid, Partfamilyid: asnardpf.Pfid}
|
|
bbaasntab.Itemlst = []db.Jit_bbaasn_itemlst{}
|
|
|
|
// 生成ASN记录
|
|
bbaasntab.Asntemplateid = bbaasntmptab.Asntemplateid
|
|
bbaasntab.Shiporderid = shipordtab.Shiporderid
|
|
bbaasntab.Asndate = common.Date(time.Now().Unix(), "YYYYMMDD")
|
|
bbaasntab.Asntime = common.Date(time.Now().Unix(), "HHmmss")
|
|
|
|
// 基于设置获取BOL号
|
|
if strings.TrimSpace(bbaasntmptab.Bolsnr) != "" {
|
|
if bolnr, err = service.SN_GetNextSnrBySession(bbaasntmptab.Bolsnr, session); err != nil {
|
|
session.Rollback()
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
} else {
|
|
if bolnr, err = service.SN_GetNextSnrBySession(strings.TrimSpace(projtab.Projectid)+"_BOL", session); err != nil {
|
|
session.Rollback()
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
bbaasntab.Bol = bolnr
|
|
bbaasntab.Shipto = bbaasntmptab.Shipto
|
|
|
|
// 生成ARD数据行
|
|
kvmap = make(map[string]string)
|
|
binmap = make(map[string]string)
|
|
for i, vdata = range asnardpf.DataList {
|
|
if common.ValueIsEmpty(strings.TrimSpace(vdata.Pln_custorder.Oemordernr)) {
|
|
fmt.Printf("vdata.Pln_custorder.Oemordernr:%v", vdata.Pln_custorder.Oemordernr)
|
|
continue
|
|
}
|
|
key = strconv.Itoa(vdata.Pln_custorder.Calloffnr) + strings.TrimSpace(vdata.Pln_custorder.Oemordernr) + strings.TrimSpace(asnardpf.Pfid)
|
|
if strings.TrimSpace(vdata.Pln_workorder.Partfamilyid) == strings.TrimSpace(asnardpf.Pfid) {
|
|
if _, ok = kvmap[key]; !ok {
|
|
kvmap[key] = key
|
|
ard = ASN_ARD{}
|
|
|
|
if shipordtab.Shiptype == "REO" {
|
|
val = vdata.Pln_workorder.Orderinfo
|
|
} else {
|
|
val = strconv.Itoa(vdata.Pln_custorder.Calloffnr)
|
|
}
|
|
|
|
ard.Read(vdata.Pln_custorder.Partfamilyid,
|
|
vdata.Pln_workorder.Supplygroupid,
|
|
val,
|
|
vdata.Pln_custorder.Oemordernr)
|
|
ae.ardlst = append(ae.ardlst, ard)
|
|
}
|
|
}
|
|
|
|
// ASN数据行
|
|
bbaasnitemtab = db.Jit_bbaasn_itemlst{Finr: db.G_FINR, Asn: ae.mid.Field1, Pos: i + 1}
|
|
if shipordtab.Shiptype == "REO" {
|
|
bbaasnitemtab.Calloffnr, _ = strconv.Atoi(vdata.Pln_workorder.Orderinfo)
|
|
} else {
|
|
bbaasnitemtab.Calloffnr = vdata.Pln_custorder.Calloffnr
|
|
}
|
|
bbaasnitemtab.Modelcode = vdata.Pln_custorder.Projnr
|
|
bbaasnitemtab.Oemordernr = vdata.Pln_custorder.Oemordernr
|
|
bbaasnitemtab.Partfamilyid = asnardpf.Pfid
|
|
bbaasnitemtab.Supplygroupid = vdata.Pln_workorder.Supplygroupid
|
|
bbaasnitemtab.Packorderid = vdata.Jit_packorder.Packorderid
|
|
bbaasnitemtab.Swet = vdata.Pln_custorder.Calloffswet
|
|
bbaasnitemtab.Binnr = vdata.Jit_packorder.Boxsn
|
|
bbaasnitemtab.Lastuser = "bbaasn_service"
|
|
bbaasnitemtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
bbaasnitemtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
|
|
bbaasntab.Itemlst = append(bbaasntab.Itemlst, bbaasnitemtab)
|
|
// 统计包装数
|
|
binmap[bbaasnitemtab.Packorderid] = bbaasnitemtab.Packorderid
|
|
}
|
|
|
|
ae.unt.Read(len(ae.ardlst)+5, asnnr)
|
|
ae.unz.Read(asnnr)
|
|
|
|
bbaasntab.Totalbinqty = len(binmap)
|
|
bbaasntab.Lastuser = "bbaasn_service"
|
|
bbaasntab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
bbaasntab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
|
|
// 保存ASN记录
|
|
if err = bbaasntab.Insert(session); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
// 生成ASN打印消息
|
|
bl_asnmsg = service.BL_Ordmsg{MsgType: common.MSG_TYPE_BBAASN, MsgObjid: bbaasntab.Asn, MsgEvent: common.MSG_EVENT_PRINT}
|
|
if err = bl_asnmsg.Create(session); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
return
|
|
}
|
|
|
|
// 输出到ASN文件
|
|
asnfile = projtab.Asn_file_prefix + asnnr + projtab.Asn_file_type + "_" + common.TimeFormat(time.Now(), "yyyyMMdd") + "_" + common.TimeFormat(time.Now(), "HHmmss") + common.CreateCaptcha()
|
|
glog.InfoExtln("BBAASN", "asnfile: ", asnfile)
|
|
f, err = os.Create(projtab.Asn_folder + "\\" + asnfile)
|
|
if err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
defer f.Close()
|
|
if _, err = f.WriteString(ae.Tostring()); err != nil {
|
|
glog.InfoExtln("BBAASN", "解析发运单消息失败: ", err)
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
session.Commit()
|
|
return
|
|
}
|