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 }