2015-07-21 90 views
0

嗨我正在制作一个模块,用于计算指定班次内用户的总工时数。计算已完成的工作时间

例如$start = strtotime("15:00");这是当天的3pm 2015-07-21$end = strtotime("06:00");6am 2015-07-22。我如何根据他们的登录和注销来计算他们的工作时间?我使用Laravel 5我做了一个表loginhours具有这种结构,

loginhours 
->id 
->user_id 
->loginhours 
->date 
->timestamp 
->status 

,但并没有作出任何的逻辑是如何做到这一点,那些表中的列可能我什么,我需要记录的东西或做任务。如果你有建议,你可以自由分享。基本上,他们可以在班次期间登录和注销,只需更新loginhours列。因此,例如,他们用的2015-07-21 03:00:00时间戳这是3pm那么如果他们退出的4pm登录他们的登录小时1.0然后将其在7pm再次登录,并在5am of 2015-07-21注销那么这将是他们以前的登录时间是1.0 + 10.0因为7pm 2015-07-20 - 5am 2015-07-21。并且应该更新该用户的登录时间。

我想的检查是在postLogin()和我AuthController

回答

0

我实现了这一点。我创建了work_order_sessions,以便用户可以检入和检出工单,然后计算工单上的总工时。在你的情况下,你可以简单地创建一个会话记录,当工作人员登录时,设置开始时间,然后当他们注销时,找到他们的最后(打开)会话并设置结束时间。它需要一些原始MySQL来计算每个会话的小时差异,然后为每个用户添加总小时差异。这里有一个片段,并链接:

// Model WorkOrder.php 

/** 
* Retrieves all of the users work order 
* sessions grouped by each user. 
* 
* @return mixed 
*/ 
public function getUniqueSessions() 
{ 
    $select = "TRUNCATE(ABS(SUM(TIME_TO_SEC(TIMEDIFF(work_order_sessions.in, work_order_sessions.out))/3600)), 2) as total_hours"; 

    $records = $this->sessions() 
     ->select('user_id', DB::raw($select)) 
     ->groupBy('user_id') 
     ->get(); 

    return $records; 
} 

https://github.com/stevebauman/maintenance/blob/master/src/Models/WorkOrder.php#L428

模式:

Schema::create('work_order_sessions', function (Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->timestamps(); 
     $table->integer('user_id')->unsigned(); 
     $table->integer('work_order_id')->unsigned(); 
     $table->dateTime('in'); 
     $table->dateTime('out')->nullable(); 

     $table->foreign('user_id')->references('id')->on('users') 
      ->onUpdate('restrict') 
      ->onDelete('cascade'); 

     $table->foreign('work_order_id')->references('id')->on('work_orders') 
      ->onUpdate('restrict') 
      ->onDelete('cascade'); 
    });