661 lines
22 KiB
PHP
661 lines
22 KiB
PHP
<?php
|
||
|
||
namespace app\controller\api\v1;
|
||
|
||
use app\controller\api\Base;
|
||
use app\controller\manager\Clock;
|
||
use app\exception\RepositoryException;
|
||
use app\model\Account;
|
||
use app\model\AccountDimission;
|
||
use app\model\AccountRecord;
|
||
use app\model\AccountWorksite;
|
||
use app\model\CheckLog;
|
||
use app\model\ClockLog;
|
||
use app\model\OvertimeLog;
|
||
use app\model\PayLog;
|
||
use app\model\Worksite;
|
||
use app\repository\AccountRepository;
|
||
use app\service\File;
|
||
use app\service\Jwt;
|
||
use app\service\wx\WechatApplets;
|
||
use app\validate\User as UserValidate;
|
||
use EasyWeChat\Kernel\Exceptions\InvalidConfigException;
|
||
use Exception;
|
||
use think\Collection;
|
||
use think\db\exception\DataNotFoundException;
|
||
use think\db\exception\DbException;
|
||
use think\db\exception\ModelNotFoundException;
|
||
use think\facade\Config;
|
||
use think\facade\Log;
|
||
use think\response\Json;
|
||
|
||
/**
|
||
* 工人相关
|
||
*
|
||
* Class Worker
|
||
* @package app\controller\api\v1
|
||
*/
|
||
class Worker extends Base
|
||
{
|
||
protected $noNeedLogin = [];
|
||
|
||
/**
|
||
* 注册工人资料
|
||
*/
|
||
public function register(): Json
|
||
{
|
||
if (!$this->request->isPost()) {
|
||
return $this->json(4000, '无效请求');
|
||
}
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
if (!$account = Account::findById($accountId)) {
|
||
return $this->json(6001, '请先登录');
|
||
}
|
||
|
||
if ($account['role'] != Account::COMMON_OFF) {
|
||
return $this->json(4003, '您无需提交资料');
|
||
}
|
||
|
||
if ($account['checking'] == Account::COMMON_ON) {
|
||
return $this->json(4002, '您已提交资料,等待审核中');
|
||
}
|
||
|
||
$post = input('post.');
|
||
|
||
$rules = [
|
||
'real_name|姓名' => 'require|max:50|min:2',
|
||
'mobile|手机号' => 'require',
|
||
'pay|工资' => 'require|number|min:0',
|
||
'emergency_contact|紧急联系人' => 'require',
|
||
'emergency_phone|紧急联系人电话' => 'require',
|
||
'bank_card_name|银行卡户名' => 'require',
|
||
'bank_card_number|银行卡号' => 'require',
|
||
'bank_name|开户行' => 'require|max:100',
|
||
'card_number|身份证' => 'require|max:20|min:15',
|
||
'position|岗位' => 'require|number',
|
||
'worksite_id|工地' => 'require|number',
|
||
'bank_card_img|银行卡拍照' => 'require',
|
||
'id_front|身份证正面' => 'require',
|
||
'id_back|身份证反面' => 'require',
|
||
'address_now|现住址' => 'require',
|
||
];
|
||
|
||
$message = [
|
||
'worksite_id.number' => '工地必选',
|
||
'worksite_id.position' => '岗位必选',
|
||
];
|
||
|
||
$validate = $this->validateByApi($post, $rules, $message);
|
||
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
|
||
$fields = [
|
||
'real_name', 'mobile', 'pay', 'emergency_contact', 'emergency_phone', 'bank_card_name', 'bank_card_number',
|
||
'bank_name', 'card_number', 'position', 'worksite_id', 'certificate', 'address_now', 'province', 'city', 'area',
|
||
'id_front', 'id_back', 'bank_card_img', 'work_experience'
|
||
];
|
||
$post = array_filter($post, function ($item, $key) use ($fields) {
|
||
return in_array($key, $fields);
|
||
}, ARRAY_FILTER_USE_BOTH);
|
||
|
||
$post['account_id'] = $accountId;
|
||
$post['is_register'] = CheckLog::COMMON_ON;
|
||
$post['created_at'] = date('Y-m-d H:i:s');
|
||
|
||
try {
|
||
CheckLog::create($post);
|
||
$account->save(['checking' => Account::COMMON_ON]);
|
||
} catch (Exception $e) {
|
||
return $this->json(5000, '资料录入失败');
|
||
}
|
||
return $this->json();
|
||
}
|
||
|
||
/**
|
||
* 修改用户信息 字段区分:1.负责人审核 2.不需要审核 如nickname
|
||
*/
|
||
public function updateInfo(): Json
|
||
{
|
||
try {
|
||
$params = input('post.');
|
||
|
||
$rules = [
|
||
'field|修改项' => 'require',
|
||
'value|修改内容' => 'require',
|
||
];
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
$validate = $this->validateByApi($params, $rules);
|
||
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
|
||
if (!$customer = Account::findById($accountId)) {
|
||
return $this->json(4004, '用户不存在');
|
||
}
|
||
|
||
$needCheckFields = Account::needCheckFields();
|
||
// 需要审核的字段
|
||
if (in_array($params['field'], $needCheckFields)) {
|
||
// 字段值未改变
|
||
if ($params['value'] == ($customer[$params['field']] ?? '')) {
|
||
return $this->json();
|
||
}
|
||
|
||
$insert = [];
|
||
$update = [];
|
||
foreach ($needCheckFields as $field) {
|
||
$insert[$field] = $field == $params['field'] ? $params['value'] : $customer[$field];
|
||
if ($field == $params['field']) {
|
||
$update[$field] = $params['value'];
|
||
}
|
||
}
|
||
|
||
if (!$checkLog = CheckLog::where('account_id', $accountId)->where('status', CheckLog::COMMON_OFF)
|
||
->find()) {
|
||
// 没有待审核的记录则新增
|
||
$insert['created_at'] = date('Y-m-d H:i:s');
|
||
$insert['account_id'] = $accountId;
|
||
$insert['worksite_id'] = $customer['worksite_id'];
|
||
CheckLog::create($insert);
|
||
} else {
|
||
$checkLog->save($update);
|
||
}
|
||
|
||
$customer->save(['checking' => Account::COMMON_ON]);
|
||
} else {
|
||
if ($params['field'] == 'address') {
|
||
//省市区单独处理 使用-分割 如 四川-成都-成华区
|
||
$arr = explode('-', $params['value']);
|
||
$customer->save([
|
||
'province' => $arr[0] ?? '',
|
||
'city' => $arr[1] ?? '',
|
||
'area' => $arr[2] ?? '',
|
||
]);
|
||
} else {
|
||
$customer->save([
|
||
$params['field'] => $params['value']
|
||
]);
|
||
}
|
||
}
|
||
} catch (Exception $e) {
|
||
Log::error('资料修改失败'.$e->getMessage());
|
||
return $this->json(5000, '修改资料失败!'.$e->getMessage());
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
|
||
// 我的打卡
|
||
public function clockList(): Json
|
||
{
|
||
$page = input('page/d', 1);
|
||
$size = input('size/d', 20);
|
||
$keyword = input('keyword/s');
|
||
$worksiteId = input('worksite_id/d', 0);
|
||
$begin = input('begin_at/s', '');
|
||
$end = input('end_at/s', '');
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
$where = [];
|
||
|
||
if (!empty($keyword)) {
|
||
$where[] = ['w.name', 'like', '%'.$keyword.'%'];
|
||
}
|
||
|
||
if ($worksiteId > 0) {
|
||
$where[] = ['cl.worksite_id', '=', $worksiteId];
|
||
}
|
||
|
||
if (!empty($begin)) {
|
||
$where[] = ['cl.created_at', '>', $begin.' 00:00:00'];
|
||
}
|
||
|
||
if (!empty($end)) {
|
||
$where[] = ['cl.created_at', '<', $end.' 23:59:59'];
|
||
}
|
||
|
||
$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();
|
||
|
||
$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;
|
||
}
|
||
$item->time = date('H:i:s', $item->create_time);
|
||
});
|
||
}
|
||
|
||
return $this->json(0, 'success', $res);
|
||
}
|
||
|
||
/**
|
||
* 提交加班
|
||
*/
|
||
public function overtime(): Json
|
||
{
|
||
try {
|
||
$input = input('post.');
|
||
|
||
$rules = [
|
||
'day|加班日期' => 'require|date',
|
||
'time|加班时长' => 'require|float',
|
||
'worksite_id|工地' => 'require|number',
|
||
];
|
||
|
||
$validate = $this->validateByApi($input, $rules, ['worksite_id.number' => '工地必传']);
|
||
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
if (!$customer = Account::findById($accountId)) {
|
||
return $this->json(6001, '请先登录');
|
||
}
|
||
|
||
if ($customer['role'] != Account::ROLE_WORKER) {
|
||
return $this->json(4003, '还不是工人');
|
||
}
|
||
|
||
$time = time();
|
||
$now = date('Y-m-d H:i:s', $time);
|
||
$day = date('Ymd', strtotime($input['day']));
|
||
OvertimeLog::create([
|
||
'account_id' => $accountId,
|
||
'worksite_id' => $input['worksite_id'],
|
||
'day_text' => $input['day'],
|
||
'day' => $day,
|
||
'time' => $input['time'],
|
||
'remarks' => $input['remarks'] ?? '',
|
||
'indexs' => $accountId.'-'.$input['worksite_id'].'-'.$day,
|
||
'created_at' => $now,
|
||
'create_time' => $time,
|
||
]);
|
||
|
||
// 创建当日工资初始记录
|
||
PayLog::createWhenNotExists($accountId, $input['worksite_id'], $day);
|
||
} catch (Exception $e) {
|
||
Log::error('工人加班提交失败'.$e->getMessage());
|
||
return $this->json(5000, '加班申请失败!');
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
|
||
// 我的加班记录
|
||
public function overtimeList(): Json
|
||
{
|
||
$page = input('page/d', 1);
|
||
$size = input('size/d', 20);
|
||
$keyword = input('keyword/s');
|
||
$worksiteId = input('worksite_id/d', 0);
|
||
$begin = input('begin_at/s', '');
|
||
$end = input('end_at/s', '');
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
$where = [];
|
||
|
||
if (!empty($keyword)) {
|
||
$where[] = ['w.name', 'like', '%'.$keyword.'%'];
|
||
}
|
||
|
||
if ($worksiteId > 0) {
|
||
$where[] = ['ol.worksite_id', '=', $worksiteId];
|
||
}
|
||
|
||
if (!empty($begin)) {
|
||
$where[] = ['ol.created_at', '>', $begin.' 00:00:00'];
|
||
}
|
||
|
||
if (!empty($end)) {
|
||
$where[] = ['ol.created_at', '<', $end.' 23:59:59'];
|
||
}
|
||
|
||
$where[] = ['ol.account_id', '=', $accountId];
|
||
$query = \app\model\OvertimeLog::alias('ol')
|
||
->leftJoin('worksite w', 'w.id = ol.worksite_id')
|
||
->field('ol.*,w.name as worksite_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('ol.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_at);
|
||
unset($item->check_by);
|
||
unset($item->created_at);
|
||
unset($item->worksite_id);
|
||
unset($item->is_statistic);
|
||
unset($item->day);
|
||
unset($item->day_text);
|
||
});
|
||
}
|
||
|
||
return $this->json(0, 'success', $res);
|
||
}
|
||
|
||
// 加班申请被打回后再次编辑
|
||
public function overtimeEdit(): Json
|
||
{
|
||
$id = input('id');
|
||
$input = input('post.');
|
||
|
||
$rules = [
|
||
'worksite_id|工地' => 'require|number',
|
||
'day|加班日期' => 'require|date',
|
||
'time|加班时长' => 'require|float',
|
||
];
|
||
|
||
$validate = $this->validateByApi($input, $rules);
|
||
|
||
if ($validate !== true) {
|
||
return $validate;
|
||
}
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
if (!$item = OvertimeLog::where('id', $id)->find()) {
|
||
return $this->json(4004, '记录不存在');
|
||
}
|
||
|
||
if ($item['account_id'] != $accountId) {
|
||
return $this->json(4003, '不是你提交的加班申请');
|
||
}
|
||
|
||
if ($item['status'] != OvertimeLog::STATUS_NO) {
|
||
return $this->json(4003, '当前状态不能编辑');
|
||
}
|
||
|
||
$item->save([
|
||
'day' => date('Ymd', strtotime($input['day'])),
|
||
'worksite_id' => $input['worksite_id'],
|
||
'time' => $input['time'],
|
||
'remarks' => $input['remarks'] ?? '',
|
||
'status' => OvertimeLog::COMMON_OFF,
|
||
]);
|
||
|
||
return $this->json(0, 'success');
|
||
}
|
||
|
||
// 加班申请被打回后删除
|
||
public function overtimeDel(): Json
|
||
{
|
||
$id = input('id');
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
if (!$item = OvertimeLog::where('id', $id)->find()) {
|
||
return $this->json(4004, '记录不存在');
|
||
}
|
||
|
||
if ($item['account_id'] != $accountId) {
|
||
return $this->json(4003, '不是你提交的加班申请');
|
||
}
|
||
|
||
if ($item['status'] != OvertimeLog::STATUS_NO) {
|
||
return $this->json(4003, '当前状态不能删除');
|
||
}
|
||
|
||
$item->delete();
|
||
|
||
return $this->json(0, 'success');
|
||
}
|
||
|
||
// 我的工资记录
|
||
public function payListMock(): Json
|
||
{
|
||
$page = input('page/d', 1);
|
||
$size = input('size/d', 20);
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
$where = [];
|
||
|
||
if (!empty($keyword)) {
|
||
$where[] = ['w.name', 'like', '%'.$keyword.'%'];
|
||
}
|
||
|
||
$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 = 10;
|
||
|
||
$res = [
|
||
'total' => $total,
|
||
'current' => $page ?: 1,
|
||
'size' => $size ?: 20,
|
||
'list' => new Collection(),
|
||
];
|
||
|
||
if ($total > 0) {
|
||
$res['list'] = [
|
||
[
|
||
'status' => 0,
|
||
'status_text' => '待发放',
|
||
'date' => '2022年11月',
|
||
'base_amount' => 7500,
|
||
'overtime_amount' => 500,
|
||
'amount' => 8000,
|
||
],
|
||
[
|
||
'status' => 1,
|
||
'status_text' => '已发放',
|
||
'date' => '2022年10月',
|
||
'base_amount' => 7500,
|
||
'overtime_amount' => 500,
|
||
'amount' => 8000,
|
||
],
|
||
[
|
||
'status' => 0,
|
||
'status_text' => '已发放',
|
||
'date' => '2022年09月',
|
||
'base_amount' => 7500,
|
||
'overtime_amount' => 500,
|
||
'amount' => 8000,
|
||
],
|
||
[
|
||
'status' => 0,
|
||
'status_text' => '已发放',
|
||
'date' => '2022年08月',
|
||
'base_amount' => 7500,
|
||
'overtime_amount' => 0,
|
||
'amount' => 7500,
|
||
],
|
||
[
|
||
'status' => 0,
|
||
'status_text' => '已发放',
|
||
'date' => '2022年08月',
|
||
'base_amount' => 7500,
|
||
'overtime_amount' => 0,
|
||
'amount' => 7500,
|
||
],
|
||
[
|
||
'status' => 0,
|
||
'status_text' => '已发放',
|
||
'date' => '2022年07月',
|
||
'base_amount' => 7500,
|
||
'overtime_amount' => 0,
|
||
'amount' => 7500,
|
||
],
|
||
[
|
||
'status' => 0,
|
||
'status_text' => '已发放',
|
||
'date' => '2022年06月',
|
||
'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);
|
||
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
$where = [];
|
||
|
||
$where[] = ['pml.account_id', '=', $accountId];
|
||
$query = \app\model\PayMonthLog::alias('pml')
|
||
->leftJoin('account a', 'a.id = pml.account_id')
|
||
->where($where)
|
||
->group('pml.time')
|
||
->fieldRaw('pml.time,pml.year,pml.month,sum(pml.amount) as amount,sum(pml.base_amount) as base_amount,sum(pml.overtime_amount) as overtime_amount');
|
||
|
||
$total = $query->count();
|
||
|
||
$res = [
|
||
'total' => $total,
|
||
'current' => $page ?: 1,
|
||
'size' => $size ?: 20,
|
||
'list' => new Collection(),
|
||
];
|
||
|
||
if ($total > 0) {
|
||
// 获取按月已发工资
|
||
$paidMonth = \app\model\PayMonthLog::alias('pml')
|
||
->leftJoin('account a', 'a.id = pml.account_id')
|
||
->where($where)
|
||
->where('pml.status', 1)
|
||
->group('pml.time')
|
||
->page($page, $size)
|
||
->order('time', 'desc')
|
||
->fieldRaw('sum(pml.amount) as amount,pml.time')
|
||
->select()->toArray();
|
||
$monthPay = [];
|
||
foreach ($paidMonth as $p) {
|
||
$monthPay[$p['time']] = $p['amount'];
|
||
}
|
||
|
||
$res['list'] = $query->page($page, $size)->order('time', 'desc')->select();
|
||
$res['list']->each(function ($item) use ($monthPay) {
|
||
$item->date = $item['year'].'年'.$item['month'].'月';
|
||
$item->done = $monthPay[$item->time] ?? 0;
|
||
$item->status = 0;
|
||
$item->status_text = '待发放';
|
||
if ($item->amount <= $item->done) {
|
||
$item->status = 1;
|
||
$item->status_text = '已发放';
|
||
}
|
||
unset($item->year);
|
||
unset($item->month);
|
||
unset($item->think_count);
|
||
});
|
||
}
|
||
|
||
return $this->json(0, 'success', $res);
|
||
}
|
||
|
||
// 获取审核记录
|
||
public function checkDetail(): Json
|
||
{
|
||
$id = input('id');
|
||
|
||
if (!$item = CheckLog::where('id', $id)->find()) {
|
||
return $this->json(4004, '记录不存在');
|
||
}
|
||
$item = arrayNullToString($item->toArray());
|
||
|
||
return $this->json(0, 'success', $item);
|
||
}
|
||
|
||
/**
|
||
* 申请离职
|
||
*/
|
||
public function dimission(): Json
|
||
{
|
||
try {
|
||
$accountId = $this->request->user['user_id'] ?? 0;
|
||
|
||
if (!$customer = Account::findById($accountId)) {
|
||
return $this->json(6001, '请先登录');
|
||
}
|
||
|
||
if ($customer['role'] != Account::ROLE_WORKER) {
|
||
return $this->json(4003, '不是工人');
|
||
}
|
||
|
||
if (AccountDimission::where('account_id', $accountId)->where('worksite_id', $customer['worksite_id'])->where('status', 0)->count() > 0) {
|
||
return $this->json(4001, '审核中请勿重复提交');
|
||
}
|
||
|
||
$time = time();
|
||
$now = date('Y-m-d H:i:s', $time);
|
||
AccountDimission::create([
|
||
'account_id' => $accountId,
|
||
'worksite_id' => $customer['worksite_id'],
|
||
'created_at' => $now,
|
||
]);
|
||
} catch (Exception $e) {
|
||
Log::error('申请离职提交失败'.$e->getMessage());
|
||
return $this->json(5000, '申请离职提交失败!');
|
||
}
|
||
|
||
return $this->json();
|
||
}
|
||
}
|