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

304 lines
8.8 KiB
PHP
Executable File
Raw Permalink 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\AcEmployee;
use addons\models\AcStore;
use common\models\Member as User;
use function addons\functions\isMobile;
class EmployeeController extends Common
{
public function beforeAction($action)
{
if (!$this->pid) {
$this->result('您正使用本系统内部接口,禁止非法链接使用!');
}
return parent::beforeAction($action);
}
public function actionIndex()
{
$apis = [
'list' => '员工清单',
'detail' => '员工详情',
'get-status'=>'状态字典',
'add'=>'添加',
'edit'=>'编辑',
'delete'=>'删除',
'show'=>'显示',
'hide'=>'隐藏',
'ajax'=>'ajax操作'
];
$this->result('您正使用CMTS-GM系统员工管理接口', $apis, 200);
}
public function actionGetStatus()
{
$status = Yii::$app->params['EmployeeStatus'];
$this->result('员工状态字典获取成功', $status, 200);
}
//用户列表
public function actionList()
{
$s = $this->search();
$res = $s['res'];
if (!$res) {
$this->result('没有查询到相应的数据!', [], 0);
}
$data= [
'total'=>$s['query']->count(),
'employees' => $res,
'stores' => $s['stores'],
'page'=>$this->page
];
$this->result('员工查询成功!', $data, 200);
}
public function actionDetail()
{
$pid = $this->pid;
$post = $this->postdata;
$id = isset($post['id']) ? $post['id'] : 0;
if ($id <= 0) {
$this->result('查询参数错误!');
}
$model = new AcEmployee();
$detail = $model->findOne($id)->toArray();
if(!$detail) $this->result('未查询到相应数据');
$this->result('查询成功!', $detail, 200);
}
public function actionAdd()
{
//数据预检查、编排
$data = $this->preSave('add');
if(!$data) $this->result('数据预检查未通过,保存失败', $data, 100);
//保存资料
$model = new AcEmployee();
foreach ($data as $key=>$val) {
$model->$key = $val;
}
$res = $model->save();
$msg = '数据保存失败!';
if(!$res) $this->result($msg, [], 100);
//员工资料注册系统用户
$this->EmployeeToUser($data);
$msg = '数据保存成功!';
$return = [];
$return['id']= $model->attributes['id']; //获取插入后id;
$this->result($msg,$return, 200);
}
//编辑员工资料
public function actionEdit()
{
$detail = $this->preUpdate();
//数据预检查、编排
$data = $this->preSave('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);
//员工资料注册系统用户
$this->EmployeeToUser($data);
$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 'out':
$detail->status_code = 0;
$res = $detail->save();
if ($res) {
$msg = '员工离职标记成功';
$errorCode = 200;
} else {
$msg = '员工离职标记失败';
}
break;
case 'in':
$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 AcEmployee();
$where = $where2 = [];
$where['pid'] = $pid;
$post = $this->postdata;
$search = $post['search'] ?? [];
$search['title'] = isset($search['title']) ? trim(htmlspecialchars_decode($search['title'])) : '';
if (!empty($search['title'])) {
$where2[] = 'or';
$where2[] = ['LIKE', 'name', $search['title']];
$where2[] = ['LIKE', 'mobile', $search['title']];
$where2[] = ['LIKE', 'adminer', $search['title']];
}
$store_id = isset($search['store_id']) ? (int)$search['store_id'] : 0;
if ($store_id) $where['store_id'] = $store_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]);
$_orderby = 'orderby DESC,update_at DESC';
$res = $data->offset($pages->offset)->limit($pages->limit)->orderBy($_orderby)->all();
$AcStore = new AcStore();
$sids = [];
if($res){
foreach ($res as $k=>$v){
$sids[] = $v->store_id;
}
}
$stores = [];
if($sids){
$stores = $AcStore->find()->where(['IN','id',$sids])->asArray()->indexBy('id')->all();
}
return ['res'=>$res,'query'=>$data,'stores'=>$stores];
}
/*
* 数据更新前的预检查,返回对应关联数据
* 必须确保get与post数据中均包含需更新的数据id且一致
* */
private function preUpdate()
{
$id = (int)Yii::$app->request->get('id');
if(!$id) $this->result('请求错误未携带ID参数');
$post = $this->postdata;
if($post['id'] != $id) $this->result('传参id与请求数据不匹配',[],403);
$model = new AcEmployee();
$res = $model->findOne($id);
if(!$res) $this->result('未查询到相应数据',[],404);
return $res;
}
/*
* 数据保存前的预检查(查重、参数校验等)
* 要保存的数据[],直接从post中取出
* @op操作类型add,edit……
* 校验机制:
* 编辑数据时必须用get方式传入参数id并与post进来的数据id进行比对只有一致时才能继续;
* 查重:禁止录入重复数据
* 返回:校验重组后的数据
* */
private function preSave($op)
{
$post = $this->postdata;
$name = trim($post['name']) ?? '';
if(!$name) $this->result('请传入员工姓名');
$data = [];
//格式化数据
//目标键=》POST键
$model = new AcEmployee();
switch ($op) {
case 'add':
$mobile = trim($post['mobile']) ?? '';
if(!isMobile($mobile)) $this->result('请传入正确的手机号');
//查询通讯录手机号是否在库(如果在库,则取出相应资料,剩余逻辑由前端完成)
$hasOne = AcEmployee::find()->where(['mobile' => $mobile])->one();
if($hasOne) $this->result('保存失败,该手机号对应的数据已在库!',$hasOne,100);
$data['mobile'] = $mobile;
$data['create_at'] = time();
$data['update_at'] = $data['create_at'];
break;
case 'edit':
//编辑模式下没有改mobile避免校验重复性
$id = (int)Yii::$app->request->get('id');
$_id = (int)$post['id'];
if(!$id != $_id) $this->result('id参数不匹配请检查');
$data['update_at'] = time();
break;
}
$data['pid'] = $this->pid;
$cols = ['status_code' => 'status_code', 'gender'=>'gender','status' => 'status', 'store_id' => 'store_id','deleted' => 'deleted','order_by'=>'order_by'];
foreach ($cols as $col => $key) {
$data[$col] = isset($post[$key]) ? (int)$post[$key] : 0;
}
$cols = ['remark' => 'editor'];
foreach ($cols as $col => $key) {
$data[$col] = isset($post[$key]) ? htmlspecialchars($post[$key]) : '';
}
return $data;
}
//员工资料注册系统会员
private function EmployeeToUser($data){
//查询对应的系统用户
$userModel = new User();
$user = $userModel->find()->where(['mobile' => $data['mobile']])->one();
if($user) return $user->id;
$userModel->username = !$data['name'] ? $data['mobile'] : $data['name'];
$userModel->mobile = $data['mobile'];
$userModel->email = $data['mobile'] . '@hiluker.com';
$userModel->setPassword(Yii::$app->params['defaultUserPassword']);
$userModel->generateAuthKey();
$userModel->avatar = Yii::$app->params['defaultUserAvatar'];
$userModel->created_at = time();
$userModel->status = 1;
$userModel->save();
return $userModel->attributes['id']; //获取插入后id
}
}