SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
4.0 KiB

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
}