123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
- require_once APPPATH.'/models/Model_flow.php';
- require_once APPPATH.'/models/Model_process_log.php';
- // require_once APPPATH.'/models/Model_headorder_item.php';
- class Model_Process extends Lin_Model
- {
- const STATUS_PROCESSING = 'processing';
- const STATUS_COMPLETED = 'completed';
- const STATUS_CANCELED = 'canceled';
- const STATUS_CLOSE = 'close';
- function __construct(){
- parent::__construct();
- $this->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,
- ]);
- }
-
-
- }
- }
-
-
- }
|