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$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$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; } }