| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346 |
- <?php
- namespace app\admin\controller;
- use think\Db;
- class EnergyStatistics extends Auth
- {
- /**
- * 医院每日用电电统计
- */
- public function dailyElectricity()
- {
- $month = input('start',date('Y-m'));
- $data = $this->dailyElectricityData($month);
- $this->assign('data',$data['res']);
- $this->assign('count',$data['count']);
- $this->assign('totalData',$data['total']);
- $this->assign('start',$month);
- $this->assign('date',date('Y年m月',strtotime($month)));
- return $this->fetch();
- }
- public function dailyElectricityData($month){
- $dep = getDay(strtotime($month));
- $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $sn = Db::name('energy_electricity')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->column('number');
- $res = [];
- $allRecords = Db::name('energy_electricity_record')
- ->where($map)
- ->field('sn,rate,degree,read_yyyymmdd')
- ->select();
- $recordsCache = [];
- foreach ($allRecords as $record) {
- $recordsCache[$record['sn']][$record['read_yyyymmdd']] = $record;
- }
- $total = 0;
- foreach ($dep as $k => $v) {
- $degree = 0;
- foreach ($sn as $kk => $vv) {
- // 获取当前日期和上个月最后一天的记录
- $currentRow = $recordsCache[$vv][$v] ?? null;
- if ($k == 0) {
- $lastRow = $recordsCache[$vv][$lastDayOfLastMonth] ?? null;
- if ($currentRow) {
- $res[$k][$kk] = $currentRow;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']) * $currentRow['rate']);
- $degree += $res[$k][$kk]['real_degree'];
- }
- } else {
- $lastRow = $recordsCache[$vv][$dep[$k-1]] ?? null;
- if ($currentRow) {
- $res[$k][$kk] = $currentRow;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']) * $currentRow['rate']);
- $degree += $res[$k][$kk]['real_degree'];
- }
- }
- }
- $res[$k]['total'] = sprintf('%.2f', $degree);
- $total += $degree;
- }
- $total = sprintf('%.2f', $total);
- return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
- }
- /**
- * 医院每月用电电统计
- */
- public function monthElectricity()
- {
- $month = input('start',date('Y'));
- $data = $this->monthElectricityData($month);
- $this->assign('data',$data['res']);
- $this->assign('count',$data['count']);
- $this->assign('totalData',$data['total']);
- $this->assign('start',$month);
- $this->assign('date',date('Y年',strtotime($month)));
- return $this->fetch();
- }
- public function monthElectricityData($month){
- $m = get_month($month);
- foreach ($m as $k => $v) {
- $monthList[] = $v['date'];
- $lateMonthList[] = date('Ym',strtotime("-1 month", strtotime($v['date'].'01')));
- }
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $sn = Db::name('energy_electricity')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->column('number');
- $res = [];
- $total = 0;
- foreach ($monthList as $k => $v) {
- $degree = 0;
- foreach ($sn as $kk => $vv) {
- $record = Db::name('energy_electricity_record')
- ->where($map)
- ->where('sn',$vv)
- ->where('read_yyyymm',$v)
- ->field('sn,rate,degree,read_yyyymm')
- ->order('read_yyyymmdd desc')
- ->limit(1)
- ->find();
- $lastRecord = Db::name('energy_electricity_record')
- ->where($map)
- ->where('sn',$vv)
- ->where('read_yyyymm',$lateMonthList[$k])
- ->field('sn,rate,degree,read_yyyymm')
- ->order('read_yyyymmdd desc')
- ->limit(1)
- ->find();
- $a = 0;
- $b =0;
- if (isset($lastRecord)){
- $b = $lastRecord['degree'];
- }
- if (isset($record)){
- $a = $record['degree'];
- }
- $res[$k][$kk] = $record;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($a-$b) * $record['rate']);
- $degree += $res[$k][$kk]['real_degree'];
- }
- $res[$k]['total'] = sprintf('%.2f', $degree);
- $total += $degree;
- }
- $total = sprintf('%.2f',$total);
- return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
- }
- /**
- * 科室月电度统计
- */
- public function monthDepElectricity()
- {
- $month = input('start', date('Y'));
- $depId = input('depId','');
- for ($i = 1; $i < 13; $i++) {
- $monthList[] = $i.'月份';
- }
- $deps = Db::name('energy_dep')->field('name,id')
- ->where('del', '=', 0)
- ->where('org_id', '=', $this->orgId)
- ->where('enable',1)
- ->select();
- $data = $this->monthDepElectricityData($month,$depId);
- $txt = '暂无数据';
- if ($data){
- foreach ($data['sum'] as $k => $v) {
- $txt = '';
- $txt .= $k+1 .'月份:'.$v.' ;';
- }
- }
- $this->assign('data', $data['data']??[]);
- $this->assign('dep', $deps);
- $this->assign('depId',$depId);
- $this->assign('txt',$txt);
- $this->assign('monthList', $monthList);
- $this->assign('start', $month);
- return $this->fetch();
- }
- public function monthDepElectricityData($month,$depId='')
- {
- $year = $month;
- $month = $month.'0101';
- for ($i = 1; $i < 13; $i++) {
- if ($i<10){
- $date[] = date('Y'.'0'.$i,strtotime($month));
- if ($i==1){
- $time = strtotime($date[0].'01');
- $lastDate[] = date('Ym',strtotime('-1 month',$time));
- }else{
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }
- }else{
- $date[] = date('Y'.$i,strtotime($month));
- if ($i==10){
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }else{
- $lastDate[] = date('Y'.($i-1),strtotime($month));
- }
- }
- }
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- // $list = [];
- // $dep = Db::name('energy_dep')
- // ->where($map)
- // ->where('enable',1)
- // ->field('id,name,area,address')
- // ->select();
- // foreach ($dep as $item){
- // $re = Db::name('energy_electricity')
- // ->Where($map)
- // ->where('enable',1)
- // ->Where('dep','like','%'.$item['id'].'%')
- // ->select();
- // if(!empty($re)){
- // $list[] = $re;
- // }
- //
- // }
- $record= Db::name('energy_electricity')
- ->where($map)
- ->where('enable', 1)
- ->select();
- $list = array_filter($record, function($item) {
- return $item['dep'] != '';
- });
- //处理数据,相同dep的放在一个数组
- $groupedData = [];
- foreach ($list as $item) {
- $depArray = explode(',', trim($item['dep']));
- foreach ($depArray as $depValue) {
- $depValue = (int)trim($depValue);
- if (!isset($groupedData[$depValue])) {
- $groupedData[$depValue] = [];
- }
- $groupedData[$depValue][] = $item;
- }
- }
- $result = array_values($groupedData);
- $list = $result;
- if (empty($list)){
- return $list;
- }
- $newList = $this->getNewList($list);
- if ($depId){
- $newList = array_filter($newList, function($item) use ($depId) {
- return $item[0]['dep'] == $depId;
- });
- }
- $newList = array_values($newList);
- $addresses = Db::name('energy_area')->column('title', 'id');
- $deps = Db::name('energy_dep')->column('name', 'id');
- $sorts = Db::name('energy_sort')->column('name', 'id');
- $snList = [];
- $dateList = [];
- foreach ($newList as $v) {
- foreach ($v as $v2) {
- $snList[] = $v2['number'];
- $dateList[] = $date; // 假设$date是一个包含所有日期的数组
- $lastDateList[] = $lastDate; // 假设$lastDate是一个包含所有上一期日期的数组
- }
- }
- $records = Db::name('energy_electricity_record')
- ->field('sn,degree,rate,read_yyyymm')
- ->where('sn', 'in', array_unique($snList))
- ->where('read_yyyy',$year)
- ->whereOr('read_yyyymm',$lastDate[0])
- ->select();
- foreach ($newList as $k => $v) {
- foreach ($v as $k2 => $v2) {
- $address = json_decode($v2['address']);
- $dep_id = explode(',',$v2['dep']);
- $newList[$k][$k2]['info']['floor1'] = $addresses[$address[1]] ?? null;
- $newList[$k][$k2]['info']['floor2'] = $addresses[$address[2]] ?? null;
- $newList[$k][$k2]['info']['dep'] = $deps[$dep_id[0]] ?? null;
- $newList[$k][$k2]['info']['type'] = $sorts[$v2['type_e']] ?? null;
- $newList[$k][$k2]['rate'] = null;
- $newList[$k][$k2]['data'] = [];
- foreach ($dateList[$k] as $k3 => $v3) {
- $re = null;
- $re2 = null;
- foreach ($records as $record) {
- if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $v3) {
- $re = $record;
- break;
- }
- }
- foreach ($records as $record) {
- if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $lastDateList[$k][$k3]) {
- $re2 = $record;
- break;
- }
- }
- if ($re && isset($re['sn'])) {
- $newList[$k][$k2]['rate'] = $re['rate'];
- }
- $degrees[$v2['number']][$k3] = ($re['degree'] - $re2['degree']) * $re['rate'];
- if ($re && $re['degree']) {
- if ($v2['share'] == 1 || (string)$v2['share'] == '0') {
- $re['real_degree'] = ($re['degree'] - $re2['degree']) * $re['rate'] * $v2['percent'];
- } else {
- $re['real_degree'] = ($re['degree'] - $re2['degree']) * $re['rate'];
- }
- }
- $newList[$k][$k2]['data'][] = $re;
- }
- }
- }
- //计算拆分电表
- $newList = $this->split($newList,$degrees,'energy_electricity');
- foreach ($date as $k=>$v){
- for($i =0;$i<count($newList);$i++){
- $count = 0;
- foreach ($newList[$i] as $k2=>$v2){
- $count += $v2['data'][$k]['real_degree']?$v2['data'][$k]['real_degree']:0;
- $total[$i][$k]=$count;
- }
- }
- }
- foreach ($total as $k=>$v){
- foreach ($v as $k2=>$v2){
- $newList[$k][0]['data'][$k2]['total']=$v2;
- }
- }
- // 初始化一个数组来存储每个月的总量
- $monthlySum = array_fill(0, 12, 0);
- foreach ($total as $item) {
- foreach ($item as $index => $value) {
- $monthlySum[$index] += $value;
- }
- }
- return ['data'=>$newList,'sum'=>$monthlySum];
- }
- //医院每日用水统计
- public function dailyWater()
- {
- $month = input('start',date('Y-m'));
- $data = $this->dailyWaterData($month);
- $this->assign('data',$data['res']);
- $this->assign('count',$data['count']);
- $this->assign('totalData',$data['total']);
- $this->assign('start',$month);
- $this->assign('date',date('Y年m月',strtotime($month)));
- return $this->fetch();
- }
- public function dailyWaterData($month){
- $dep = getDay(strtotime($month));
- $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $sn = Db::name('energy_water')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->where('type_w',0)
- ->column('number');
- $hotInSn = Db::name('energy_water')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->where('type_w',1)
- ->column('number');
- $hotReturnSn = Db::name('energy_water')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->where('type_w',2)
- ->column('number');
- $res = [];
- $allRecords = Db::name('energy_water_record')
- ->where($map)
- ->field('sn,degree,read_yyyymmdd')
- ->select();
- $recordsCache = [];
- foreach ($allRecords as $record) {
- $recordsCache[$record['sn']][$record['read_yyyymmdd']] = $record;
- }
- $total = 0;
- $count = 0;
- foreach ($dep as $k => $v) {
- $degree = 0;
- $degree2 = 0;
- $degree3 = 0;
- foreach ($sn as $kk => $vv) {
- // 获取当前日期和上个月最后一天的记录
- $currentRow = $recordsCache[$vv][$v] ?? null;
- if ($k == 0) {
- $lastRow = $recordsCache[$vv][$lastDayOfLastMonth] ?? null;
- if ($currentRow) {
- $count +=1;
- $res[$k][$kk] = $currentRow;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
- $degree += $res[$k][$kk]['real_degree'];
- }
- } else {
- $lastRow = $recordsCache[$vv][$dep[$k-1]] ?? null;
- if ($currentRow) {
- $count +=1;
- $res[$k][$kk] = $currentRow;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
- $degree += $res[$k][$kk]['real_degree'];
- }
- }
- }
- foreach ($hotInSn as $k2=>$v2){
- $currentRow = $recordsCache[$v2][$v] ?? null;
- if ($currentRow){
- $degree2 += sprintf("%.2f", $currentRow['degree']);
- }
- }
- foreach ($hotReturnSn as $k3=>$v3){
- $currentRow = $recordsCache[$v3][$v] ?? null;
- if ($currentRow){
- $degree3 += sprintf("%.2f", $currentRow['degree']);
- }
- }
- $hotDegree = sprintf('%.2f', $degree2-$degree3);
- $res[$k]['total'] = sprintf('%.2f', $degree+$hotDegree);
- $res[$k]['hot_degree'] = $hotDegree;
- $total += $degree+$hotDegree;
- }
- $total = sprintf('%.2f', $total);
- return ['res'=>$res,'total'=>$total,'count'=>$count+1];
- }
- /**
- * 医院每月用水统计
- */
- public function monthWater()
- {
- $month = input('start',date('Y'));
- $data = $this->monthWaterData($month);
- $this->assign('data',$data['res']);
- $this->assign('count',$data['count']);
- $this->assign('totalData',$data['total']);
- $this->assign('start',$month);
- $this->assign('date',date('Y年',strtotime($month)));
- return $this->fetch();
- }
- public function monthWaterData($month)
- {
- $m = get_month($month);
- foreach ($m as $k => $v) {
- $monthList[] = $v['date'];
- $lateMonthList[] = date('Ym', strtotime("-1 month", strtotime($v['date'] . '01')));
- }
- $map[] = ['del', '=', 0];
- $map[] = ['org_id', '=', $this->orgId];
- $sn = Db::name('energy_water')
- ->where($map)
- ->where('enable', 1)
- ->where('parent_id', 0)
- ->where('type_w', 0)
- ->column('number');
- $hotInSn = Db::name('energy_water')
- ->where($map)
- ->where('enable', 1)
- ->where('parent_id', 0)
- ->where('type_w', 1)
- ->column('number');
- $hotReturnSn = Db::name('energy_water')
- ->where($map)
- ->where('enable', 1)
- ->where('parent_id', 0)
- ->where('type_w', 2)
- ->column('number');
- $res = [];
- $total = 0;
- $count = 0;
- foreach ($monthList as $k => $v) {
- $degree = 0;
- foreach ($sn as $kk => $vv) {
- $record = Db::name('energy_water_record')
- ->where($map)
- ->where('sn', $vv)
- ->where('read_yyyymm', $v)
- ->field('sn,degree,read_yyyymm')
- ->order('read_yyyymmdd', ' desc')
- ->limit(1)
- ->find();
- $lastRecord = Db::name('energy_water_record')
- ->where($map)
- ->where('sn', $vv)
- ->where('read_yyyymm', $lateMonthList[$k])
- ->field('sn,degree,read_yyyymm')
- ->order('read_yyyymmdd', ' desc')
- ->limit(1)
- ->find();
- $a = 0;
- $b = 0;
- if (isset($lastRecord)) {
- $b = $lastRecord['degree'];
- }
- if (isset($record)) {
- $a = $record['degree'];
- $count += 1;
- }
- $res[$k][$kk] = $record;
- $res[$k][$kk]['real_degree'] =($a-$b)>0? sprintf("%.2f", $a - $b):sprintf("%.2f", 0);
- $degree += $res[$k][$kk]['real_degree'];
- }
- $degree2 = Db::name('energy_water_record')//热水进水
- ->where($map)
- ->where('sn', 'in', $hotInSn)
- ->where('read_yyyymm', $v)
- ->field('sn,degree,read_yyyymm')
- ->sum('degree');
- $degree3 = Db::name('energy_water_record')//热水进水
- ->where($map)
- ->where('sn', 'in', $hotReturnSn)
- ->where('read_yyyymm', $v)
- ->field('sn,degree,read_yyyymm')
- ->sum('degree');
- $hotDegree = sprintf('%.2f', $degree2 - $degree3);
- $res[$k]['total'] = sprintf('%.2f', $degree + $hotDegree);
- $res[$k]['hot_degree'] = $hotDegree;
- $total += $degree + $hotDegree;
- }
- $total = sprintf('%.2f', $total);
- return ['res' => $res, 'total' => $total, 'count' => $count + 1];
- }
- /**
- * 科室月冷热水量统计
- */
- public function monthDepWater()
- {
- $month = input('start', date('Y'));
- for ($i = 1; $i < 13; $i++) {
- $monthList[] = $i.'月份';
- }
- $data = $this->monthDepWaterData($month);
- $this->assign('data', $data);
- $this->assign('monthList', $monthList);
- $this->assign('start', $month);
- // halt($data);
- return $this->fetch();
- }
- public function monthDepWaterData($month)
- {
- $month = $month.'0101';
- for ($i = 1; $i < 13; $i++) {
- if ($i<10){
- $date[] = date('Y'.'0'.$i,strtotime($month));
- if ($i==1){
- $time = strtotime($date[0].'01');
- $lastDate[] = date('Ym',strtotime('-1 month',$time));
- }else{
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }
- }else{
- $date[] = date('Y'.$i,strtotime($month));
- if ($i==10){
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }else{
- $lastDate[] = date('Y'.($i-1),strtotime($month));
- }
- }
- }
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $list = [];
- $dep = Db::name('energy_dep')
- ->where($map)
- ->where('enable',1)
- ->field('id,name,area,address')
- ->select();
- foreach ($dep as $item){
- $re = Db::name('energy_water')
- ->Where($map)
- ->where('enable',1)
- ->where('','exp',Db::raw('FIND_IN_SET('.$item['id'].',dep)'))
- ->select();
- if(!empty($re)){
- $list[] = $re;
- }
- }
- if (empty($list)){
- return $list;
- }
- $newList = $this->getNewList($list);
- $addressIds = [];
- $depIds = [];
- foreach ($newList as $k => $v) {
- foreach ($v as $k2 => $v2) {
- $address = json_decode($v2['address'], true);
- $dep_id = explode(',',$v2['dep']);
- $addressIds[] = $address[1];
- $addressIds[] = $address[2];
- $depIds[] = $dep_id[0];
- }
- }
- $uniqueAddressIds = array_unique($addressIds);
- $floors = Db::name('energy_area')->where('id', 'in', $uniqueAddressIds)->column('title', 'id');
- $departments = Db::name('energy_dep')->where('id', 'in', array_unique($depIds))->column('name', 'id');
- $snList = [];
- foreach ($newList as $k => $v) {
- foreach ($v as $k2 => $v2) {
- $snList[] = $v2['number'];
- }
- }
- $uniqueSnList = array_unique($snList);
- $records = Db::name('energy_water_record')
- ->field('sn,degree,read_yyyymm')
- ->where($map)
- ->where('sn', 'in', $uniqueSnList)
- ->select();
- $recordsGroupBySn = [];
- foreach ($records as $record) {
- $recordsGroupBySn[$record['sn']][$record['read_yyyymm']] = $record;
- }
- foreach ($newList as $k => $v) {
- foreach ($v as $k2 => $v2) {
- $address = json_decode($v2['address'], true);
- $dep_id = explode(',',$v2['dep']);
- $newList[$k][$k2]['info']['floor1'] = $floors[$address[1]] ?? null;
- $newList[$k][$k2]['info']['floor2'] = $floors[$address[2]] ?? null;
- $newList[$k][$k2]['info']['dep'] = $departments[$dep_id[0]] ?? null;
- if ($v2['type_w'] == 0) {
- $newList[$k]['sn'][] = $v2['number'];
- $coldData = [];
- foreach ($date as $k3 => $v3) {
- $re = $recordsGroupBySn[$v2['number']][$v3] ?? 0;
- $re2 = $recordsGroupBySn[$v2['number']][$lastDate[$k3]] ?? 0;
- $coldDegrees[$v2['number']][$k3] = $re['degree']?$re['degree'] - $re2['degree']:0;
- if ($re && $re['degree']) {
- $cold_degree = ($re['degree'] - ($re2['degree'] ?? 0)) * ($v2['share'] == 1 || (string)$v2['share'] == '0' ? $v2['percent'] : 1);
- $re['cold_degree'] = $cold_degree;
- }
- $coldData[] = $re;
- }
- $newList[$k]['cold'][] = $coldData;
- } elseif ($v2['type_w'] == 1) {
- $hotInData = [];
- foreach ($date as $k4 => $v4) {
- $hotIn = 0;
- foreach ($recordsGroupBySn[$v2['number']] ?? [] as $record) {
- if ($record['read_yyyymm'] == $v4) {
- $hotIn += $record['degree'];
- }
- }
- $hotInDegrees[$v2['number']][$k4] = $hotIn;
- $hotIn = $v2['share'] == 1 ? $hotIn * $v2['percent'] : $hotIn;
- $hotInData[] = $hotIn;
- }
- $newList[$k]['hotIn'][] = $hotInData;
- } elseif ($v2['type_w'] == 2) {
- $hotReturnData = [];
- foreach ($date as $k5 => $v5) {
- $hotReturn = 0;
- foreach ($recordsGroupBySn[$v2['number']] ?? [] as $record) {
- if ($record['read_yyyymm'] == $v5) {
- $hotReturn += $record['degree'];
- }
- }
- $hotReturnDegrees[$v2['number']][$k5] = $hotReturn;
- $hotReturn = $v2['share'] == 1 ? $hotReturn * $v2['percent'] : $hotReturn;
- $hotReturnData[] = $hotReturn;
- }
- $newList[$k]['hotReturn'][] = $hotReturnData;
- }
- }
- }
- /**
- * 计算拆分电表
- */
- foreach ($newList as $k => $v) {
- foreach ($v as $k2 => $v2) {
- if (isset($v2['id'])){
- if ($v2['split']) {
- $split = explode(',', $v2['split']);
- $info = Db::name('energy_water')->field('number,split')->where('id', 'in', $split)->select();
- foreach ($v['cold'] as $k4 => $v4) {
- foreach ($v4 as $k5 => $v5) {
- foreach ($info as $value) {
- if ((string)$v2['type_w'] == '0') {
- if (isset($v4['cold_degree'])) {
- $newList[$k]['cold'][$k5]['cold_degree'] -= $coldDegrees[$value['number']][$k5];
- }
- }else if ((string)$v2['type_w'] == '1'){
- $newList[$k]['hotIn'][$k5] -= $hotInDegrees[$value['number']][$k5];
- }else{
- $newList[$k]['hotReturn'][$k5] -= $hotReturnDegrees[$value['number']][$k5];
- }
- }
- }
- }
- }
- }
- }
- }
- foreach ($newList as $k=> $v){
- if (!isset($v['hotIn'])){
- foreach ($date as $k1 => $v1) {
- $newList[$k]['hotIn'][] = 0;
- }
- }
- if (!isset($v['hotReturn'])){
- foreach ($date as $k1 => $v1) {
- $newList[$k]['hotReturn'][] = 0;
- }
- }
- }
- foreach ($newList as $k=> $v){
- foreach ($date as $k1 => $v1) {
- $totalCold = 0;
- $totalHotIn = 0;
- $totalHotReturn = 0;
- if (isset($v['cold'])){
- foreach ($v['cold'] as $k2 => $v2){
- $totalCold += $v2[$k1]['cold_degree'] ?? 0;
- }
- }
- if (isset($v['hotIn'])) {
- foreach ($v['hotIn'] as $k3 => $v3) {
- $totalHotIn += $v3[$k1];
- }
- }
- if (isset($v['hotReturn'])){
- foreach ($v['hotReturn'] as $k4 => $v4){
- $totalHotReturn += $v4[$k1];
- }
- }
- $newList[$k]['totalCold'][] =$totalCold;
- $newList[$k]['totalHotIn'][] =$totalHotIn;
- $newList[$k]['totalHotReturn'][] =$totalHotReturn;
- unset($newList[$k]['hotIn']);
- unset($newList[$k]['hotReturn']);
- }
- }
- // halt($newList);
- return $newList;
- }
- /**
- * 医院每日燃气用量统计
- */
- public function dailyGas()
- {
- $month = input('start',date('Y-m'));
- $data = $this->dailyGasData($month);
- $this->assign('data',$data['res']);
- $this->assign('count',$data['count']);
- $this->assign('totalData',$data['total']);
- $this->assign('start',$month);
- $this->assign('date',date('Y年m月',strtotime($month)));
- return $this->fetch();
- }
- public function dailyGasData($month){
- $dep = getDay(strtotime($month));
- $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $sn = Db::name('energy_gas')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->column('number');
- $res = [];
- $allRecords = Db::name('energy_gas_record')
- ->where($map)
- ->field('sn,degree,read_yyyymmdd')
- ->select();
- $recordsCache = [];
- foreach ($allRecords as $record) {
- $recordsCache[$record['sn']][$record['read_yyyymmdd']] = $record;
- }
- $total = 0;
- foreach ($dep as $k => $v) {
- $degree = 0;
- foreach ($sn as $kk => $vv) {
- $currentRow = $recordsCache[$vv][$v] ?? null;
- if ($k == 0) {
- $lastRow = $recordsCache[$vv][$lastDayOfLastMonth] ?? null;
- if ($currentRow) {
- $res[$k][$kk] = $currentRow;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
- $degree += $res[$k][$kk]['real_degree'];
- }
- } else {
- $lastRow = $recordsCache[$vv][$dep[$k-1]] ?? null;
- if ($currentRow) {
- $res[$k][$kk] = $currentRow;
- $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
- $degree += $res[$k][$kk]['real_degree'];
- }
- }
- }
- $res[$k]['total'] = sprintf('%.2f', $degree);
- $total += $degree;
- }
- $total = sprintf('%.2f', $total);
- return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
- }
- /**
- * 医院每月用燃气统计
- */
- public function monthGas()
- {
- $month = input('start',date('Y'));
- $data = $this->monthGasData($month);
- $this->assign('data',$data['res']);
- $this->assign('count',$data['count']);
- $this->assign('totalData',$data['total']);
- $this->assign('start',$month);
- $this->assign('date',date('Y年',strtotime($month)));
- return $this->fetch();
- }
- public function monthGasData($month){
- $m = get_month($month);
- foreach ($m as $k => $v) {
- $monthList[] = $v['date'];
- $lateMonthList[] = date('Ym',strtotime("-1 month", strtotime($v['date'].'01')));
- }
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $sn = Db::name('energy_gas')
- ->where($map)
- ->where('enable',1)
- ->where('parent_id',0)
- ->column('number');
- $res = [];
- $total = 0;
- foreach ($monthList as $k => $v) {
- $degree = 0;
- foreach ($sn as $kk => $vv) {
- $record = Db::name('energy_gas_record')
- ->where($map)
- ->where('sn',$vv)
- ->where('read_yyyymm',$v)
- ->field('sn,degree,read_yyyymm')
- ->order('read_yyyymmdd desc')
- ->limit(1)
- ->find();
- $lastRecord = Db::name('energy_gas_record')
- ->where($map)
- ->where('sn',$vv)
- ->where('read_yyyymm',$lateMonthList[$k])
- ->field('sn,degree,read_yyyymm')
- ->order('read_yyyymmdd desc')
- ->limit(1)
- ->find();
- $a = 0;
- $b =0;
- if (isset($record)){
- $a = $record['degree'];
- }
- if (isset($lastRecord)){
- $b = $lastRecord['degree'];
- }
- $res[$k][$kk] = $record;
- $res[$k][$kk]['real_degree'] =($a-$b)>0? sprintf("%.2f", $a - $b):sprintf("%.2f", 0);
- $degree += $res[$k][$kk]['real_degree'];
- }
- $res[$k]['total'] = sprintf('%.2f', $degree);
- $total += $degree;
- }
- $total = sprintf('%.2f', $total);
- return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
- }
- /**
- * 科室月燃气用量统计
- */
- public function monthDepGas()
- {
- $month = input('start', date('Y'));
- for ($i = 1; $i < 13; $i++) {
- $monthList[] = $i.'月份';
- }
- $data = $this->monthDepGasData($month);
- $this->assign('data', $data['newList']);
- $this->assign('count', $data['count']);
- $this->assign('total', $data['total']);
- $this->assign('monthList', $monthList);
- $this->assign('start', $month);
- // halt($data);
- return $this->fetch();
- }
- public function monthDepGasData($month)
- {
- $month = $month.'0101';
- for ($i = 1; $i < 13; $i++) {
- if ($i<10){
- $date[] = date('Y'.'0'.$i,strtotime($month));
- if ($i==1){
- $time = strtotime($date[0].'01');
- $lastDate[] = date('Ym',strtotime('-1 month',$time));
- }else{
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }
- }else{
- $date[] = date('Y'.$i,strtotime($month));
- if ($i==10){
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }else{
- $lastDate[] = date('Y'.($i-1),strtotime($month));
- }
- }
- }
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $list = [];
- $dep = Db::name('energy_dep')
- ->where($map)
- ->where('enable',1)
- ->field('id,name,area,address')
- ->select();
- foreach ($dep as $item){
- $re = Db::name('energy_gas')
- ->Where($map)
- ->where('enable',1)
- ->where('','exp',Db::raw('FIND_IN_SET('.$item['id'].',dep)'))
- ->select();
- if(!empty($re)){
- $list[] = $re;
- }
- }
- if (empty($list)){
- return ['newList'=>[],'count'=>0,'total'=>0];
- }
- $newList = $this->getNewList($list);
- $addressIds = [];
- $depIds = [];
- $numbers = [];
- foreach ($newList as $k => $v){
- foreach ($v as $k2 => $v2){
- $address = json_decode($v2['address']);
- $dep_id = explode(',',$v2['dep']);
- $numbers[] = $v2['number'];
- if (!in_array($address[1], $addressIds)) {
- $addressIds[] = $address[1];
- }
- if (!in_array($address[2], $addressIds)) {
- $addressIds[] = $address[2];
- }
- if (!in_array($dep_id[0], $depIds)) {
- $depIds[] = $dep_id[0];
- }
- }
- }
- $energyAreaData = Db::name('energy_area')->where('id', 'in', $addressIds)->column('title', 'id');
- $energyDepData = Db::name('energy_dep')->where('id', 'in', $depIds)->column('name', 'id');
- $gasRecords = Db::name('energy_gas_record')->field('sn,degree,read_yyyymm')->where($map)->select();
- foreach ($newList as $k => $v){
- foreach ($v as $k2 => $v2){
- $address = json_decode($v2['address']);
- $dep_id = explode(',',$v2['dep']);
- $newList[$k][$k2]['info']['floor1'] = $energyAreaData[$address[1]] ?? null;
- $newList[$k][$k2]['info']['floor2'] = $energyAreaData[$address[2]] ?? null;
- $newList[$k][$k2]['info']['dep'] = $energyDepData[$dep_id[0]] ?? null;
- foreach ($date as $k3 => $v3){
- $re = null;
- $re2 = null;
- foreach ($gasRecords as $record) {
- if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $v3) {
- $re = $record;
- }
- if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $lastDate[$k3]) {
- $re2 = $record;
- }
- }
- $degrees[$v2['number']][$k3] = $re['degree'] - $re2['degree'];
- if ($re && $re['degree']){
- if ($v2['share'] == 1 || (string)$v2['share'] == '0'){
- $re['real_degree'] = ($re['degree'] - $re2['degree']) * $v2['percent'];
- }else{
- $re['real_degree'] = $re['degree'] - $re2['degree'];
- }
- }
- $newList[$k][$k2]['data'][] = $re;
- }
- }
- }
- //计算拆分电表
- $newList = $this->split($newList,$degrees,'energy_gas');
- $total = [];
- foreach ($date as $k=>$v){
- $degree = 0;
- foreach ($newList as $k2 => $v2){
- $count=0;
- foreach ($v2 as $k3=>$v3){
- if (!empty($v2[0]['data'][$k])){
- $count = $v2[0]['data'][$k]['real_degree'];
- }
- $degree+=$count;
- }
- $total[$k] = $degree;
- }
- }
- return ['newList'=>$newList,'count'=>count($newList),'total'=>$total];
- }
- /**
- * 医院月设备电度统计
- */
- public function monthDeviceElectricity()
- {
- $month = input('start', date('Y'));
- for ($i = 1; $i < 13; $i++) {
- $monthList[] = $i.'月份';
- }
- $data = $this->monthDeviceElectricityData($month);
- $this->assign('data', $data);
- $this->assign('monthList', $monthList);
- $this->assign('start', $month);
- return $this->fetch();
- }
- public function monthDeviceElectricityData($month)
- {
- $month = $month.'0101';
- for ($i = 1; $i < 13; $i++) {
- if ($i<10){
- $date[] = date('Y'.'0'.$i,strtotime($month));
- if ($i==1){
- $time = strtotime($date[0].'01');
- $lastDate[] = date('Ym',strtotime('-1 month',$time));
- }else{
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }
- }else{
- $date[] = date('Y'.$i,strtotime($month));
- if ($i==10){
- $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
- }else{
- $lastDate[] = date('Y'.($i-1),strtotime($month));
- }
- }
- }
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $list = Db::name('energy_device_electricity')
- ->field('name,number,type_e')
- ->where($map)
- ->where('enable',1)
- ->select();
- $sort = Db::name('energy_sort')
- ->where($map)
- ->where('enable',1)
- ->column('name','id');
- $device = array();
- $nameCount = array();
- foreach ($list as $item) {
- if (!isset($nameCount[$item['name']])) {
- $nameCount[$item['name']] = 1;
- } else {
- $nameCount[$item['name']]++;
- }
- }
- foreach ($nameCount as $name => $count) {
- if ($count > 1) {
- $device[] = array_filter($list, function ($device) use ($name) {
- return $device['name'] === $name;
- });
- } else {
- foreach ($list as $d) {
- if ($d['name'] === $name) {
- $device[] = array($d);
- break;
- }
- }
- }
- }
- foreach ($device as $k => $v){
- $device[$k] = array_values($v);
- }
- foreach ($device as $k=>$v){
- foreach ($v as $k2=>$v2){
- $device[$k][$k2]['type_e'] = $sort[$v2['type_e']];
- foreach ($date as $k3=>$v3){
- $re = Db::name('energy_device_electricity_record')
- ->field('sn,degree,rate,read_yyyymm')
- ->where($map)
- ->where('read_yyyymm',$v3)
- ->where('sn',$v2['number'])
- ->find();
- $re2 = Db::name('energy_device_electricity_record')
- ->field('sn,degree')
- ->where($map)
- ->where('read_yyyymm',$lastDate[$k3])
- ->where('sn',$v2['number'])
- ->find();
- if (isset($re['sn'])){
- $device[$k][$k2]['rate'] = $re['rate'];
- }
- if ($re['degree']){
- $re['real_degree'] =($re['degree'] - $re2['degree']) * $re['rate'];
- }
- $device[$k][$k2]['data'][] = $re;
- }
- }
- }
- foreach ($date as $k=>$v){
- for($i =0;$i<count($device);$i++){
- $count = 0;
- foreach ($device[$i] as $k2=>$v2){
- $count += isset($v2['data'][$k]['real_degree'])?$v2['data'][$k]['real_degree']:0;
- $total[$i][$k]=$count;
- }
- }
- }
- if (isset($total)){
- foreach ($total as $k=>$v){
- foreach ($v as $k2=>$v2){
- $device[$k][0]['data'][$k2]['total']=$v2;
- }
- }
- }
- return $device;
- }
- /**
- * 医院每日水电燃气数据分析图表
- */
- public function dailyView(){
- $month = input('month',date('Y-m'));
- $data = $this->dailyViewData($month);
- $this->assign('date',$data['date']);
- $this->assign('data',$data['data']);
- $this->assign('month',$month);
- $this->assign('year',date('Y',strtotime($month)));
- return $this->fetch();
- }
- public function dailyViewData($month)
- {
- $map = [
- ['del', '=', 0],
- ['org_id', '=', $this->orgId],
- // ['min_temperature', '<>', 'null'],
- // ['max_temperature', '<>', 'null'],
- // ['beds', '<>', 'null'],
- ['read_yyyymm', '=', date('Ym',strtotime($month))],
- ];
- $date = getMonth($month);
- $lastYear = date('Y-m', strtotime("-1 year", strtotime($month)));
- $lastDate = getMonth($lastYear);
- // 获取电、水、气的数据
- $eInfo = $this->dailyElectricityData($month);
- $eInfoLast = $this->dailyElectricityData($lastYear);
- $wInfo = $this->dailyWaterData($month);
- $wInfoLast = $this->dailyWaterData($lastYear);
- $gInfo = $this->dailyGasData($month);
- $gInfoLast = $this->dailyGasData($lastYear);
- // 初始化数据数组
- $data = [
- 'electricity' => [],
- 'lastElectricity' => [],
- 'water' => [],
- 'lastWater' => [],
- 'gas' => [],
- 'lastGas' => [],
- 'electricityTempMin' => [],
- 'electricityBeds' => [],
- 'electricityTempMax' => [],
- 'waterTempMin' => [],
- 'waterBeds' => [],
- 'waterTempMax' => [],
- 'gasTempMin' => [],
- 'gasBeds' => [],
- 'gasTempMax' => []
- ];
- // 合并电、水、气的数据
- foreach ($eInfo['res'] as $k => $v) {
- $data['electricity'][$k] = $v['total'];
- $data['lastElectricity'][$k] = $eInfoLast['res'][$k]['total'];
- }
- foreach ($wInfo['res'] as $k => $v) {
- $data['water'][$k] = $v['total'];
- $data['lastWater'][$k] = $wInfoLast['res'][$k]['total'];
- }
- foreach ($gInfo['res'] as $k => $v) {
- $data['gas'][$k] = $v['total'];
- $data['lastGas'][$k] = $gInfoLast['res'][$k]['total'];
- }
- // 一次性获取电的记录
- $records = Db::name('energy_electricity_record')
- ->where($map)
- ->whereOr('read_yyyymm',date('Ym',strtotime($lastYear)))
- ->order('read_yyyymmdd', 'asc')
- ->column('min_temperature, max_temperature, beds', 'read_time');
- // 处理今年电的数据
- foreach ($date['ymd'] as $k => $v) {
- $data['electricityTempMin'][$k] = isset($records[$v]) ? $records[$v]['min_temperature'] : 0;
- $data['electricityTempMax'][$k] = isset($records[$v]) ? $records[$v]['max_temperature'] : 0;
- $data['electricityBeds'][$k] = isset($records[$v]) ? $records[$v]['beds'] : 0;
- $data['LastElectricityTempMin'][$k] = isset($records[$lastDate['ymd'][$k]]) ? $records[$lastDate['ymd'][$k]]['min_temperature'] : 0;
- $data['LastElectricityTempMax'][$k] = isset($records[$lastDate['ymd'][$k]]) ? $records[$lastDate['ymd'][$k]]['max_temperature'] : 0;
- }
- // 一次性获取水的记录
- $wRecords = Db::name('energy_water_record')
- ->where($map)
- ->order('create_time', 'desc')
- ->column('min_temperature, max_temperature, beds', 'read_time');
- // 处理水的数据
- foreach ($date['ymd'] as $k => $v) {
- $data['waterTempMin'][$k] = isset($wRecords[$v]) ? $wRecords[$v]['min_temperature'] : 0;
- $data['waterTempMax'][$k] = isset($wRecords[$v]) ? $wRecords[$v]['max_temperature'] : 0;
- $data['waterBeds'][$k] = isset($wRecords[$v]) ? $wRecords[$v]['beds'] : 0;
- }
- // 一次性获取气的记录
- $gRecords = Db::name('energy_gas_record')
- ->where($map)
- ->order('create_time', 'desc')
- ->column('min_temperature, max_temperature, beds', 'read_time');
- // 处理气的数据
- foreach ($date['ymd'] as $k => $v) {
- $data['gasTempMin'][$k] = isset($gRecords[$v]) ? $gRecords[$v]['min_temperature'] : 0;
- $data['gasTempMax'][$k] = isset($gRecords[$v]) ? $gRecords[$v]['max_temperature'] : 0;
- $data['gasBeds'][$k] = isset($gRecords[$v]) ? $gRecords[$v]['beds'] : 0;
- }
- return ['data' => $data, 'date' => $date];
- }
- /**
- * 医院每月水电燃气数据分析图表
- */
- public function dailyView2(){
- $month = input('month',date('Y'));
- $data = $this->dailyViewData2($month);
- $this->assign('date',$data['date']);
- $this->assign('data',$data['data']);
- $this->assign('month',$month);
- $this->assign('year',$month);
- return $this->fetch();
- }
- public function dailyViewData2($month)
- {
- $map = [
- ['del', '=', 0],
- ['org_id', '=', $this->orgId],
- ['read_yyyy', '=', $month]
- ];
- $map2 = [
- ['del', '=', 0],
- ['org_id', '=', $this->orgId],
- ['enable', '=', 1],
- ['parent_id', '=', 0],
- ];
- $lastYear = $month-1;
- $lastYear2 = $month-2;
- $lastYear3 = $month-3;
- // 获取电、水、气的数据
- $eInfo = $this->monthElectricityData($month);
- $eInfoLast = $this->monthElectricityData($lastYear);
- $eInfoLast2 = $this->monthElectricityData($lastYear2);
- $eInfoLast3 = $this->monthElectricityData($lastYear3);
- $wInfo = $this->monthWaterData($month);
- $wInfoLast = $this->monthWaterData($lastYear);
- $wInfoLast2 = $this->monthWaterData($lastYear2);
- $wInfoLast3 = $this->monthWaterData($lastYear3);
- $gInfo = $this->monthGasData($month);
- $gInfoLast = $this->monthGasData($lastYear);
- $gInfoLast2 = $this->monthGasData($lastYear2);
- $gInfoLast3 = $this->monthGasData($lastYear3);
- for ($i =1;$i<=12;$i++){
- if($i<10){
- $date[] = $month.'0'.$i;
- }else{
- $date[] = $month.$i;
- }
- $date2[] = $i.'月';
- }
- // 初始化数据数组
- $data = [
- 'electricity' => [],
- 'lastElectricity' => [],
- 'water' => [],
- 'lastWater' => [],
- 'gas' => [],
- 'lastGas' => [],
- 'electricityTempMin' => [],
- 'electricityBeds' => [],
- 'electricityTempMax' => [],
- 'waterTempMin' => [],
- 'waterBeds' => [],
- 'waterTempMax' => [],
- 'gasTempMin' => [],
- 'gasBeds' => [],
- 'gasTempMax' => []
- ];
- // 合并电、水、气的数据
- foreach ($eInfo['res'] as $k => $v) {
- $data['electricity'][$k] = $v['total'];
- $data['lastElectricity'][$k] = $eInfoLast['res'][$k]['total'];
- $data['lastElectricity2'][$k] = $eInfoLast2['res'][$k]['total'];
- $data['lastElectricity3'][$k] = $eInfoLast3['res'][$k]['total'];
- }
- foreach ($wInfo['res'] as $k => $v) {
- $data['water'][$k] = $v['total'];
- $data['lastWater'][$k] = $wInfoLast['res'][$k]['total'];
- $data['lastWater2'][$k] = $wInfoLast2['res'][$k]['total'];
- $data['lastWater3'][$k] = $wInfoLast3['res'][$k]['total'];
- }
- foreach ($gInfo['res'] as $k => $v) {
- $data['gas'][$k] = $v['total'];
- $data['lastGas'][$k] = $gInfoLast['res'][$k]['total'];
- $data['lastGas2'][$k] = $gInfoLast2['res'][$k]['total'];
- $data['lastGas3'][$k] = $gInfoLast3['res'][$k]['total'];
- }
- $eSn = Db::name('energy_electricity')
- ->where($map2)
- ->column('number');
- // 一次性获取所有记录
- $records = Db::name('energy_electricity_record')
- ->where($map)
- ->where('sn','in',$eSn)
- ->order('create_time', 'desc')
- ->column('min_temperature, max_temperature, beds', 'read_yyyymm');
- // 处理电的数据
- foreach ($date as $k => $v) {
- $data['electricityTempMin'][$k] = isset($records[$v]) && $records[$v]['min_temperature']!=null ? $records[$v]['min_temperature'] : 0;
- $data['electricityTempMax'][$k] = isset($records[$v]) && $records[$v]['max_temperature']!=null ? $records[$v]['max_temperature'] : 0;
- $data['electricityBeds'][$k] = isset($records[$v]) && $records[$v]['beds']!=null ? $records[$v]['beds'] : 0;
- }
- $wSn = Db::name('energy_water')
- ->where($map2)
- ->column('number');
- // 一次性获取水的记录
- $wRecords = Db::name('energy_water_record')
- ->where($map)
- ->where('sn','in',$wSn)
- ->order('create_time', 'desc')
- ->column('min_temperature, max_temperature, beds', 'read_yyyymm');
- // 处理水的数据
- foreach ($date as $k => $v) {
- $data['waterTempMin'][$k] = isset($wRecords[$v]) && $wRecords[$v]['min_temperature']!=null ? $wRecords[$v]['min_temperature'] : 0;
- $data['waterTempMax'][$k] = isset($wRecords[$v]) && $wRecords[$v]['max_temperature']!=null ? $wRecords[$v]['max_temperature'] : 0;
- $data['waterBeds'][$k] = isset($wRecords[$v]) && $wRecords[$v]['beds']!=null ? $wRecords[$v]['beds'] : 0;
- }
- $gSn = Db::name('energy_gas')
- ->where($map2)
- ->column('number');
- // 一次性获取气的记录
- $gRecords = Db::name('energy_gas_record')
- ->where($map)
- ->where('sn','in',$gSn)
- ->order('create_time', 'desc')
- ->column('min_temperature, max_temperature, beds', 'read_yyyymm');
- // 处理气的数据
- foreach ($date as $k => $v) {
- $data['gasTempMin'][$k] = isset($gRecords[$v]) && $gRecords[$v]['min_temperature']!=null ? $gRecords[$v]['min_temperature'] : 0;
- $data['gasTempMax'][$k] = isset($gRecords[$v]) && $gRecords[$v]['max_temperature']!=null ? $gRecords[$v]['max_temperature'] : 0;
- $data['gasBeds'][$k] = isset($gRecords[$v]) && $gRecords[$v]['beds']!=null ? $gRecords[$v]['beds'] : 0;
- }
- return ['data' => $data, 'date' => $date2];
- }
- /**
- * 医院每日水电燃气数据分析图表
- */
- public function monthView(){
- set_time_limit(0);
- ini_set("memory_limit","2048M");
- $map = [
- ['org_id','=',$this->orgId],
- ['enable','=',1],
- ['del','=',0]
- ];
- $month = input('month',date('Y'));
- $id = Db::name('energy_dep')->where($map)->order('create_time')->limit(1)->value('id');
- $depId = input('depId',$id);
- for ($i = 1; $i < 13; $i++) {
- $monthList[] = $i.'月份';
- }
- $data = $this->monthViewData($month,$depId);
- foreach ($data['dep'] as $k => $v) {
- if ($v['id'] == $depId) {
- $depName = $v['name'];
- }
- }
- $this->assign('data',$data['data']);
- $this->assign('dep',$data['dep']);
- $this->assign('depId',$depId);
- $this->assign('depName',$depName??'');
- $this->assign('month',$month);
- $this->assign('monthList',$monthList);
- return $this->fetch();
- }
- public function monthViewData($year,$depId)
- {
- $zero = [0,0,0,0,0,0,0,0,0,0,0,0];
- $data = [
- 'electricity'=>$zero,
- 'water'=>$zero,
- 'lastElectricity'=>$zero,
- 'lastWater'=>$zero,
- 'gas'=>$zero,
- 'lastGas'=>$zero,
- ];
- $map = [
- ['del', '=', 0],
- ['org_id', '=', $this->orgId],
- ];
- $depInfo = Db::name('energy_dep')->field('name,id')
- ->where($map)
- ->where('enable',1)
- ->select();
- $lastYear = $year-1;
- $list = $this->publicDepTotalData($year,'0');
- $lastList = $this->publicDepTotalData($lastYear,'0');
- foreach ($list as $k => $v) {
- if ($depId == $v['id']) {
- $data['electricity'] = isset($v['electricity']) ? $v['electricity'] : $zero;
- $data['water'] = isset($v['water']) ? $v['water'] : $zero;
- $data['lastElectricity'] = isset($lastList[$k]['electricity']) ? $lastList[$k]['electricity'] : $zero;
- $data['lastWater'] = isset($lastList[$k]['water']) ? $lastList[$k]['water'] : $zero;
- break;
- }
- }
- $gas = $this->monthDepGasData($year);
- $lastGas = $this->monthDepGasData($lastYear);
- foreach ($depInfo as $k => $v) {
- foreach ($gas['newList'] as $k1 => $v1){
- $id = explode(',',$v1[0]['dep']);
- if ($v['id'] == $id[0]) {
- foreach ($v1[0]['data'] as $k2 => $v2){
- $depInfo[$k]['data'][] = isset($v2['real_degree']) ? $v2['real_degree'] : 0;
- $depInfo[$k]['lastData'][] = isset($lastGas['newList'][$k1][0]['data'][$k2]['real_degree']) ? $lastGas['newList'][$k1][0]['data'][$k2]['real_degree'] : 0;
- }
- break;
- }
- }
- }
- foreach ($depInfo as $k => $v){
- if (!isset($v['data'])) {
- $depInfo[$k]['data'] = $zero;
- $depInfo[$k]['lastData'] = $zero;
- }
- }
- foreach ($depInfo as $k => $v) {
- if ($depId == $v['id']) {
- $data['gas'] = $v['data'];
- $data['lastGas'] = $v['lastData'];
- break;
- }
- }
- $sn = Db::name('energy_electricity')
- ->where($map)
- ->where('enable',1)
- ->where('','exp',Db::raw("FIND_IN_SET('.$depId.',dep)"))
- ->column('number');
- $months = [];
- for ($i = 1; $i <= 12; $i++) {
- $months[] = date('Ym', strtotime($year . '-' . $i));
- $months[] = date('Ym', strtotime($lastYear . '-' . $i));
- }
- $temp = Db::name('energy_electricity_record')
- ->where($map)
- ->where('read_yyyymm', 'in', $months)
- ->where('sn', 'in', $sn)
- ->field('read_yyyymm,min_temperature as maxMinTemp,max_temperature as maxMaxTemp,beds')
- ->group('read_yyyymm')
- ->select();//温度
- $groupedTemp = [];
- foreach ($temp as $k => $v) {
- $groupedTemp[$v['read_yyyymm']] = $v;
- }
- for ($i = 1; $i <= 12; $i++) {
- $readYyyyMm = date('Ym', strtotime($year . '-' . $i));
- $readYyyyMm2 = date('Ym', strtotime($lastYear . '-' . $i));
- $record = $groupedTemp[$readYyyyMm] ?? null;
- $lastRecord = $groupedTemp[$readYyyyMm2] ?? null;
- $data['tempMin'][] = isset($record['maxMinTemp']) && $record['maxMinTemp'] >0 ? $record['maxMinTemp'] : 0;
- $data['tempMax'][] = isset($record['maxMaxTemp']) && $record['maxMaxTemp'] >0 ? $record['maxMaxTemp'] : 0;
- $data['LastTempMin'][] = isset($lastRecord['maxMinTemp']) && $lastRecord['maxMinTemp'] >0 ? $lastRecord['maxMinTemp'] : 0;
- $data['LastTempMax'][] = isset($lastRecord['maxMaxTemp']) && $lastRecord['maxMaxTemp'] >0 ? $lastRecord['maxMaxTemp'] : 0;
- $data['beds'][] = isset($record['beds']) && $record['beds'] >0 ? $record['beds'] : 0;
- }
- return ['data'=>$data,'dep'=>$depInfo];
- }
- /**
- *科室公用设备电量分摊
- */
- public function publicDepElectricity()
- {
- set_time_limit(0);
- ini_set("memory_limit","1024M");
- $month = input('start',date('Y-m'));
- $type = input('type','0');
- $data = $this->publicDepElectricityData($month,$type);
- $this->assign('data',$data['data']);
- $this->assign('type',$type);
- $this->assign('device',$data['device']);
- $this->assign('start',$month);
- return $this->fetch();
- }
- public function publicDepElectricityData($month,$type)
- {
- $map['del'] = 0;
- $map['enable'] = 1;
- $map['org_id'] = $this->orgId;
- $totalArea = Db::name('energy_area')
- ->where($map)
- ->where('pid',0)
- ->sum('area'); //医院总面积
- $floor = Db::name('energy_area')
- ->where($map)
- ->column('title','id'); //医院总面积
- $device = Db::name('energy_sort')
- ->where($map)
- ->column('name', 'id');
- $depInfo = Db::name('energy_dep')
- ->where($map)
- ->Field('id,name,area,address,percent')
- ->select();
- //将多地址科室进行拆分
- $dep = array();
- foreach ($depInfo as $item) {
- $addresses = json_decode($item['address'], true);
- $percents = explode(',', $item['percent']);
- $itemCount = count($addresses);
- for ($i = 0; $i < $itemCount; $i++) {
- $newItem = array(
- "id" => $item['id'],
- "name" => $item['name'],
- "area" => $item['area'],
- "address" => json_encode(array($addresses[$i])),
- "percent" => ($i < count($percents) ? trim($percents[$i]) : '')
- );
- $dep[] = $newItem;
- }
- }
- foreach ($dep as $k => $v){
- substr($dep[$k]['address'],1,strlen($dep[$k]['address'])-2);
- if ($dep[$k]['percent']){
- $depPercent = substr($dep[$k]['percent'],0,2);
- $dep[$k]['area'] = $dep[$k]['area']*($depPercent/100);
- }
- $percent = sprintf('%.3f',$dep[$k]['area']/$totalArea);//面积占比
- $dep[$k]['publicPercent'] = $percent;
- if ($type == '1'){
- $e = $this->ElectricitySplit($month);
- foreach($e as $k2 => $v2){
- $address = substr($v['address'],1,strlen($v['address'])-2);
- $id = explode(',',$v2['dep']);
- if ($address == $v2['address'] && (string) $v['id'] == $id[0] ) {
- $dep[$k]['publicPercent'] = $v2['percent'];
- }
- //待改进
- $depId = array_column($e,'dep');
- if (!in_array('['.$v['id'].']',$depId)){
- $dep[$k]['publicPercent'] = 0;
- }
- }
- }
- }
- //计算用电
- $publicDevice = $this->monthDeviceElectricityData2($month);
- foreach ($dep as $k => $v){
- $address = json_decode($v['address'], true);
- $dep[$k]['floor1'] = $floor[$address[0][1]];
- $dep[$k]['floor2'] = $floor[$address[0][2]];
- $total = 0;
- foreach ($device as $k2 => $v2){
- foreach ($publicDevice as $k3 => $v3){
- if ($k2 == $v3['type_e']){
- $dep[$k]['data'][$k2] = $v3['total'] * $v['publicPercent'];
- $total += $dep[$k]['data'][$k2];
- }
- }
- }
- $dep[$k]['total'] = $total;
- }
- return ['data'=>$dep,'device'=>$device];
- }
- public function monthDeviceElectricityData2($month)
- {
- $month = date('Ym',strtotime($month));
- $lastMonth = date('Ym', strtotime('-1 month', strtotime($month)));
- $map[] = ['del','=',0];
- $map[] = ['org_id','=',$this->orgId];
- $list = Db::name('energy_device_electricity')
- ->field('name,number,type_e')
- ->where($map)
- ->where('enable',1)
- ->select();
- $device = array();
- foreach ($list as $item) {
- // 检查是否已经为该type_e创建了组
- if (!isset($device[$item['type_e']])) {
- $device[$item['type_e']] = array($item);
- } else {
- $device[$item['type_e']][] = $item;
- }
- }
- foreach ($device as $k => $v){
- $device[$k] = array_values($v);
- }
- // foreach ($device as $k=>$v){
- // foreach ($v as $k2=>$v2){
- // $re = Db::name('energy_device_electricity_record')
- // ->field('sn,degree,rate,read_yyyymm')
- // ->where($map)
- // ->where('read_yyyymm',$month)
- // ->where('sn',$v2['number'])
- // ->find();
- //
- // $re2 = Db::name('energy_device_electricity_record')
- // ->field('sn,degree')
- // ->where($map)
- // ->where('read_yyyymm',$lastMonth)
- // ->where('sn',$v2['number'])
- // ->find();
- // if (isset($re['sn'])){
- // $device[$k][$k2]['rate'] = $re['rate'];
- // }
- // if ($re['degree']){
- // $re['real_degree'] =($re['degree'] - $re2['degree']) * $re['rate'];
- // }
- //
- // $device[$k][$k2]['data'] = $re;
- // }
- // }
- $allNumbers = [];
- foreach ($device as $group) {
- foreach ($group as $item) {
- if (!empty($item['number'])) {
- $allNumbers[] = $item['number'];
- }
- }
- }
- // 去重并确保有设备需要查询
- $allNumbers = array_unique(array_filter($allNumbers));
- if (!empty($allNumbers)) {
- // 批量查询当月记录
- $currentRecordsData = Db::name('energy_device_electricity_record')
- ->field('sn,degree,rate,read_yyyymm')
- ->where($map)
- ->where('read_yyyymm', $month)
- ->whereIn('sn', $allNumbers)
- ->select();
- // 转换为以sn为键的数组
- $currentRecords = [];
- foreach ($currentRecordsData as $record) {
- $currentRecords[$record['sn']] = $record;
- }
- // 批量查询上月记录
- $lastRecordsData = Db::name('energy_device_electricity_record')
- ->field('sn,degree')
- ->where($map)
- ->where('read_yyyymm', $lastMonth)
- ->whereIn('sn', $allNumbers)
- ->select();
- // 转换为以sn为键的数组
- $lastRecords = [];
- foreach ($lastRecordsData as $record) {
- $lastRecords[$record['sn']] = $record;
- }
- // 处理数据
- foreach ($device as &$group) {
- foreach ($group as &$item) {
- $sn = $item['number'] ?? null;
- if (!$sn) continue;
- $currentRecord = $currentRecords[$sn] ?? null;
- if (!$currentRecord) {
- $item['data'] = [
- 'sn' => $sn,
- 'degree' => 0,
- 'rate' => 1,
- 'read_yyyymm' => $month,
- 'real_degree' => 0
- ];
- continue;
- }
- // 确保数据类型正确
- $currentDegree = (float)$currentRecord['degree'];
- $currentRate = (float)($currentRecord['rate'] ?? 1);
- $lastDegree = isset($lastRecords[$sn]['degree']) ? (float)$lastRecords[$sn]['degree'] : 0;
- // 计算实际度数(当前度数 - 上月度数)× 倍率
- $realDegree = ($currentDegree - $lastDegree) * $currentRate;
- // 更新记录
- $item['rate'] = $currentRate;
- $item['data'] = array_merge($currentRecord, [
- 'real_degree' => max(0, $realDegree) // 确保不为负数
- ]);
- }
- }
- unset($group, $item);
- }
- // 收集所有设备编号
- foreach ($device as $k=>$v){
- $count = 0;
- foreach ($v as $k2=>$v2){
- $count += $v2['data']['real_degree']?$v2['data']['real_degree']:0;
- $device[$k][0]['total'] = $count;
- }
- }
- foreach ($device as $k=>$v){
- $device[$k] = ['type_e'=>$v[0]['type_e'],'total'=>$v[0]['total']];
- }
- return $device;
- }
- /**
- * 科室公用水量分摊
- */
- public function publicDepWater()
- {
- $month = input('start',date('Y-m'));
- $type = input('type','0');
- $data = $this->publicDepWaterData($month,$type);
- $this->assign('data',$data);
- $this->assign('type',$type);
- $this->assign('start',$month);
- return $this->fetch();
- }
- public function publicDepWaterData($month,$type)
- {
- $data = $this->monthDepWaterData($month);
- $date = date('n',strtotime($month))-1;
- $waterData = $this->dailyWaterData($month);
- $depTotalDegree = $waterData['total'];//医院月总用水量
- $totalDegree = 0;//科室月冷热水总量
- $e = [];//能耗占比
- $totalArea = Db::name('energy_area')
- ->where('org_id',$this->orgId)
- ->where('pid',0)
- ->where('del',0)
- ->where('enable',1)
- ->sum('area'); //医院总面积
- $depArea = Db::name('energy_dep')
- ->where('org_id',$this->orgId)
- ->column('area', 'id'); //科室面积
- $dep = Db::name('energy_dep')
- ->where('org_id',$this->orgId)
- ->where('del',0)
- ->where('enable',1)
- ->select(); //医院总面积
- $addressInfo = Db::name('energy_area')
- ->where('org_id',$this->orgId)
- ->where('del',0)
- ->where('enable',1)
- ->column('title','id'); //医院总面积
- foreach ($dep as $k=>$v){
- $totalWater = [];
- foreach ($data as $k2=>$v2){
- $id = explode(',',$v2[0]['dep']);
- if ($v['id'] == $id[0]){
- $totalWater = $v2['totalCold'][$date]+$v2['totalHotIn'][$date]-$v2['totalHotReturn'][$date];
- $dep[$k]['water'] = $totalWater;
- $dep[$k]['floor1'] = $v2[0]['info']['floor1'];
- $dep[$k]['floor2'] = $v2[0]['info']['floor2'];
- }
- }
- }
- foreach ($dep as $k=>$v){
- if (!isset($v['water'])){
- $address = json_decode($v['address'],true);
- $dep[$k]['water'] = 0;
- $dep[$k]['floor1'] = $addressInfo[$address[0][1]];
- $dep[$k]['floor2'] = $addressInfo[$address[0][2]];
- }
- $totalDegree += isset($v['water']) ? $v['water'] : 0;
- }
- foreach ($dep as $k=>$v){
- $area = $totalArea;//医院面积
- $depId = $v['id'];
- $area2 = $depArea[$depId];//科室面积
- $percent = sprintf('%.3f',$area2/$area);//面积占比
- $dep[$k]['publicPercent'] = $percent;
- $dep[$k]['splitDegree'] =($depTotalDegree-$totalDegree)*$percent;//分摊水量
- if ($type == '1'){
- $e = $this->ElectricitySplit($month);
- $result = [];
- foreach ($e as $item) {
- $depKey = trim($item['dep']); // 去掉空格以确保匹配
- if (!isset($result[$depKey])) {
- $result[$depKey] = [
- "dep" => $depKey,
- "percent" => (float)$item['percent'], // 转换为浮点数
- ];
- } else {
- $result[$depKey]['percent'] += (float)$item['percent'];
- }
- }
- $finalResult = array_values($result);
- foreach($dep as $k => $v){
- foreach($finalResult as $k2 => $v2){
- $id = explode(',',$v2['dep']);
- if ($v['id'] == $id[0] ) {
- $dep[$k]['publicPercent'] = $v2['percent'];
- $dep[$k]['splitDegree'] =($depTotalDegree-$totalDegree)*$v2['percent'];//分摊水量
- }
- $depIds = array_column($e,'dep');
- if (!in_array('['.$v['id'].']',$depIds)){
- $dep[$k]['publicPercent'] = 0;
- $dep[$k]['splitDegree'] = 0;
- }
- }
- }
- }
- }
- return $dep ;
- }
- /**
- * 科室水电总使用量
- */
- public function publicDepTotal()
- {
- $month = input('start',date('Y'));
- for ($i = 1; $i < 13; $i++) {
- $monthList[] = $i.'月份';
- }
- $type = input('type','0');
- $data = $this->publicDepTotalData($month,$type);
- $this->assign('monthList', $monthList);
- $this->assign('data', $data);
- $this->assign('type',$type);
- $this->assign('start',$month);
- return $this->fetch();
- }
- public function publicDepTotalData($month,$type)
- {
- $dep = Db::name('energy_dep')
- ->field('id,name,address')
- ->where('org_id',$this->orgId)
- ->where('del',0)
- ->where('enable',1)
- ->select();
- if (empty($dep)){
- return [];
- }
- $totalWaterData = $this->monthDepWaterData($month);
- $totalElectricityData = $this->monthDepElectricityData($month);
- $totalElectricityData = $totalElectricityData['data'];
- foreach ($dep as $k=>$v){
- $totalWater = [];
- foreach ($totalWaterData as $k2=>$v2){ //计算合计水量
- $id = explode(',',$v2[0]['dep']);
- if ($v['id'] == $id[0]){
- foreach ($v2['totalCold'] as $k3=>$v3){
- $totalWater[] = $v2['totalCold'][$k3]+$v2['totalHotIn'][$k3]-$v2['totalHotReturn'][$k3];
- }
- $dep[$k]['water'] = $totalWater;
- }
- }
- }
- //计算分摊水量
- $splitWaterData = $this->splitWaterData($month,$type);
- foreach ($dep as $k=>$v){
- foreach ($splitWaterData as $k2=>$v2){
- if (isset($v2[0]['dep'])){
- $id = explode(',',$v2[0]['dep']);
- if ($v['id'] == $id[0]){
- $dep[$k]['splitWater'] = $v2['splitDegree'];
- }
- }
- }
- }
- foreach ($dep as $k=>$v){ //计算合并电量
- $totalElectricity = [];
- foreach ($totalElectricityData as $k2=>$v2){ //计算合计水量
- $id = explode(',',$v2[0]['dep']);
- if ($v['id'] == $id[0]){
- $dep[$k]['electricity'][] = $v2[0]['data'];
- }
- }
- }
- foreach ($dep as $k=>$v){//处理上面合计电量数据
- if (isset($v['electricity'])){
- if (count($v['electricity']) == 1){
- foreach ($v['electricity'][0] as $k2=>$v2){
- $dep[$k]['electricity'][$k2] = $v2['total'];
- }
- }else{
- $sumArray = [];
- $groups = $v['electricity'];
- foreach ($groups as $group) {
- foreach (array_keys($group) as $key) {
- if (!is_numeric($key)) {
- continue;
- }
- if (isset($sumArray[$key])) {
- if ($sumArray[$key]['total'] === null) {
- $sumArray[$key]['total'] = 0;
- }
- $sumArray[$key]['total'] += $group[$key]['total'];
- } else {
- $sumArray[$key] = ['total' => $group[$key]['total']];
- }
- }
- $total = array_map(function($item) {
- return $item['total'];
- }, $sumArray);
- $dep[$k]['electricity']= $total;
- }
- }
- }
- }
- //计算分摊电量
- $splitElectricityData = $this->publicDepElectricityData2($month,$type);
- foreach ($dep as $k => $v){
- foreach ($splitElectricityData as $k2=>$v2){
- if ($v['id'] == $v2['id']) {
- $dep[$k]['splitElectricity'] = $v2['data'];
- }
- }
- }
- //计算总计水量
- foreach ($dep as $k=>$v){
- $totalWater = 0;
- $totalElectricity = 0;
- for ($i = 0; $i < 12; $i++) {
- $water = isset($v['water'])?$v['water'][$i]:0;
- $splitWater = isset($v['splitWater'])?$v['splitWater'][$i]:0;
- $totalWater += $water+$splitWater;
- $electricity = isset($v['electricity'])?$v['electricity'][$i]:0;
- $splitElectricity= isset($v['splitElectricity'])?$v['splitElectricity'][$i]:0;
- $totalElectricity += $electricity+$splitElectricity;
- }
- $dep[$k]['totalWater'] = $totalWater;
- $dep[$k]['totalElectricity'] = $totalElectricity;
- }
- return $dep;
- }
- /**
- * 科室水电总量——分摊水量
- */
- public function splitWaterData($month,$type)
- {
- $data = $this->monthDepWaterData($month);
- for ($i = 1; $i < 13; $i++) {
- if ($i<10){
- $date[] =$month.'-0'.$i;
- }else{
- $date[] =$month.'-'.$i;
- }
- }
- foreach ($date as $k=>$v){
- $waterData = $this->dailyWaterData($v);
- $depTotalDegree[] = $waterData['total'];//医院月总用水量
- }
- $e = [];//能耗占比
- $totalArea = Db::name('energy_area')
- ->where('org_id',$this->orgId)
- ->where('pid',0)
- ->where('del',0)
- ->where('enable',1)
- ->sum('area'); //医院总面积
- $depArea = Db::name('energy_dep')
- ->where('org_id',$this->orgId)
- ->column('area', 'id'); //科室面积
- for ($i=0;$i<12;$i++){
- $totalDegree = 0;
- foreach ($data as $k=>$v){
- if (isset($v['totalCold']) && isset($v['totalHotIn']) && isset($v['totalHotReturn'])){
- $totalDegree += $v['totalCold'][$i]+($v['totalHotIn'][$i]-$v['totalHotReturn'][$i]);
- }
- }
- $data[0]['totalDegree'][] = $totalDegree;
- }
- //去掉多余数据
- foreach ($data as $k=>$v){
- foreach ($v as $k2=>$v2){
- if ($k2 != 0 || $k2 != 'totalDegree'){
- unset($data[$k][$k2]);
- }
- }
- if (isset($v[0]['dep'])){
- $area = $totalArea;//医院面积
- $d = explode(',',$v[0]['dep']);
- $dep = $d[0];
- $area2 = $depArea[$dep];//科室面积
- $percent = sprintf('%.2f',$area2/$area);//面积占比
- foreach ($data[0]['totalDegree'] as $k3=>$v3){
- $data[$k]['splitDegree'][$k3] =($depTotalDegree[$k3]-$data[0]['totalDegree'][$k3])*$percent;//分摊水量
- }
- if ($type == '1'){
- $e = $this->ElectricitySplit2($month);
- foreach($data as $k => $v){
- foreach($e as $k2 => $v2){
- if ( $v[0]['dep'] == $v2[0]['dep'] ) {
- foreach ($data[0]['totalDegree'] as $k3=>$v3){
- $data[$k]['splitDegree'][$k3] =($depTotalDegree[$k3]-$data[0]['totalDegree'][$k3])*$v2[$k3]['percent'];//分摊水量
- }
- }
- }
- }
- }
- }
- }
- return $data ;
- }
- //对取到的数据进行整理,根据地址和科室进行分类整合
- public function getNewList($list,$flag=0)
- {
- //根据number进行分组
- $grouped_array = [];
- foreach ($list as $group) {
- foreach ($group as $item) {
- $number = $item['number'];
- // 如果这个number还没有分组,则创建一个新的分组
- if (!isset($grouped_array[$number])) {
- $grouped_array[$number] = [];
- }
- // 添加元素到对应的分组
- $grouped_array[$number][] = $item;
- }
- }
- $grouped_array = array_values($grouped_array);
- //分配比例
- foreach ($grouped_array as $k => $v){
- if (count($v)>1){
- $index = 0;
- foreach ($v as $k2=>$v2){
- if ($v2['share'] == 1){ //按比例分摊
- $dep = explode(',',$v2['dep']);
- $percent = explode(':',$v2['percent']);
- $m = array_sum($percent);//分母
- $p = sprintf("%.2f", $percent[$index]/$m);
- $grouped_array[$k][$k2]['percent'] = $p ;
- $grouped_array[$k][$k2]['dep'] = $dep[$index] ;
- }
- if ((string)$v2['share'] == '0' ){ //按面积分摊
- $dep = explode(',',$v2['dep']);
- $areas = Db::name('energy_dep')->where('id', 'in', $dep)->column('area', 'id');
- $m = array_sum(array_values($areas));//分母
- $area = $areas[$dep[$index]];
- $p = sprintf("%.2f", $area/$m);
- $grouped_array[$k][$k2]['percent'] = $p ;
- $grouped_array[$k][$k2]['dep'] = $dep[$index] ;
- }
- $index++;
- }
- }
- }
- $otherArrays = array_slice($grouped_array, 1);
- $list = array_merge($grouped_array[0], ...$otherArrays);
- $list2 = [];
- foreach ($list as $item) {
- // 创建组合键
- if ($flag ==1){//设备电表
- $combinedKey = $item['address'] . '|' . $item['name'];
- }else{
- $combinedKey = $item['address'] . '|' . $item['dep'];
- }
- if (!isset($list2[$combinedKey])) {
- $list2[$combinedKey] = [];
- }
- $list2[$combinedKey][] = $item;
- }
- $list2 = array_values($list2);
- $newList = [];
- foreach ($list2 as $subArray) {
- $processedSubArray = []; // 用于存储当前子数组处理后的结果
- $seen = []; // 用于记录已经见过的组合
- foreach ($subArray as $item) {
- $dep = explode(',',$item['dep']);
- $uniqueKey = $item['number'] . '|' . implode(',', $dep);
- if (!isset($seen[$uniqueKey])) {
- $processedSubArray[] = $item;
- $seen[$uniqueKey] = true;
- }
- }
- $newList[] = $processedSubArray;
- }
- return $newList;
- }
- //拆分电表,存在问题
- public function split($newList,$degrees,$table)
- {
- foreach ($newList as $k => $v) {
- foreach ($v as $k2 => $v2) {
- if ($v2['split']) {
- $split = explode(',', $v2['split']);
- $info = Db::name($table)->field('number,split')->where('id', 'in', $split)->select();
- foreach ($v2['data'] as $k4 => $v4) {
- foreach ($info as $value) {
- if (isset($v4['real_degree'])) {
- $newList[$k][$k2]['data'][$k4]['real_degree'] -= $degrees[$value['number']][$k4];
- }
- }
- }
- }
- }
- }
- return $newList;
- }
- /**
- * 能耗占比计算
- */
- public function ElectricitySplit($month)
- {
- $data2 = $this->monthDepElectricityData($month);
- $data2 = $data2['data'];
- $date = date('n',strtotime($month))-1;
- $depTotalDegree2 = 0;//所有科室月总用电量
- foreach ($data2 as $k=>$v){
- $data2[$k][0]['totalDegree'] = $v[0]['data'][$date]['total'];//科室月度电量
- $depTotalDegree2 += $data2[$k][0]['totalDegree'];
- }
- foreach ($data2 as $k=>$v){
- foreach ($v as $k2=>$v2){
- if ($k2 != 0 || $k2 != 'totalDegree'){
- unset($data2[$k][$k2]);
- }
- if ($k2 == 0){
- unset($data2[$k][0]['rate']);
- unset($data2[$k][0]['data']);
- }
- }
- $percent = $depTotalDegree2>0?sprintf('%.3f',$data2[$k][0]['totalDegree']/$depTotalDegree2):0;//科室能耗占比
- $data2[$k][0]['publicPercent'] = $percent;
- $e[] = ['address'=>$data2[$k][0]['address'],'dep'=>$data2[$k][0]['dep'],'percent'=>$data2[$k][0]['publicPercent']];
- }
- return $e;
- }
- //按年计算
- public function ElectricitySplit2($month)
- {
- $data2 = $this->monthDepElectricityData($month);
- $data2 = $data2['data'];
- for ($i=0;$i<12;$i++){
- $total = 0;
- foreach ($data2 as $k=>$v){
- $depDegree2 = 0;
- $depDegree2 += $v[0]['data'][$i]['total'];//科室月度电量
- $total+=$depDegree2;
- $data2[$k][0]['depDegree'][$i] = $depDegree2;
- }
- $totalDegree[$i] = $total;//每个月所有科室总用电
- }
- //合并相同科室,地址不同数据
- $result = array();
- $depSums = array();
- $processedDeps = array();
- foreach ($data2 as $group) {
- $dep = $group[0]['dep'];
- $depDegree = $group[0]['depDegree'];
- // 如果是第一次处理这个dep,初始化累加器
- if (!isset($processedDeps[$dep])) {
- $processedDeps[$dep] = true;
- $depSums[$dep] = $depDegree;
- $result[] = array($group[0]); // 将第一组添加到结果中
- } else {
- // 累加depDegree的对应索引值
- foreach ($depDegree as $key => $value) {
- $depSums[$dep][$key] += $value;
- }
- }
- }
- foreach ($result as $key => $value) {
- $dep = $value[0]['dep'];
- $result[$key][0]['depDegree'] = $depSums[$dep];
- }
- foreach ($result as $k => $v) {
- for ($i=0;$i<12;$i++) {
- $percent = $totalDegree[$i] >0 ?sprintf('%.3f', $result[$k][0]['depDegree'][$i] / $totalDegree[$i]):0;//科室能耗占比
- $e[$k][$i] = ['dep' => $result[$k][0]['dep'], 'percent' => $percent,'total' =>$result[$k][0]['depDegree'][$i]];
- }
- }
- return $e;
- }
- public function publicDepElectricityData2($month,$type)
- {
- $map['del'] = 0;
- $map['enable'] = 1;
- $map['org_id'] = $this->orgId;
- $totalArea = Db::name('energy_area')
- ->where($map)
- ->where('pid',0)
- ->sum('area'); //医院总面积
- $dep = Db::name('energy_dep')
- ->where($map)
- ->Field('id,name,area,address,percent')
- ->select();
- foreach ($dep as $k => $v){
- substr($dep[$k]['address'],1,strlen($dep[$k]['address'])-2);
- $percent = sprintf('%.3f',$dep[$k]['area']/$totalArea);//面积占比
- $dep[$k]['publicPercent'] = $percent;
- if ($type == '1'){
- $e = $this->ElectricitySplit2($month);
- foreach($e as $k2 => $v2){
- $id = explode(',',$v2[0]['dep']);
- if ((string) $v['id'] == $id[0] ) {
- $dep[$k]['publicPercent'] = $v2;
- }
- }
- }
- }
- $publicDevice = $this->monthDeviceElectricityData($month);
- for ($i=0;$i<12;$i++){
- $totalDegree = 0;//每个月总用电量
- foreach ($publicDevice as $k=>$v){
- $totalDegree += $v[0]['data'][$i]['total'];
- }
- $total[$i] = $totalDegree;
- }
- foreach ($dep as $k=>$v){
- foreach ($total as $k2=>$v2){
- if ($type == '1'){
- if (is_array($dep[$k]['publicPercent'])){
- $dep[$k]['data'][$k2] = $dep[$k]['publicPercent'][$k2]['percent']*$v2;
- }else{
- $dep[$k]['data'][$k2] = 0;
- }
- }else{
- $dep[$k]['data'][$k2] = $v['publicPercent']*$v2;
- }
- }
- }
- return $dep;
- }
- }
|