package service
|
|
|
|
import (
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type BL_BomHead struct {
|
|
Bomid string
|
|
Materialid string
|
|
bomheadtab db.Me_bomhead
|
|
Bomitemlst []BL_BomItem
|
|
}
|
|
|
|
type BL_BomItem struct {
|
|
Fmaterialid string // 父物料
|
|
Fmatqty float32 // 父物料数量
|
|
Cmaterialid string // 子物料
|
|
Mattype string // 子物料类型:自制件 / 外购件
|
|
Cmatqty float32 // 子物料数量
|
|
Leadtime float32 // 前置时间
|
|
Timeuom string // 时间单位:SEC MIN HOUR DAY
|
|
bomitemtab db.Me_bomlst
|
|
Bomitemlst []BL_BomItem // 子件的下级物料需求
|
|
}
|
|
|
|
// 获取物料以秒计算的生产提前期
|
|
func (t *BL_BomItem) GetChildLeadTimeInSecond() (lt int) {
|
|
switch strings.ToUpper(strings.TrimSpace(t.Timeuom)) {
|
|
case "S":
|
|
lt = int(t.Leadtime)
|
|
case "SEC":
|
|
lt = int(t.Leadtime)
|
|
case "SECOND":
|
|
lt = int(t.Leadtime)
|
|
case "M":
|
|
lt = int(t.Leadtime * 60)
|
|
case "MIN":
|
|
lt = int(t.Leadtime * 60)
|
|
case "MINUTE":
|
|
lt = int(t.Leadtime * 60)
|
|
case "H":
|
|
lt = int(t.Leadtime * 60 * 60)
|
|
case "HOUR":
|
|
lt = int(t.Leadtime * 60 * 60)
|
|
case "D":
|
|
lt = int(t.Leadtime * 60 * 60 * 24)
|
|
case "DAY":
|
|
lt = int(t.Leadtime * 60 * 60 * 24)
|
|
default:
|
|
lt = int(t.Leadtime)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 计算自身需求,并向下继续调用
|
|
func (bh *BL_BomHead) CalLowerLevelDemand(session *xorm.Session, adtabInlst []db.Pln_material_demand, matdict map[string]db.Pln_material) (err error) {
|
|
var (
|
|
i, j int
|
|
mattab db.Pln_material
|
|
adtab db.Pln_material_demand
|
|
adtabLowlst []db.Pln_material_demand
|
|
t time.Time
|
|
ok bool
|
|
)
|
|
|
|
adtabLowlst = []db.Pln_material_demand{}
|
|
for i = 0; i < len(adtabInlst); i++ {
|
|
for j = 0; j < len(bh.Bomitemlst); j++ {
|
|
if bh.Bomitemlst[j].Fmaterialid == adtabInlst[i].Materialid {
|
|
// 判断子物料是否存在
|
|
if mattab, ok = matdict[bh.Bomitemlst[i].Cmaterialid]; !ok {
|
|
continue
|
|
}
|
|
if bh.Bomitemlst[i].Fmatqty <= 0 || bh.Bomitemlst[i].Cmatqty <= 0 {
|
|
continue
|
|
}
|
|
// 存在则计算独立需求
|
|
adtab = db.Pln_material_demand{}
|
|
adtab.Finr = db.G_FINR
|
|
adtab.Materialid = mattab.Materialid
|
|
adtab.Workordernr = adtabInlst[i].Workordernr
|
|
adtab.Demandqty = adtabInlst[i].Demandqty * int(bh.Bomitemlst[j].Cmatqty/bh.Bomitemlst[j].Fmatqty)
|
|
// 获取物料的需求时间(扣除前置期)
|
|
loc, _ := time.LoadLocation("UTC")
|
|
t, _ = common.DateParse(adtabInlst[i].Swet, "YmdHis")
|
|
t = t.In(loc).Add(time.Duration(bh.Bomitemlst[j].GetChildLeadTimeInSecond()) * time.Second * -1)
|
|
if t.Unix() < time.Now().Unix() {
|
|
t = time.Now()
|
|
}
|
|
adtab.Swet = common.Date(t.Unix(), "YYYYMMDDHHmmss")
|
|
adtab.Demandyear = t.Year()
|
|
adtab.Demandmonth = int(t.Month())
|
|
_, adtab.Demandweek = t.ISOWeek()
|
|
adtab.Demandday = t.Day()
|
|
adtab.Demandhour = t.Hour()
|
|
adtab.Usestatus = 0 // 默认未使用
|
|
adtab.Credatuz = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
adtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
adtab.Lastuser = "service"
|
|
|
|
// 插入需求
|
|
if err = adtab.InsertAndUpdate(session); err != nil {
|
|
return
|
|
}
|
|
|
|
// 添加到循环遍历
|
|
adtabLowlst = append(adtabLowlst, adtab)
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(adtabLowlst) > 0 {
|
|
if err = bh.CalLowerLevelDemand(session, adtabLowlst, matdict); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|