<?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);
    }
}