471 lines
16 KiB
PHP
471 lines
16 KiB
PHP
<?php
|
|
|
|
namespace app\controller\manager;
|
|
|
|
use app\exception\RepositoryException;
|
|
use app\model\Account;
|
|
use app\model\Account as AccountModel;
|
|
use app\model\PayMonthLog;
|
|
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 Pay
|
|
* @package app\controller\manager
|
|
*/
|
|
class Pay extends Base
|
|
{
|
|
protected $noNeedLogin = ['getAccountList', 'list', 'listModify', 'payAll'];
|
|
|
|
/**
|
|
* 详情
|
|
*
|
|
* @return View
|
|
* @throws RepositoryException
|
|
*/
|
|
public function detail(): View
|
|
{
|
|
$id = input('id/d', 0);
|
|
$item = PayMonthLog::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 = PayMonthLog::findById($id)) {
|
|
if ($this->request->isPost()) {
|
|
return $this->json(4000, '记录不存在');
|
|
} else {
|
|
return $this->error('记录不存在');
|
|
}
|
|
}
|
|
|
|
$all = PayMonthLog::where('account_id', $info['account_id'])->where('time', $info['time'])
|
|
->fieldRaw('sum(amount) as amount,sum(base_amount) as base_amount,sum(overtime_amount) as overtime_amount,sum(paid_amount) as paid_amount')
|
|
->find();
|
|
|
|
$info['amount'] = $all['amount'];
|
|
$info['base_amount'] = $all['base_amount'];
|
|
$info['overtime_amount'] = $all['overtime_amount'];
|
|
$info['paid_amount'] = $all['paid_amount'];
|
|
|
|
if ($this->request->isPost()) {
|
|
$item = input('post.');
|
|
$validate = $this->validateByApi($item, [
|
|
'status' => 'require',
|
|
]);
|
|
|
|
if ($validate !== true) {
|
|
return $validate;
|
|
}
|
|
|
|
try {
|
|
PayMonthLog::where('account_id', $info['account_id'])->where('time', $info['time'])->save(['status' => $item['status']]);
|
|
return $this->json();
|
|
} catch (ValidateException $e) {
|
|
return $this->json(4001, $e->getError());
|
|
}
|
|
}
|
|
|
|
$this->data['item'] = $info;
|
|
$this->data['account'] = Account::findById($info['account_id']);
|
|
|
|
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 = PayMonthLog::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 Json
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
* @throws Exception
|
|
*/
|
|
public function listModify(): Json
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$item = input('post.');
|
|
$validate = $this->validateByApi($item, [
|
|
'field' => 'require',
|
|
'value' => 'require',
|
|
]);
|
|
|
|
if ($validate !== true) {
|
|
return $validate;
|
|
}
|
|
|
|
if (!$info = PayMonthLog::findById($item['id'])) {
|
|
return $this->json(4001, '记录不存在');
|
|
}
|
|
|
|
if ($item['field'] != 'paid_amount') {
|
|
return $this->json(4001, '该项不支持修改');
|
|
}
|
|
|
|
$update = [$item['field'] => (float) $item['value']];
|
|
|
|
if ($item['field'] == 'paid_amount') {
|
|
if ($item['value'] < 0) {
|
|
return $this->json(4001, '发放工资不能小于0');
|
|
}
|
|
if ($item['value'] > $info['amount']) {
|
|
return $this->json(4001, '发放工资不能大于总工资');
|
|
}
|
|
|
|
if ($item['value'] == $info['amount']) {
|
|
$update['status'] = 1;//全部发放
|
|
}
|
|
|
|
if ($item['value'] < $info['amount']) {
|
|
$update['status'] = 2;//部分发放
|
|
}
|
|
}
|
|
|
|
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()
|
|
{
|
|
$accountId = input('user_id/d', 0);
|
|
$worksite = Worksite::list();
|
|
$position = Position::list();
|
|
if ($this->request->isPost()) {
|
|
$page = input('page/d', 1);
|
|
$size = input('size/d', 20);
|
|
$searchParams = input('searchParams');
|
|
$search = [];
|
|
if ($searchParams) {
|
|
foreach ($searchParams as $key => $param) {
|
|
if ($param || $param == '0') {
|
|
switch ($key) {
|
|
case 'keyword':
|
|
$search[] = ['a.nickname|a.real_name|a.mobile', 'like', '%'.$param.'%'];
|
|
break;
|
|
default:
|
|
$search[] = ['pml.'.$key, '=', $param];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($accountId > 0) {
|
|
$search[] = ['pml.account_id', '=', $accountId];
|
|
}
|
|
|
|
try {
|
|
$total = 0;
|
|
$res = [
|
|
'total' => $total,
|
|
'current' => $page ?: 1,
|
|
'size' => $size ?: 20,
|
|
'info' => [],
|
|
'list' => [],
|
|
];
|
|
|
|
$query = PayMonthLog::alias('pml')
|
|
->leftJoin('account a', 'a.id = pml.account_id')
|
|
->where($search);
|
|
// 汇总信息
|
|
$info = $query->fieldRaw('sum(pml.amount) as amount, sum(pml.base_amount) as base_amount,
|
|
sum(pml.overtime_amount) as overtime_amount')->find();
|
|
// 已发放工资
|
|
$doneAmount = $query->where('pml.status', 1)->fieldRaw('sum(pml.amount) as amount')->find();
|
|
|
|
$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),
|
|
];
|
|
|
|
$query = PayMonthLog::alias('pml')
|
|
->leftJoin('account a', 'a.id = pml.account_id')
|
|
->leftJoin('worksite w', 'w.id = a.worksite_id')
|
|
->leftJoin('position p', 'p.id = a.position')
|
|
->where($search)
|
|
->group('account_id,time');
|
|
|
|
$total = $query->count();
|
|
$res['total'] = $total;
|
|
|
|
if ($total > 0) {
|
|
$res['list'] = $query->field('pml.id,sum(pml.amount) as amount,sum(pml.base_amount) as base_amount,pml.status,pml.year,pml.month,
|
|
sum(pml.overtime_amount) as overtime_amount,sum(pml.paid_amount) as paid_amount,pml.account_id,pml.time,a.nickname,a.real_name,a.mobile,w.name as worksite_name,
|
|
p.name as position_text,pml.paid_amount')
|
|
->page($page, $size)->order('pml.time', 'desc')->order('pml.id', 'desc')->select();
|
|
$res['list']->each(function ($item) {
|
|
$item->status_text = '待发放';
|
|
if ($item['amount'] == $item['paid_amount'] && $item['amount'] > 0) {
|
|
$item->status_text = '完全发放';
|
|
}
|
|
|
|
if ($item['amount'] > $item['paid_amount'] && $item['paid_amount'] > 0) {
|
|
$item->status_text = '部分发放';
|
|
}
|
|
|
|
$item->time_text = $item->year.'年'.$item->month.'月';
|
|
});
|
|
}
|
|
|
|
return $this->json(0, 'success', $res);
|
|
} catch (RepositoryException $e) {
|
|
return $this->json(4001, $e->getMessage());
|
|
} catch (Exception $e) {
|
|
return $this->json(5001, '获取工资列表失败'.$e->getMessage());
|
|
}
|
|
}
|
|
|
|
$this->data['userId'] = $accountId;
|
|
$this->data['worksiteList'] = $worksite;
|
|
$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, '非法请求');
|
|
}
|
|
|
|
/**
|
|
* 每月工资列表 与index的区别是 index按人与月份的汇总 几个工地的工资都进行了汇总
|
|
* list则是按每个工地单独统计
|
|
*
|
|
* @return View|Json
|
|
* @throws Exception
|
|
*/
|
|
public function list()
|
|
{
|
|
$accountId = input('user_id/d', 0);
|
|
$time = input('time/d', 0);
|
|
$worksite = Worksite::list();
|
|
$position = Position::list();
|
|
if ($this->request->isPost()) {
|
|
$page = input('page/d', 1);
|
|
$size = input('size/d', 20);
|
|
$searchParams = input('searchParams');
|
|
$search = [];
|
|
if ($searchParams) {
|
|
foreach ($searchParams as $key => $param) {
|
|
if ($param || $param == '0') {
|
|
switch ($key) {
|
|
case 'keyword':
|
|
$search[] = ['a.nickname|a.real_name|a.mobile', 'like', '%'.$param.'%'];
|
|
break;
|
|
default:
|
|
$search[] = ['pml.'.$key, '=', $param];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($accountId > 0) {
|
|
$search[] = ['pml.account_id', '=', $accountId];
|
|
}
|
|
|
|
if ($time > 0) {
|
|
$search[] = ['pml.time', '=', $time];
|
|
}
|
|
|
|
try {
|
|
$total = 0;
|
|
$res = [
|
|
'total' => $total,
|
|
'current' => $page ?: 1,
|
|
'size' => $size ?: 20,
|
|
'info' => [],
|
|
'list' => [],
|
|
];
|
|
|
|
$query = PayMonthLog::alias('pml')
|
|
->leftJoin('account a', 'a.id = pml.account_id')
|
|
->where($search);
|
|
// 汇总信息
|
|
$info = $query->fieldRaw('sum(pml.amount) as amount, sum(pml.base_amount) as base_amount,
|
|
sum(pml.overtime_amount) as overtime_amount')->find();
|
|
// 已发放工资
|
|
$doneAmount = $query->where('pml.status', 1)->fieldRaw('sum(pml.amount) as amount')->find();
|
|
|
|
$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),
|
|
];
|
|
|
|
$query = PayMonthLog::alias('pml')
|
|
->leftJoin('account a', 'a.id = pml.account_id')
|
|
->leftJoin('worksite w', 'w.id = pml.worksite_id')//注意此处需要使用pml表
|
|
->leftJoin('position p', 'p.id = a.position')
|
|
->where($search);
|
|
|
|
$total = $query->count();
|
|
$res['total'] = $total;
|
|
|
|
if ($total > 0) {
|
|
$res['list'] = $query->field('pml.*,a.nickname,a.real_name,a.mobile,w.name as worksite_name,
|
|
p.name as position_text')
|
|
->page($page, $size)->order('pml.id', 'desc')->select();
|
|
$res['list']->each(function ($item) {
|
|
$item->status_text = $item->status == 1 ? '已发放' : '待发放';
|
|
$item->time_text = $item->year.'年'.$item->month.'月';
|
|
});
|
|
}
|
|
|
|
return $this->json(0, 'success', $res);
|
|
} catch (RepositoryException $e) {
|
|
return $this->json(4001, $e->getMessage());
|
|
} catch (Exception $e) {
|
|
return $this->json(5001, '获取工资列表2失败'.$e->getMessage());
|
|
}
|
|
}
|
|
|
|
$this->data['userId'] = $accountId;
|
|
$this->data['time'] = $time;
|
|
$this->data['worksiteList'] = $worksite;
|
|
$this->data['positionList'] = $position;
|
|
return $this->view();
|
|
}
|
|
|
|
// 全部发放
|
|
public function payAll(): Json
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$time = input('time/d', 0);
|
|
$accountId = input('user_id/d', 0);
|
|
if (!$time) {
|
|
return $this->json(4004, '参数错误');
|
|
}
|
|
|
|
PayMonthLog::where('time', $time)->where('account_id', $accountId)->update([
|
|
'status' => 1,
|
|
'paid_amount' => Db::raw('`amount`'),
|
|
]);
|
|
|
|
return $this->json();
|
|
}
|
|
|
|
return $this->json(4001, '操作错误');
|
|
}
|
|
} |