building-sign/app/controller/api/v1/Manager.php

638 lines
22 KiB
PHP
Raw Normal View History

2023-01-09 08:41:41 +00:00
<?php
namespace app\controller\api\v1;
use app\controller\api\Base;
use app\model\Account;
use app\model\AccountWorksite;
use app\model\CheckLog;
use app\model\ClockLog;
use app\model\OvertimeLog;
use app\model\Position;
use app\model\Worksite;
use app\service\Math;
use Exception;
use Lcobucci\Clock\Clock;
use think\Collection;
use think\response\Json;
/**
* 负责人相关
*
* Class Manager
* @package app\controller\api\v1
*/
class Manager extends Base
{
protected $noNeedLogin = [];
/**
* 查看审核详情
*
* @return Json
*/
public function checkDetail(): Json
{
try {
$accountId = $this->request->user['user_id'] ?? 0;
$id = input('id/d');//待审核记录ID
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
// 工地负责人才能查看
return $this->json(4003, '无查看权限');
}
if (!$item = CheckLog::findById($id)) {
return $this->json(4004, '记录不存在');
}
$item = arrayNullToString($item->toArray());
$fields = Account::needCheckFields();
array_push($fields, 'id', 'role', 'work_at', 'worksite_id');
$user = Account::findById($item['account_id'], $fields)->toArray();
$user = arrayNullToString($user);
$positionList = Position::column('name', 'id');
$item['position_name'] = $positionList[$item['position']] ?? '';
$user['position_name'] = $positionList[$user['position']] ?? '';
// user角色为工人时需要判断当前人是否是该工地的负责人
if (!empty($user) && $user['role'] == Account::COMMON_ON) {
$managerIds = AccountWorksite::where('worksite_id', $user['worksite_id'])->column('account_id');
if (!in_array($accountId, $managerIds)) {
return $this->json(4003, '无查看权限2');
}
}
$item['account'] = $user;
return $this->json(0, 'success', $item);
} catch (Exception $e) {
return $this->json(4000, '没有相关的用户记录'.$e->getMessage());
}
}
// 审核列表(员工资料提交的审核)
public function checkList(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$keyword = input('keyword/s');
$status = input('status/d', 0);//状态 0=待审核 1=已审核包含1通过 -1不通过
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
return $this->json(4003, '无查看权限');
}
$where = [];
if (!empty($keyword)) {
$where[] = ['cl.real_name|cl.mobile', 'like', '%'.$keyword.'%'];
}
if ($status == 0) {
$where[] = ['cl.status', '=', 0];
} else {
$where[] = ['cl.status', 'in', [1, -1]];
}
// 负责工地
$worksiteIds = AccountWorksite::where('account_id', $accountId)->column('worksite_id');
$where[] = ['cl.worksite_id', 'in', $worksiteIds];
$query = CheckLog::alias('cl')
->leftJoin('account a', 'a.id = cl.account_id')
->leftJoin('position p', 'p.id = cl.position')
->field('cl.id,cl.real_name,cl.status,cl.created_at,p.name as position_name')
->where($where);
$total = $query->count();
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'list' => new Collection(),
];
if ($total > 0) {
$res['list'] = $query->page($page, $size)->order('cl.id', 'desc')->select();
$res['list']->each(function ($item) {
$item->created_at = date('Y年m月d日 H:i:s', strtotime($item->created_at));
});
$res['list'] = arrayNullToString($res['list']->toArray());
}
return $this->json(0, 'success', $res);
}
/**
* 审核资料(工人信息注册或二次修改审核)
*
* @return Json
*/
public function checkInfo(): Json
{
try {
$accountId = $this->request->user['user_id'] ?? 0;
$type = input('type/d', 1);//类型 1=通过 0=不通过
$id = input('id/d');//待审核记录ID
$reason = input('reason/s');//不通过原因
if (!in_array($type, [0, 1])) {
return $this->json(4001, '审核参数错误');
}
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
// 工地负责人才能操作
return $this->json(4003, '无此权限');
}
if (!$item = CheckLog::findById($id)) {
return $this->json(4004, '记录不存在');
}
if ($item['status'] != CheckLog::COMMON_OFF) {
return $this->json(4002, '状态错误');
}
$user = Account::getUser($item['account_id']);
// user角色为工人时需要判断当前人是否是该工地的负责人
if (!empty($user) && $user['role'] == Account::COMMON_ON) {
$managerIds = AccountWorksite::where('worksite_id', $user['worksite_id'])->column('account_id');
if (!in_array($accountId, $managerIds)) {
return $this->json(4003, '无此权限2');
}
}
// 审核不通过
if ($type == 0) {
Account::where('id', $item['account_id'])->save(['checking' => Account::COMMON_OFF]);
$item->save(['status' => -1, 'refund_reason' => $reason]);
return $this->json();
}
$now = date('Y-m-d H:i:s');
$update = $item->toArray();
if ($update['is_register'] == CheckLog::COMMON_ON) {
$update['role'] = CheckLog::COMMON_ON;
$update['work_at'] = $now;
}
$update['checking'] = Account::COMMON_OFF;
unset($update['id']);
unset($update['account_id']);
unset($update['is_register']);
unset($update['status']);
unset($update['created_at']);
unset($update['check_at']);
unset($update['refund_reason']);
Account::where('id', $item['account_id'])->save($update);
$item->save(['status' => 1, 'check_at' => $now]);
return $this->json();
} catch (Exception $e) {
return $this->json(4000, '没有相关的用户记录'.$e->getMessage());
}
}
// 打卡记录
public function clockList(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$status = input('status/d', 0);//状态 0=待审核 1=已审核包含1通过 -1不通过
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
return $this->json(4003, '无权限');
}
$where = [];
if ($status == 0) {
$where[] = ['cl.status', '=', 0];
} else {
$where[] = ['cl.status', 'in', [1, -1]];
}
// 负责工地
$worksiteIds = AccountWorksite::where('account_id', $accountId)->column('worksite_id');
$where[] = ['cl.worksite_id', 'in', $worksiteIds];
$query = \app\model\ClockLog::alias('cl')
->leftJoin('account a', 'a.id = cl.account_id')
->leftJoin('worksite w', 'w.id = cl.worksite_id')
->field('cl.*,w.name as worksite_name,a.real_name as worker_name')
->where($where);
$total = $query->count();
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'list' => new Collection(),
];
if ($total > 0) {
$res['list'] = $query->page($page, $size)->order('cl.id', 'desc')->select();
$res['list']->each(function ($item) {
$item->type_text = $item->type == 'in' ? '上班' : '下班';
switch ($item->status) {
case 0:
$item->status_text = '待确认';
break;
case 1:
$item->status_text = '已确认';
break;
case -1:
$item->status_text = '不通过';
break;
}
unset($item->check_by);
unset($item->check_at);
unset($item->account_id);
unset($item->create_time);
unset($item->type);
unset($item->worksite_id);
});
$res['list'] = arrayNullToString($res['list']->toArray());
}
return $this->json(0, 'success', $res);
}
/**
* 审核打卡 支持批量
*
* @return Json
*/
public function checkClock(): Json
{
try {
$accountId = $this->request->user['user_id'] ?? 0;
$type = input('type/d', 1);//类型 1=通过 0=不通过
$ids = input('id/s');//待审核记录ID 多个用逗号分割
$ids = explode(',', $ids);
$ids = array_filter($ids);
if (!in_array($type, [0, 1])) {
return $this->json(4001, '审核参数错误');
}
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
// 工地负责人才能操作
return $this->json(4003, '无此权限');
}
$worksiteIds = AccountWorksite::where('account_id', $accountId)->column('worksite_id');
if (ClockLog::whereIn('id', $ids)->whereNotIn('worksite_id', $worksiteIds)->count() > 0) {
return $this->json(4003, '部分记录不在您权限操作的范围');
}
ClockLog::whereIn('id', $ids)->where('status', ClockLog::COMMON_OFF)->update([
'status' => $type == 1 ? 1 : -1,
'check_at' => date('Y-m-d H:i:s'),
'check_by' => $accountId
]);
return $this->json();
} catch (Exception $e) {
return $this->json(5000, '审核失败'.$e->getMessage());
}
}
// 加班记录
public function overtimeList(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$status = input('status/d', 0);//状态 0=待审核 1=已审核包含1通过 -1不通过
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
return $this->json(4003, '无权限');
}
$where = [];
if ($status == 0) {
$where[] = ['cl.status', '=', 0];
} else {
$where[] = ['cl.status', 'in', [1, -1]];
}
// 负责工地
$worksiteIds = AccountWorksite::where('account_id', $accountId)->column('worksite_id');
$where[] = ['cl.worksite_id', 'in', $worksiteIds];
$query = \app\model\OvertimeLog::alias('cl')
->leftJoin('account a', 'a.id = cl.account_id')
->leftJoin('worksite w', 'w.id = cl.worksite_id')
->field('cl.*,w.name as worksite_name,a.real_name as worker_name')
->where($where);
$total = $query->count();
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'list' => new Collection(),
];
if ($total > 0) {
$res['list'] = $query->page($page, $size)->order('cl.id', 'desc')->select();
$res['list']->each(function ($item) {
switch ($item->status) {
case 0:
$item->status_text = '待确认';
break;
case 1:
$item->status_text = '已确认';
break;
case -1:
$item->status_text = '不通过';
break;
}
$item->create_time = date('Y年m月d日 H:i:s', $item->create_time);
$item->worktime = date('Y年m月d日', strtotime($item->day));
unset($item->check_by);
unset($item->check_at);
unset($item->account_id);
unset($item->created_at);
unset($item->type);
unset($item->day);
unset($item->day_text);
unset($item->worksite_id);
unset($item->is_statistic
);
});
$res['list'] = arrayNullToString($res['list']->toArray());
}
return $this->json(0, 'success', $res);
}
/**
* 审核加班 支持批量
*
* @return Json
*/
public function checkOvertime(): Json
{
try {
$accountId = $this->request->user['user_id'] ?? 0;
$type = input('type/d', 1);//类型 1=通过 0=不通过
$ids = input('id/s');//待审核记录ID 多个用逗号分割
$ids = explode(',', $ids);
$ids = array_filter($ids);
if (!in_array($type, [0, 1])) {
return $this->json(4001, '审核参数错误');
}
if (!$account = Account::findById($accountId, ['id, role'])) {
return $this->json(6001, '请先登录');
}
if ($account['role'] <= Account::COMMON_ON) {
// 工地负责人才能操作
return $this->json(4003, '无此权限');
}
$worksiteIds = AccountWorksite::where('account_id', $accountId)->column('worksite_id');
if (OvertimeLog::whereIn('id', $ids)->whereNotIn('worksite_id', $worksiteIds)->count() > 0) {
return $this->json(4003, '部分记录不在您权限操作的范围');
}
OvertimeLog::whereIn('id', $ids)->where('status', ClockLog::COMMON_OFF)->update([
'status' => $type == 1 ? 1 : -1,
'check_at' => date('Y-m-d H:i:s'),
'check_by' => $accountId
]);
return $this->json();
} catch (Exception $e) {
return $this->json(5000, '审核失败'.$e->getMessage());
}
}
// 工资记录
public function payListMock(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$status = input('status/d', -1);
$date = input('data/s', '');
$accountId = $this->request->user['user_id'] ?? 0;
$where = [];
if (!empty($keyword)) {
$where[] = ['w.name', 'like', '%'.$keyword.'%'];
}
if ($status >= 0) {
$where[] = ['w.status', '=', $status];
}
if (!empty($date)) {
$date = str_replace('_', '', $date);
$where[] = ['cl.time', '=', $date];
}
$where[] = ['cl.account_id', '=', $accountId];
// $query = \app\model\ClockLog::alias('cl')
// ->leftJoin('worksite w', 'w.id = cl.worksite_id')
// ->field('cl.*,w.name as worksite_name')
// ->where($where);
//
// $total = $query->count();
$total = 20;
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'info' => [],
'list' => new Collection(),
];
if ($total > 0) {
$res['info'] = [
'amount' => 999999,//工资总金额
'base_amount' => 20000,//基本工资
'overtime_amount' => 20000,//加班工资
'not_amount' => 20000,//未发放
'done_amount' => 20000,//已发放
];
$res['list'] = [
[
'name' => '张珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
[
'name' => '李珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
[
'name' => '王珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
[
'name' => '张珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
[
'name' => '刘珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
[
'name' => '谢珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
[
'name' => '吴珊珊',
'status' => 0,
'status_text' => '待发放',
'base_amount' => 7500,
'overtime_amount' => 0,
'amount' => 7500,
],
];
}
return $this->json(0, 'success', $res);
}
// 工资记录
public function payList(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$status = input('status/d', -1);
$date = input('date/s', '');
$accountId = $this->request->user['user_id'] ?? 0;
$where = [];
if (!empty($date)) {
$date = str_replace('_', '', $date);
$where[] = ['pml.time', '=', $date];
}
$worksiteIds = AccountWorksite::where('account_id', $accountId)->column('worksite_id');
$total = 0;
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'info' => [],
'list' => new Collection(),
];
if (empty($worksiteIds)) {
return $this->json(0, 'success', $res);
}
// 当前明确说明 负责人和工地是一对一关系
$where[] = ['pml.worksite_id', '=', $worksiteIds[0]];
$query = \app\model\PayMonthLog::alias('pml')
// ->leftJoin('account a', 'a.id = pml.account_id')
->where($where);
// 汇总信息
$info = $query->fieldRaw('sum(pml.amount) as amount, sum(pml.base_amount) as base_amount,
sum(pml.overtime_amount) as overtime_amount')->find()->toArray();
// 已发放工资
$doneAmount = $query->where('pml.status', 1)->fieldRaw('sum(pml.amount) as amount')->find()->toArray();
$res['info'] = [
'amount' => $info['amount'] ?? 0,
'base_amount' => $info['base_amount'] ?? 0,
'overtime_amount' => $info['overtime_amount'] ?? 0,
'done_amount' => $doneAmount['amount'] ?? 0,
'not_amount' => Math::sub($info['amount'] ?? 0, $doneAmount['amount'] ?? 0),
];
if ($status >= 0) {
$where[] = ['pml.status', '=', $status];
}
$query = \app\model\PayMonthLog::alias('pml')
->leftJoin('account a', 'a.id = pml.account_id')
->where($where);
$total = $query->count();
$res['total'] = $total;
if ($total > 0) {
$res['list'] = $query->field('pml.id,pml.status,pml.amount,pml.base_amount,pml.overtime_amount,a.real_name as name')->page($page, $size)->order('pml.id', 'desc')->select();
$res['list']->each(function ($item) {
$item->status_text = $item->status == 1 ? '已发放' : '待发放';
});
}
return $this->json(0, 'success', $res);
}
}