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.

166 lines
4.4 KiB

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
}