package tier2 import ( "fmt" "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "leit.com/leit_seat_aps/service" "time" ) func LoadMaterialData() (matdict map[string]db.Pln_material, err error) { var ( mattab db.Pln_material mattablst []db.Pln_material i int ) // 获取所有激活的物料数据 mattab = db.Pln_material{} if mattablst, err = mattab.GetAll(); err != nil { return } // 加载物料数据到字典 matdict = make(map[string]db.Pln_material) for i = 0; i < len(mattablst); i++ { matdict[mattablst[i].Materialid] = mattablst[i] } return } // 为指定的客户订单生成对应的需求 func RunDemandCollector() (err error) { var ( bl_ordmsg service.BL_Ordmsg matdict map[string]db.Pln_material msgtab db.Order_msg msgtablst []db.Order_msg cotab db.Pln_custorder wotablst []db.Pln_workorder materialtab db.Pln_material matdemandtab db.Pln_material_demand i, j, k int swet, t time.Time session *xorm.Session ok bool ) // 加载所需物料主数据 if matdict, err = LoadMaterialData(); err != nil { return } fmt.Println("加载物料:") for _, materialtab = range matdict { fmt.Println(" -->", materialtab.Materialid, materialtab.Descr2) } // 循环获取开口的模型解析消息 for { fmt.Println("加载客户订单需求计算消息......") msgtab = db.Order_msg{} if msgtablst, err = msgtab.GetOpenDemandMessages(); err != nil { return } for i = 0; i < len(msgtablst); i++ { bl_ordmsg = service.BL_Ordmsg{Ordmsgtab: msgtablst[i]} fmt.Println(" 遍历客户订单:", msgtablst[i].Msgobjid) // 基于消息获取客户订单 cotab = db.Pln_custorder{Finr: db.G_FINR, Custordernr: msgtablst[i].Msgobjid} if wotablst, err = cotab.GetWorkorderPartlst(); err != nil { return } fmt.Println(" 获取客户订单的生产订单:", len(wotablst)) session = db.G_DbEngine.NewSession() defer session.Close() if err = session.Begin(); err != nil { return } // 遍历生产订单 for j = 0; j < len(wotablst); j++ { // 遍历生产订单的零件清单 for k = 0; k < len(wotablst[j].Partlst); k++ { if materialtab, ok = matdict[wotablst[j].Partlst[k].Partid]; !ok { continue } fmt.Println(wotablst[j].Partlst[k].Partid, "********** 适配成功!") // 创建新需求 matdemandtab = db.Pln_material_demand{Finr: db.G_FINR} matdemandtab.Materialid = wotablst[j].Partlst[k].Partid matdemandtab.Workordernr = wotablst[j].Workordernr matdemandtab.Demandqty = wotablst[j].Partlst[k].Partqty // 获取物料的需求时间(扣除前置期) loc, _ := time.LoadLocation("UTC") swet, _ = common.DateParse(wotablst[j].Swet, "YmdHis") t = swet.In(loc).Add(time.Duration(materialtab.GetLeadTimeInSecond()) * time.Second * -1) if t.Unix() < time.Now().Unix() { t = time.Now() } matdemandtab.Demanddate = common.Date(t.Unix(), "YYYYMMDD") matdemandtab.Descr = materialtab.Descr2 matdemandtab.Demandtype = common.DEMAND_TYPE_SEQ matdemandtab.Swet = common.Date(t.Unix(), "YYYYMMDDHHmmss") matdemandtab.Demandyear = t.Year() matdemandtab.Demandmonth = int(t.Month()) _, matdemandtab.Demandweek = t.ISOWeek() matdemandtab.Demandday = t.Day() matdemandtab.Demandhour = t.Hour() matdemandtab.Usestatus = 0 // 默认未使用 matdemandtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") matdemandtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") matdemandtab.Lastuser = "demand_service" // 存储(如果存在则更新) if err = matdemandtab.InsertAndUpdate(session); err != nil { session.Rollback() session.Close() return } } } // 关闭消息 if err = bl_ordmsg.Close(); err != nil { session.Rollback() session.Close() return } session.Commit() session.Close() } time.Sleep(time.Duration(5) * time.Second) } return }