UNPKG

tw-shift-schedule

Version:
64 lines (50 loc) 1.62 kB
'use strict'; // 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;