382 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			382 lines
		
	
	
		
			13 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']; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 详情 | ||
|  |      * | ||
|  |      * @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') | ||
|  |             ->find(); | ||
|  | 
 | ||
|  |         $info['amount']          = $all['amount']; | ||
|  |         $info['base_amount']     = $all['base_amount']; | ||
|  |         $info['overtime_amount'] = $all['overtime_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 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') | ||
|  |                         ->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, '获取工资列表失败'.$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(); | ||
|  |     } | ||
|  | } |