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