ERP系统 - 如何处理js中的时间线

时间:2016-12-31 14:54:53

标签: javascript erp

我正在尝试用javascript为我的公司构建一个简单的ERP系统并学习正在进行的工作。 我已经完成了大部分工作,但我无法弄清楚如何处理时间。
例如:
我有3台机器,2个操作员在几个小时内工作。我得到了未来3天要完成的事情清单(其中一些需要5分钟其他3小时)。我想做的是按重要性完成所有工作,并将其与免费操作员一起安排,并为所有活动制定计划 - 他们应该在什么时间开始和结束。
SOOO ...
操作员1在8:00开始第一份工作,他忙到8:45,
操作员2获得第二份工作,因为操作员1忙,他从8:00开始并在8:35完成 第三份工作交给运营商2,因为他将先完成... ect
我知道如何在理论上做到这一点我只是不知道如何在代码中写它...
换句话说,在代码中表示时间轴的最佳方式是什么?

此致

1 个答案:

答案 0 :(得分:0)

记录每项工作的时间信息(开始和持续时间)。 记录每个操作员的占用工作。

这样的事情:

  var jobs = [
  {
    id: 'Job1',
    topic: 'Do something',
    start: 1483200720000, // milliseconds from Jan 1 1970 UTC
    takes: 1500000, // 25 mins (in milliseconds)  
    operator: ''
  },
  {
    id: 'Job2',
    topic: 'Do another thing',
    start: 1483208700000, // milliseconds from Jan 1 1970 UTC
    takes: 5400000, // 1 hour 30 mins (in milliseconds)    
    operator: ''
  },
  // Job 3 starts one minute after Job2 starts so it must take Operator 2
  {
    id: 'Job3',
    topic: 'Do yet another thing',
    start: 1483208760000, // milliseconds from Jan 1 1970 UTC
    takes: 5400000, // 1 hour 30 mins (in milliseconds)    
    operator: ''
  },
];
var operators = 
[
  {
    name: 'Op1',
    jobs: [],
  },
  {
    name: 'Op2',
    jobs: []
  },
];

然后,按照他们的开始时间对作业进行排序,并找到每个作业,一个可用的操作员 - 这是一个在所需时间跨度内没有其他工作的操作员。这是代码的其余部分:

function allocateJobs() {
  // define sort by start time
  var jobsSorter = function (a,b) {return a.start - b.start};

  // sort the jobs by the time they start at
  jobs = jobs.sort(jobsSorter);
  for (var i = 0 ; i < jobs.length ; i++){
    var job = jobs[i];
    for (var j = 0 ; j < operators.length ; j++){
      var op = operators[j];
      if (isAvailable(op, job.start, job.start + job.takes)) {
        // fix job in operator data
        op.jobs.push(job);    

        // fix operator in job data
        job.operator = op.name;        
        break;
      }
    }

  }
}

/** Determines whether an operator is free between fromTime till toTime */
function isAvailable(operator, fromTime, toTime){
  for (var i = 0 ; i < operator.jobs.length ; i++){
    var job = operator.jobs[i];

    // case there is a job starting between fromTime and toTime
    if (job.start > fromTime && job.start < toTime) return false;

    var jobEnds = job.start + job.takes;
    // case there is a job ending between fromTime and toTime
    if (jobEnds > fromTime && jobEnds < toTime) return false;
  }
  return true;
}

Here's a JSFiddle Demo