ctms/ctms-api/controllers/gm/v1/CarseriesController.php
fm453 4b842ebf3d ADD:添加后台管理端接口;
DEL:删除不必要的头部注释;
FIX:修正若干已知错误;
2025-06-30 09:40:13 +08:00

283 lines
8.3 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace api\controllers\gm\v1;
use Yii;
use yii\data\Pagination;
use addons\models\AcCarBrand;
use addons\models\AcCarSeries;
class CarseriesController extends Common
{
//主界面
public function actionIndex()
{
$apis = [
'list'=>'车型列表',
'detail'=>'详情',
'add'=>'添加',
'edit'=>'编辑',
'delete'=>'删除',
'show'=>'显示',
'hide'=>'隐藏',
'ajax'=>'ajax操作'
];
$this->result('您正使用CMTS-GM系统品牌车型管理接口', $apis, 200);
}
//车型列表
public function actionList()
{
$s = $this->search();
$res = $s['res'];
if (!$res) {
$this->result('没有查询到相应的数据!', [], 0);
}
$return = [];
$return['code'] = 200;
$return['msg'] = '车型查询成功!';
$return['data']= [
'total'=>$s['query']->count(),
'series' => $res,
'brands' => $s['brands'],
'page'=>$this->page
];
$this->result($return['msg'], $return['data'], $return['code']);
}
public function actionDetail()
{
$id = (int)Yii::$app->request->get('id');
if(!$id) $this->result('请求错误未携带ID参数');
$model = new AcCarSeries();
$res = $model->findOne($id)->toArray();
if(!$res) $this->result('未查询到相应数据');
$this->result('车型信息查询完成', $res, 200);
}
//新增车型
public function actionAdd()
{
$post = $this->postdata;
$data = [];
//格式化数据 为空的项则不修改
$data['title'] = trim($post['title']);
if(!$data['title']) $this->result('请传入车型名称');
$data['brand_id'] = (int)$post['brand_id'];
if(!$data['brand_id']) $this->result('请传入所属品牌');
$data['params'] = $post['params'] ?? [];
$data['status_code'] = 1; //状态代码1可用
$data['create_at'] = time();
$data['update_at'] = $data['create_at'];
//数据预检查、编排
$data = $this->preSave($data,'add');
if(!$data) $this->result('数据预检查未通过,保存失败', $data, 100);
//保存资料
$model = new AcCarSeries();
foreach ($data as $key=>$val) {
$model->$key = $val;
}
$res = $model->save();
$msg = '数据保存失败!';
if(!$res) $this->result($msg, [], 100);
$msg = '数据保存成功!';
$return = [];
$return['id']= $model->attributes['id']; //获取插入后id;
$this->result($msg,$return, 200);
}
//更新车型
public function actionEdit()
{
$detail = $this->preUpdate();
$post = $this->postdata;
$data = [];
//格式化数据 为空的项则不修改
$data['title'] = trim($post['title']);
if(!$data['title']) $this->result('请传入车型名称');
$data['brand_id'] = (int)$post['brand_id'];
if(!$data['brand_id']) $this->result('请传入所属品牌');
$data['params'] = $post['params'] ?? [];
$data['status_code'] = 1; //状态代码1可用
$data['update_at'] = time();
$data = $this->preSave($data,'edit');
if(!$data) $this->result('数据预检查未通过,保存失败', $data, 100);
//保存资料
foreach ($data as $key=>$val) {
$detail->$key = $val;
}
$res = $detail->save();
$msg = '车型数据更新失败!';
if(!$res) $this->result($msg, [], 100);
$msg = '车型数据更新成功!';
$return = [];
$return['data']= $detail;
$this->result($msg,$return, 200);
}
//删除车型
public function actionDelete()
{
$detail = $this->preUpdate();
$data = [];
$data['update_at'] = time();
$data['deleted'] = $detail->deleted + 1;
//保存资料
foreach ($data as $key=>$val) {
$detail->$key = $val;
}
$res = $detail->save();
$msg = '车型数据删除失败!';
if(!$res) $this->result($msg, [], 100);
$msg = '车型数据删除成功!';
$this->result($msg,[], 200);
}
public function actionAjax()
{
$detail = $this->preUpdate();
$get = Yii::$app->request->get();
$msg = '';
$errorCode = 0;
$detail->update_at = time();
switch ($get['do']) {
case 'hide':
$detail->status_code = 0;
$res = $detail->save();
if ($res) {
$msg = '车型隐藏标记成功';
$errorCode = 200;
} else {
$msg = '车型隐藏标记失败';
}
break;
case 'show':
$detail->status_code = 1;
$res = $detail->save();
if ($res) {
$msg = '车型显示标记成功';
$errorCode = 200;
} else {
$msg = '车型显示标记失败';
}
break;
default:
break;
}
$this->result($msg,[], $errorCode);
}
private function search(){
$pid = $this->pid;
$return = [];
$model = new AcCarSeries();
$where = $where2 = [];
$where2[] = 'and';
// $where['pid'] = $pid;
$post = $this->postdata;
$search = $post['search'] ?? [];
$search['title'] = isset($search['title']) ? trim(htmlspecialchars_decode($search['title'])) : '';
if (!empty($search['title'])) {
$where2[] = ['LIKE', 'title', $search['title']];
}
$search['brand'] = isset($search['brand']) ? trim(htmlspecialchars_decode($search['brand'])) : '';
$search['brand_id'] = isset($search['brand_id']) ? (int)$search['brand_id'] : 0;
if (!empty($search['brand_id'])) {
$where['brand_id'] = $search['brand_id'];
}
$where['deleted'] = 0;
$data = $model->find()->where($where);
if ($search['title']) {
$data = $data->andwhere($where2);
}
$pages = new Pagination(['totalCount' => $data->count(), 'pageSize' => $this->pageSize]);
$res = $data->offset($pages->offset)->limit($pages->limit)->indexBy('id')->all();
$series = $bids = [];
foreach ($res as &$s) {
$s = $s->toArray();
$brands[$s['id']] = $s;
}
$AcCarBrand = new AcCarBrand();
$brands = [];
$_brands = $AcCarBrand->find()->where(['in', 'id', $bids])->indexBy('id')->all();
unset($s);
foreach ($_brands as $s) {
$brands[$s->id] = $s->toArray();
}
return ['res'=>$res,'query'=>$data,'brands'=>$brands];
}
//数据更新前的预检查,返回对应关联数据
private function preUpdate()
{
$id = (int)Yii::$app->request->get('id');
if(!$id) $this->result('请求错误未携带ID参数');
$post = $this->postdata;
if($post['id'] != $id) $this->result('传参与请求数据不匹配',[],403);
$model = new AcCarSeries();
$res = $model->findOne($id);
if(!$res) $this->result('未查询到相应数据',[],404);
return $res;
}
/*
* 数据保存前的预检查(查重、参数校验等)
* @data,要保存的数据[]
* @op操作类型add,edit……
* 校验机制:
* 编辑数据时必须用get方式传入参数id并与post进来的数据id进行比对只有一致时才能继续;
* 查重:禁止录入重复数据
* 返回校验重组后的data
* */
private function preSave($data,$op)
{
$title = trim($data['title']);
$id = 0;
$model = new AcCarBrand();
switch ($op) {
case 'add':
$hasOne = $model->find()->where(['title'=>$title])->one();
if ($hasOne) {
$this->result('品牌名称重复,请检查重录');
}
break;
case 'edit':
$id = (int)$data['id'];
$origin = $model->findOne($id);
if(!$origin) $this->result('指定id('.$id.')的数据不存在,请检查');
$hasOne = $model->find()->select('id')->where(['title'=>$title,'id'<>$id])->indexBy('id')->one();
if ($hasOne) {
$this->result('品牌名称重复,请检查重录');
}
break;
}
//处理车型相关参数(数组内检查完成后转json)
$params = $data['params'];
$arr = ['length','width','height','kg'];
foreach ($arr as $v) {
$params[$v] = isset($params[$v]) ? (int)$params[$v] : 0;
}
$arr = ['gas'=>'汽油','diesel'=>'柴油','e-power'=>'纯电','hybrid'=>'混动'];
$arr_keys = array_keys($arr);
//设置默认能源类型为 汽油
$energy = $params['energy'] ?? '';
if(!empty($energy) && array_key_exists($energy,$arr_keys)){
$params['energy'] = $energy;
}else{
$params['energy'] = 'gas';
}
$data['params'] = json_encode($params, JSON_UNESCAPED_UNICODE);
return $data;
}
}