|
|
- 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
- }
|