load->_model('Model_systemtransfer','systemtransfer'); $this->load->_model("Model_systemtransfer_cr",'systemtransfer_cr'); $this->load->_model("Model_transfer",'transfer'); $this->load->_model("Model_fullorder","fullorder"); $this->load->_model("Model_fullordersmt","fullordersmt"); $this->load->_model("Model_fullordertt","fullordertt"); } //定义方法的调用规则 获取URI第二段值 public function _remap($arg,$arg_array) { if($arg == 'cjgx' ){ //执行车间效率检测 $this->_cjgx(); }else{ $this->_index(); } } public function _index(){ echo "程序异常"; } public function dd($val){ echo "
"; var_dump($val); die; } public function _cjgx(){ $limit_time = time() - 3600*24*30; $list = $this->systemtransfer->find_all("status < 10 and time >= ".$limit_time); if(empty($list)){ die(json_encode(array('code'=>0,'msg'=>'没有需要检测的工单'),JSON_UNESCAPED_UNICODE)); } echo date('Y-m-d H:i:s')."开始执行车间效率检测".PHP_EOL; foreach ($list as $val){ $this->doSingleData($val); } echo date('Y-m-d H:i:s')."执行车间效率检测结束".PHP_EOL; } //单独处理每个工单的状态判断 public function doSingleData($info){ $lbrk = array_reverse(explode('|',trim($info['rk'],'|'))); $lbck = array_reverse(explode('|',trim($info['ck'],'|'))); //如果是11 说明是成品库 说明已经入库完毕了 表示已经完毕 if($lbrk[0] == 11){ $this->checkOver($info['id']); return; } //检测出入库都存在时 是否做过标记 在出库的时候已经同步过了 if($lbrk[0] == $lbck[0]){ // if(!in_array($lbrk[0],[11,12,15,16])){ // $this->checkIsOver($info,$lbrk[0]); // return; // } return ; } //如果是 成品库 布标打印 发块 滞销款 不做处理 再次判定状态是否是 超时一次 超时两次 if(!in_array($lbrk[0],[11,12,15,16])){ $this->jdgeTimeOut($info,$lbrk[0]); } } //如果检测到最后的入库是 /** * $id 工单主键id */ public function checkOver($id){ $this->systemtransfer->save(array('status'=>10),$id); $this->load->database(); //同步表示 此单已经到成品库 完结了 $this->db->where('fid',$id); $this->db->update('systemtransfer_cr',array('is_over'=>3)); $this->db->affected_rows(); } //检测是否已经完结 如果完结 且已经标记 那么不做处理 如果为做标记 那么就坐下处理 /** * $fid 工单主键id * $lx 车间id */ public function checkIsOver($info,$lx){ $fid = $info['id']; $list = $this->systemtransfer_cr->find_all("fid = ".$fid,"*",'id desc',0,2); //如果查到的数据小于2 那么就说明此单异常 if(count($list) < 2){ //echo json_encode(array('code'=>0,'msg'=>'程序异常','data'=>['info'=>$info,'list'=>$list]),JSON_UNESCAPED_UNICODE); return ; } //如果查到的数据不等于指定的车间id 说明程序异常了 先不执行 if(($list[0]['lx'] != $lx) || ($list[1]['lx'] != $lx)){ return ; } if(($list[0]['is_over'] == 0) || ($list[1]['is_over'] == 0)){ if($list[1]['orver_flag'] == 2){ $this->systemtransfer_cr->save(['is_over'=>1,'orver_flag'=>2],$list[0]['id']); }else{ $this->systemtransfer_cr->save(['is_over'=>1],$list[0]['id']); } $this->systemtransfer_cr->save(['is_over'=>1],$list[1]['id']); } return ; } //判定是否超时 public function jdgeTimeOut($info,$lx){ $list = $this->systemtransfer_cr->find_all("fid = ".$info['id'],"*",'id desc',0,1); if(empty($list)){ return ; } if($list[0]['lx'] != $lx){ return ; } //查询流转部分要求 $depart_info = $this->transfer->find("id = ".$lx); if(empty($depart_info)){ return ; } $now_time = time(); $ru_time = $list[0]['time'];//扫描时间 // $overtime_one = $depart_info['overtime_one'] * 3600; // $overtime_two = $depart_info['overtime_two'] * 3600; //如果时间节点一样 就不再执行了 if($depart_info['overtime_one'] == $depart_info['overtime_two']){ return ; } $overtime_one = $depart_info['overtime_one'] * 3600 ; $overtime_two = $depart_info['overtime_two'] * 3600; //不选超时 if(($now_time - $ru_time) < $overtime_one){ return ; } $limit_time = [ 'overtime_one'=> $depart_info['overtime_one'], 'overtime_two'=>$depart_info['overtime_two'], ]; $remain_time = $now_time - $ru_time; $num = $this->weektimes($ru_time , $now_time); if($num > 0 ){ $remain_time = $remain_time - 24 * 3600 * $num; } //前处理有时间1 就是超时提醒 // if($lx == 5){ // //超时一次的 // if(($now_time - $ru_time) >= $overtime_one ){ // if($list['0']['orver_flag'] == 0){ // $this->systemtransfer_cr->save(['orver_flag'=>1,'limit_time_str'=> json_encode($limit_time)],$list['0']['id']); // } // } // }else{ //超时一次的 if(( $remain_time) >= $overtime_one && ( $remain_time) < $overtime_two){ if($list['0']['orver_flag'] == 0){ $type = $this->checkOrderInfo($info['number']); if($type == 1){//订单取消了或者其他原因 在没出库的情况下就完成了 $this->systemtransfer_cr->save(['orver_flag'=>3],$list[0]['id']); }elseif($type == 10){ $this->systemtransfer_cr->save(['orver_flag'=>1,'limit_time_str'=> json_encode($limit_time)],$list[0]['id']); } } } //超时2次的 if(( $remain_time) >= $overtime_two){ if($list[0]['orver_flag'] <= 1){ //$this->systemtransfer_cr->save(['orver_flag'=>2,'limit_time_str'=> json_encode($limit_time)],$list['0']['id']); $type = $this->checkOrderInfo($info['number']); if($type == 1){//订单取消了或者其他原因 在没出库的情况下就完成了 $this->systemtransfer_cr->save(['orver_flag'=>3],$list[0]['id']); }elseif($type == 10){ $this->systemtransfer_cr->save(['orver_flag'=>2,'limit_time_str'=> json_encode($limit_time)],$list[0]['id']); }else{ } } } //} } //检测是否含有周日 protected function weektimes($start_time,$endstime) { //是否有周六周日 $week_array = [7, 1, 2, 3, 4, 5, 6]; $i = 0; while ($start_time <= $endstime) { $now_time = date('Y-m-d', $start_time); // 可根据自己想要的返回格式进行调整 $alltime[$i]['week'] = $week_array[date("w", strtotime($now_time))]; $start_time = strtotime('+1 day', $start_time); $i++; } $list = []; foreach ($alltime as $key => $value) { //周日数组 if ($value['week'] > 6) { $list[] = $value['week']; } } return count($list); } //检验订单的状态 protected function checkOrderInfo($number){ $nu = $this->fullorder->get_number($number); if(!$nu) { $nu = $this->fullordersmt->get_number($number); if(!$nu) { $nu = $this->fullordertt->get_number($number); } } //此单已取消!请联系店员核实 if($nu['state'] == '214' || $nu['state'] == '217') { return 1; } //因为某些原因订单虽然现实是完成 但是实际上是终止了 所以就按照取消计算吧 // if($nu['state'] == '216' || $nu['state'] == '215') // { // return 1; // } return 10; } }