load->database(); $this->table = 'process'; $this->load_table('process'); $this->flow=new Model_Flow(); $this->log=new Model_Process_log(); } public function initStatus($flow) { // 流程的第一个情况 $firstStatus = $this->flow->getFirstStatus($flow); $this->setStatus($firstStatus); } public function toNextStatus() { // 流程的下一个情况 $nextStatus = $this->flow->getNextStatus($this->data['status']); // 根据情况生成新状态 return $this->setStatus($nextStatus); } private function operationValidate() { if (isset($this->state) && $this->state != self::STATUS_PROCESSING) { return false; } return true; // if ($this->isPending() == true) { // throw new AppException("{$this->name}已挂起,无法继续操作"); // } } private function setStatus($status) { $state=self::STATUS_PROCESSING; if($this->compareStatus($status,$this->flow->getFinalStatus($status))){ // 流程执行完 if($this->operationValidate()){ $state = self::STATUS_COMPLETED; }else{ $state = self::STATUS_CANCELED; } } if($this->compareStatus($status,$this->flow->getCancelStatus($status))||$this->compareStatus($status,$this->flow->getCloseStatus($status))){ $state = self::STATUS_CANCELED; } //todo 日志 要不要把status 加入 $success=$this->save([ 'state'=>$state, 'status_id'=>$status['id'], 'status'=>$status['code'], 'updated_at'=>time(), ]); if($success){ $info=$this->read($this->id); $msg='头套订单id: '.$info['order_id'].'状态: '.$info['state'].'阶段: '.$info['status'].$status['name']; if($info['uid']){ $msg.='员工:'.$info['uid']; } $this->log->insert([ 'process_id'=>$info['id'], 'flow_id'=>$info['flow_id'], 'msg'=>$msg, 'process_status'=>$status['code'], 'origindata'=>json_encode($info,true), 'created_at'=>time(), ]); $this->afterSetStatus($info,$state); //todo 判断是否全部完成 return true; } return false; } private function compareStatus($status,$flowStatus){ return $status['code']==$flowStatus['code']?true:false; } /** * @throws \Exception */ public function toCloseStatus($flow) { $closeStatus = $this->flow->getCloseStatus($flow); $this->setStatus($closeStatus); } /** * @throws \Exception */ public function toCancelStatus($flow) { $cancelStatus = $this->flow->getCancelStatus($flow); $this->setStatus($cancelStatus); } /** * @return string */ public function getNameAttribute() { return $this->flow->name; } /** * @return string */ public function getStateNameAttribute() { return $this->allState[$this->state]; } /** * @return string */ public function getStatusNameAttribute() { return $this->status->name; } /** * @return string */ public function getCodeAttribute() { return $this->flow->code; } public function afterSetStatus($info,$state){ if($state == self::STATUS_COMPLETED){ $orderid=$info['order_id']; $query=$this->db->from('headorder_item')->where('id',$orderid)->limit(1)->get(); $orderitem=$query->row_array(); $where='a.p_order='.$orderitem['p_order'].' and (b.state !="'.self::STATUS_CANCELED .'" or b.state !="'.self::STATUS_CLOSE.'") and b.status !="cancle"'; $query=$this->db->select('a.*,b.status,b.state') ->from('headorder_item as a') ->join('process as b',' a.`id`=b.`order_id`','inner') ->join('flow_status as c','b.`status_id`=c.id') ->where($where) ->get(); $process_list=$query->result_array(); $sum=array_count_values(array_column($process_list,'status')); if(isset($sum['completed'])&& !empty($sum['completed'])){ if(count($process_list)==$sum['completed']){ // fullorder or smt UPDATE WIGS $res=$this->db->where('orderinfo',$orderitem['p_order'])->update('fullorder',[ 'wigs'=>3, ]); if(!$this->db->affected_rows()){ $this->db->where('orderinfo',$orderitem['p_order'])->update('fullordersmt',[ 'wigs'=>3, ]); } } } }else{ $orderid=$info['order_id']; $query=$this->db->from('headorder_item')->where('id',$orderid)->limit(1)->get(); $orderitem=$query->row_array(); $where='a.p_order='.$orderitem['p_order'].' and (b.state !="'.self::STATUS_CANCELED .'" or b.state !="'.self::STATUS_CLOSE.'") and b.status !="cancle"'; $query=$this->db->select('a.*,b.status,b.state') ->from('headorder_item as a') ->join('process as b',' a.`id`=b.`order_id`','inner') ->join('flow_status as c','b.`status_id`=c.id') ->order_by('c.order DESC') ->limit(1) ->where($where) ->get(); $item=$query->row_array(); $db='fullorder'; $query=$this->db->from($db)->where('orderinfo',$orderitem['p_order'])->limit(1)->get(); $order=$query->row_array(); if(!$order){ $db='fullordersmt'; $query=$this->db->from($db)->where('orderinfo',$orderitem['p_order'])->limit(1)->get(); $order=$query->row_array(); if(!$order){ return; } } $status=$item['status']; $wigs=$order['wigs']?$order['wigs']:0; $nextwigs=0; if($status=='waitAssign'&&$wigs==9){ $nextwigs=1; } if($status=='waitScan' && $wigs==1){ $nextwigs=2; } if($status=='completed' && $wigs==2){ $nextwigs=3; } if($nextwigs){ $res=$this->db->where('orderinfo',$orderitem['p_order'])->update($db,[ 'wigs'=>$nextwigs, ]); } } } }