<?php namespace app\admin\controller; use app\admin\model\ContractModel; use app\admin\model\CopyModel; use app\admin\model\DepartmentModel; use app\admin\model\ElectricMeter; use app\admin\model\ElectricMeterType; use app\admin\model\EngineRoom; use app\admin\model\OperatorModel; use app\admin\model\StaffModel; use app\admin\validate\EmAddValidate; use think\facade\Session; use think\Request; use app\station\model\Station as StationModel; /** * 电表控制器 * Class Em * @package app\admin\controller */ class Em extends Base { public function index(Request $request) { $map=[]; //权限检测 $user = Session::get('user'); if(!$user['is_admin']){ $permissionData=check_data(); if($permissionData){ $map[]=$permissionData; } } $search_text = $request->get('search_text'); $search_type = $request->get('search_type'); if($search_text){ switch ($search_type) { case '1': $this->assign('search_text',$search_text); $map[]=['s.station_name','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '2': $this->assign('search_text',$search_text); $map[]=['s.station_sp_code','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '3': $this->assign('search_text',$search_text); $map[]=['s.proj_number','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '4': $this->assign('search_text',$search_text); $map[]=['em.number','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '5': $this->assign('search_text',$search_text); $map[]=['em.qrcode','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; case '6': $this->assign('search_text',$search_text); $map[]=['er.rent','like',"%$search_text%"]; $this->assign('search_type',$search_type); break; } }else{ $this->assign('search_type',''); $this->assign('search_text',''); } $operator = $request->get('operator'); if($operator){ $map[] = ['s.original_sp_id','=',$operator]; $this->assign('operator',$operator); }else{ $this->assign('operator',''); } $area_id = $request->get('area_id'); if($area_id){ $map[] = ['s.area_id','=',$area_id]; $this->assign('area_id',$area_id); }else{ $this->assign('area_id',''); } $page = $request->get('page')?$request->get('page'):1; $limit = $request->get('limit')?$request->get('limit'):10; $em= new ElectricMeter; $emList= $em->getEmList($map,$page,$limit); $emCount= $em->getEmListCount($map); if($request->get('page')){ return ['code'=>0,'msg'=>'','count'=>$emCount,'data'=>$emList]; } //运营商 $operators = OperatorModel::field('operator_id,operator_name')->where('operator_state','=',1)->select()->toArray(); //区域 $this->assign('regions',getTree($em->regions())); $this->assign('operators',$operators); return $this->fetch('index'); } public function search(Request $request){ $em = new ElectricMeter; $condition = ''; //查询条件信息 $map = []; //查询参数 $regions = $em->regions(); //获取区域 $pageCount = $request->get('page'); $identity = (new Staff)->getIdentity(); if($pageCount > 0){ $map = Session::get('map'); $condition = Session::get('condition'); } else { //获取查询条件 $type = $request->post('search_type'); $text = $request->post('search_text'); $operator = $request->post('operator') + 0; $area_id = $request->post('area') + 0; switch ($type){ case 1: $type = 's.station_name'; $condition .= '站名: '; break; case 2: $type = 's.station_sp_code'; $condition .= '站号: '; break; case 3: $type = 's.proj_number'; $condition .= '项目编号: '; break; case 4: $type = 'em.number'; $condition .= '电表识别号: '; break; case 5: $type = 'em.qrcode'; $condition .= '机房二维码: '; break; case 6: $type = 'er.rent'; $condition .= '出租单位名: '; break; } if( !empty($text) ){ $map[] = [$type,'like',"%".$text."%"]; $condition .= "<span style='color:#FFB800'> " .$text . " </span>"; } else { $condition .= " 默认 "; } if( !empty($operator) ){ $map[] = ['s.original_sp_id','=',$operator]; if($operator == 1){ $condition .= " + 运营商: <span style='color:#FFB800'> 移动</span>"; } else { $condition .= " + 运营商: <span style='color:#FFB800'> 铁塔</span>"; } } else { $condition .= " + 运营商: 默认 "; } if( $area_id > 0 ){ $region = ''; foreach ($regions as $v){ if($v['id'] == $area_id) $region = $v; } $map[] = ['s.area_id','=',$area_id]; $condition .= " + 区域: <span style='color:#FFB800'>". $region['region_name'] ."</span>"; } else { $condition .= " + 区域: 默认 "; } $user = Session::get('user'); if(!$user['is_admin'] && $identity !=5){ if(config('admin.search_area') == 1){ $staff = StaffModel::get($user['user_id']); //通过员工的部门id查询 员工所在部门以及下属部门的所有基站数据 $dids = (new DepartmentModel)->getNodeIds($staff->d_id); $stations = StationModel::field('station_id') ->where('department_id','in',$dids) ->select() ->toArray(); $stationArr = []; foreach ($stations as $station){ $stationArr[]= $station['station_id']; } $map[] = ['em.station_id','in',$stationArr]; } } //保存查询条件跟查询信息给分页显示使用 Session::set('map',$map); Session::set('condition',$condition); } $config = [ 'list_rows'=>10, 'page'=> $pageCount, 'type' => '\app\extend\PageLayUi', 'var_page' => 'page' ]; $list = $em->searchList($map,$config); $page = $list->render(); $operators = OperatorModel::field('operator_id,operator_name')->where('operator_state','=',1)->select()->toArray(); $this->assign('regions',$regions); $this->assign('condition',$condition); $this->assign('identity',$identity); $this->assign('data',$list); $this->assign('page',$page); $this->assign('operators',$operators); return $this->fetch('index'); } public function create($sid){ //取出电表类型 $eType = ElectricMeterType::select()->toArray(); //取出员工信息 $user = Session::get('user'); if($user['is_admin']){ $staffs = StaffModel::field('id,name')->select()->toArray(); } else { $staff = StaffModel::find($user['user_id'])->toArray(); $dIds = (new DepartmentModel)->getNodeIds($staff['d_id']); $staffs = StaffModel::field('id,name')->where('d_id','in',$dIds)->select()->toArray(); } $this->assign('users',$staffs); //获取基站信息 $station = (new Station())->getStationById($sid); $this->assign('eType',$eType); $this->assign('uid',$user['user_id']); $this->assign('station',$station); //通过user_id找到所在的组下面的所有成员 return $this->fetch('add'); } public function edit($id){ $em = ElectricMeter::with('photo')->find($id)->toArray(); //电表 $em['photo']['src'] = ltrim($em['photo']['src'] ,'.'); //过滤路径中的点 $station = (new Station)->getStationById($em['station_id'])->toArray(); //基站 if($em['er_id']){ $er = EngineRoom::find($em['er_id'])->toArray(); //机房 } else { $er = []; } if($em['protocol_id']){ $protocol = ContractModel::with('photo')->find($em['protocol_id'])->toArray(); //协议 } else { $protocol = []; } if(isset($protocol['photo'])) $protocol['photo']['src'] = ltrim($protocol['photo']['src'] ,'.'); //过滤路径中的点 $contract = ContractModel::field('id,number,sign_time,period')->find($em['contract_id'])->toArray(); //合同 //取出电表类型 $eType = ElectricMeterType::select(); $this->assign('eType',$eType); //取出部门员工 $user = Session::get('user'); if($user['is_admin']){ $staffs = StaffModel::field('id,name')->select()->toArray(); } else { $staff = StaffModel::find($user['user_id'])->toArray(); $dIds = (new DepartmentModel)->getNodeIds($staff['d_id']); $staffs = StaffModel::field('id,name')->where('d_id','in',$dIds)->select()->toArray(); } $this->assign('staffs',$staffs); if(strlen($em['first_cp_date']) == 10 || strlen($em['first_cp_date']) == 11){ $em['first_cp_date'] = date('Y-m-d',$em['first_cp_date']); } $this->assign('iden',$user['is_admin']); $this->assign('em',$em); $this->assign('station',$station); $this->assign('er',$er); $this->assign('protocol',$protocol); $this->assign('contract',$contract); return $this->fetch(); } public function update(Request $request,EmAddValidate $validate){ $type = $request->post('electric_type'); //非供电局表 $scene = 'upType'.$type; if(!$validate->scene($scene)->check($request->post())){ return jsonErr($validate->getError()); } if($request->post('is_protocol') == 1){ if(!$validate->scene('protocol')->check($request->post())){ return jsonErr($validate->getError()); } } //电表信息 $em = ElectricMeter::find($request->post('em_id')); $em->emt_id = $request->post('electric_type'); //电表类型 $em->qrcode = $request->post('qr_code') ?: $em->qrcode; //缴费周期 $em->number = $request->post('electric_number'); //电表标号 $em->pay_number = $request->post('pay_number'); //缴费号 $em->multiple = $request->post('multiple'); //倍率 $em->pay_cycle = $request->post('pay_cycle'); //缴费周期 $em->unit_price = $request->post('unit_price'); //电表单价 $em->address = $request->post('address'); //地址 $em->remark = $request->post('electric_remark'); //备注 $em->init_degree = $request->post('init_degree'); //初始度数 if($em->emt_id == 2 || $em->emt_id == 4){ $em->init_amount = $request->post('init_amount'); //初始读数 } $em->first_cp_date = strtotime($request->post('first_cp_date')); //初始抄表日期 $em->is_protocol = $request->post('is_protocol'); // 协议 $em->protocol_price = $request->post('protocol_price'); // 协议价格 if($em->is_protocol == 1){ $em->protocol_id = $request->post('protocol_id'); //上传协议ID } $em->staff_id = $request->post('staff_id'); // 员工 $em->photo_id = $request->post('photo_id'); // 照片 $em->status = 1 ; if($em->is_protocol && !$em->protocol_id){ return jsonErr('需要添加电费补充协议'); } //机房信息更新 $erRes = $this->addEngineRoom(); if(!$erRes){ return jsonErr('更新机房信息失败'); } else { $em->er_id = $erRes; } //合同信息更新 $conRes = $this->updateContract(); if(!$conRes){ return jsonErr('更新合同信息失败'); } else { $em->contract_id = $request->post('contract_id') ?: $em->contract_id; } if(!$em->save()){ return jsonErr('更新电表信息失败'); } else { return jsonSuc('更新成功'); } } public function show($id){ $em = (new ElectricMeter)->getEmById($id); //查询电表所属的抄表单信息 $copy = CopyModel::getCopyByEmId($id); if($copy) { foreach ($copy as $k => $v) { if(isset($v['used_number'])) { $copy[$k]['used_number'] = ceil($v['used_number'] * $em['multiple']); } } } $this->assign('copy',$copy); $this->assign('em',$em); return $this->fetch('detail'); } public function export(){ $user = Session::get('user'); $staff = StaffModel::get($user['user_id']); $stations = StationModel::field('station_id')->where('department_id','=',$staff->d_id)->select()->toArray(); $stationArr = []; foreach ($stations as $station){ $stationArr[]= $station['station_id']; } //查询基站所属的电表ID $ems = (new ElectricMeter())->getEmsBySids($stationArr); $excel = new Excel; $excel->export($ems,'电表资料'); } //数据导入 public function import(){ $file = request()->file('file_name'); $upload = new Upload($file,2); $result = $upload->upload(); $fileurl=$_SERVER['DOCUMENT_ROOT'].$result['src']; $excel = new Excel; $result=$excel->importExecl($fileurl); if($result['code']==200){ return jsonSuc('导入成功! 总导入条数为 '.$result['data']['total'].' 条'.' 成功导入条数为 '.$result['data']['suc']. ' 条'.' 失败'.$result['data']['er']. '条'); }else{ return jsonErr('模板格式错误'); } } public function store(Request $request,EmAddValidate $validate){ $type = $request->post('electric_type'); $scene = 'type'.$type; if(!$validate->scene($scene)->check($request->post())){ return jsonErr($validate->getError()); } if($request->post('is_protocol') == 1){ if(!$validate->scene('protocol')->check($request->post())){ return jsonErr($validate->getError()); } } //电表信息 $em = new ElectricMeter; $em->station_id = $request->post('station_id'); $em->emt_id = $type; //电表类型 $em->number = $request->post('electric_number'); //电表标号 $em->pay_number = $request->post('pay_number'); //缴费号 $em->multiple = $request->post('multiple'); //倍率 $em->pay_cycle = $request->post('pay_cycle'); //缴费周期 $em->unit_price = $request->post('unit_price'); //电表单价 $em->address = $request->post('address'); //地址 $em->remark = $request->post('electric_remark'); //备注 $em->init_degree = $request->post('init_degree'); //初始度数 $em->init_amount = $request->post('init_amount'); //初始余额 $em->first_cp_date = strtotime($request->post('first_cp_date')); //初始抄表日期 $em->is_protocol = $request->post('is_protocol'); // 协议 $em->protocol_id = $request->post('protocol_id'); //上传协议照片ID $em->staff_id = $request->post('staff_id'); // 员工 $em->photo_id = $request->post('photo_id'); // 照片 $em->status = 1 ; $em->qrcode = $request->post('qr_code') ?: ''; //倍率 $em->er_id = $this->addEngineRoom(); if($em->er_id == 0) return jsonErr('添加机房数据错误,请重试'); $resCon = $this->addContract(); if($resCon['data'] == 0) return jsonErr($resCon['message']); $em->contract_id = $resCon['data']; //电表附件 如果上传则添加 if($em->is_protocol == 1){ $em->protocol_price = $request->post('protocol_price'); } if($em->save()){ return jsonSuc('添加电表成功!'); } else { return jsonErr('添加电表失败'); } } public function searchStations(){ return $this->fetch('search'); } public function upProtocol(Request $request){ $file = $request->file('upProtocol'); $upload = new Upload($file,1); $result = $upload->upload(); if(!empty($result)){ return jsonSuc('协议上传成功',$result); } else { return jsonErr($result); } } public function upAnnex(Request $request){ $file = $request->file('annex_file'); $upload = new Upload($file,1); $result = $upload->upload(); if(!empty($result)){ return jsonSuc('电表附件上传成功',$result); } else { return jsonErr($result); } } private function addEngineRoom(){ //机房 $request = new Request; $em_id = $request->post('em_id'); if($em_id){ $em = ElectricMeter::get($em_id); $room = EngineRoom::get($em->er_id); } //新增 if(!isset($room) || $room == ''){ $room = new EngineRoom; } $room->name = $request->post('rent') ?: $room->name; $room->position = $request->post('room_position') ?: $room->position; $room->station_id = $request->post('station_id') ?: $room->station_id; $room->contact = $request->post('contact') ?: $room->contact; $room->tel = $request->post('contact_tel') ?: $room->tel; $room->receive = $request->post('receive') ?: $room->receive; $room->rent = $request->post('rent') ?: $room->rent; $room->property_position = $request->post('property_position') ?: $room->property_position; if($request->post('engineroom_remark')){ $room->remark = $request->post('engineroom_remark'); } if($room->save()){ return $room->id; } else { return 0; } } private function addContract(){ $request = new Request; $contract = new Contract; $user = Session::get('user'); $staff = StaffModel::field('id,d_id')->find($user['user_id'])->toArray(); $data['id'] = $request->post('contract_id') ?: null; $data['name'] = '新增电表合同'; $data['number'] = $request->post('contract_number') ?: 'contract-add-000000'; $data['u_id'] = $user['user_id']; $data['start_date'] = strtotime($request->post('contract_confirm_date')); $data['end_date'] = strtotime($request->post('contract_confirm_date')); $data['sign_date'] = strtotime($request->post('contract_confirm_date')); $data['d_id'] = $staff['d_id']; $data['type'] = 1; $data['file_id'] = 0; $data['remark'] = ''; $data['period'] = $request->post('period'); return $contract->store($data); } public function updateContract(){ $request = new Request; $em_id = $request->post('em_id'); $em = ElectricMeter::get($em_id); $contract = ContractModel::get($em->contract_id); $contract->number = $request->post('contract_number') ?: $contract->number; $contract->sign_time = strtotime($request->post('contract_confirm_date')) ?: $contract->sign_time; $contract->period = $request->post('period') ?: $contract->period; return $contract->save(); } public function storeProtocol(Request $request,Contract $contract){ $user = Session::get('user'); $staff = StaffModel::field('id,d_id')->find($user['user_id'])->toArray(); //有ID则更新 没有ID则新增 $data['id'] = $request->post('pro_id') ?: ''; $data['name'] = $request->post('contract_name'); $data['number'] = $request->post('contract_number'); $data['u_id'] = $user['user_id']; $data['start_date'] = strtotime($request->post('contract_start_date')); $data['end_date'] = strtotime($request->post('contract_end_date')); $data['sign_date'] = strtotime($request->post('contract_sign_date')); $data['d_id'] = $staff['d_id']; $data['type'] = 2; //获取合同附件ID $data['file_id'] = $request->post('contract_file'); $data['remark'] = $request->post('contract_remark'); //计算合同区间 $time = $data['end_date'] - $data['start_date']; $data['period'] = ceil($time/(3600*24*30)); $resCon = $contract->store($data); if(!$resCon['data']) return jsonErr($resCon['message']); else return jsonSuc($resCon['message'],$resCon['data']); } public function updateProtocol(Request $request,Contract $contract){ $user = Session::get('user'); $staff = StaffModel::field('id,d_id')->find($user['user_id'])->toArray(); $data['id'] = $request->post('pro_id'); $data['name'] = $request->post('contract_name'); $data['number'] = $request->post('contract_number'); $data['u_id'] = $user['user_id']; $data['start_date'] = strtotime($request->post('contract_start_date')); $data['end_date'] = strtotime($request->post('contract_end_date')); $data['sign_date'] = strtotime($request->post('contract_sign_date')); $data['d_id'] = $staff['d_id']; $data['type'] = $request->post('contract_type') ?: 2 ; $data['file_id'] = $request->post('contract_file'); $data['remark'] = $request->post('contract_remark'); $time = $data['end_date'] - $data['start_date']; $data['period'] = ceil($time/(3600*24*30)); $resCon = $contract->store($data); return $resCon ? $resCon->id : 0; } }