You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

256 lines
8.9 KiB

6 months ago
<?php
namespace App\Repositories;
use App\Models\ThirdAppointmentLog;
use App\Models\ThirdPlateLog;
/**
* 科拓道闸
*/
class CarRepository
{
public $baseUrl;
public $appid;
public $appsecret;
public $parkId;
public function __construct()
{
$this->baseUrl = 'https://kp-open.keytop.cn/unite-api';
// $this->appid = '10749';
// $this->appsecret = 'f82b42c6f60246eba56ec4a77dfe7f9b';
// $this->parkId = '4603';
$this->appid = '13520';
$this->appsecret = 'dac06919e42c4974937ccb867792141a';
$this->parkId = '7818';
}
/**
* 停车场信息查询接口
* @return false|mixed
*/
public function getParkingLotInfo()
{
$url = $this->baseUrl . '/api/wec/GetParkingLotInfo';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'getParkingLotInfo',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo()
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
try {
$result = httpCurl($url, 'POST', $params, $header);
$result = json_decode($result, true);
if (empty($result['resCode'])) {
return json_decode($result['data'], true);
} else {
return false;
}
} catch (\Exception $e) {
return false;
}
}
/**
* 预约车位
*/
public function appointment($model, $plateNo, &$out)
{
$url = $this->baseUrl . '/api/find/ReserveSpace';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'reserveSpace',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo(),
'plateNo' => $plateNo,
'type' => 1,
'addrId' => '4,6',
'enterTime' => date('Y-m-d 00:00:01', strtotime($model->start_time)),
6 months ago
'leaveTime' => date('Y-m-d 23:59:58', strtotime($model->end_time)),
6 months ago
// 失效时间
6 months ago
'failureTime' => date('Y-m-d 23:59:59', strtotime($model->end_time)),
6 months ago
'flag' => 1,
'cardType' => 100,
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
$result = [];
$finally = $order_no = 0;
$plate_status = 2;
try {
$resultJson = httpCurl($url, 'POST', $params, $header);
$out = $resultJson;
$result = json_decode($resultJson, true);
if (empty($result['resCode'])) {
$finally = 1;
$order_no = json_decode($result['data'], true)['orderNo'];
$plate_status = 1;
return true;
} else {
return false;
}
} catch (\Exception $e) {
$out = $e->getMessage();
return false;
} finally {
// 写日志
$thirdAppointmentLogModel = ThirdAppointmentLog::add($model->id, 0, $model->user_id, $url, $params, $result, $finally, '用户车位预订');
// 写车牌记录信息
ThirdAppointmentLog::addPlate($thirdAppointmentLogModel, $plateNo, $plate_status, $order_no);
}
}
/**
* 预约车位(课程报名渠道)
*/
public function courseAppointment($course, $courseSigns, $plateNo, &$out)
{
$url = $this->baseUrl . '/api/find/ReserveSpace';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'reserveSpace',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo(),
'plateNo' => $plateNo,
'type' => 1,
'addrId' => '',
'enterTime' => $course->start_date . ' 00:00:00',
'leaveTime' => $course->end_date . ' 00:00:00',
'failureTime' => date('Y-m-d 59:59:59', strtotime($course->end_date)),
'flag' => 1,
'cardType' => 100,
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
$result = [];
$finally = $order_no = 0;
$plate_status = 2;
try {
$resultJson = httpCurl($url, 'POST', $params, $header);
$out = $resultJson;
$result = json_decode($resultJson, true);
if (empty($result['resCode'])) {
$finally = 1;
$order_no = json_decode($result['data'], true)['orderNo'];
return true;
} else {
return false;
}
} catch (\Exception $e) {
$out = $e->getMessage();
return false;
} finally {
// 写日志
$thirdAppointmentLogModel = ThirdAppointmentLog::add(0, $courseSigns->id, $courseSigns->user_id, 0, $url, $params, $result, $finally, '用户车位预订');
// 写车牌记录信息
ThirdAppointmentLog::addPlate($thirdAppointmentLogModel, $plateNo, $plate_status, $order_no);
}
}
/**
* 取消预约车位
*/
public function cancelAppointment($appointment_id = 0, $course_sign_id = 0, $plateNo, &$out)
{
// 获取车位预约的订单号
$thirdPlateLog = ThirdAppointmentLog::where(function ($query) use ($appointment_id, $course_sign_id) {
if ($appointment_id) {
$query->where('appointment_id', $appointment_id);
}
if ($course_sign_id) {
$query->where('course_sign_id', $course_sign_id);
}
})->where('plate', 'like', "%$plateNo%")
->where('plate_status', 1)
->first();
if (empty($thirdPlateLog)) {
$out = '预约成功记录不存在';
return false;
};
$url = $this->baseUrl . '/api/find/CancelReserveSpace';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'cancelReserveSpace',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo(),
'orderNo' => $thirdPlateLog->plate_order_no,
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
$result = [];
$finally = 0;
try {
$resultJson = httpCurl($url, 'POST', $params, $header);
$out = $resultJson;
$result = json_decode($resultJson, true);
if (empty($result['resCode'])) {
// 修改车牌预约状态
$thirdPlateLog->plate_status = 3;
$thirdPlateLog->save();
$finally = 1;
return true;
} else {
return false;
}
} catch (\Exception $e) {
$out = $e->getMessage();
return false;
} finally {
// 写日志
ThirdAppointmentLog::add($appointment_id, $course_sign_id, 0, $url, $params, $result, $finally, '用户取消车位预订');
}
}
/**
* 签名
*/
public function sign($data)
{
// 过滤掉空值、null、空字符串及特定键appId, appSercert
$filteredData = array_filter($data, function ($value) {
return !is_null($value) && $value !== '' && !is_array($value) && !is_object($value);
}, ARRAY_FILTER_USE_BOTH);
// 移除特定键appId, appSercert如果存在的话
if (isset($filteredData['appId'])) {
unset($filteredData['appId']);
}
if (isset($filteredData['appSercert'])) {
unset($filteredData['appSercert']);
}
// 按ASCII码字典序排序属性名
uksort($filteredData, 'strcasecmp');
// 拼接成URL键值对格式的字符串
$stringA = '';
foreach ($filteredData as $key => $value) {
$stringA .= $key . '=' . $value . '&';
}
$stringA = rtrim($stringA, '&'); // 去除最后一个多余的&
// 拼接上appSercert并计算MD5
$appSercert = $this->appsecret; // 假设'appSercert'始终存在
$stringSignTemp = $stringA . '&' . $appSercert;
$signValue = strtoupper(md5($stringSignTemp)); // 转换为大写
return $signValue;
}
}