463 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			463 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,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 = PayMonthLog::statusText()[$item->status] ?? '';
 | 
						|
                        $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, '操作错误');
 | 
						|
    }
 | 
						|
} |