优化排班功能
This commit is contained in:
1 parent
8acbe732ff
commit
8ba15d87b3
13 files changed
+2463
-565
No files matched your search
@@ -121,71 +121,63 @@ func (c *BackendOaSchedulingController) TemplateApply() {
|
||||
c.scFail(500, 500, "查询班次失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
// 班次匹配索引:精确(名称+时间)→ 名称 → 兜底(默认班次 / 第一个可用班次)。
|
||||
// 不强制时间一致,也不自动创建班次,由用户在方案里自行判断调整
|
||||
shiftMap := make(map[string]*models.OaShift, len(shifts))
|
||||
maxSort := 0
|
||||
shiftNameMap := make(map[string]*models.OaShift, len(shifts))
|
||||
var fallbackShift *models.OaShift
|
||||
for i := range shifts {
|
||||
shift := &shifts[i]
|
||||
shiftMap[schedShiftKey(shift.Name, shift.WorkStart, shift.WorkEnd)] = shift
|
||||
if shift.Sort > maxSort {
|
||||
maxSort = shift.Sort
|
||||
if _, ok := shiftNameMap[shift.Name]; !ok {
|
||||
shiftNameMap[shift.Name] = shift
|
||||
}
|
||||
if fallbackShift == nil || (shift.IsDefault == 1 && fallbackShift.IsDefault != 1) {
|
||||
fallbackShift = shift
|
||||
}
|
||||
}
|
||||
|
||||
patterns := []scPatternDay{}
|
||||
createdShifts := 0
|
||||
matchedShifts := 0
|
||||
for _, day := range c.schedTplDays(tpl.ID) {
|
||||
if day.DayType != models.SchedTplDayWork {
|
||||
patterns = append(patterns, scPatternDay{DayIndex: day.DayIndex, DayType: models.SchedTplDayRest})
|
||||
continue
|
||||
}
|
||||
key := schedShiftKey(day.ShiftName, day.WorkStart, day.WorkEnd)
|
||||
shift, hit := shiftMap[key]
|
||||
if hit {
|
||||
matchedShifts++
|
||||
} else {
|
||||
maxSort += 10
|
||||
shift = &models.OaShift{
|
||||
Tid: int(tid),
|
||||
Name: day.ShiftName,
|
||||
ShortName: day.ShiftShort,
|
||||
Color: day.Color,
|
||||
WorkStart: day.WorkStart,
|
||||
WorkEnd: day.WorkEnd,
|
||||
RestStart: day.RestStart,
|
||||
RestEnd: day.RestEnd,
|
||||
WorkHours: day.WorkHours,
|
||||
IsDefault: 0,
|
||||
Status: 1,
|
||||
Sort: maxSort,
|
||||
IsDeleted: 0,
|
||||
}
|
||||
if shift.ShortName == "" {
|
||||
shift.ShortName = shift.Name
|
||||
}
|
||||
if shift.Color == "" {
|
||||
shift.Color = "#409EFF"
|
||||
}
|
||||
if _, err := models.Orm.Insert(shift); err != nil {
|
||||
c.scFail(500, 500, "创建班次失败: "+err.Error())
|
||||
return
|
||||
}
|
||||
shiftMap[key] = shift
|
||||
createdShifts++
|
||||
shift := shiftMap[schedShiftKey(day.ShiftName, day.WorkStart, day.WorkEnd)]
|
||||
if shift == nil {
|
||||
shift = shiftNameMap[strings.TrimSpace(day.ShiftName)]
|
||||
}
|
||||
patterns = append(patterns, scPatternDay{
|
||||
if shift == nil {
|
||||
shift = fallbackShift
|
||||
}
|
||||
if shift != nil {
|
||||
matchedShifts++
|
||||
}
|
||||
item := scPatternDay{
|
||||
DayIndex: day.DayIndex,
|
||||
DayType: models.SchedTplDayWork,
|
||||
ShiftID: shift.ID,
|
||||
ShiftName: shift.Name,
|
||||
ShortName: shift.ShortName,
|
||||
Color: shift.Color,
|
||||
WorkStart: shift.WorkStart,
|
||||
WorkEnd: shift.WorkEnd,
|
||||
RestStart: shift.RestStart,
|
||||
RestEnd: shift.RestEnd,
|
||||
WorkHours: shift.WorkHours,
|
||||
})
|
||||
ShiftName: day.ShiftName,
|
||||
ShortName: day.ShiftShort,
|
||||
Color: day.Color,
|
||||
WorkStart: day.WorkStart,
|
||||
WorkEnd: day.WorkEnd,
|
||||
RestStart: day.RestStart,
|
||||
RestEnd: day.RestEnd,
|
||||
WorkHours: day.WorkHours,
|
||||
}
|
||||
if shift != nil {
|
||||
item.ShiftID = shift.ID
|
||||
item.ShiftName = shift.Name
|
||||
item.ShortName = shift.ShortName
|
||||
item.Color = shift.Color
|
||||
item.WorkStart = shift.WorkStart
|
||||
item.WorkEnd = shift.WorkEnd
|
||||
item.RestStart = shift.RestStart
|
||||
item.RestEnd = shift.RestEnd
|
||||
item.WorkHours = shift.WorkHours
|
||||
}
|
||||
patterns = append(patterns, item)
|
||||
}
|
||||
if len(patterns) == 0 {
|
||||
c.scFail(400, 400, "该模板没有配置排班规则")
|
||||
@@ -196,7 +188,6 @@ func (c *BackendOaSchedulingController) TemplateApply() {
|
||||
"template": schedTplView(tpl, nil),
|
||||
"pattern": patterns,
|
||||
"days": patterns,
|
||||
"created_shift": createdShifts,
|
||||
"matched_shift": matchedShifts,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user