优化排班功能

This commit is contained in:
hero920103 committed 2026-11-05 18:00:50 +08:00
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,
})
}