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, delmvtab 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 } } //删掉对应的车型 delmvtab = db.Pln_custorder_carmodelver{Finr: db.G_FINR} delmvtab.Oemordernr = msgtablst[i].Msgobjid delmvtab.Projnr = msgtablst[i].Msg_cpara1 res := delmvtab.DelSession(session) if !res { session.Rollback() session.Close() return } // 更新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 }