load->helper(array('form', 'date')); $this->load->model("workorder_model"); } /** * 统计报表首页 */ public function index() { $sign = $this->input->get("sign", true); $begin_date = $this->input->post("begin_date", true); $end_date = $this->input->post("end_date", true); $begin_time = " 0:0:0"; $end_time = " 23:59:59"; $now = new DateTime(); $end = $now->format("Y-m-d"); switch ($sign) { case '1': $title = "近7天"; $end_date_time = new DateTime($end . $end_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $now = new DateTime(); $now->modify("-6 day"); $begin = $now->format("Y-m-d"); $begin_date_time = new DateTime($begin . $begin_time); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); break; case '2': $title = "近30天"; $end_date_time = new DateTime($end . $end_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $now = new DateTime(); $now->modify("-30 day"); $begin = $now->format("Y-m-d"); $begin_date_time = new DateTime($begin . $begin_time); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); break; case '3': $title = "近三个月"; $end_date_time = new DateTime($end . $end_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $now = new DateTime(); $now->modify("-3 month"); $begin = $now->format("Y-m-d"); $begin_date_time = new DateTime($begin . $begin_time); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); break; case '4': $title = "近半年"; $end_date_time = new DateTime($end . $end_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $now = new DateTime(); $now->modify("-6 month"); $begin = $now->format("Y-m-d"); $begin_date_time = new DateTime($begin . $begin_time); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); break; case '5': $title = "近一年"; $end_date_time = new DateTime($end . $end_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $now = new DateTime(); $now->modify("-1 year"); $begin = $now->format("Y-m-d"); $begin_date_time = new DateTime($begin . $begin_time); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); break; default: $title = "近7天"; $end_date_time = new DateTime($end . $end_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $now = new DateTime(); $now->modify("-6 day"); $begin = $now->format("Y-m-d"); $begin_date_time = new DateTime($begin . $begin_time); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); } if ($begin_date && $end_date) { $title = "自" . $begin_date . "至" . $end_date; $end_date_time = new DateTime($end_date . $end_time); $begin_date_time = new DateTime($begin_date . $begin_time); $end_datetime = new MongoDB\BSON\UTCDateTime($end_date_time->getTimestamp()*1000); $begin_datetime = new \MongoDB\BSON\UTCDateTime($begin_date_time->getTimestamp()*1000); } /*图表1数据封装 各个状态的工单分布*/ $group1 = array( "_id" => "\$status", "value" => array("\$sum" => 1) ); $result1 = $this->workorder_model->aggregate($begin_datetime, $end_datetime, $group1,NULL,array("status"=>array("\$ne"=>"60"))); $data1 = array(); if (is_array($result1) && count($result1) >= 1) { foreach ($result1 as $key => $val) { $data1[] = array( "name" => $this->workorder_status[$val['_id']], "value" => $val['value'] ); } } /*图表2数据封装 各分支工单总数*/ $group2 = array( "_id" => "\$branch.branch_id", "value" => array("\$sum" => 1) ); $result2 = $this->workorder_model->aggregate($begin_datetime, $end_datetime, $group2,NULL,array("status"=>array("\$ne"=>"60"))); $data2x = array(); $data2y = array(); if (is_array($result2) && count($result2) >= 1) { foreach ($this->branch_array as $key => $branch) { $data2x[] = $branch['branch_name']; $have_value = 0; foreach ($result2 as $key => $val) { if ($val['_id'] == $branch['branch_id']) { $data2y[] = $val['value']; $have_value = 1; } } if (!$have_value) { $data2y[] = 0; } } } /*图表3数据封装 各分支工单状态数量*/ $group3 = array( "_id" => array("branchs" => "\$branch.branch_id", "status" => "\$status"), "value" => array("\$sum" => 1) ); $result3 = $this->workorder_model->aggregate($begin_datetime, $end_datetime, $group3,NULL,array("status"=>array("\$ne"=>"60"))); $data3x = array(); $data3y = array(); $data3legend = array(); $i = 0; foreach ($this->branch_array as $key => $branch) { $data3x[] = $branch['branch_name']; } foreach ($this->workorder_status as $k => $status) { if($k == "60") continue; $data = array(); $data['name'] = $status; $data['type'] = "bar"; $data['barGap'] = 0; $data3y[] = $data; $data3legend[] = $status; } $i = 0; foreach ($this->workorder_status as $k => $status) { if($k == "60") continue; $value = array(); foreach ($this->branch_array as $key => $branch) { $have_value = 0; foreach ($result3 as $result) { if ($result['_id']['branchs'] == $branch['branch_id'] && $result['_id']['status'] == $k) { $value[] = $result['value']; $have_value = 1; } } if (!$have_value) { $value[] = 0; } } $data3y[$i]['data'] = $value; if ($i < count($data3y)) { $i++; } } $datediff = $begin_date_time->diff($end_date_time); /*图表4数据封装 工单总数趋势图*/ $data4x = array(); $data4y = array(); if($sign==1 || $sign ==2 || ($datediff->m<3 && $datediff->y==0)) { $start_date_time = new DateTime($begin_date_time->format("Y-m-d")); if($sign == 1) { for ($i = 0; $i <= $datediff->d; $i++) { $data4x[] = $start_date_time->format("Y-m-d"); $start_date_time->modify("+1 day"); } }elseif($sign==2){ for ($i = 0; $i < 30; $i++) { $data4x[] = $start_date_time->format("Y-m-d"); $start_date_time->modify("+1 day"); } }else{ $diff = $this->diffBetweenTwoDays($begin_date_time,$end_date_time); for ($i = 0; $i < $diff; $i++) { $data4x[] = $start_date_time->format("Y-m-d"); $start_date_time->modify("+1 day"); } } $group4 = array( "_id" => array("\$dateToString" => array("format" => "%Y-%m-%d", "date" => array("\$add" => ["\$create_time", 28800000]))), "value" => array("\$sum" => 1), ); }else{ $start_date_time = new DateTime($begin_date_time->format("Y-m-d")); if($datediff->y > 0){ $count = $datediff->y*12 + $datediff->m; }else{ $count = $datediff->m; } for($i = 0;$i<$count;$i++){ $start_date_time->modify("+1 month"); $data4x[] = $start_date_time->format("Y-m"); } $group4 = array( "_id" => array("\$dateToString" => array("format" => "%Y-%m", "date" => array("\$add" => ["\$create_time", 28800000]))), "value" => array("\$sum" => 1), ); } $result4 = $this->workorder_model->aggregate($begin_datetime, $end_datetime, $group4,NULL,array("status"=>array("\$ne"=>"60")),NULL,NULL,array("_id"=>"ASC")); for ($i=0 ; $im<3 && $datediff->y==0)) { $start_date_time = new DateTime($begin_date_time->format("Y-m-d")); if($sign == 1) { for ($i = 0; $i <= $datediff->d; $i++) { $data5x[] = $start_date_time->format("Y-m-d"); $start_date_time->modify("+1 day"); } }elseif($sign==2){ for ($i = 0; $i < 30; $i++) { $data5x[] = $start_date_time->format("Y-m-d"); $start_date_time->modify("+1 day"); } }else{ $diff = $this->diffBetweenTwoDays($begin_date_time,$end_date_time); for ($i = 0; $i <= $diff; $i++) { $data5x[] = $start_date_time->format("Y-m-d"); $start_date_time->modify("+1 day"); } } $group5 = array( "_id" => array("\$dateToString" => array("format" => "%Y-%m-%d", "date" => array("\$add" => ["\$end_time", 28800000]))), "value" => array("\$sum" => 1), ); }else{ $start_date_time = new DateTime($begin_date_time->format("Y-m-d")); if($datediff->y > 0){ $count = $datediff->y*12 + $datediff->m; }else{ $count = $datediff->m; } for($i = 0;$i<$count;$i++){ $start_date_time->modify("+1 month"); $data5x[] = $start_date_time->format("Y-m"); } $group5 = array( "_id" => array("\$dateToString" => array("format" => "%Y-%m", "date" => array("\$add" => ["\$end_time", 28800000]))), "value" => array("\$sum" => 1), ); } $result5 = $this->workorder_model->aggregate($begin_datetime, $end_datetime, $group5,NULL,array("status"=>"50"),NULL,NULL,array("_id"=>"ASC")); for ($i=0;$iassign("data1", json_encode($data1)); $this->assign("data2x", json_encode($data2x)); $this->assign("data2y", json_encode($data2y)); $this->assign("data3x", json_encode($data3x)); $this->assign("data3y", json_encode($data3y)); $this->assign("data3legend", json_encode($data3legend)); $this->assign("data4x", json_encode($data4x)); $this->assign("data4y", json_encode($data4y)); $this->assign("data5x", json_encode($data5x)); $this->assign("data5y", json_encode($data5y)); $this->assign("begin_date", $begin_date); $this->assign("end_date", $end_date); $this->assign("title", $title); $this->assign("sign", $sign); $this->assign("now", now()); $this->display("report/index.html"); } /** * 求两个日期之间相差的天数 * (针对1970年1月1日之后,求之前可以采用泰勒公式) * @param DateTime $day1 * @param DateTime $day2 * @return number */ public function diffBetweenTwoDays ($day1, $day2) { $second1 = $day1->getTimestamp(); $second2 = $day2->getTimestamp(); if ($second1 < $second2) { $tmp = $second2; $second2 = $second1; $second1 = $tmp; } return ($second1 - $second2) / 86400; } /** * 导出统计报表 */ public function export(){ $title = $this->input->get('title',true); $chart1 = '
' . ''; $chart2 = '
' . ''; $chart3 = '
' . ''; $chart4 = '
' . ''; $chart5 = '
' . ''; $this->assign("title", $title); $this->assign("chart1", $chart1); $this->assign("chart2", $chart2); $this->assign("chart3", $chart3); $this->assign("chart4", $chart4); $this->assign("chart5", $chart5); $this->display("export/report.html"); } }