tw-shift-schedule
Version:
64 lines (50 loc) • 1.62 kB
JavaScript
;
// usage:
// create(3, [
// { from: '2017-12-01 09:36:00', to: '2017-12-01 19:44:00', required: 2},
// ...
// ])
var Schedule = require('./schedule');
var validate = require('./validate');
function create(employeeCount, shifts, transformed) {
var schedules = [];
var employees = [];
for (var i = 0; i < employeeCount; i++) {
employees.push(i);
schedules.push([]);
}
// 前一班已經在工作的人,優先從這些人開始爬,以延續當日工時
var lastShiftWorkedEmployees = [];
for (var _i = 0; _i < shifts.length; _i++) {
var required = shifts[_i].required;
var assigned = [];
// 員工 id 列表,前一班已經在工作的排在前面
var candidates = lastShiftWorkedEmployees.concat(employees).filter(function (v, i, self) {
return self.indexOf(v) === i;
});
var ok = false;
for (var j = 0; j < candidates.length; j++) {
var employee = candidates[j];
schedules[employee].push([shifts[_i].from, shifts[_i].to]);
if (validate(Schedule.fromTime(schedules[employee]), { transformed: transformed }).length === 0) {
// 排班合法,進入下一個
assigned.push(employee);
} else {
// 排班不合法,丟掉這個排班,換試下一個
schedules[employee].pop();
}
if (assigned.length === required) {
ok = true;
break;
}
lastShiftWorkedEmployees = assigned;
}
if (!ok) {
var e = new Error('Unable to schedule');
e.pos = shifts[_i];
throw e;
}
}
return schedules;
}
module.exports = create;