From 175893b72968c9fba1df5452e3303a06b3c60eee Mon Sep 17 00:00:00 2001 From: weiz <736250432@qq.com> Date: Mon, 27 May 2024 15:10:36 +0800 Subject: [PATCH] update --- .../works/finance/ExpenseController.php | 466 +++++++++++++++++- .../works/finance/ExpenseValidate.php | 11 + 2 files changed, 475 insertions(+), 2 deletions(-) diff --git a/app/adminapi/controller/works/finance/ExpenseController.php b/app/adminapi/controller/works/finance/ExpenseController.php index b20e7fccc..6caa647f4 100644 --- a/app/adminapi/controller/works/finance/ExpenseController.php +++ b/app/adminapi/controller/works/finance/ExpenseController.php @@ -7,7 +7,6 @@ use app\common\model\auth\Admin; use app\common\model\dept\Dept; use app\common\model\works\bgsp\OaFlow; - use app\common\model\works\bgsp\OaFlowType; use think\facade\Db; class ExpenseController extends BaseAdminController @@ -237,7 +236,7 @@ 3=> [['check_status','=',2],['pay_admin_id','=',0],['pay_time','=',0]], //审批通过,待打款 4=> ['check_status','=',3], //审核不通过 5=> ['check_status','=',4], //撤销审核 - 6=> [['check_status','=',2],['pay_admin_id','>',0],['pay_time','>',0]], //撤销审核 + 6=> [['check_status','=',2],['pay_admin_id','>',0],['pay_time','>',0]], //审批通过,已打款 }; }else{ $where[] = ['check_status','in','1,2,3,4']; @@ -270,4 +269,467 @@ $count = Db::name('oa_expense')->where($where)->where('admin_id',$this->adminId)->count(); return $this->success('成功', compact('count', 'lists', 'page_no', 'page_size')); } + + public function copy(){ + $params = $this->request->get(['start_time','end_time','page_no','page_size']); + $page_no = !empty($params['page_no']) ? $params['page_no'] : 1; + $page_size = !empty($params['page_size']) ? $params['page_size'] : 15; + $map = []; + if(!empty($params['start_time']) && !empty($params['end_time'])){ + if(strtotime($params['end_time']) <= strtotime($params['start_time'])){ + return $this->fail('结束时间不等小于开始时间'); + } + $map[] = ['create_time','between',[strtotime($params['start_time']),strtotime($params['end_time'])]]; + } + //查询条件 + $map = []; + $map[] = ['f.check_status', '=', 2]; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$this->adminId}',f.copy_uids)")]; + + $lists = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->where($map) + ->order('f.id desc') + ->group('f.id') + ->page($page_no, $page_size)->select() + ->each(function($item){ + $item['create_time'] = date('Y-m-d H:i', $item['create_time']); + if($item['check_status']<2 && !empty($item['check_admin_ids'])){ + $check_user = Db::name('admin')->where('id','in',$item['check_admin_ids'])->column('name'); + $item['check_admin_users'] = implode(',',$check_user); + } + $item['income_month'] = date('Y-m',$item['income_month']); + $item['expense_time'] = date('Y-m-d',$item['expense_time']); + $item['pay_time'] = !empty($item['pay_time']) ? date('Y-m-d H:i:s',$item['pay_time']) : ''; + $item['pay_admin_name'] = Admin::where('id',$item['pay_admin_id'])?->value('name'); + $item['check_status_text'] = match ($item['check_status']){ + 0=>'待审核',1=>'审核中',2=>'审核通过',3=>'审核不通过',4=>'撤销审核' + }; + if(!empty($item['pay_admin_id']) && !empty($item['pay_time']) && $item['check_status'] == 2){ + $item['check_status_text'] = '已打款'; + } + $item['total_amount'] = 0; + foreach (json_decode($item['detail'],true) as $v){ + $item['total_amount'] += $v['amount']; + } + return $item; + })->toArray(); + $count = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->where($map)->count(); + return $this->success('成功', compact('count', 'lists', 'page_no', 'page_size')); + } + + public function deal_with(){ + $params = $this->request->get(); + $status = !empty($params['status']) ? $params['status'] : 0; + //查询条件 + $map1 = []; + $map2 = []; + $map1[] = ['', 'exp', Db::raw("FIND_IN_SET('{$this->adminId}',f.check_admin_ids)")]; + $map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$this->adminId}',f.flow_admin_ids)")]; + + $page_no = !empty($params['page_no']) ? $params['page_no'] : 1; + $page_size = !empty($params['page_size']) ? $params['page_size'] : 15; + $lists = []; + $count = 0; + if($status == 0){ + $lists = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->whereOr([$map1,$map2]) + ->order('f.id desc') + ->group('f.id') + ->page($page_no, $page_size)->select() + ->each(function($item){ + $item['create_time'] = date('Y-m-d H:i', $item['create_time']); + if($item['check_status']<2 && !empty($item['check_admin_ids'])){ + $check_user = Db::name('admin')->where('id','in',$item['check_admin_ids'])->column('name'); + $item['check_admin_users'] = implode(',',$check_user); + } + $item['income_month'] = date('Y-m',$item['income_month']); + $item['expense_time'] = date('Y-m-d',$item['expense_time']); + $item['pay_time'] = !empty($item['pay_time']) ? date('Y-m-d H:i:s',$item['pay_time']) : ''; + $item['pay_admin_name'] = Admin::where('id',$item['pay_admin_id'])?->value('name'); + $item['check_status_text'] = match ($item['check_status']){ + 0=>'待审核',1=>'审核中',2=>'审核通过',3=>'审核不通过',4=>'撤销审核' + }; + if(!empty($item['pay_admin_id']) && !empty($item['pay_time']) && $item['check_status'] == 2){ + $item['check_status_text'] = '已打款'; + } + $item['total_amount'] = 0; + foreach (json_decode($item['detail'],true) as $v){ + $item['total_amount'] += $v['amount']; + } + return $item; + })->toArray(); + $count = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->whereOr([$map1,$map2])->count(); + } + + if($status == 1){ + $lists = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->where($map1) + ->order('f.id desc') + ->group('f.id') + ->page($page_no, $page_size)->select() + ->each(function($item){ + $item['create_time'] = date('Y-m-d H:i', $item['create_time']); + if($item['check_status']<2 && !empty($item['check_admin_ids'])){ + $check_user = Db::name('admin')->where('id','in',$item['check_admin_ids'])->column('name'); + $item['check_admin_users'] = implode(',',$check_user); + } + $item['income_month'] = date('Y-m',$item['income_month']); + $item['expense_time'] = date('Y-m-d',$item['expense_time']); + $item['pay_time'] = !empty($item['pay_time']) ? date('Y-m-d H:i:s',$item['pay_time']) : ''; + $item['pay_admin_name'] = Admin::where('id',$item['pay_admin_id'])?->value('name'); + $item['check_status_text'] = match ($item['check_status']){ + 0=>'待审核',1=>'审核中',2=>'审核通过',3=>'审核不通过',4=>'撤销审核' + }; + if(!empty($item['pay_admin_id']) && !empty($item['pay_time']) && $item['check_status'] == 2){ + $item['check_status_text'] = '已打款'; + } + $item['total_amount'] = 0; + foreach (json_decode($item['detail'],true) as $v){ + $item['total_amount'] += $v['amount']; + } + return $item; + })->toArray(); + $count = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->where($map1)->count(); + } + if($status == 2){ + $lists = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->where($map2) + ->order('f.id desc') + ->group('f.id') + ->page($page_no, $page_size)->select() + ->each(function($item, $key){ + $item['create_time'] = date('Y-m-d H:i', $item['create_time']); + if($item['check_status']<2 && !empty($item['check_admin_ids'])){ + $check_user = Db::name('admin')->where('id','in',$item['check_admin_ids'])->column('name'); + $item['check_admin_users'] = implode(',',$check_user); + } + $item['income_month'] = date('Y-m',$item['income_month']); + $item['expense_time'] = date('Y-m-d',$item['expense_time']); + $item['pay_time'] = !empty($item['pay_time']) ? date('Y-m-d H:i:s',$item['pay_time']) : ''; + $item['pay_admin_name'] = Admin::where('id',$item['pay_admin_id'])?->value('name'); + $item['check_status_text'] = match ($item['check_status']){ + 0=>'待审核',1=>'审核中',2=>'审核通过',3=>'审核不通过',4=>'撤销审核' + }; + if(!empty($item['pay_admin_id']) && !empty($item['pay_time']) && $item['check_status'] == 2){ + $item['check_status_text'] = '已打款'; + } + $item['total_amount'] = 0; + foreach (json_decode($item['detail'],true) as $v){ + $item['total_amount'] += $v['amount']; + } + return $item; + })->toArray(); + $count = Db::name('oa_expense') + ->field('f.*,a.name as user_name,d.name as dept_name') + ->alias('f') + ->join('admin a', 'a.id = f.admin_id', 'left') + ->join('dept d', 'd.id = a.dept_id', 'left') + ->where($map2)->count(); + } + return $this->success('成功', compact('count', 'lists', 'page_no', 'page_size')); + } + + public function check(){ + $params = $this->request->post(['id','check','content']); + if(empty($params['id'])){ + return $this->fail('缺少数据主键'); + } + if(empty($params['check']) || !in_array($params['check'],[1,2,3])){ + return $this->fail('审核参数错误'); + } + if(empty($params['content'])){ + return $this->fail('请填写审核意见'); + } + $data = Db::name('oa_expense')->where('id',$params['id'])->find(); + if(empty($data)){ + return $this->fail('数据信息不存在'); + } + //撤销 + if($params['check'] == 3){ + if($data['admin_id'] != $this->adminId){ + return $this->fail('你不是该申请的发起者,无权撤销'); + } + //撤销审核,数据操作 + $params['check_status'] = 4; + $params['check_admin_ids'] =''; + $params['check_step_sort'] = 0; + $res = Db::name('oa_expense')->strict(false)->field('check_step_sort,check_status,check_admin_ids')->update($params); + if($res){ + $checkData=array( + 'action_id' => $params['id'], + 'step_id' => 0, + 'check_user_id' => $this->adminId, + 'type' => 2, + 'check_time' => time(), + 'status' => $params['check'], + 'content' => $params['content'], + 'create_time' => time() + ); + Db::name('oa_flow_record')->strict(false)->field(true)->insertGetId($checkData); + return $this->success('ok'); + }else{ + return $this->fail('fail'); + } + } + //拒绝 + if($params['check'] == 2){ + //当前审核节点详情 + $step = Db::name('oa_flow_step')->where(['action_id'=>$params['id'],'sort'=>$data['check_step_sort'],'type'=>2])->find(); + $check_admin_ids = explode(",", strval($data['check_admin_ids'])); + if (!in_array($this->adminId, $check_admin_ids)){ + return $this->fail('您没权限审核该审批'); + } + //拒绝审核,数据操作 + $params['check_status'] = 3; + $params['last_admin_id'] = $this->adminId; + $params['flow_admin_ids'] = $data['flow_admin_ids'].$this->adminId.','; + $params['check_admin_ids'] = ''; + if($step['flow_type'] == 4){ + //获取上一步的审核信息 + $prev_step = Db::name('oa_flow_step')->where(['action_id'=>$params['id'],'sort'=>($data['check_step_sort']-1),'type'=>2])->find(); + if($prev_step){ + //存在上一步审核 + $params['check_step_sort'] = $prev_step['sort']; + $params['check_admin_ids'] = $prev_step['flow_uids']; + $params['check_status'] = 1; + } + else{ + //不存在上一步审核,审核初始化步骤 + $params['check_step_sort'] = 0; + $params['check_admin_ids'] = ''; + $params['check_status'] = 0; + } + } + $res = Db::name('oa_expense')->strict(false)->field('check_step_sort,check_status,last_admin_id,flow_admin_ids,check_admin_ids')->update($params); + if($res){ + $checkData=array( + 'action_id' => $params['id'], + 'step_id' => $step['id'], + 'check_user_id' => $this->adminId, + 'type' => 2, + 'check_time' => time(), + 'status' => $params['check'], + 'content' => $params['content'], + 'create_time' => time() + ); + Db::name('oa_flow_record')->strict(false)->field(true)->insertGetId($checkData); + return $this->success('ok'); + } + else{ + return $this->fail('fail'); + } + } + //通过 + if($params['check'] == 1){ + //当前审核节点详情 + $step = Db::name('oa_flow_step')->where(['action_id'=>$params['id'],'sort'=>$data['check_step_sort'],'type'=>2])->find(); + $check_admin_ids = explode(",", strval($data['check_admin_ids'])); + if (!in_array($this->adminId, $check_admin_ids)){ + return $this->fail('您没权限审核该审批'); + } + //多人会签审批 + if($step['flow_type'] == 3){ + //查询当前会签记录数 + $check_count = Db::name('oa_flow_record')->where(['action_id'=>$params['id'],'step_id'=>$step['id'],'type'=>2])->count(); + //当前会签记应有记录数 + $flow_count = explode(',', $step['flow_uids']); + if(($check_count+1) >=count($flow_count)){ + $next_step = Db::name('oa_flow_step')->where(['action_id'=>$params['id'],'sort'=>($data['check_step_sort']+1),'type'=>2])->find(); + if($next_step){ + //存在下一步审核 + if($next_step['flow_type'] == 1){ + //获取部门负责人 + $dept = Admin::where('id',$data['admin_id'])->value('dept_id'); + if(empty($dept)){ + return $this->fail('当前用户未设置部门,请联系管理员'); + } + $leader = Dept::where('id',$dept)->value('leader_id'); + if(empty($leader)){ + return $this->fail('当前部门负责人还未设置,请联系管理员'); + }else{ + $params['check_admin_ids'] = $leader; + } + }else{ + $params['check_admin_ids'] = $next_step['flow_uids']; + } + $params['check_step_sort'] = $data['check_step_sort']+1; + $params['check_status'] = 1; + }else{ + //不存在下一步审核,审核结束 + $params['check_status'] = 2; + $params['check_admin_ids'] =''; + } + }else{ + $params['check_status'] = 1; + $params['check_admin_ids'] = $step['flow_uids']; + } + }else if($step['flow_type'] == 0){ + //自由人审批 + if($params['check_node'] == 2){ + $next_step = $data['check_step_sort']+1; + $flow_step = array( + 'action_id' => $params['id'], + 'sort' => $next_step, + 'type' => 2, + 'flow_uids' => $params['check_admin_ids'], + 'create_time' => time() + ); + $fid = Db::name('oa_flow_step')->strict(false)->field(true)->insertGetId($flow_step); + //下一步审核步骤 + $params['check_step_sort'] = $next_step; + $params['check_status'] = 1; + } + else{ + //不存在下一步审核,审核结束 + $params['check_status'] = 2; + $params['check_admin_ids'] =''; + } + }else{ + $next_step = Db::name('oa_flow_step')->where(['action_id'=>$params['id'],'sort'=>($data['check_step_sort']+1),'type'=>2])->find(); + if($next_step){ + //存在下一步审核 + if($next_step['flow_type'] == 1){ + //获取部门负责人 + $dept = Admin::where('id',$data['admin_id'])->value('dept_id'); + if(empty($dept)){ + return $this->fail('当前用户未设置部门,请联系管理员'); + } + $leader = Dept::where('id',$dept)->value('leader_id'); + if(empty($leader)){ + return $this->fail('当前部门负责人还未设置,请联系管理员'); + }else{ + $params['check_admin_ids'] = $leader; + } + } + else{ + $params['check_admin_ids'] = $next_step['flow_uids']; + } + $params['check_step_sort'] = $data['check_step_sort']+1; + $params['check_status'] = 1; + } + else{ + //不存在下一步审核,审核结束 + $params['check_status'] = 2; + $params['check_admin_ids'] =''; + } + } + if($params['check_status'] == 1 && empty($params['check_admin_ids'])){ + return $this->fail('找不到下一步的审批人,该审批流程设置有问题,请联系HR或者管理员'); + } + //审核通过数据操作 + $params['last_admin_id'] = $this->adminId; + $params['flow_admin_ids'] = $data['flow_admin_ids'].$this->adminId.','; + $res = Db::name('oa_expense')->strict(false)->field('check_step_sort,check_status,last_admin_id,flow_admin_ids,check_admin_ids')->update($params); + if($res){ + $checkData=array( + 'action_id' => $params['id'], + 'step_id' => $step['id'], + 'check_user_id' => $this->adminId, + 'type' => 2, + 'check_time' => time(), + 'status' => $params['check'], + 'content' => $params['content'], + 'create_time' => time() + ); + Db::name('oa_flow_record')->strict(false)->field(true)->insertGetId($checkData); + return $this->success('ok'); + } + else{ + return $this->fail('fail'); + } + } + return $this->fail(); + } + + public function lists2(){ + $params = $this->request->get(['start_time','end_time','status','page_no','page_size']); + $page_no = !empty($params['page_no']) ? $params['page_no'] : 1; + $page_size = !empty($params['page_size']) ? $params['page_size'] : 15; + $where = []; + if(!empty($params['start_time']) && !empty($params['end_time'])){ + if(strtotime($params['end_time']) <= strtotime($params['start_time'])){ + return $this->fail('结束时间不等小于开始时间'); + } + $where[] = ['create_time','between',[strtotime($params['start_time']),strtotime($params['end_time'])]]; + } + if(!empty($params['status'])){ + $where[] = match ($params['status']){ + 1=> [['check_status','=',2],['pay_admin_id','=',0],['pay_time','=',0]], //审批通过,待打款 + 2=> [['check_status','=',2],['pay_admin_id','>',0],['pay_time','>',0]], //审批通过,已打款 + }; + }else{ + $where[] = ['check_status','=',2]; + } + $lists = Db::name('oa_expense')->field('id,code,income_month,expense_time,admin_id,check_admin_ids,check_status,pay_admin_id,pay_time,create_time,detail')->where('admin_id',$this->adminId)->where($where) + ->page($page_no, $page_size)->order('id desc')->select()->each(function($data){ + $admin = Admin::field('name,dept_id')->where('id',$data['admin_id'])->findOrEmpty(); + $dept = Dept::where('id',$admin['dept_id'])->value('name'); + $check_admin_users = Admin::where('id','in',$data['check_admin_ids'])->column('name'); + $data['user_name'] = $admin['name']; + $data['dept_name'] = $dept ?? ''; + $data['check_admin_users'] = !empty($check_admin_users) ? implode(',',$check_admin_users) : ''; + $data['create_time'] = date('Y-m-d H:i:s',$data['create_time']); + $data['income_month'] = date('Y-m',$data['income_month']); + $data['expense_time'] = date('Y-m-d',$data['expense_time']); + $data['pay_time'] = !empty($data['pay_time']) ? date('Y-m-d H:i:s',$data['pay_time']) : ''; + $data['pay_admin_name'] = Admin::where('id',$data['pay_admin_id'])?->value('name'); + $data['check_status_text'] = match ($data['check_status']){ + 0=>'待审核',1=>'审核中',2=>'审核通过',3=>'审核不通过',4=>'撤销审核' + }; + if(!empty($data['pay_admin_id']) && !empty($data['pay_time']) && $data['check_status'] == 2){ + $data['check_status_text'] = '已打款'; + } + $data['total_amount'] = 0; + foreach (json_decode($data['detail'],true) as $v){ + $data['total_amount'] += $v['amount']; + } + return $data; + })->toArray(); + $count = Db::name('oa_expense')->where($where)->where('admin_id',$this->adminId)->count(); + return $this->success('成功', compact('count', 'lists', 'page_no', 'page_size')); + } + + public function payment(){ + $params = (new ExpenseValidate())->post()->goCheck('pay'); + $data = Db::name('oa_expense')->where('id',$params['id'])->find(); + if(empty($data)){ + return $this->success('申请信息不存在'); + } + if($data['check_status'] !== 2){ + return $this->success('当前申请未审核通过'); + } + $res = Db::name('oa_expense')->where('id',$params['id'])->update(['pay_admin_id'=>$this->adminId,'pay_time'=>time()]); + return $res ? $this->success('ok') : $this->fail('fail'); + } } \ No newline at end of file diff --git a/app/adminapi/validate/works/finance/ExpenseValidate.php b/app/adminapi/validate/works/finance/ExpenseValidate.php index ce3553aef..998e0e189 100644 --- a/app/adminapi/validate/works/finance/ExpenseValidate.php +++ b/app/adminapi/validate/works/finance/ExpenseValidate.php @@ -79,6 +79,17 @@ return $this->only(['id']); } + /** + * @notes 详情场景 + * @return ExpenseValidate + * @author likeadmin + * @date 2024/05/24 14:16 + */ + public function scenePay() + { + return $this->only(['id']); + } + public function checkFlow($value): bool|string { $data = OaFlow::where('id',$value)->findOrEmpty(); if($data->isEmpty()){