package seq
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
"io/ioutil"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/service"
|
|
"os"
|
|
"regexp"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// 测试SEQ文件解析和保存
|
|
func TestParseSeqNew(t *testing.T) {
|
|
var (
|
|
connstring string
|
|
err error
|
|
projtab db.Me_project
|
|
projtablst []db.Me_project
|
|
seqland SeqLandData
|
|
seqProj service.SeqProject
|
|
rd []os.FileInfo
|
|
fi os.FileInfo
|
|
edi_file string
|
|
matched bool
|
|
)
|
|
|
|
// 连接数据库
|
|
connstring = fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;port=%d;encrypt=disable",
|
|
`localhost`, "lapp", "123fis", "SJA_APS", 1433)
|
|
if err = db.InitMssqlDb(connstring); err != nil {
|
|
t.Errorf("Failed to connect db due to: %v", err)
|
|
return
|
|
}
|
|
defer db.G_DbEngine.Close()
|
|
|
|
projtab = db.Me_project{}
|
|
if projtablst, err = projtab.GetAllActive(); err != nil {
|
|
t.Errorf("Failed to get project list!")
|
|
return
|
|
}
|
|
|
|
for i, _ := range projtablst {
|
|
seqProj = service.SeqProject{}
|
|
seqProj.Projecttab = projtablst[i]
|
|
seqProj.Projectid = projtablst[i].Projectid
|
|
fmt.Println("Ready to load data for project:", projtablst[i].Projectid)
|
|
// 读取文件夹内的文件并解析
|
|
if rd, err = ioutil.ReadDir(seqProj.Projecttab.Seq_folder + "/inbox"); err != nil {
|
|
return
|
|
}
|
|
for _, fi = range rd {
|
|
if fi.IsDir() {
|
|
continue
|
|
}
|
|
|
|
edi_file = seqProj.Projecttab.Seq_folder + "/inbox" + "/" + fi.Name()
|
|
|
|
// 判断文件的合规性
|
|
if matched, err = regexp.MatchString(seqProj.Projecttab.Seq_filename_regexp, fi.Name()); err != nil {
|
|
t.Errorf("Failed to match EDI file name: %s due to: %v", fi.Name(), err)
|
|
return
|
|
}
|
|
if !matched {
|
|
t.Errorf("The specified EDI file: %s doesn't match the required name specification!", fi.Name())
|
|
os.Rename(edi_file, seqProj.Projecttab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
return
|
|
}
|
|
|
|
// 解析SEQ文件到字典
|
|
fmt.Println("Ready to read tod data......")
|
|
seqland = SeqLandData{}
|
|
seqland.Projnr = projtablst[i].Projectid
|
|
seqland.Edifile = edi_file
|
|
if err = seqland.ReadSeqData(edi_file); err != nil {
|
|
t.Errorf("Failed to parse SEQ file due to: %v", err)
|
|
os.Rename(edi_file, seqProj.Projecttab.Seq_folder+"/errbox"+"/"+fi.Name())
|
|
return
|
|
}
|
|
|
|
// 保存SEQ字典到SEQ的临时缓存表
|
|
if err = seqland.SaveSeqData(); err != nil {
|
|
t.Errorf("Failed to save SEQ parse result due to: %v", err)
|
|
return
|
|
}
|
|
|
|
// 将文件移到outbox
|
|
os.Rename(edi_file, seqProj.Projecttab.Seq_folder+"/outbox"+"/"+fi.Name())
|
|
}
|
|
}
|
|
}
|
|
|
|
// 解析并读取SEQ
|
|
func TestParseSeqOrder(t *testing.T) {
|
|
var (
|
|
connstring string
|
|
err error
|
|
i, j,prevseq int
|
|
projtab db.Me_project
|
|
projtablst []db.Me_project
|
|
seqProj service.SeqProject
|
|
seqlandtab db.Pln_seqdata_landing
|
|
seqlandtablst []db.Pln_seqdata_landing
|
|
cotab db.Pln_custorder
|
|
bl_co service.BL_CustOrder
|
|
bl_ordmsg service.BL_Ordmsg
|
|
ok, exist bool
|
|
session *xorm.Session
|
|
)
|
|
|
|
// 连接数据库
|
|
connstring = fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;port=%d;encrypt=disable",
|
|
`localhost`, "lapp", "123fis", "SJA_APS", 1433)
|
|
if err = db.InitMssqlDb(connstring); err != nil {
|
|
t.Errorf("Failed to connect db due to: %v", err)
|
|
return
|
|
}
|
|
defer db.G_DbEngine.Close()
|
|
|
|
projtab = db.Me_project{}
|
|
if projtablst, err = projtab.GetAllActive(); err != nil {
|
|
t.Errorf("Failed to get project list!")
|
|
return
|
|
}
|
|
|
|
for i, _ = range projtablst {
|
|
seqProj = service.SeqProject{}
|
|
seqProj.Projecttab = projtablst[i]
|
|
seqProj.Projectid = projtablst[i].Projectid
|
|
fmt.Println("Ready to load data for project:", projtablst[i].Projectid)
|
|
|
|
// 加载项目的二级物料主数据
|
|
if err = seqProj.LoadMaterialData(); err != nil {
|
|
t.Errorf("Failed to Load material data due to: %v", err)
|
|
return
|
|
}
|
|
// 加载BOM主数据
|
|
if err = seqProj.LoadBomData(); err != nil {
|
|
t.Errorf("Failed to load bom data due to: %v", err)
|
|
return
|
|
}
|
|
|
|
// 读取SEQ解析用主数据
|
|
seqlandtab = db.Pln_seqdata_landing{Projnr: seqProj.Projectid}
|
|
if seqlandtablst, err = seqlandtab.GetUnparsedLandingData(); err != nil {
|
|
t.Errorf("Failed to GetUnparsedLandingData due to: %v", err)
|
|
return
|
|
}
|
|
|
|
// 读取SEQ的LandingData
|
|
for j, _ = range seqlandtablst {
|
|
// 初始化客户订单对象并获取客户订单头,如果不存在则返回
|
|
cotab = db.Pln_custorder{Projnr: seqlandtablst[j].Projnr, Oemordernr: seqlandtablst[j].Oemordernr, Partfamilyid: seqlandtablst[j].Partfamilyid}
|
|
if exist, cotab, err = cotab.GetByOemOrderNr(); err != nil {
|
|
t.Errorf("Failed to get custorder for oemorder %s due to: %v", seqlandtablst[j].Oemordernr, err)
|
|
return
|
|
}
|
|
if exist {
|
|
bl_co = service.BL_CustOrder{}
|
|
bl_co.Custordertab = cotab
|
|
bl_co.Custordernr = cotab.Custordernr
|
|
bl_co.Partfamilyid = cotab.Partfamilyid
|
|
bl_co.Projnr = cotab.Projnr
|
|
bl_co.SeqType = seqlandtablst[j].Seqmode
|
|
bl_co.Oemordernr = seqlandtablst[j].Oemordernr
|
|
} else {
|
|
fmt.Println(fmt.Sprintf("客户订单%s不存在!",seqlandtablst[j].Oemordernr))
|
|
continue
|
|
}
|
|
|
|
// 获取客户订单完整数据(客户订单头、解析的零件和属性、生产订单列表)
|
|
if err = bl_co.GetFullData(); err != nil {
|
|
t.Errorf("Failed to get full data for custorder %s due to: %v", bl_co.Custordernr, err)
|
|
return
|
|
}
|
|
// 验证客户订单状态是否满足更新条件
|
|
if bl_co.Custordertab.Handlestatus != common.CO_PARSE_STATUS_OK {
|
|
continue
|
|
}
|
|
// 判断订单状态,如果是>=26,则跳出循环
|
|
if bl_co.Custordertab.Status >= common.CO_STATUS_RELEASED {
|
|
// 客户订单状态不允许更新,设置解析状态为9
|
|
seqlandtablst[j].Parsed = common.EDI_PARSE_ERROR
|
|
seqlandtablst[j].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
fields := []string{"parsed", "lastmodif"}
|
|
if err = seqlandtablst[j].UpdateFieldsWithoutSession(fields); err != nil {
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
|
|
// 校验客户订单的OEMSEQ是否连续(基于零件族获取最大的已计划的客户订单的SEQ)
|
|
if bl_co.Custordertab.Orderinfo != "TCAR" && seqlandtablst[j].Oemseq < 9999999999 && seqProj.Projecttab.Seq_verify_sequence > 0 && seqProj.IsPartFamilyNeedToContinue(bl_co.Custordertab.Partfamilyid) {
|
|
// 读取项目各零件族最大的OEMSEQ号
|
|
if err = seqProj.GetPartFamilyMaxOemseq(); err != nil {
|
|
t.Errorf("加载项目零件族最大OEMSEQ号失败: %v", err)
|
|
return
|
|
}
|
|
if prevseq, ok = seqProj.Pfseqdict[bl_co.Custordertab.Partfamilyid]; !ok {
|
|
t.Errorf("获取零件族%s 最大OEMSEQ失败: %v", bl_co.Custordertab.Partfamilyid, err)
|
|
return
|
|
}
|
|
if prevseq > 0 && ( prevseq +1 != common.ValueToInt(seqlandtablst[j].Oemseq, 0)) {
|
|
fmt.Println(fmt.Sprintf("当前零件族%s的最大OEMSEQ%d,与SEQ订单%s的排序%d不连续!",bl_co.Custordertab.Partfamilyid,
|
|
prevseq,seqlandtablst[j].Oemordernr,common.ValueToInt(seqlandtablst[j].Oemseq,0) ))
|
|
continue
|
|
}
|
|
}
|
|
|
|
// 更新客户订单的SEQ信息和状态(设置Preschedseq)
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 基于SEQ保存客户订单版本信息(用于追溯)
|
|
if err = bl_co.SaveSeqCOV(seqlandtablst[j]); err != nil {
|
|
t.Errorf("Failed to insert SEQ cov data for custorder %s due to: %v", bl_co.Custordernr, err)
|
|
session.Rollback()
|
|
session.Close()
|
|
return
|
|
}
|
|
|
|
// 将SEQ信息更新到对应的客户订单和生产订单
|
|
if err = bl_co.UpdateSEQData(seqlandtablst[j]); err != nil {
|
|
t.Errorf("Failed to update SEQ data for custorder %s due to: %v", bl_co.Custordernr, err)
|
|
session.Rollback()
|
|
session.Close()
|
|
return
|
|
}
|
|
|
|
// 创建OEM订单消息用于Carmodel的解析
|
|
bl_ordmsg = service.BL_Ordmsg{MsgType: common.MSG_TYPE_CARMODEL, MsgEvent: common.MSG_EVENT_NEW, MsgObjid: bl_co.Oemordernr, MsgcPara1: bl_co.Projnr}
|
|
if err = bl_ordmsg.CreateForOemorderToParseCarmodel(session); err != nil {
|
|
t.Errorf("为客户订单 %s 创建车型解析消息失败: %v", bl_co.Custordernr, err)
|
|
session.Rollback()
|
|
session.Close()
|
|
return
|
|
}
|
|
|
|
// 创建客户订单计算二级需求的消息
|
|
bl_ordmsg = service.BL_Ordmsg{MsgType: common.MSG_TYPE_DEMAND, MsgEvent: common.MSG_EVENT_NEW, MsgObjid: bl_co.Custordernr, MsgcPara1: bl_co.Projnr}
|
|
if err = bl_ordmsg.Create(session); err != nil {
|
|
t.Errorf("为客户订单 %s 创建二级需求消息失败: %v", bl_co.Custordernr, err)
|
|
session.Rollback()
|
|
session.Close()
|
|
return
|
|
}
|
|
|
|
// 更新解析记录的状态为已解析
|
|
seqlandtablst[j].Parsed = common.EDI_PARSE_YES
|
|
seqlandtablst[j].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
fields := []string{"parsed", "lastmodif"}
|
|
if err = seqlandtablst[j].UpdateFields(session, fields); err != nil {
|
|
t.Errorf("Failed to close seqlandtab for custorder %s due to: %v", bl_co.Custordernr, err)
|
|
session.Rollback()
|
|
session.Close()
|
|
return
|
|
}
|
|
|
|
session.Commit()
|
|
session.Close()
|
|
}
|
|
|
|
}
|
|
}
|