package service import ( "errors" "fmt" "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "leit.com/leit_seat_aps/glog" "strings" "time" ) type BL_Tier2ASN struct { Asnheadtab db.Jit_asnhead_landing Orderdict map[string]BL_Tier2Order } type BL_Tier2Order struct { Ordernr string Asnordertab db.Jit_asnorder_landing Itemdict map[string]db.Jit_asnitem_landing } // 遍历asn数据,将客户订单号(OEM订单号-零件族-年份)的所有零件放到对应字典中 func (bt *BL_Tier2ASN) SortAsnByOrder() (err error) { var ( i, j int bl_t2ord BL_Tier2Order ok bool ) // 初始化 bt.Orderdict = make(map[string]BL_Tier2Order) // 遍历零件 for i = 0; i < len(bt.Asnheadtab.Itemlst); i++ { // 遍历客户订单 for j = 0; j < len(bt.Asnheadtab.Itemlst[i].Orderlst); j++ { if bl_t2ord, ok = bt.Orderdict[bt.Asnheadtab.Itemlst[i].Orderlst[j].Ordernr]; !ok { // 不存在则新添加 bl_t2ord = BL_Tier2Order{} bl_t2ord.Itemdict = make(map[string]db.Jit_asnitem_landing) bl_t2ord.Asnordertab = bt.Asnheadtab.Itemlst[i].Orderlst[j] bl_t2ord.Ordernr = bt.Asnheadtab.Itemlst[i].Orderlst[j].Ordernr } bl_t2ord.Itemdict[bt.Asnheadtab.Itemlst[i].Partid] = bt.Asnheadtab.Itemlst[i] bt.Orderdict[bl_t2ord.Ordernr] = bl_t2ord } } return } // 遍历客户订单逐个关闭 func (bt *BL_Tier2ASN) CLoseTier2WorkOrder() (err error) { var ( bl_t2ord BL_Tier2Order cotab db.Pln_custorder wotab db.Pln_workorder mail db.Sendmailtab i, j int session *xorm.Session exist, match bool ) for _, bl_t2ord = range bt.Orderdict { session = db.G_DbEngine.NewSession() defer session.Close() if err = session.Begin(); err != nil { return } /***** *逻辑: *第一步:联查出jit_asnorder_cache表,每条成功更新状态 *第二步:检查每条更新后,对应的head头部是否全部更新完成,完成的话,更新head状态 ***************/ cotab = db.Pln_custorder{Finr: db.G_FINR, Oemordernr: bl_t2ord.Asnordertab.Oemordernr, Partfamilyid: bl_t2ord.Asnordertab.Partfamilyid} // 基于Oem订单号,零件族和年份获取最新的客户订单及其关联的零件族对应的生产订单 if exist, cotab, err = cotab.GetByAsnDataBySession(bl_t2ord.Asnordertab.Swetyear, session); err != nil { session.Rollback() return } if !exist { err = errors.New(fmt.Sprintf("ASN 中指定的OEM客户订单%s 零件族%s 要货年份%s 不存在!", bl_t2ord.Asnordertab.Oemordernr, bl_t2ord.Asnordertab.Partfamilyid, bl_t2ord.Asnordertab.Swetyear)) session.Rollback() return } // 如果客户订单没有对应零件族的生产订单,则报错返回 if len(cotab.Wotablst) < 0 { err = errors.New(fmt.Sprintf("ASN 中指定的OEM客户订单%s 零件族%s 要货年份%s 的生产订单不存在!", bl_t2ord.Asnordertab.Oemordernr, bl_t2ord.Asnordertab.Partfamilyid, bl_t2ord.Asnordertab.Swetyear)) session.Rollback() return } // 关闭生产订单 match = true for i = 0; i < len(cotab.Wotablst); i++ { if strings.TrimSpace(cotab.Wotablst[i].Supplygroupid) != strings.TrimSpace(bl_t2ord.Asnordertab.Supplygroupid) || strings.TrimSpace(cotab.Wotablst[i].Partfamilyid) != strings.TrimSpace(bl_t2ord.Asnordertab.Partfamilyid) { continue } if cotab.Wotablst[i].Status < common.WO_STATUS_CLOSED && cotab.Wotablst[i].Status >= common.WO_STATUS_RELEASED { // 验证订单的零件和ASN中的零件是否匹配,不匹配报错返回 for j = 0; j < len(cotab.Wotablst[i].Partlst); j++ { if _, match = bl_t2ord.Itemdict[cotab.Wotablst[i].Partlst[j].Partid]; !match { err = errors.New(fmt.Sprintf("扶手订单%s 的零件%s 在ASN %s的客户订单%s中缺失!", cotab.Wotablst[i].Workordernr, cotab.Wotablst[i].Partlst[j].Partid, bt.Asnheadtab.Asnnr, bl_t2ord.Asnordertab.Ordernr)) project := new(db.Me_project) project.Finr = db.G_FINR project.Projectid = cotab.Wotablst[i].Projnr projtab, _ := project.SelectOne() projtab.Clipped() //添加邮件预警 host := projtab.Emailserver_host + ":" + common.ValueToString(projtab.Emailserver_port, "") body := "项目号: " + projtab.Projectid + "\r\nCustordernr 扶手订单: " + cotab.Wotablst[i].Custordernr + "\r\nErrorinfo :" + "零件缺失" + "\r\nPartfamilyid :" + cotab.Wotablst[i].Partfamilyid + "\r\nPartid :" + cotab.Wotablst[i].Partid mail.Status = "waiting" mail.Body = body mail.Subject = "Reorder的消息的更新" mail.Name = projtab.From_email mail.Tomail = projtab.Tod_error_to_recievers mail.Host = host mail.Password = projtab.From_pwd mail.Username = projtab.From_email mail.Add() session.Rollback() return } } // 验证通过,关闭生产订单 cotab.Wotablst[i].Status = common.WO_STATUS_CLOSED cotab.Wotablst[i].Lastuser = "asn_service" cotab.Wotablst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") res, err := cotab.Wotablst[i].UpdateFieldsWo(session, "status, lastmodif, lastuser") if err != nil || res < 1 { session.Rollback() glog.InfoExtln("grammerasn", "err :", err) continue } } else if cotab.Wotablst[i].Status == common.WO_STATUS_CLOSED { err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr)) glog.InfoExtln("grammerasn", "err :", err) continue } else { err = errors.New(fmt.Sprintf("扶手订单%s 订单状态不符合!", cotab.Wotablst[i].Workordernr)) glog.InfoExtln("grammerasn", "err :", err) session.Rollback() return } } //验证是否是最后一个生产订单,如果是,更新对应的客户订单 if err = wotab.UpdateCustorderByWorkorder(session, cotab.Custordernr); err != nil { session.Rollback() glog.InfoExtln("grammerasn", "err :", err) return } glog.InfoExtln("grammerasn", "err :", err) //判断该客户订单是否有小于80的GRAMMEER订单,如果存在则不更新 ok := wotab.SelectByCustorder(session, cotab.Custordernr) glog.InfoExtln("grammerasn", "ok :", ok) if ok { glog.InfoExtln("grammerasninfo", "bl_t2ord.Asnordertab.Asnnr :", bl_t2ord.Asnordertab.Asnnr) glog.InfoExtln("grammerasninfo", "bl_t2ord.Asnordertab.Asnnr :", bl_t2ord.Asnordertab.Oemordernr) //置位对应的工单 cache := new(db.Jit_asnorder_cache) cache.Asnnr = bl_t2ord.Asnordertab.Asnnr cache.Oemordernr = bl_t2ord.Asnordertab.Oemordernr cache.Partfamilyid = bl_t2ord.Asnordertab.Partfamilyid cache.Flag = 1 cache.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") cache.Lastuser = "asn_service" if err = cache.UpdateFields(session, "flag,lastmodif,lastuser"); err != nil { glog.InfoExtln("grammerasn", "err :", err) session.Rollback() return } } else { glog.InfoExtln("grammerasn暂时不能置位的订单", "cotab.Custordernr :", cotab.Custordernr) } session.Commit() } return } // 遍历客户订单逐个关闭 func (bt *BL_Tier2ASN) SetParsedStatus() (err error) { //判断该asn订单是否都被更新 cache := new(db.Jit_asnorder_cache) cache.Asnnr = bt.Asnheadtab.Asnnr result := cache.SelectInfo() if !result { return errors.New("该文件有未解析的订单") } // 设置ASN为已解析状态 bt.Asnheadtab.Parsed = 1 bt.Asnheadtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") bt.Asnheadtab.Lastuser = "asn_service" if err = bt.Asnheadtab.UpdateFields("parsed, lastmodif, lastuser"); err != nil { return } //删除文件对应的缓存 //cache.DelInfo() return }