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.

504 lines
16 KiB

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
}