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.

162 lines
4.7 KiB

package seq
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"
"time"
)
// 从消息表获取 类型为 CARMODEl的开口消息,基于消息对象ID (OEM订单号)解析OEM订单对应的车型
// 解析成功则关闭该消息,并将OEM订单对应的解析车型信息进行记录
func RunCarmodelParser(projnr string) (err error) {
var (
bl_proj service.BL_Project
bl_cm service.BL_Carmodel
bl_ordmsg service.BL_Ordmsg
bl_cmspec service.BL_Carmodel_Spec
msgtab db.Order_msg
msgtablst []db.Order_msg
cotab db.Pln_custorder
cotablst []db.Pln_custorder
cocmvtab db.Pln_custorder_carmodelver
i int
ok, match, isnew, alert bool
cmid, alertinfo string
version int
createtime time.Time
dura time.Duration
session *xorm.Session
)
bl_proj.Projectid = projnr
// 第一步:加载项目的相关数据和已有车型规格
if err = bl_proj.GetCarModelList(); err != nil {
glog.InfoExtln("解析车型", "GetCarModelList is:",err)
return
}
fmt.Println("加载项目:", projnr, "的车型主数据成功!")
glog.InfoExtln("解析车型", "加载项目:",projnr)
// 第二步:加载项目的零件数据
if err = bl_proj.GetPartList(); err != nil {
return
}
fmt.Println("加载项目:", projnr, "的零件主数据成功!")
// 第三步:加载项目的属性数据
if err = bl_proj.GetAttributeList(common.ATCOD_TYPE_PART); err != nil {
return
}
fmt.Println("加载项目:", projnr, "的属性主数据成功!")
fmt.Println("加载项目的开口车型消息......")
msgtab = db.Order_msg{}
if msgtablst, err = msgtab.GetProjectOpenCarmodelMessages(projnr); err != nil {
return
}
for i = 0; i < len(msgtablst); i++ {
// 消息创建时间超过10分钟以上再处理(等客户订单的多个SEQ文件凑齐)
if createtime, err = common.DateParse(msgtablst[i].Credatuz, "YmdHis"); err != nil {
fmt.Println("消息",msgtablst[i].Msgid,"的创建时间无法解析!")
continue
}
dura = time.Now().Sub(createtime)
if dura.Seconds() < 10*60 {
// 只处理创建时间超过10分钟的消息
continue
}
bl_ordmsg = service.BL_Ordmsg{Ordmsgtab: msgtablst[i]}
// 基于消息对象ID获取OEM订单完整数据
cotab = db.Pln_custorder{}
if cotablst, err = cotab.GetDataForCarmodelByOemorder(msgtablst[i].Msgobjid, msgtablst[i].Msg_cpara1); err != nil {
return
}
// 如果客户订单有报错不处理
ok = true
for _, cotab = range cotablst {
if cotab.Handlestatus != common.CO_PARSE_STATUS_OK {
ok = false
break
}
}
if !ok {
continue
}
// 是否满足车型要求
if match, cmid = bl_proj.IsMatchWithCarModel(cotablst); !match {
// 判断消息开口是否超过指定时长,超过则报警
if alert, alertinfo, err = bl_ordmsg.IsNeedToAlert(3600 * 24); err != nil {
return
}
if alert {
// 报警
fmt.Println(alertinfo)
}
continue
}
if bl_cm, ok = bl_proj.Carmodeldict[cmid]; !ok {
// 判断消息开口是否超过指定时长,超过则报警
if alert, alertinfo, err = bl_ordmsg.IsNeedToAlert(3600 * 24); err != nil {
return
}
if alert {
// 报警
fmt.Println(alertinfo)
}
//continue
}
session = db.G_DbEngine.NewSession()
defer session.Close()
if err = session.Begin(); err != nil {
return
}
// 满足车型要求,查看是否是已存在规格
if isnew, version = bl_cm.IsNewSpecToThisModel(cotablst); isnew {
// 新版本,新增
if bl_cmspec, err = bl_cm.CreateNewCarmodel(cotablst, &bl_proj, session); err != nil {
session.Rollback()
session.Close()
return
} else {
// 更新项目的车型规格库
bl_cm.SpecDict[bl_cmspec.Version] = bl_cmspec
bl_proj.Carmodeldict[bl_cm.Carmodelid] = bl_cm
version = bl_cmspec.Version
}
}
// 更新OEM订单的车型规格表
cocmvtab = db.Pln_custorder_carmodelver{Finr: db.G_FINR}
cocmvtab.Carmodelid = bl_cm.Carmodelid
cocmvtab.Version = version
cocmvtab.Oemordernr = msgtablst[i].Msgobjid
cocmvtab.Projnr = msgtablst[i].Msg_cpara1
cocmvtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
cocmvtab.Lastuser = "cm_service"
if err = cocmvtab.Insert(session); err != nil {
session.Rollback()
session.Close()
return
}
// 关闭消息
if err = bl_ordmsg.Close(); err != nil {
session.Rollback()
session.Close()
return
}
session.Commit()
session.Close()
}
return
}