Commit 741f7b68 by BANice

由于掉电离线,服务端只能根据心跳检测连线有延迟,所有当设备重新上线时自动断开之前的tcp触发close时间防止错误

parent 914e138d
......@@ -226,8 +226,6 @@ class AccessController extends Controller
$orderId = $port->getPortUsingOrderId($redis, $id);
Log::debug('order_id->'.$orderId);
if (isset($orderId) === false || $orderId === false || $orderId == 0) {
continue;
......@@ -237,20 +235,15 @@ class AccessController extends Controller
$order->setId($orderId);
var_dump($orderId);
if ($order->getOrderCache($redis) !== false) {
//订单从离线的状态变为正在充电状态
$orderState = new Offline($order, $redis, $offlineReason);
$orderState->toCharger();
$remainChargerTime = $orderState->getRemainChargerTime();
Log::debug('remainChargerTime'.$remainChargerTime);
if ($remainChargerTime > 0) {
array_push($responseOrder, [
......
......@@ -10,6 +10,7 @@ namespace Application\Controller;
use Application\Controller;
use GatewayWorker\Lib\Gateway;
use Lib\Aes;
use Lib\Log;
......@@ -19,8 +20,8 @@ class CertifyController extends Controller
protected $parameterMap = [
'01' => [
'mac' => 6
]
'mac' => 6,
],
];
/**
......@@ -29,11 +30,11 @@ class CertifyController extends Controller
public function certify()
{
Log::debug('平台认证',$this->getRequest()->getParameters());
Log::debug('平台认证', $this->getRequest()->getParameters());
$nonce = $this->getNonce();
$mac =$this->getRequest()->get('mac');
$mac = $this->getRequest()->get('mac');
//todo 验证mac地址是否存在,从数据库中获取producter_id生产sign
......@@ -43,12 +44,21 @@ class CertifyController extends Controller
$productId = 'A22E4F4CDB05C460E450E46241DD6F89';
$sign = bin2hex(Aes::encrypt($nonce,$productId));
$sign = bin2hex(Aes::encrypt($nonce, $productId));
$sign = substr($sign,0,8);
$sign = substr($sign, 0, 8);
if (Gateway::isUidOnline($mac) === 1) {
$this->response->send('01',$sign);
$clients = Gateway::getClientIdByUid($mac);
foreach ($clients as $client) {
Gateway::closeClient($client);
}
}
$this->response->send('01', $sign);
}
......
......@@ -21,6 +21,7 @@ use Lib\api\message\ChargerStartMessage;
use Lib\api\message\PortShedMessage;
use Lib\api\message\Push;
use Lib\cdz_order\Order;
use Lib\cdz_order\state\Charger;
use Lib\cdz_order\state\WaitingCharger;
use Lib\Gateway;
use Lib\Log;
......@@ -124,7 +125,6 @@ class PortController extends Controller
$offlinePortId = [];
foreach ($portMacArray as $mac) {
//todo 更新逻辑地址数据中
......@@ -143,6 +143,26 @@ class PortController extends Controller
}
$port = new Port();
foreach ($offlinePortId as $portId) {
$orderId = $port->getPortUsingOrderId(\Events::getRedis(),$portId);
$order = new Order();
$order->setId($orderId);
$charger = new Charger($order,\Events::getRedis());
$charger->toOffline();
unset($charger);
unset($order);
}
$port->offline($offlinePortId);
......@@ -197,8 +217,16 @@ class PortController extends Controller
$update['start_time'] = $nowTime;
$row = $orderModel->update($update, 'id = ' . $orderId);
$orderModel->update($update, 'id = ' . $orderId);
//订单状态改为正在充电
$order = new Order();
$order->setId($orderId);
$waiting = new WaitingCharger($order,\Events::getRedis());
$waiting->toCharger();
} catch (\Exception $exception) {
Log::error($exception->getMessage());
......
......@@ -15,18 +15,15 @@ use Application\Model\OrderExceptionModel;
use Application\Model\OrderModel;
use Lib\api\message\ChargerExceedMessage;
use Lib\api\message\ChargerExceptionMessage;
use Lib\api\message\ChargerExcessMessage;
use Lib\api\message\ChargerFailMessage;
use Lib\api\message\ChargerFinishMessage;
use Lib\api\message\ChargerRefundMessage;
use Lib\api\message\ChargerStartMessage;
use Lib\api\message\PortShedMessage;
use Lib\api\message\Push;
use Lib\cdz_order\Order;
use Lib\cdz_order\state\Charger;
use Lib\cdz_order\state\WaitingCharger;
use Lib\Gateway;
use Lib\Log;
use Lib\order_exception\OrderState;
use Lib\order_exception\OrderTrace;
use Lib\port\Port;
use Lib\state\StateCode;
......@@ -153,8 +150,6 @@ class PowerController extends Controller
if( $order->getOrderCache($redis) !== false)
{
var_dump($order->getOrderCache($redis));
$waiting = new WaitingCharger($order,$redis);
$waiting->toCharger();
......@@ -290,6 +285,7 @@ class PowerController extends Controller
$this->response->send('15', $orderId);
return;
} else {
//订单结束更新订单记录
......@@ -297,10 +293,6 @@ class PowerController extends Controller
$orderModel->update(['is_stop' => $state, 'state' => 1, 'end_capacity' => $capacity, 'end_time' => $time], ' id = ' . $id);
$orderState = new OrderState($orderId);
$orderState->setState($state);
}
......@@ -314,20 +306,26 @@ class PowerController extends Controller
Gateway::sendToUid($userId, json_encode(['code' => 10000]));
}
if (isset($orderInfo['order_amount']) === true) {
$orderInfo['order_amount'] = number_format($orderInfo['order_amount'] / 100, 2);
}
$port->setId($portId);
$port->freePort();
$order = new Order();
$order->setId($id);
$chargerState = new Charger($order,\Events::getRedis());
$chargerState->setFinishState($state);
$chargerState->setEndTime(time());
$chargerState->toFinish();
switch ($state) {
case StateCode::FINISH_EXCEED:
$finishMessage = new ChargerExceedMessage();
$finishMessage->setUserId($orderInfo['wx_user_id']);
......
......@@ -151,6 +151,8 @@ class Events
$redis = Events::getRedis();
Log::debug('disconnect');
if (isset($_SESSION['gateway_id']) === true) {
Log::info('gateway_id(' . $_SESSION['gateway_id'] . ')' . 'disconnect');
......
......@@ -77,7 +77,7 @@ class ChargerFinishMessage extends MessageData
'color' => '#333',
],
'keyword4' => [
'value' => '¥'.$this->orderAmount,
'value' => '¥'.number_format($this->orderAmount/100,2),
'color' => '#333',
],
'remark' => [
......
......@@ -105,16 +105,12 @@ class Order
if ($redis->exists($keyName) === false) {
Log::debug('exists false');
return false;
}
$this->orderCache = $redis->hGetAll($keyName);
foreach ($this->orderCache as $key => $value) {
$this->$key = $value;
......
......@@ -35,13 +35,20 @@ class Charger extends State
// TODO: Implement toFull() method.
}
/**
* 充电结束记录充电结束状态和结束充电时间
*/
public function toFinish()
{
// TODO: Implement toFinish() method.
$this->redis->hMSet($this->keyName, ['finishState' => $this->finishState, 'endTime' => $this->endTime]);
}
public function toOffline()
{
$this->redis->hSet($this->keyName,'offlineTime',time());
// TODO: Implement toOffline() method.
}
......
......@@ -23,18 +23,28 @@ class Offline extends State
}
/**
*
*记录了离线原因和上线时间
* 通过上线时间和离线时间根据离线原因计算剩余充电时间
*/
public function toCharger()
{
$purchaseTime = $this->order->getPurchaseTime();
$startTime = $this->getStartTime();
$offlineTime = $this->getOfflineTime();
$this->onlineTime = time();
if($this->order->getStateCode() == -1)
{
$this->remainChargerTime = $this->order->getPurchaseTime();
}else {
$startTime = $this->getStartTime();
$offlineTime = $this->getOfflineTime();
if ($this->offlineReason == 1) {
......@@ -47,9 +57,10 @@ class Offline extends State
$remainTime = $purchaseTime * 60 - ($this->onlineTime - $startTime);
$this->remainChargerTime = (int) ceil($remainTime/60);
$this->remainChargerTime = (int)ceil($remainTime / 60);
}
}
$this->saveOrder->savePortOnlineTime();
......
......@@ -95,6 +95,11 @@ abstract class State
*/
protected $remainChargerTime;
/**
* @var int
*/
protected $finishState;
/**
* State constructor.
* @param Order $order
......@@ -319,6 +324,21 @@ abstract class State
$this->endTime = $endTime;
}
/**
* @return int
*/
public function getFinishState(): int
{
return $this->finishState;
}
/**
* @param int $finishState
*/
public function setFinishState(int $finishState): void
{
$this->finishState = $finishState;
}
......
......@@ -27,8 +27,6 @@ class WaitingCharger extends State
$this->order->setStateCode(12);
$this->order->setCurrentState(new Charger($this->order,$this->redis));
$this->saveOrder->pipe();
$this->saveOrder->saveStartTime();
......
......@@ -25,6 +25,7 @@ class Exception
'99' => '下发开始充电命令',
'98' => '更换充电口',
'97' => '下发结束充电命令',
'96' => '订单更换口子成功',
];
......
......@@ -185,9 +185,6 @@ class Port
{
// 口子充电结束,释放口子,删除正在使用的订单号和用户id,口子状态修改为1。
Log::debug('释放口子id->'.$this->id);
$this->redis->hDel(RedisKey::PORT_USING_ORDER_ID,$this->id);
$this->redis->zRem(RedisKey::PORT_USING_USER_ID,$this->id);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment