building-sign/app/controller/manager/account/Index.php

386 lines
13 KiB
PHP

<?php
namespace app\controller\manager\account;
use app\controller\manager\Base;
use app\exception\RepositoryException;
use app\model\Account;
use app\model\Account as AccountModel;
use app\model\AccountStar;
use app\model\AccountWorksite;
use app\model\Position;
use app\model\Worksite;
use app\repository\AccountRepository;
use app\service\Math;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Log;
use think\response\Json;
use think\response\Redirect;
use think\response\View;
/**
* 用户管理
*
* Class Footmarks
* @package app\controller\manager
*/
class Index extends Base
{
protected $noNeedLogin = ['getAccountList', 'star'];
/**
* 详情
*
* @return View
* @throws RepositoryException
*/
public function detail(): View
{
$id = input('id/d', 0);
$item = AccountRepository::getInstance()->findById($id);
$orderNum = 0;
$orderScoreNum = 0;
$totalPrice = 0;
$totalScore = 0;
$item['total_price'] = Math::fen2Yuan($totalPrice);
$item['order_num'] = $orderNum;
$item['order_score_num'] = $orderScoreNum;
$item['order_newest'] = [];
$this->data['item'] = $item;
return $this->view();
}
/**
* 编辑
*
* @return Redirect|Json|View
* @throws Exception
*/
public function edit()
{
$id = input('id/d', 0);
if (!$info = AccountRepository::getInstance()->findById($id)) {
if ($this->request->isPost()) {
return $this->json(4000, '用户不存在');
} else {
return $this->error('用户不存在');
}
}
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'real_name' => 'require',
'mobile' => 'require',
]);
if ($validate !== true) {
return $validate;
}
try {
$info->save($item);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
$this->data['item'] = $info;
return $this->view();
}
/**
* 工人信息编辑
*
* @return Redirect|Json|View
* @throws Exception
*/
public function worker()
{
$id = input('id/d', 0);
if (!$info = Account::find($id)) {
if ($this->request->isPost()) {
return $this->json(4000, '用户不存在');
} else {
return $this->error('用户不存在');
}
}
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'real_name|姓名' => 'require',
'mobile|电话' => 'require',
'position|岗位' => 'require',
'pay|基本工资' => 'require',
'emergency_contact|紧急联系人' => 'require',
'emergency_phone|紧急联系人电话' => 'require',
'bank_card_name|银行卡户名' => 'require',
'bank_card_number|银行卡号' => 'require',
'bank_name|开户行' => 'require',
'card_number|身份证' => 'require',
]);
if ($validate !== true) {
return $validate;
}
try {
$info->save($item);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
$this->data['item'] = $info;
$this->data['positionList'] = Position::list();
$this->data['worksite_name'] = Worksite::where('id', $info['worksite_id'])->value('name');
return $this->view();
}
/**
* 单个字段编辑
*
* @return Json
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws Exception
*/
public function modify(): Json
{
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'field' => 'require',
'value' => 'require',
]);
if ($validate !== true) {
return $validate;
}
if (!$info = AccountModel::findById($item['id'])) {
return $this->json(4001, '记录不存在');
}
$update = [$item['field'] => $item['value']];
try {
$info->save($update);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
return $this->json(4000, '非法请求');
}
/**
* 列表
*
* @return View|Json
* @throws Exception
*/
public function index()
{
$position = Position::list();
$role = input('role');
$worksiteId = input('worksite_id/d');
$outsourceId = input('outsource_id/d');
if ($this->request->isPost()) {
$page = input('page/d', 1);
$size = input('size/d', 20);
$searchParams = input('searchParams');
if (input('role')) {
$searchParams['role'] = input('role');
}
if (input('worksite_id') && $worksiteId > 0) {
$searchParams['worksite_id'] = input('worksite_id');
}
if (input('outsource_id') && $outsourceId > 0) {
$searchParams['outsource_id'] = input('outsource_id');
}
$search = [];
if ($searchParams) {
foreach ($searchParams as $key => $param) {
if ($param || $param == '0') {
switch ($key) {
case 'keyword':
$search[] = ['nickname|real_name|mobile|emergency_contact|emergency_phone|bank_card_name|bank_card_number|bank_name|card_number|province|city|area|address_now', 'like', '%'.$param.'%'];
break;
case 'role':
switch ($param) {
case -1://全部
break;
case Account::ROLE_NORMAL:
case Account::ROLE_WORKER:
case Account::ROLE_MANAGER:
$search[] = ['role', '=', $param];
break;
case 3://单独构造的代号 员工 表示工人和负责人
$search[] = ['role', 'in', [Account::ROLE_WORKER, Account::ROLE_MANAGER]];
break;
}
break;
default:
$search[] = [$key, 'like', '%'.$param.'%'];
}
}
}
}
if (empty($searchParams['role'])) {
$search[] = ['role', 'in', [Account::ROLE_WORKER, Account::ROLE_MANAGER]];
}
try {
$items = Account::findList($search, [], $page, $size, function ($q) {
return $q->order('id', 'desc');
});
$worksite = Worksite::list();
$items['list']->each(function ($item) use ($position, $worksite) {
$genderText = Account::genderText()[$item->gender] ?? '保密';
$item->role_text = Account::roleText()[$item->role] ?? '其他';
$item->position_text = $position[$item->position] ?? '其他';
$item->worksite_name = $worksite[$item->position] ?? '';
$item->checking_text = Account::checkingText()[$item->checking] ?? '';
$item->gender_text = $genderText;
});
return $this->json(0, '操作成功', $items);
} catch (RepositoryException $e) {
return $this->json(4001, $e->getMessage());
} catch (Exception $e) {
return $this->json(5001, '获取用户列表失败'.$e->getMessage());
}
}
$this->data['worksiteId'] = $worksiteId;
$this->data['outsourceId'] = $outsourceId;
$this->data['role'] = $role;
$this->data['positionList'] = $position;
return $this->view();
}
/**
* 获取客户列表
*
* @return Json
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException|Exception
*/
public function getAccountList(): Json
{
if ($this->request->isPost()) {
$keyword = input('keyword/s', '');
$page = input('page/d', 1);
$size = input('size/d', 10);
$id = input('id', '');
$relationIds = explode(',', $id);//已选记录
$where = [];
if (!empty($keyword)) {
$where[] = ['nickname|real_name|mobile', 'like', '%'.$keyword.'%'];
}
$res = AccountModel::findList($where, ['id', 'nickname', 'real_name', 'mobile'], $page, $size);
if ($res['total'] > 0 && $relationIds) {
$res['list'] = $res['list']->toArray();
foreach ($res['list'] as &$item) {
$item['name_text'] = sprintf("昵称:%s;真实姓名:%s,手机号:%s", $item['nickname'], $item['real_name'], $item['mobile']);
if (count($relationIds) > 0 && in_array($item['id'], $relationIds)) {
$item['selected'] = true;
}
}
}
return $this->json(0, '操作成功', $res);
}
return $this->json(4001, '非法请求');
}
/**
* 负责人评定
*
* @return Redirect|Json|View
* @throws Exception
*/
public function star()
{
$id = input('id/d', 0);
if (!$info = Account::find($id)) {
if ($this->request->isPost()) {
return $this->json(4000, '用户不存在');
} else {
return $this->error('用户不存在');
}
}
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'star_time|评定时间' => 'require',
'star|评级' => 'require|in:1,2,3,4,5',
]);
if ($validate !== true) {
return $validate;
}
if ($item['star_time'] > date('Y-m')) {
return $this->json(4002, '不能超过当前月份');
}
try {
$timeArr = explode('-', $item['star_time']);
$year = $timeArr[0];
$month = (string) $timeArr[1];
$ym = $year.$month;
if (AccountStar::where('type', AccountStar::TYPE_MANAGER)->where('account_id', $id)->where('ym', $ym)->count() > 0) {
return $this->json(4002, '该月已评');
}
AccountStar::create([
'type' => AccountStar::TYPE_MANAGER,
'star' => $item['star'],
'account_id' => $id,
'year' => $year,
'month' => $month,
'ym' => $ym,
'operated_by' => $this->auth['user_id'],
'created_at' => date('Y-m-d H:i:s'),
]);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
$this->data['item'] = $info;
$worksiteId = AccountWorksite::where('account_id', $id)->value('worksite_id');
$this->data['worksite_name'] = Worksite::where('id', $worksiteId)->value('name');
return $this->view();
}
}