mCommonID = $common_id; $this->mBatchCode = $batch_code; $this->mod_fcode = Model('goods_fcode'); } public function grabed($mobile = null) { $cond = []; $cond['goods_commonid'] = $this->mCommonID; $cond['batch_code'] = $this->mBatchCode; if($mobile == null) { if(session_helper::logined()) { $cond['mobile|session_id'] = array('_multi'=>true,session_helper::cur_mobile(),session_helper::session_id()); } else { $cond['session_id'] = session_helper::session_id(); } } else { $cond['mobile|session_id'] = array('_multi'=>true,$mobile,session_helper::session_id()); } $fcode = $this->mod_fcode->getGoodsFCode($cond); if(empty($fcode)) { return false; } else { return $fcode; } } public function grab() { $fcode = $this->grabed(); if($fcode != false) return $fcode; while(true) { $cond = array('goods_commonid' => $this->mCommonID, 'batch_code' => $this->mBatchCode, 'fc_state' => '0', 'grab_state' => array('in', array(0,1)), 'grab_time' => array('lt',time() - self::time_out)); $fcodes = $this->mod_fcode->where($cond)->field('*')->order('fc_id asc')->limit(1)->select(array('master' => true)); if(empty($fcodes) || empty($fcodes[0])) return false; $fcode = $this->try_grab($fcodes[0]); if($fcode != false) { return $fcode; } } } public function bind($fcode,$mobile) { $cond = []; $cond['goods_commonid'] = $this->mCommonID; $cond['batch_code'] = $this->mBatchCode; $cond['user_key'] = $fcode['user_key']; $cond['fc_id'] = $fcode['fc_id']; $cond['fc_state'] = $fcode['fc_state']; $cond['grab_state'] = $fcode['grab_state']; $cond['grab_time'] = $fcode['grab_time']; $cond['session_id'] = $fcode['session_id']; $cond['mobile'] = $fcode['mobile']; $datas = array('grab_state' => 2, 'mobile' => $mobile, 'user_key' => mt_rand(1000, 9999), 'usable_time' => time() + ($fcode['usable_days'] * 24 * 3600)); try { $this->mod_fcode->beginTransaction(); $ret = $this->mod_fcode->where($cond)->update($datas); $affect_rows = $this->mod_fcode->affected_rows(); $this->mod_fcode->commit(); Log::record("fcode::grab try_grab ret={$ret} affected_rows={$affect_rows}",Log::DEBUG); if($ret != false && $affect_rows > 0) { $fcode = array_merge($fcode,$datas); return $fcode; } else { return false; } } catch (Exception $ex) { $this->mod_fcode->rollback(); return false; } } public function change($fcode,$mobile) { return $this->bind($fcode,$mobile); } public function lock($pay_sn) { $fcode = $this->grabed(); if($fcode != false) return $fcode; if(!session_helper::logined()) { return false; } while(true) { $cond = array('goods_commonid' => $this->mCommonID, 'batch_code' => $this->mBatchCode, 'fc_state' => '0', 'grab_state' => array('in', array(0,1)), 'grab_time' => array('lt',time() - self::time_out)); $fcodes = $this->mod_fcode->where($cond)->field('*')->order('fc_id asc')->limit(1)->select(array('master' => true)); if(empty($fcodes) || empty($fcodes[0])) return false; $fcode = $this->try_lock($fcodes[0],$pay_sn); if($fcode != false) { return $fcode; } } } public static function unlock($pay_sn) { $mod_fcode = Model('goods_fcode'); $cur_time = time(); $ret = $mod_fcode->where(['pay_sn' => $pay_sn,'fc_state' => 3])->update(['fc_state' => 0, 'usable_time' => array('exp', "usable_days * 86400 + {$cur_time}")]); $affect_rows = $mod_fcode->affected_rows(); if($ret != false && $affect_rows > 0) { return $affect_rows; } else { return 0; } } public static function reset($pay_sn) { $mod_fcode = Model('goods_fcode'); $ret = $mod_fcode->where(['pay_sn' => $pay_sn,'fc_state' => 3])->update(['fc_state' => 0, 'usable_time' => 0, 'mobile' => '', 'session_id' => '', 'grab_state' => 0, 'grab_time' => 0, 'pay_sn' => 0]); $affect_rows = $mod_fcode->affected_rows(); if($ret != false && $affect_rows > 0) { return $affect_rows; } else { return 0; } } private function try_lock($fcode,$pay_sn) { $cond = []; $cond['goods_commonid'] = $this->mCommonID; $cond['batch_code'] = $this->mBatchCode; $cond['user_key'] = $fcode['user_key']; $cond['fc_id'] = $fcode['fc_id']; $cond['fc_state'] = $fcode['fc_state']; $cond['grab_state'] = $fcode['grab_state']; $cond['grab_time'] = $fcode['grab_time']; $cond['session_id'] = $fcode['session_id']; $cond['mobile'] = $fcode['mobile']; $datas = array( 'grab_state' => 2, 'grab_time' => time(), 'session_id' => session_helper::session_id(), 'mobile' => session_helper::cur_mobile(), 'fc_state' => 3, 'pay_sn' => $pay_sn, 'user_key' => mt_rand(1000, 9999)); try { $this->mod_fcode->beginTransaction(); $ret = $this->mod_fcode->where($cond)->update($datas); $affect_rows = $this->mod_fcode->affected_rows(); $this->mod_fcode->commit(); Log::record("fcode::grab try_grab ret={$ret} affected_rows={$affect_rows}",Log::DEBUG); if($ret != false && $affect_rows > 0) { $fcode = array_merge($fcode,$datas); return $fcode; } else { return false; } } catch (Exception $ex) { $this->mod_fcode->rollback(); return false; } } private function try_grab($fcode) { $cond = []; $cond['goods_commonid'] = $this->mCommonID; $cond['batch_code'] = $this->mBatchCode; $cond['user_key'] = $fcode['user_key']; $cond['fc_id'] = $fcode['fc_id']; $cond['fc_state'] = $fcode['fc_state']; $cond['grab_state'] = $fcode['grab_state']; $cond['grab_time'] = $fcode['grab_time']; $cond['session_id'] = $fcode['session_id']; $cond['mobile'] = $fcode['mobile']; if(session_helper::logined() || session_helper::isVerfiyMobile()) { // 如果是登录状态直接绑定 $datas = array( 'grab_state' => 2, 'grab_time' => time(), 'session_id' => session_helper::session_id(), 'mobile' => session_helper::cur_mobile(), 'user_key' => mt_rand(1000, 9999), 'usable_time' => time() + ($fcode['usable_days'] * 24 * 3600)); } else { $datas = array( 'grab_state' => 1, 'grab_time' => time(), 'session_id' => session_helper::session_id()); } try { $this->mod_fcode->beginTransaction(); $ret = $this->mod_fcode->where($cond)->update($datas); $affect_rows = $this->mod_fcode->affected_rows(); $this->mod_fcode->commit(); Log::record("fcode::grab try_grab ret={$ret} affected_rows={$affect_rows}",Log::DEBUG); if($ret != false && $affect_rows > 0) { $fcode = array_merge($fcode,$datas); return $fcode; } else { return false; } } catch (Exception $ex) { $this->mod_fcode->rollback(); return false; } } }