package service
|
|
|
|
import (
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"time"
|
|
)
|
|
|
|
type BL_Demand struct {
|
|
Matid string
|
|
Day string
|
|
DemandQty int
|
|
PlanQty int
|
|
Demandtablst []db.Pln_material_demand
|
|
Batordtablst []db.Pln_batchorder
|
|
Materialtab db.Pln_material
|
|
}
|
|
|
|
// 获取指定日期指定物料对应的所有需求清单
|
|
func (bl_dd *BL_Demand) GetDemandList(session *xorm.Session) (err error) {
|
|
var (
|
|
demandtab db.Pln_material_demand
|
|
)
|
|
|
|
bl_dd.Demandtablst = []db.Pln_material_demand{}
|
|
demandtab = db.Pln_material_demand{}
|
|
if bl_dd.Demandtablst, err = demandtab.SelectByMaterialDuedate(bl_dd.Matid, bl_dd.Day, session); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取需求总数
|
|
func (bl_dd *BL_Demand) GetDemandQty() {
|
|
var i int
|
|
|
|
bl_dd.DemandQty = 0
|
|
for i = 0; i < len(bl_dd.Demandtablst); i++ {
|
|
bl_dd.DemandQty = bl_dd.DemandQty + bl_dd.Demandtablst[i].Demandqty
|
|
}
|
|
}
|
|
|
|
// 获取指定日期指定物料对应的所有批次订单
|
|
func (bl_dd *BL_Demand) GetDemandBatchOrderList(session *xorm.Session) (err error) {
|
|
var (
|
|
batordtab db.Pln_batchorder
|
|
)
|
|
|
|
bl_dd.Batordtablst = []db.Pln_batchorder{}
|
|
batordtab = db.Pln_batchorder{}
|
|
if bl_dd.Batordtablst, err = batordtab.SelectByMaterialDuedate(bl_dd.Materialtab.Cust_materialid, bl_dd.Day, session); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取计划总数
|
|
func (bl_dd *BL_Demand) GetPlanQty() {
|
|
var i int
|
|
|
|
bl_dd.PlanQty = 0
|
|
for i = 0; i < len(bl_dd.Batordtablst); i++ {
|
|
bl_dd.PlanQty = bl_dd.PlanQty + bl_dd.Batordtablst[i].Planqty
|
|
}
|
|
}
|
|
|
|
// 关闭需求状态
|
|
func (bl_dd *BL_Demand) CloseDemandStatus(session *xorm.Session, Matid string, Day string) (err error) {
|
|
var (
|
|
i int
|
|
worknrs []string
|
|
material db.Pln_material_demand
|
|
)
|
|
|
|
for i = 0; i < len(bl_dd.Demandtablst); i++ {
|
|
if bl_dd.Demandtablst[i].Usestatus == 1 {
|
|
continue
|
|
}
|
|
worknrs = append(worknrs, bl_dd.Demandtablst[i].Workordernr)
|
|
}
|
|
material.Materialid = Matid
|
|
material.Demanddate = Day
|
|
material.Usestatus = 1
|
|
material.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
err = material.BatchUpdateFields(session, worknrs, "usestatus, lastmodif")
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 适配排序工单的零件清单,为指定物料生成需求
|
|
// 遍历未处理的需求,按照物料ID和时间点适配批次订单,如果不存在则新建
|
|
// 存在未计划,将数量变化更新到已有批次订单(增加情况更新到最后一个批次订单,减少情况,依次减少直至当日订单数量为0)
|
|
// 存在已计划,新增量独立创建批次订单,减少量不做处理
|
|
func (bl_dd *BL_Demand) GenerateBatchOrder() (err error) {
|
|
var (
|
|
i, newqty int
|
|
added bool
|
|
bl_batchord BL_Batchorder
|
|
session *xorm.Session
|
|
)
|
|
|
|
session = db.G_DbEngine.NewSession()
|
|
defer session.Close()
|
|
if err = session.Begin(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 获取对应时段所有需求
|
|
if err = bl_dd.GetDemandList(session); err != nil {
|
|
return
|
|
}
|
|
bl_dd.GetDemandQty()
|
|
|
|
// 获取对应时段所有批次订单
|
|
if err = bl_dd.GetDemandBatchOrderList(session); err != nil {
|
|
return
|
|
}
|
|
bl_dd.GetPlanQty()
|
|
|
|
// 如果需求数 > 计划数 则做相应处理
|
|
if bl_dd.DemandQty > bl_dd.PlanQty {
|
|
newqty = bl_dd.DemandQty - bl_dd.PlanQty
|
|
added = false
|
|
// 将新增数量更新到未计划的批次订单中
|
|
for i = 0; i < len(bl_dd.Batordtablst); i++ {
|
|
// 基于状态更新
|
|
if bl_dd.Batordtablst[i].Status <= common.WO_STATUS_UNPLANED {
|
|
bl_dd.Batordtablst[i].Planqty = bl_dd.Batordtablst[i].Planqty + newqty
|
|
bl_dd.Batordtablst[i].Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
|
|
bl_dd.Batordtablst[i].Lastuser = "demand_service"
|
|
if err = bl_dd.Batordtablst[i].Insert(session); err != nil {
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
added = true
|
|
break
|
|
}
|
|
}
|
|
// 如果批次订单都已计划,则将新增量单独创建批次订单
|
|
if !added {
|
|
// 新建批次
|
|
bl_batchord = BL_Batchorder{}
|
|
bl_batchord.Partid = bl_dd.Matid
|
|
bl_batchord.PlanQty = newqty
|
|
bl_batchord.DDT = bl_dd.Day
|
|
bl_batchord.Type = common.BATORD_TYPE_SEQ
|
|
if err = bl_batchord.Create(bl_dd.Materialtab, session); err != nil {
|
|
session.Rollback()
|
|
return
|
|
}
|
|
}
|
|
}
|
|
// 关闭需求的状态
|
|
if err = bl_dd.CloseDemandStatus(session, bl_dd.Matid, bl_dd.Day); err != nil {
|
|
session.Rollback()
|
|
return
|
|
}
|
|
|
|
session.Commit()
|
|
session.Close()
|
|
return
|
|
}
|