<?php /** * v2 抄表模块 */ namespace app\em\controller; use app\admin\controller\Base; use app\em\model\EmCheckBill; use app\em\model\Staff; use app\em\model\Station; use app\em\model\UseageDetail; use app\em\validate\UseageGeneralInfoValidate; use think\facade\Request; use think\facade\Session; class Useage extends Base { //获取抄表单列表 public function index(){ $map=[]; //权限检测 $user = Session::get('user'); if(!$user['is_admin']){ $permissionData=check_data(); if($permissionData){ $map[]=$permissionData; } } $this->assign('admin',$user['is_admin']); $search_text = Request::get('search_text'); $search_type = Request::get('search_type'); $status = Request::get('status'); if($search_text){ switch ($search_type) { case '1': $this->assign('search_text',$search_text); $map[]=['ue.useage_id','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '2': $this->assign('search_text',$search_text); $map[]=['station.station_name','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '3': $this->assign('search_text',$search_text); $map[]=['em.em_numb','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; } }else{ $this->assign('search_type',''); $this->assign('search_text',''); } if($status){ $this->assign('status',$status); $map[]=['ue.status','=',$status]; }else{ $this->assign('status',0); } //抄表时间查询条件 $dateStart = strtotime(Request::get('date_start')); $dateEnd = strtotime(Request::get('date_end')); //区间查询 if( !empty($dateStart) && !empty($dateEnd) ){ $map[] = ['ue.current_date','between',[$dateStart,$dateEnd]]; $this->assign('date_start',Request::get('date_start')); $this->assign('date_end',Request::get('date_end')); } elseif (!empty($dateStart) && empty($dateEnd)){ $map[] = ['ue.current_date','>',$dateStart]; $this->assign('date_start',Request::get('date_start')); $this->assign('date_end',''); } elseif (empty($dateStart) && !empty($dateEnd)){ $map[] = ['ue.current_date','<',$dateEnd]; $this->assign('date_end',Request::get('date_end')); $this->assign('date_start',''); }else{ $this->assign('date_start',''); $this->assign('date_end',''); } $page =Request::param('page')?Request::param('page'):1; $limit = Request::param('limit')?Request::param('limit'):10; $data = (new \app\em\model\Useage)->getCopyList($map,$page,$limit); $copyCount = (new \app\em\model\Useage)->getCopyListCount($map); if(Request::param('page')){ return ['code'=>0,'msg'=>'','count'=>$copyCount,'data'=>$data]; } return $this->fetch(); } //生成抄表单 public function create(){ $em_id = Request::param('id'); if(!(new Em())->checkEmComplete($em_id)){ $this->error('电表信息不完整,需要补充基础信息','/em'); } $em = (new \app\em\model\Em)->getEmUseageInfoById($em_id,false); //基站信息 $station_info = Station::getBaseInfoById($em->station_id); $this->assign('station',$station_info); //当前用户 $user = Session::get('user'); $this->assign('uid',$user['user_id']); //员工列表 $this->assign('staffs',(new Staff())->getStaffs($user['is_admin'],'','useage')); $this->assign('em',$em); $this->assign('detail',false); return $this->fetch('default'); } public function update(){ $useage_id = Request::param('useage_id'); $uModel = (new \app\em\model\Useage())->with('photo')->get(['useage_id'=>$useage_id]); $em = (new \app\em\model\Em)->getEmUseageInfoById($uModel->em_id,false); //基站信息 $station_info = Station::getBaseInfoById($em->station_id); $this->assign('station',$station_info); //当前用户 $user = Session::get('user'); $this->assign('uid',$user['user_id']); //员工列表 $this->assign('staffs',(new Staff())->getStaffs($user['is_admin'],'','useage')); $this->assign('em',$em); $step = 1000000; $uModel->repo_numb = ((int)($uModel->current_sum_numb * $step) - (int)($uModel->last_sum_numb * $step)) / $step; $this->assign('useage',$uModel); return $this->fetch('update'); } //保存抄表单 public function store(){ //获取表单数据 $data = Request::post(); $useage_id = isset($data['useage_id']) ? $data['useage_id'] : ''; $action = '新增'; //数据验证 $validate = new UseageGeneralInfoValidate(); //根据计量模式 验证去表单数据 $sence = 's1'; if($data['pricing_type'] == 2){ $sence = 's2'; } if(!$validate->scene($sence)->check($data)){ return json(['status'=>0,'message'=>$validate->getError()]); } //获取电表基本信息 $em = (new \app\em\model\Em)->getEmInfoById(['id'=>$data['em_id']],'rule'); if(empty($useage_id)) { $uModel = new \app\em\model\Useage(); $uModel->useage_id = $this->getUId(); $uModel->uid = $this->uid; $uModel->last_sum_numb = $data['last_numb']; $uModel->last_date = $data['last_date']; $uModel->em_id = $data['em_id']; $uModel->amount = isset($data['amount']) ? $data['amount'] : 0; //峰谷类型 $uModel->type = $data['pricing_type']; } else { $this->checkEnd($useage_id); $action = '修改'; $uModel = (new \app\em\model\Useage())->get(['useage_id' => $useage_id]); $uModel->status = 1; } //更新 $uModel->staff_id = $data['staff_id']; $uModel->current_date = $data['current_date']; $uModel->current_sum_numb = $data['current_numb']; $uModel->photo_id = $data['photo_id']; //单价 $uModel->price = $data['pricing_type'] == 1 ? $em->rule->pay_price : $data['price']; $uModel->save(); //保存抄表记录 if(empty($useage_id)){ $udModel = new UseageDetail(); //抄表详情模型 $udModel->useage_id = $uModel->useage_id; $udModel->type = $data['pricing_type'] == 1 ? 5 : 6; $udModel->current_numb = $uModel->current_sum_numb; $udModel->last_numb = $uModel->last_sum_numb; } else { $udModel = (new UseageDetail())->get(['useage_id' => $useage_id]); //抄表详情模型 } $udModel->current_numb = $uModel->current_sum_numb; $udModel->price = $uModel->price; $udModel->save(); return json(['status'=>1,'message'=>$action.'抄表记录成功']); } /** * 审核抄表单并生成账单 */ public function check(){ $useage_id = Request::param('useage_id'); $useage = \app\em\model\Useage::get(['useage_id' => $useage_id]); if($useage->status == 2) return json(['status'=>0,'message'=>'单据已经审核过,不能再次审核']); //如果是驳回则记录驳回状态 $checkType = Request::param('checkType'); $this->verify($useage_id,$checkType); //1是通过 2是驳回 if($checkType == 2) { $res = $this->checkEnd($useage_id); if($res !== true) return $res; $useage->status = 3; //3代表被驳回 $useage->save(); return json(['status'=>1,'message'=>'单据已经驳回']); } $inv = (new Invoice())->createInvoice($useage_id); $useage->status = 2; $useage->save(); //触发销账逻辑 $result = (new WriteOff())->writeOffFromInvoice($inv->invoice_id); return json(['status'=>1,'message'=>"已审核,并生成账单,$result"]); } //获取单号 private function getUId(){ $uModel = \app\em\model\Useage::field('id')->order('id desc,create_time desc')->find(); if(!$uModel) $id = 1; else $id = $uModel->id + 1; return "CB".date('Ymd').zero($id); } /** * 通过useage_id获取抄表单详情 * 通过useage_id找到电表类型 * 通过电表类型判断是否是峰谷表 * 如果是峰谷表就显示峰谷的详情 * 如果不是峰谷表就显示单条记录 */ public function detail(){ $uid = Request::param('useage_id'); $useage = (new \app\em\model\Useage)->alias('u') ->field('u.*,em.rate') ->field('emr.pricing_type,emr.pay_price') ->leftJoin(['em'],'em.id=u.em_id') ->leftJoin(['em_rule'=>'emr'],'emr.em_id=em.id') ->where('u.useage_id','=',$uid) ->find(); $em = (new \app\em\model\Em())->getBaseInfo($useage->em_id); $user = Session::get('user'); if($useage){ $this->assign('staffs',(new Staff())->getStaffs($user['is_admin'],$useage->staff_id)); } else { $this->assign('staffs',(new Staff())->getStaffs($user['is_admin'])); } $useage->price = $useage->pricing_type == 1 ? $useage->pay_price : $useage->price; $useage->repo_numb = round(round($useage->current_sum_numb - $useage->last_sum_numb,2) * $useage->rate,2); $this->assign('em',$em); $this->assign('useage',$useage); return $this->fetch('detail'); } public function del(){ $useage_id = Request::param('uid'); $res = $this->checkEnd($useage_id); if($res !== true) return $res; //删除useage表数据 $useage = (new \app\em\model\Useage())->get(['useage_id'=>$useage_id]); $useage->delete(); //删除明细表数据 (new UseageDetail())->where('useage_id','=',$useage_id)->delete(); return json(['status'=>1,'message'=>"删除单据成功"]); } /** * 判断useage_id是否是em_id的最后一条记录 * @param $useage_id * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function checkEnd($useage_id){ $uModel = (new \app\em\model\Useage())->get(['useage_id'=>$useage_id]); if(!$uModel) return json(['status'=>0,'message'=>"不存在的抄表单号,请联系管理员"]); if($uModel->status == 2) return json(['status'=>0,'message'=>"已审核过的单据无法操作,请联系管理员"]); //找出电表最后一条数据 $lastModel = (new \app\em\model\Useage())->where('em_id','=',$uModel->em_id) ->order('id desc')->find(); if($lastModel->status == 2) return json(['status'=>0,'message'=>"单号不是最新的抄表记录且最新的抄表记录已经审核无法操作,请联系管理员"]); if($uModel->id != $lastModel->id){ return json(['status'=>0,'message'=>"抄表单号不是最新的抄表记录无法操作,请联系管理员"]); } return true; } //审核 public function verify($usage_id,$status=2){ $user = Session::get('user'); (new EmCheckBill)->check(Request::param('refuseInfo'),$user['user_id'],Request::controller(),$usage_id,$status); } }