From ce5f63532953a320b61578d8bbcac14f47a352af Mon Sep 17 00:00:00 2001 From: "leo.xue@le-it.com.cn" Date: Fri, 2 Apr 2021 16:26:10 +0800 Subject: [PATCH] LEO commit --- models/WorkLineWorkShiftLst.go | 40 +++- models/WorkShift.go | 33 ++++ schedule/Scheduler.Ctrl.go | 16 ++ schedule/TimeModel.Ctrl.go | 350 +++++++++++++++++++++++++++++++++ schedule/WorkLine.Ctrl.go | 36 +++- schedule/WorkShift.Ctrl.go | 33 +++- 6 files changed, 497 insertions(+), 11 deletions(-) diff --git a/models/WorkLineWorkShiftLst.go b/models/WorkLineWorkShiftLst.go index 94de572..bf18167 100644 --- a/models/WorkLineWorkShiftLst.go +++ b/models/WorkLineWorkShiftLst.go @@ -8,13 +8,13 @@ import ( "xorm.io/core" ) +// 产线班次出勤表 type Worklineworkshiftlst struct { Plantnr int `json:"PlantNr" xorm:"not null pk INT(4)"` Worklineid string `json:"WorkLineId" xorm:"not null pk NVARCHAR(80)"` Workday string `json:"WorkDay" xorm:"not null pk NVARCHAR(16)"` - Pos int `json:"Pos" xorm:"not null pk INT(4)"` - Workshiftnr int `json:"WorkShiftNr" xorm:"not null INT(4)"` - Levelid string `json:"LevelId" xorm:"NVARCHAR(40)"` + Workshiftnr int `json:"WorkShiftNr" xorm:"not null pk INT(4)"` + Personqty int `json:"PersonQty" xorm:"INT(4)"` Lastmodify time.Time `json:"LastModify" xorm:"DATETIME(8)"` Lastuser string `json:"LastUser" xorm:"not null NVARCHAR(40)"` Createtime time.Time `json:"CreateTime" xorm:"DATETIME(8)"` @@ -44,7 +44,7 @@ func (t *Worklineworkshiftlst) TableName() string { func (t *Worklineworkshiftlst) Add() error { e := db.Eloquent.Master() count := new(Worklineworkshiftlst) - affw, err := e.Table(t.TableName()).ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Pos}).Count(count) + affw, err := e.Table(t.TableName()).ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Workshiftnr}).Count(count) if err != nil { return err } @@ -77,7 +77,7 @@ func (t *Worklineworkshiftlst) Add() error { ******************************************************************************/ func (t *Worklineworkshiftlst) Del() bool { e := db.Eloquent.Master() - _, err := e.ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Pos}).Delete(&Worklineworkshiftlst{}) + _, err := e.ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Workshiftnr}).Delete(&Worklineworkshiftlst{}) if err != nil { return false } @@ -102,7 +102,7 @@ func (t *Worklineworkshiftlst) Del() bool { ******************************************************************************/ func (t *Worklineworkshiftlst) Update() error { e := db.Eloquent.Master() - _, err := e.ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Pos}).Update(t) + _, err := e.ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Workshiftnr}).Update(t) if err != nil { return err } @@ -128,9 +128,35 @@ func (t *Worklineworkshiftlst) Update() error { func (t *Worklineworkshiftlst) SelectOne() (Worklineworkshiftlst, error) { e := db.Eloquent.Master() var data Worklineworkshiftlst - _, err := e.ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Pos}).Get(&data) + _, err := e.ID(core.PK{t.Plantnr, t.Worklineid, t.Workday, t.Workshiftnr}).Get(&data) if err != nil { return data, err } return data, nil } + +/****************************************************************************** + * + * @Function Name : + *----------------------------------------------------------------------------- + * + * @Description : 数据查找 + * + * @Function Parameters: + * + * @Return Value : + * + * @Author : Lou Wenzhi + * + * @Date : 2021/3/6 8:47 + * + ******************************************************************************/ +func (t *Worklineworkshiftlst) GetWorkLineWorkShiftData(lineid, st, et string) (datalst []Worklineworkshiftlst, err error) { + e := db.Eloquent.Master() + + if err := e.Table(t.TableName()).Where("PlantNr = ? and WorkLineId = ? and WorkDay >= ? and WorkDay <= ?",t.Plantnr, + lineid, st, et).Asc("WorkDay", "WeekModelNr").Find(&datalst);err != nil { + return + } + return +} diff --git a/models/WorkShift.go b/models/WorkShift.go index 90b1169..37f3c44 100644 --- a/models/WorkShift.go +++ b/models/WorkShift.go @@ -149,3 +149,36 @@ func (t *Workshift) SelectOne() (Workshift, error) { } return data, nil } + +/****************************************************************************** + * + * @Function Name : + *----------------------------------------------------------------------------- + * + * @Description : 数据查找 + * + * @Function Parameters: + * + * @Return Value : + * + * @Author : Lou Wenzhi + * + * @Date : 2021/3/6 8:47 + * + ******************************************************************************/ +func (t *Workshift) SelectAll() (datalst []Workshift, err error) { + var i int + + e := db.Eloquent.Master() + if err := e.Table(t.TableName()).Where("PlantNr = ?",t.Plantnr).OrderBy("WorkShiftNr").Find(&datalst);err != nil { + return + } + for i = 0; i < len(datalst); i++ { + if err = e.Table("Workshiftefflst").Where("PlantNr = ? and WorkShiftNr = ?", datalst[i].Plantnr, + datalst[i].Workshiftnr).OrderBy("LevelId").Find(&datalst[i].Efflst); err != nil { + return + } + } + + return +} diff --git a/schedule/Scheduler.Ctrl.go b/schedule/Scheduler.Ctrl.go index d0c6723..00c115e 100644 --- a/schedule/Scheduler.Ctrl.go +++ b/schedule/Scheduler.Ctrl.go @@ -54,6 +54,22 @@ func(schedsrv *SchedulerSrv)LoadTimemodelData(){ // 加载指定日期范畴内的时间模型相关主数据 schedsrv.Tmsrv.LoadBasicData(schedsrv.StartDate, schedsrv.EndDate) } +// 加载产线班次的实际出勤数据,指定时段,没有按班次指定的默认值填充 +func(schedsrv *SchedulerSrv)LoadWorkLineWorkShiftData()(err error){ + var( + wlsrv *WorklineSrv + ) + // 遍历产线 + for _, wlsrv = range schedsrv.WorklineDict { + // 加载产线指定时段内的实际出勤数据 + if err = wlsrv.LoadWorkShiftData(schedsrv.StartDate, schedsrv.EndDate); err != nil{ + err = errors.New(fmt.Sprintf("加载产线%s的排班数据出错%v!",wlsrv.WorklineId, err)) + return + } + } + + return +} // 加载产品换型矩阵 func(schedsrv *SchedulerSrv)LoadSetupData()(err error){ var ( diff --git a/schedule/TimeModel.Ctrl.go b/schedule/TimeModel.Ctrl.go index 4ebb458..305710b 100644 --- a/schedule/TimeModel.Ctrl.go +++ b/schedule/TimeModel.Ctrl.go @@ -14,6 +14,7 @@ type TimeModelSrv struct { DayModelDict map[int]DayModelSrv // 日模型字典 WeekModelDict map[int]WeekModelSrv // 周模型字典 CalendarDict map[int]CalendarSrv // 日历字典 + WorkShiftDict map[int]WorkShiftSrv // 人员班组字典 } // 加载日模型、周模型和工作日历等基础数据 @@ -22,18 +23,22 @@ func(tmsrv *TimeModelSrv)LoadBasicData(startDate, endDate time.Time)(err error){ dmsrv DayModelSrv wkmsrv WeekModelSrv calsrv CalendarSrv + wssrv WorkShiftSrv dmtab models.Daymodel dmtablst []models.Daymodel wkmtab models.Weekmodel wkmtablst []models.Weekmodel caltab models.Workcalendar caltablst []models.Workcalendar + wstab models.Workshift + wstablst []models.Workshift i int ) // 初始化 tmsrv.DayModelDict = make(map[int]DayModelSrv) tmsrv.WeekModelDict = make(map[int]WeekModelSrv) tmsrv.CalendarDict = make(map[int]CalendarSrv) + tmsrv.WorkShiftDict = make(map[int]WorkShiftSrv) // 加载日模型 dmtab = models.Daymodel{Plantnr: tmsrv.PlantNr} @@ -71,5 +76,350 @@ func(tmsrv *TimeModelSrv)LoadBasicData(startDate, endDate time.Time)(err error){ tmsrv.CalendarDict[calsrv.CalendarNr] = calsrv } + // 加载工作班次模型 + wstab = models.Workshift{Plantnr: tmsrv.PlantNr} + if wstablst, err = wstab.SelectAll(); err != nil { + err = errors.New(fmt.Sprintf("加载工厂%d的人员班组失败%v!",wstab.Plantnr, err)) + return + } + for i = 0; i < len(wstablst); i++ { + wssrv = WorkShiftSrv{} + wssrv.Init(wstablst[i]) + tmsrv.WorkShiftDict[wssrv.WorkShiftNr] = wssrv + } + + return +} + +// 生成日模型的可用时间线 +func(tmsrv *TimeModelSrv)GenDayModelLineArray()(err error){ + var( + dms DayModelSrv + wssrv WorkShiftSrv + lssrv LineSegementSrv + nextStartPoint int + ok bool + ) + + // 遍历日模型 + for _, dms = range tmsrv.DayModelDict { + dms.LineArray = []LineSegementSrv{} + // 是否是人员班组 + if dms.DayModelTab.Workshifttoggle > 0 { + // 班次1 + if dms.DayModelTab.S1toggle > 0 { + if wssrv, ok = tmsrv.WorkShiftDict[dms.DayModelTab.S1Workshiftnr]; !ok { + err = errors.New(fmt.Sprintf("日模型%d的班次1对应的人员班次%d不存在!",dms.DayModelTab.Daymodelnr, dms.DayModelTab.S1Workshiftnr)) + return + } + nextStartPoint = wssrv.Wsstab.SBeg + if wssrv.Wsstab.SB1Beg > 0 && wssrv.Wsstab.SB1End > wssrv.Wsstab.SB1Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB1Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB1End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB2End > 0 && wssrv.Wsstab.SB2End > wssrv.Wsstab.SB2Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB2Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB2End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB3End > 0 && wssrv.Wsstab.SB3End > wssrv.Wsstab.SB3Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB3Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB3End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB4End > 0 && wssrv.Wsstab.SB4End > wssrv.Wsstab.SB4Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB4Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB4End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB5End > 0 && wssrv.Wsstab.SB5End > wssrv.Wsstab.SB5Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB5Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB5End + dms.LineArray = append(dms.LineArray, lssrv) + } + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SEnd + lssrv.GetDuration() + dms.LineArray = append(dms.LineArray, lssrv) + } + + // 班次2 + if dms.DayModelTab.S2toggle > 0 { + if wssrv, ok = tmsrv.WorkShiftDict[dms.DayModelTab.S2Workshiftnr]; !ok { + err = errors.New(fmt.Sprintf("日模型%d的班次2对应的人员班次%d不存在!",dms.DayModelTab.Daymodelnr, dms.DayModelTab.S2Workshiftnr)) + return + } + nextStartPoint = wssrv.Wsstab.SBeg + if wssrv.Wsstab.SB1Beg > 0 && wssrv.Wsstab.SB1End > wssrv.Wsstab.SB1Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB1Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB1End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB2End > 0 && wssrv.Wsstab.SB2End > wssrv.Wsstab.SB2Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB2Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB2End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB3End > 0 && wssrv.Wsstab.SB3End > wssrv.Wsstab.SB3Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB3Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB3End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB4End > 0 && wssrv.Wsstab.SB4End > wssrv.Wsstab.SB4Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB4Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB4End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB5End > 0 && wssrv.Wsstab.SB5End > wssrv.Wsstab.SB5Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB5Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB5End + dms.LineArray = append(dms.LineArray, lssrv) + } + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SEnd + lssrv.GetDuration() + dms.LineArray = append(dms.LineArray, lssrv) + } + + // 班次2 + if dms.DayModelTab.S3toggle > 0 { + if wssrv, ok = tmsrv.WorkShiftDict[dms.DayModelTab.S3Workshiftnr]; !ok { + err = errors.New(fmt.Sprintf("日模型%d的班次3对应的人员班次%d不存在!",dms.DayModelTab.Daymodelnr, dms.DayModelTab.S3Workshiftnr)) + return + } + nextStartPoint = wssrv.Wsstab.SBeg + if wssrv.Wsstab.SB1Beg > 0 && wssrv.Wsstab.SB1End > wssrv.Wsstab.SB1Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB1Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB1End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB2End > 0 && wssrv.Wsstab.SB2End > wssrv.Wsstab.SB2Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB2Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB2End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB3End > 0 && wssrv.Wsstab.SB3End > wssrv.Wsstab.SB3Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB3Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB3End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB4End > 0 && wssrv.Wsstab.SB4End > wssrv.Wsstab.SB4Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB4Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB4End + dms.LineArray = append(dms.LineArray, lssrv) + } + if wssrv.Wsstab.SB5End > 0 && wssrv.Wsstab.SB5End > wssrv.Wsstab.SB5Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SB5Beg + lssrv.GetDuration() + nextStartPoint = wssrv.Wsstab.SB5End + dms.LineArray = append(dms.LineArray, lssrv) + } + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = wssrv.Wsstab.SEnd + lssrv.GetDuration() + dms.LineArray = append(dms.LineArray, lssrv) + } + }else{ + // 班次1 + if dms.DayModelTab.S1toggle > 0 { + nextStartPoint = dms.DayModelTab.S1Beg + if dms.DayModelTab.S1B1End > 0 && dms.DayModelTab.S1B1End > dms.DayModelTab.S1B1Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S1B1Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S1B1End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S1B2End > 0 && dms.DayModelTab.S1B2End > dms.DayModelTab.S1B2Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S1B2Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S1B2End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S1B3End > 0 && dms.DayModelTab.S1B3End > dms.DayModelTab.S1B3Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S1B3Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S1B3End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S1B4End > 0 && dms.DayModelTab.S1B4End > dms.DayModelTab.S1B4Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S1B4Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S1B4End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S1B5End > 0 && dms.DayModelTab.S1B5End > dms.DayModelTab.S1B5Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S1B5Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S1B5End + dms.LineArray = append(dms.LineArray, lssrv) + } + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S1End + lssrv.GetDuration() + dms.LineArray = append(dms.LineArray, lssrv) + } + + // 班次2 + if dms.DayModelTab.S2toggle > 0 { + nextStartPoint = dms.DayModelTab.S2Beg + if dms.DayModelTab.S2B1End > 0 && dms.DayModelTab.S2B1End > dms.DayModelTab.S2B1Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S2B1Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S2B1End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S2B2End > 0 && dms.DayModelTab.S2B2End > dms.DayModelTab.S2B2Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S2B2Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S2B2End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S2B3End > 0 && dms.DayModelTab.S2B3End > dms.DayModelTab.S2B3Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S2B3Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S2B3End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S2B4End > 0 && dms.DayModelTab.S2B4End > dms.DayModelTab.S2B4Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S2B4Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S2B4End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S2B5End > 0 && dms.DayModelTab.S2B5End > dms.DayModelTab.S2B5Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S2B5Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S2B5End + dms.LineArray = append(dms.LineArray, lssrv) + } + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S2End + lssrv.GetDuration() + dms.LineArray = append(dms.LineArray, lssrv) + } + + // 班次2 + if dms.DayModelTab.S3toggle > 0 { + nextStartPoint = dms.DayModelTab.S3Beg + if dms.DayModelTab.S3B1End > 0 && dms.DayModelTab.S3B1End > dms.DayModelTab.S3B1Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S3B1Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S3B1End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S3B2End > 0 && dms.DayModelTab.S3B2End > dms.DayModelTab.S3B2Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S3B2Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S3B2End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S3B3End > 0 && dms.DayModelTab.S3B3End > dms.DayModelTab.S3B3Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S3B3Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S3B3End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S3B4End > 0 && dms.DayModelTab.S3B4End > dms.DayModelTab.S3B4Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S3B4Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S3B4End + dms.LineArray = append(dms.LineArray, lssrv) + } + if dms.DayModelTab.S3B5End > 0 && dms.DayModelTab.S3B5End > dms.DayModelTab.S3B5Beg { + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S3B5Beg + lssrv.GetDuration() + nextStartPoint = dms.DayModelTab.S3B5End + dms.LineArray = append(dms.LineArray, lssrv) + } + lssrv = LineSegementSrv{} + lssrv.StartSecond = nextStartPoint + lssrv.EndSecond = dms.DayModelTab.S3End + lssrv.GetDuration() + dms.LineArray = append(dms.LineArray, lssrv) + } + } + + tmsrv.DayModelDict[dms.DayModelNr] = dms + } return } diff --git a/schedule/WorkLine.Ctrl.go b/schedule/WorkLine.Ctrl.go index 2b1ec1f..e16ecd9 100644 --- a/schedule/WorkLine.Ctrl.go +++ b/schedule/WorkLine.Ctrl.go @@ -10,6 +10,7 @@ import ( ) type WorklineSrv struct { + PlantNr int WorklineId string WorklineTab models.Workline RelCtrlWay string @@ -21,16 +22,19 @@ type WorklineSrv struct { SchedTaskArray []TaskSrv // 所有调度到当前产线的生产任务 TimeCurve TimeCurveSrv // 加载完时间模型后的时间曲线 SchedTimeCurve TimeCurveSrv // 调度过程中动态计算的时间曲线 + WorkShiftEffDict map[string]models.Worklineworkshiftlst // 产线排班表 WorkShiftArray []WorkShiftSrv // 产线班次列表 WorkLoadArray []WorkLoadSrv // 产线负载 } // 初始化产线对象 func(wlsrv *WorklineSrv)Init(wltab models.Workline){ + wlsrv.PlantNr = wltab.Plantnr wlsrv.WorklineId = wltab.Worklineid wlsrv.WorklineTab = wltab wlsrv.DayModelArray = []DayModelSrv{} wlsrv.DayModelIdxDict = make(map[string]int) + wlsrv.WorkShiftEffDict = make(map[string]models.Worklineworkshiftlst) wlsrv.SchedTaskArray = []TaskSrv{} wlsrv.SchedTaskList = list.New() wlsrv.TimeCurve = TimeCurveSrv{} @@ -39,8 +43,34 @@ func(wlsrv *WorklineSrv)Init(wltab models.Workline){ wlsrv.WorkLoadArray = []WorkLoadSrv{} } +// 加载指定时段内的班次实际出勤数据 +func(wlsrv *WorklineSrv)LoadWorkShiftData(startdate, enddate time.Time)(err error){ + var( + i int + key, st,et string + wlwstab models.Worklineworkshiftlst + wlwstablst []models.Worklineworkshiftlst + ) + st = GetYMDString(startdate) + et = GetYMDString(enddate) + // 初始化 + wlsrv.WorkShiftEffDict = make(map[string]models.Worklineworkshiftlst) + // 加载指定日期范围内的产线排班数据 + wlwstab = models.Worklineworkshiftlst{Plantnr: wlsrv.PlantNr} + if wlwstablst, err = wlwstab.GetWorkLineWorkShiftData(wlsrv.WorklineId, st, et); err != nil { + err = errors.New(fmt.Sprintf("无法获取产线%s的排班数据%v!",wlsrv.WorklineId, err)) + return + } + for i = 0; i < len(wlwstablst); i++ { + key = wlwstablst[i].Workday + strconv.Itoa(wlwstablst[i].Workshiftnr) + wlsrv.WorkShiftEffDict[key] = wlwstablst[i] + } + + return +} + // 将任务数组转化成列表 -func(wlsrv *WorklineSrv)GetLineList(){ +func(wlsrv *WorklineSrv)GetLineTaskList(){ var( task TaskSrv ) @@ -53,7 +83,7 @@ func(wlsrv *WorklineSrv)GetLineList(){ } // 将任务列表转化成数组 -func(wlsrv *WorklineSrv)GetLineArray(){ +func(wlsrv *WorklineSrv)GetLineTaskArray(){ var( e *list.Element task *TaskSrv @@ -107,7 +137,7 @@ func(wlsrv *WorklineSrv)GetWorkDayList(tmsrv *TimeModelSrv)(err error){ } // 将产线工作日历指定的特殊日模型进行替换 for i = 0; i < len(calsrv.WorkCalTab.Itemlst); i++ { - if idx, ok = wlsrv.DayModelIdxDict[strconv.Itoa(calsrv.WorkCalTab.Itemlst[i].Workdate)]; ok{ + if idx, ok = wlsrv.DayModelIdxDict[calsrv.WorkCalTab.Itemlst[i].Workdate]; ok{ daymodelnr = calsrv.WorkCalTab.Itemlst[i].Daymodelnr if dmsrv, ok = tmsrv.DayModelDict[daymodelnr]; !ok{ err = errors.New(fmt.Sprintf("工作日历%d中在工作日%d指定的日模型%d不存在!",calsrv.CalendarNr,calsrv.WorkCalTab.Itemlst[i].Workdate,daymodelnr)) diff --git a/schedule/WorkShift.Ctrl.go b/schedule/WorkShift.Ctrl.go index d657736..e4e279f 100644 --- a/schedule/WorkShift.Ctrl.go +++ b/schedule/WorkShift.Ctrl.go @@ -1,9 +1,40 @@ package schedule -import "time" +import ( + "leit.com/LAPP_GAAS_GFrame/models" + "time" +) type WorkShiftSrv struct { + WorkShiftNr int ShiftType string StartTime time.Time EndTime time.Time + Wsstab models.Workshift +} + +func( wss *WorkShiftSrv)Init(wstab models.Workshift){ + wss.WorkShiftNr = wstab.Plantnr + wss.Wsstab = wstab +} + +// 基于指定的人数获取效率 +func( wss *WorkShiftSrv)GetEff(pesqty int)(eff float32){ + var( + i int + found bool + ) + + found = false + for i = 0; i < len(wss.Wsstab.Efflst); i++ { + if pesqty >= wss.Wsstab.Efflst[i].Planpersonlclqty && pesqty <= wss.Wsstab.Efflst[i].Planpersonuclqty { + found = true + eff = wss.Wsstab.Efflst[i].Planefficiency + break + } + } + if !found { + eff = wss.Wsstab.Planefficiency + } + return }