Files
park/application/api/controller/YqDriver.php

645 lines
19 KiB
PHP
Raw Permalink Normal View History

2025-12-01 11:19:23 +08:00
<?php
namespace app\api\controller;
use app\admin\model\Article;
use app\admin\model\yq\alarm\Alarm;
use app\admin\model\yq\base_config\Cargo;
use app\admin\model\yq\base_config\Early;
use app\admin\model\yq\driver\Driver;
use app\admin\model\yq\driver\Trouble;
use app\admin\model\yq\electronic_waybill\Waybill;
use app\admin\model\yq\message\Message;
use app\admin\model\yq\park\Park;
use app\common\controller\Api;
use app\common\exception\UploadException;
use app\common\library\Upload;
use think\Cache;
use think\Db;
use think\Exception;
use think\Loader;
/**
* 司机端接口管理
*/
class YqDriver extends Api
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
protected $driver_id = null;
protected $key = "A273781DBF8B7657";
protected $method = 'AES-128-CBC';
protected $iv = "E3041CDBBD37CC50";
public function _initialize()
{
parent::_initialize();
if (!$this->driver_id) {
if (!isset(getallheaders()['Token'])) {
$this->error('非法请求~');
}
$this->driver_id = $this->decrypt(getallheaders()['Token']);
}
}
/** 获取基础配置信息 */
public function index()
{
$data = [];
$this->success('success', $data);
}
//入园目的
public function mission()
{
$data = (new Park())->getMissionList();
$this->success('success', $data);
}
//载货品类
public function getProductCate()
{
$data = Cargo::list();
$this->success('success', $data);
}
//报警等级
public function getEarlyList()
{
$data = Early::select();
$this->success('success', $data);
}
//企业信息
public function getEnterpriseList()
{
$data = \app\admin\model\yq\perimeter\Enterprise::select();
$this->success('success', $data);
}
/** 司机信息 */
//登录
public function login()
{
$params = input();
if (empty($params['account']) || strlen($params['account']) > 10) {
$this->error('请输入正确的账号');
}
if (empty($params['password'])) {
$this->error('请输入正确的密码');
}
$driver = Driver::where('account', $params['account'])->find();
if (!$driver) {
$this->error('账号不存在,请先注册');
}
if ($driver['password'] != md5($params['password'])) {
$this->error('密码错误');
}
$this->driver_id = $driver['id'];
$this->success('正在登录...', ['token' => $this->encrypt($driver['id'])]);
}
//注册
public function register()
{
$params = input();
if (empty($params['account']) || strlen($params['account']) > 10) {
$this->error('请输入正确的真实姓名');
}
if (empty($params['phone']) || !preg_match("/^1\d{10}$/", trim($params['phone']))) {
$this->error('请输入正确的手机号码');
}
$default_password = "123456";
$params['password'] = md5($default_password);
$driver = Driver::where('account', $params['account'])->find();
if ($driver) {
$this->error('真实姓名已被注册');
}
$driver = Driver::where('phone', $params['phone'])->find();
if ($driver) {
$this->error('手机号已被注册');
}
$res = Driver::create([
'account' => $params['account'],
'phone' => $params['phone'],
'password' => $params['password'],
]);
if ($res) {
$this->driver_id = $res->id;
$this->success('注册成功,正在自动登录...', ['token' => $this->encrypt($res->id)]);
}
$this->error('注册失败,请检查');
}
//退出
public function logout()
{
$this->driver_id = null;
$this->success('退出成功');
}
//自动登录
public function autoLogin()
{
$driver = Driver::where('id', $this->driver_id)->find();
if ($driver) {
$this->driver_id = $driver['id'];
$this->success('正在自动登录...', ['token' => $this->encrypt($driver['id'])]);
}
$this->error('自动登录失败');
}
//修改信息
public function updateDriverInfo()
{
$params = input();
$driver = Driver::where('id', $this->driver_id)->find();
if (!$driver) {
$this->error('未找到');
}
if (empty($params['password'])) {
unset($params['password']);
} else {
$params['password'] = md5($params['password']);
}
unset($params['mouth']);
unset($params['lv']);
unset($params['onPassage']);
unset($params['status_text']);
unset($params['create_time']);
$res = Driver::update($params);
if ($res) {
$driver = Driver::where('id', $this->driver_id)->find();
$this->success('修改成功', $driver);
}
$this->error('修改失败');
}
//司机信息
public function getDriverInfo()
{
$driver = Driver::where('id', $this->driver_id)->find();
if ($driver) {
$driver['mouth'] = Waybill::where('driverid', $this->driver_id)->whereTime('create_time', 'month')->count('*');
$driver['onPassage'] = 0;
$driver['lv'] = $driver['mouth'] == 0 ? '0.00%' : (floor($driver['onPassage'] / $driver['mouth'] * 100) / 100) . '%';
$this->success('', $driver);
}
$this->error('未找到');
}
/** 车辆信息 */
//车辆列表
public function carList()
{
$driver = \app\admin\model\yq\driver\Vehicle::where('driver_id', $this->driver_id)->column('license');
$list = \app\admin\model\yq\vehicle\Vehicle::where('vehicleNo', 'in', $driver)->select();
$this->success('获取成功', $list);
}
//绑定车辆
public function bindVehicle()
{
$params = input();
if (empty($params['vehicleNo']) || !isset($params['vehicleNo'])) {
$this->error('请输入车牌号');
}
$info = \app\admin\model\yq\vehicle\Vehicle::where('vehicleNo', $params['vehicleNo'])->find();
if ($info) {
$this->error('该车牌已被绑定');
}
Db::startTrans();
try {
\app\admin\model\yq\vehicle\Vehicle::create(['vehicleNo' => $params['vehicleNo']]);
\app\admin\model\yq\driver\Vehicle::create(['license' => $params['vehicleNo'], 'driver_id' => $this->driver_id]);
Db::commit();
$this->success('添加成功');
} catch (Exception $exception) {
Db::rollback();
$this->error('添加失败' . $exception->getMessage());
}
}
//解除绑定
public function unbindVehicle()
{
$params = input();
$info = \app\admin\model\yq\driver\Vehicle::where(['license' => $params['vehicleNo'], 'driver_id' => $this->driver_id])->find();
if (!$info) {
$this->error('不存在');
}
Db::startTrans();
try {
\app\admin\model\yq\vehicle\Vehicle::where('vehicleNo', $params['vehicleNo'])->delete();
\app\admin\model\yq\driver\Vehicle::where(['license' => $params['vehicleNo'], 'driver_id' => $this->driver_id])->delete();
Db::commit();
$this->success('删除成功');
} catch (Exception $exception) {
Db::rollback();
$this->error('删除失败' . $exception->getMessage());
}
}
//修改车辆信息
public function updateBindVehicle()
{
$params = input();
if (empty($params['vehicleNo']) || !isset($params['vehicleNo'])) {
$this->error('请输入车牌号');
}
$info = \app\admin\model\yq\vehicle\Vehicle::where('vehicleNo', $params['vehicleNo'])->find();
if ($info) {
$this->error('该车牌已被绑定');
}
Db::startTrans();
try {
$id = $params['id'];
$info = \app\admin\model\yq\vehicle\Vehicle::where('id', $id)->find();
\app\admin\model\yq\driver\Vehicle::update(['license' => $params['vehicleNo']], ['license' => $info['vehicleNo'], 'driver_id' => $this->driver_id]);
\app\admin\model\yq\vehicle\Vehicle::update(['vehicleNo' => $params['vehicleNo']], ['id' => $id]);
Db::commit();
$this->success('修改成功');
} catch (Exception $exception) {
Db::rollback();
$this->error('修改失败' . $exception->getMessage());
}
}
/** 园区入园 */
//列表
public function parkList()
{
$res = Park::where('reporter_id', $this->driver_id)->order('create_time desc')->select();
$this->success('获取成功', $res);
}
//上报
public function enParkReport()
{
$params = input();
$data = [];
$data['reporter_id'] = $this->driver_id;
$data['has_mount'] = $params['has_mount'];
$data['mission'] = $params['mission'];
$data['tractor_license'] = $params['tractor_license'];
$data['mount_license'] = $params['mount_license'];
$data['phone_num'] = $params['phone_num'];
$data['reporter_name'] = $params['reporter_name'];
$data['create_time'] = date('Y-m-d H:i:s', time());
$rule = [
'mission' => 'require',
'phone_num' => 'require|mobile',
'tractor_license' => 'require|max:8|min:7',
'mount_license' => 'requireIf:has_mount,1',
];
$message = [
'mission.require' => '请选择入园目的',
'phone_num.require' => '请填写手机号',
'tractor_license.require' => '请填写牵引车车牌号',
'phone_num.mobile' => '手机号格式错误',
'tractor_license.max' => '车牌号最多8位',
'tractor_license.min' => '车牌号最少7位',
'mount_license.requireIf' => '请填写挂车车牌号',
];
$validate = new \think\Validate($rule, $message);
if (!$validate->check($data)) {
$this->error($validate->getError());
}
$res = Park::create($data);
if ($res) {
$this->success('上报成功');
}
$this->error('上报失败');
}
//详情
public function enParkInfo()
{
$params = input();
$res = Park::get($params['id']);
if ($res) {
$this->success('获取成功', $res);
}
$this->error('不存在');
}
/** 电子运单 */
public function waybillList()
{
$where = [];
$where['driverid'] = $this->driver_id;
$params = input();
if (!empty($params['current']) && isset($params['current'])) {
$where['check_status'] = $params['current'] - 1;
}
$res = Waybill::where($where)->order('create_time desc')->select();
$this->success('获取成功', $res);
}
//上报
public function waybillReport()
{
$params = input();
$data = [
'cargocategory' => $params['cargocategory'],
'cargocount' => $params['cargocount'],
'driver_tel' => $params['driver_tel'],
'mount_license' => $params['mount_license'] ?? '无',
'sale_product' => $params['sale_product'],
'tow_license' => $params['tow_license'],
'w_mission' => $params['w_mission'],
'waybill_date' => $params['waybill_date'],
'waybill_loading' => $params['waybill_loading'],
'waybill_name' => $params['waybill_name'],
'waybill_unloading' => $params['waybill_unloading'],
'driverid' => $this->driver_id,
'create_time' => date('Y-m-d H:i:s', time()),
'waybill_order' => 'CS' . date('Ymd', time()) . 'DD' . substr(time(), 2, 8)
];
$rule = [
'cargocategory' => 'require',
'cargocount' => 'require',
'driver_tel' => 'require|mobile',
'sale_product' => 'require|max:20',
'tow_license' => 'require|max:8|min:7',
'w_mission' => 'require',
'waybill_name' => 'require',
'waybill_unloading' => 'requireIf:w_mission,卸货',
'waybill_loading' => 'requireIf:w_mission,装货',
];
$message = [
'cargocategory.require' => '请填写装/卸货品类',
'cargocount.require' => '请填写装/卸货数量',
'driver_tel.require' => '请填写司机电话',
'sale_product.require' => '请填写销售产品',
'tow_license.require' => '请填写牵引车牌',
'w_mission.require' => '请填写入园目的',
'waybill_name.require' => '请填写运单人',
'driver_tel.mobile' => '司机电话格式错误',
'sale_product.max' => '销售产品名称控制在20个字符内',
'tow_license.max' => '车牌号最多8位',
'tow_license.min' => '车牌号最少7位',
'waybill_unloading.requireIf' => '卸货时必须填写卸货信息',
'waybill_loading.requireIf' => '装货时必须填写装货单位',
];
$validate = new \think\Validate($rule, $message);
if (!$validate->check($data)) {
$this->error($validate->getError());
}
Db::startTrans();
try {
$res = Waybill::create($data);
//写入一条提示信息
Message::create([
'driver_id' => $this->driver_id,
'type' => 3,
'event_id' => $res->id,
'vehicle_no' => $params['tow_license'] ?? '',
'create_time' => date('Y-m-d H:i:s', time()),
]);
Db::commit();
$this->success('上报成功');
} catch (Exception $exception) {
Db::rollback();
// 记录详细错误日志
\think\Log::error('运单上报失败: ' . $exception->getMessage() . PHP_EOL . $exception->getTraceAsString());
\think\Log::error('上报参数: ' . json_encode($params, JSON_UNESCAPED_UNICODE));
$this->error('上报失败: ' . $exception->getMessage());
}
}
//详情
public function waybillInfo()
{
$params = input();
$res = Waybill::get($params['id']);
if ($res) {
$this->success('获取成功', $res);
}
$this->error('不存在');
}
/** 车辆事故 */
public function troubleList()
{
$res = Alarm::where('reporter_id', $this->driver_id)->order('create_time desc')->select();
$this->success('获取成功', $res);
}
//上报
public function troubleReport()
{
$params = input();
$data = [
'reporter_id' => $this->driver_id,
'license' => $params['license'],
'mount_license' => $params['mount_license'],
'has_mount' => $params['has_mount'],
'phone' => $params['phone'],
'perimeter_location' => $params['perimeter_location'],
'perimeter_point' => $params['perimeter_point'],
'type' => $params['type'],
'describe' => $params['describe'],
'id_card' => $params['id_card'],
'trigger_type' => 2,
'name' => $params['name'],
'create_time' => date('Y-m-d H:i:s',time()),
];
$rule = [
'license' => 'require|max:8|min:7',
'phone' => 'require|mobile',
'perimeter_location' => 'require|max:50',
'type' => 'require',
'id_card' => 'require',
'mount_license' => 'requireIf:has_mount,1',
];
$message = [
'license.require' => '请填写牵引车车牌',
'phone.require' => '请填写手机号',
'id_card.require' => '请填写身份证号',
'perimeter_location.require' => '请填写位置信息',
'phone.mobile' => '司机电话格式错误',
'latlng_address.max' => '位置信息控制在50个字符内',
'license.min' => '牵引车牌号最少7位',
'license.max' => '牵引车牌号最多8位',
'mount_license.requireIf' => '有挂车时请填写挂车车牌号',
];
$validate = new \think\Validate($rule, $message);
if (!$validate->check($data)) {
$this->error($validate->getError());
}
$data['lv'] = Early::where('id', $params['type'])->value('lv');
$data['reporter_name'] = Driver::where('id', $this->driver_id)->value('account');
$res = Alarm::create($data);
if ($res) {
$this->success('上报成功');
}
$this->error('上报失败');
}
//详情
public function troubleInfo()
{
$params = input();
$res = Alarm::get($params['id']);
if ($res) {
$this->success('获取成功', $res);
}
$this->error('不存在');
}
/** 报警信息 */
//列表
public function alarmList()
{
$params = input();
$where = [];
if (!empty($params['cate_id']) && isset($params['cate_id'])) {
$where['type'] = $params['cate_id'] == 0 ? 3 : 1;
}
$res = Message::where('driver_id', $this->driver_id)->where($where)->select();
foreach ($res as $k => $v) {
$res[$k]['car'] = Cargo::get($v['m_id']);
}
$this->success('获取成功', $res);
}
//详情
public function alarmInfo()
{
$params = input();
$res = Message::where(['driver_id' => $this->driver_id, 'id' => $params['id']])->find();
$res['car'] = Cargo::get($res['m_id']);
$this->success('获取成功', $res);
}
/** 帮助中心 */
//列表
public function articleList()
{
$res = Article::select();
$this->success('获取成功', $res);
}
//详情
public function articleInfo()
{
$params = input();
$res = Article::where(['id' => $params['id']])->find();
$this->success('获取成功', $res);
}
/** 上传图片 */
public function upload()
{
$attachment = null;
//默认普通上传文件
$file = $this->request->file('file');
try {
$upload = new Upload($file);
$attachment = $upload->upload();
} catch (UploadException $e) {
$this->error($e->getMessage());
} catch (\Exception $e) {
$this->error($e->getMessage());
}
$this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);
}
//token解密
public function decrypt($input)
{
$encrypted = base64_decode($input);
return openssl_decrypt(
$encrypted,
$this->method,
$this->key,
OPENSSL_RAW_DATA,
$this->iv
);
}
//token加密
public function encrypt($input)
{
$encryptedText = openssl_encrypt(
$input,
$this->method,
$this->key,
OPENSSL_RAW_DATA,
$this->iv
);
return base64_encode($encryptedText);
}
}