EnergyStatistics.php 88 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346
  1. <?php
  2. namespace app\admin\controller;
  3. use think\Db;
  4. class EnergyStatistics extends Auth
  5. {
  6. /**
  7. * 医院每日用电电统计
  8. */
  9. public function dailyElectricity()
  10. {
  11. $month = input('start',date('Y-m'));
  12. $data = $this->dailyElectricityData($month);
  13. $this->assign('data',$data['res']);
  14. $this->assign('count',$data['count']);
  15. $this->assign('totalData',$data['total']);
  16. $this->assign('start',$month);
  17. $this->assign('date',date('Y年m月',strtotime($month)));
  18. return $this->fetch();
  19. }
  20. public function dailyElectricityData($month){
  21. $dep = getDay(strtotime($month));
  22. $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
  23. $map[] = ['del','=',0];
  24. $map[] = ['org_id','=',$this->orgId];
  25. $sn = Db::name('energy_electricity')
  26. ->where($map)
  27. ->where('enable',1)
  28. ->where('parent_id',0)
  29. ->column('number');
  30. $res = [];
  31. $allRecords = Db::name('energy_electricity_record')
  32. ->where($map)
  33. ->field('sn,rate,degree,read_yyyymmdd')
  34. ->select();
  35. $recordsCache = [];
  36. foreach ($allRecords as $record) {
  37. $recordsCache[$record['sn']][$record['read_yyyymmdd']] = $record;
  38. }
  39. $total = 0;
  40. foreach ($dep as $k => $v) {
  41. $degree = 0;
  42. foreach ($sn as $kk => $vv) {
  43. // 获取当前日期和上个月最后一天的记录
  44. $currentRow = $recordsCache[$vv][$v] ?? null;
  45. if ($k == 0) {
  46. $lastRow = $recordsCache[$vv][$lastDayOfLastMonth] ?? null;
  47. if ($currentRow) {
  48. $res[$k][$kk] = $currentRow;
  49. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']) * $currentRow['rate']);
  50. $degree += $res[$k][$kk]['real_degree'];
  51. }
  52. } else {
  53. $lastRow = $recordsCache[$vv][$dep[$k-1]] ?? null;
  54. if ($currentRow) {
  55. $res[$k][$kk] = $currentRow;
  56. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']) * $currentRow['rate']);
  57. $degree += $res[$k][$kk]['real_degree'];
  58. }
  59. }
  60. }
  61. $res[$k]['total'] = sprintf('%.2f', $degree);
  62. $total += $degree;
  63. }
  64. $total = sprintf('%.2f', $total);
  65. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  66. }
  67. /**
  68. * 医院每月用电电统计
  69. */
  70. public function monthElectricity()
  71. {
  72. $month = input('start',date('Y'));
  73. $data = $this->monthElectricityData($month);
  74. $this->assign('data',$data['res']);
  75. $this->assign('count',$data['count']);
  76. $this->assign('totalData',$data['total']);
  77. $this->assign('start',$month);
  78. $this->assign('date',date('Y年',strtotime($month)));
  79. return $this->fetch();
  80. }
  81. public function monthElectricityData($month){
  82. $m = get_month($month);
  83. foreach ($m as $k => $v) {
  84. $monthList[] = $v['date'];
  85. $lateMonthList[] = date('Ym',strtotime("-1 month", strtotime($v['date'].'01')));
  86. }
  87. $map[] = ['del','=',0];
  88. $map[] = ['org_id','=',$this->orgId];
  89. $sn = Db::name('energy_electricity')
  90. ->where($map)
  91. ->where('enable',1)
  92. ->where('parent_id',0)
  93. ->column('number');
  94. $res = [];
  95. $total = 0;
  96. foreach ($monthList as $k => $v) {
  97. $degree = 0;
  98. foreach ($sn as $kk => $vv) {
  99. $record = Db::name('energy_electricity_record')
  100. ->where($map)
  101. ->where('sn',$vv)
  102. ->where('read_yyyymm',$v)
  103. ->field('sn,rate,degree,read_yyyymm')
  104. ->order('read_yyyymmdd desc')
  105. ->limit(1)
  106. ->find();
  107. $lastRecord = Db::name('energy_electricity_record')
  108. ->where($map)
  109. ->where('sn',$vv)
  110. ->where('read_yyyymm',$lateMonthList[$k])
  111. ->field('sn,rate,degree,read_yyyymm')
  112. ->order('read_yyyymmdd desc')
  113. ->limit(1)
  114. ->find();
  115. $a = 0;
  116. $b =0;
  117. if (isset($lastRecord)){
  118. $b = $lastRecord['degree'];
  119. }
  120. if (isset($record)){
  121. $a = $record['degree'];
  122. }
  123. $res[$k][$kk] = $record;
  124. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($a-$b) * $record['rate']);
  125. $degree += $res[$k][$kk]['real_degree'];
  126. }
  127. $res[$k]['total'] = sprintf('%.2f', $degree);
  128. $total += $degree;
  129. }
  130. $total = sprintf('%.2f',$total);
  131. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  132. }
  133. /**
  134. * 科室月电度统计
  135. */
  136. public function monthDepElectricity()
  137. {
  138. $month = input('start', date('Y'));
  139. $depId = input('depId','');
  140. for ($i = 1; $i < 13; $i++) {
  141. $monthList[] = $i.'月份';
  142. }
  143. $deps = Db::name('energy_dep')->field('name,id')
  144. ->where('del', '=', 0)
  145. ->where('org_id', '=', $this->orgId)
  146. ->where('enable',1)
  147. ->select();
  148. $data = $this->monthDepElectricityData($month,$depId);
  149. $txt = '暂无数据';
  150. if ($data){
  151. foreach ($data['sum'] as $k => $v) {
  152. $txt = '';
  153. $txt .= $k+1 .'月份:'.$v.' ;';
  154. }
  155. }
  156. $this->assign('data', $data['data']??[]);
  157. $this->assign('dep', $deps);
  158. $this->assign('depId',$depId);
  159. $this->assign('txt',$txt);
  160. $this->assign('monthList', $monthList);
  161. $this->assign('start', $month);
  162. return $this->fetch();
  163. }
  164. public function monthDepElectricityData($month,$depId='')
  165. {
  166. $year = $month;
  167. $month = $month.'0101';
  168. for ($i = 1; $i < 13; $i++) {
  169. if ($i<10){
  170. $date[] = date('Y'.'0'.$i,strtotime($month));
  171. if ($i==1){
  172. $time = strtotime($date[0].'01');
  173. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  174. }else{
  175. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  176. }
  177. }else{
  178. $date[] = date('Y'.$i,strtotime($month));
  179. if ($i==10){
  180. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  181. }else{
  182. $lastDate[] = date('Y'.($i-1),strtotime($month));
  183. }
  184. }
  185. }
  186. $map[] = ['del','=',0];
  187. $map[] = ['org_id','=',$this->orgId];
  188. // $list = [];
  189. // $dep = Db::name('energy_dep')
  190. // ->where($map)
  191. // ->where('enable',1)
  192. // ->field('id,name,area,address')
  193. // ->select();
  194. // foreach ($dep as $item){
  195. // $re = Db::name('energy_electricity')
  196. // ->Where($map)
  197. // ->where('enable',1)
  198. // ->Where('dep','like','%'.$item['id'].'%')
  199. // ->select();
  200. // if(!empty($re)){
  201. // $list[] = $re;
  202. // }
  203. //
  204. // }
  205. $record= Db::name('energy_electricity')
  206. ->where($map)
  207. ->where('enable', 1)
  208. ->select();
  209. $list = array_filter($record, function($item) {
  210. return $item['dep'] != '';
  211. });
  212. //处理数据,相同dep的放在一个数组
  213. $groupedData = [];
  214. foreach ($list as $item) {
  215. $depArray = explode(',', trim($item['dep']));
  216. foreach ($depArray as $depValue) {
  217. $depValue = (int)trim($depValue);
  218. if (!isset($groupedData[$depValue])) {
  219. $groupedData[$depValue] = [];
  220. }
  221. $groupedData[$depValue][] = $item;
  222. }
  223. }
  224. $result = array_values($groupedData);
  225. $list = $result;
  226. if (empty($list)){
  227. return $list;
  228. }
  229. $newList = $this->getNewList($list);
  230. if ($depId){
  231. $newList = array_filter($newList, function($item) use ($depId) {
  232. return $item[0]['dep'] == $depId;
  233. });
  234. }
  235. $newList = array_values($newList);
  236. $addresses = Db::name('energy_area')->column('title', 'id');
  237. $deps = Db::name('energy_dep')->column('name', 'id');
  238. $sorts = Db::name('energy_sort')->column('name', 'id');
  239. $snList = [];
  240. $dateList = [];
  241. foreach ($newList as $v) {
  242. foreach ($v as $v2) {
  243. $snList[] = $v2['number'];
  244. $dateList[] = $date; // 假设$date是一个包含所有日期的数组
  245. $lastDateList[] = $lastDate; // 假设$lastDate是一个包含所有上一期日期的数组
  246. }
  247. }
  248. $records = Db::name('energy_electricity_record')
  249. ->field('sn,degree,rate,read_yyyymm')
  250. ->where('sn', 'in', array_unique($snList))
  251. ->where('read_yyyy',$year)
  252. ->whereOr('read_yyyymm',$lastDate[0])
  253. ->select();
  254. foreach ($newList as $k => $v) {
  255. foreach ($v as $k2 => $v2) {
  256. $address = json_decode($v2['address']);
  257. $dep_id = explode(',',$v2['dep']);
  258. $newList[$k][$k2]['info']['floor1'] = $addresses[$address[1]] ?? null;
  259. $newList[$k][$k2]['info']['floor2'] = $addresses[$address[2]] ?? null;
  260. $newList[$k][$k2]['info']['dep'] = $deps[$dep_id[0]] ?? null;
  261. $newList[$k][$k2]['info']['type'] = $sorts[$v2['type_e']] ?? null;
  262. $newList[$k][$k2]['rate'] = null;
  263. $newList[$k][$k2]['data'] = [];
  264. foreach ($dateList[$k] as $k3 => $v3) {
  265. $re = null;
  266. $re2 = null;
  267. foreach ($records as $record) {
  268. if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $v3) {
  269. $re = $record;
  270. break;
  271. }
  272. }
  273. foreach ($records as $record) {
  274. if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $lastDateList[$k][$k3]) {
  275. $re2 = $record;
  276. break;
  277. }
  278. }
  279. if ($re && isset($re['sn'])) {
  280. $newList[$k][$k2]['rate'] = $re['rate'];
  281. }
  282. $degrees[$v2['number']][$k3] = ($re['degree'] - $re2['degree']) * $re['rate'];
  283. if ($re && $re['degree']) {
  284. if ($v2['share'] == 1 || (string)$v2['share'] == '0') {
  285. $re['real_degree'] = ($re['degree'] - $re2['degree']) * $re['rate'] * $v2['percent'];
  286. } else {
  287. $re['real_degree'] = ($re['degree'] - $re2['degree']) * $re['rate'];
  288. }
  289. }
  290. $newList[$k][$k2]['data'][] = $re;
  291. }
  292. }
  293. }
  294. //计算拆分电表
  295. $newList = $this->split($newList,$degrees,'energy_electricity');
  296. foreach ($date as $k=>$v){
  297. for($i =0;$i<count($newList);$i++){
  298. $count = 0;
  299. foreach ($newList[$i] as $k2=>$v2){
  300. $count += $v2['data'][$k]['real_degree']?$v2['data'][$k]['real_degree']:0;
  301. $total[$i][$k]=$count;
  302. }
  303. }
  304. }
  305. foreach ($total as $k=>$v){
  306. foreach ($v as $k2=>$v2){
  307. $newList[$k][0]['data'][$k2]['total']=$v2;
  308. }
  309. }
  310. // 初始化一个数组来存储每个月的总量
  311. $monthlySum = array_fill(0, 12, 0);
  312. foreach ($total as $item) {
  313. foreach ($item as $index => $value) {
  314. $monthlySum[$index] += $value;
  315. }
  316. }
  317. return ['data'=>$newList,'sum'=>$monthlySum];
  318. }
  319. //医院每日用水统计
  320. public function dailyWater()
  321. {
  322. $month = input('start',date('Y-m'));
  323. $data = $this->dailyWaterData($month);
  324. $this->assign('data',$data['res']);
  325. $this->assign('count',$data['count']);
  326. $this->assign('totalData',$data['total']);
  327. $this->assign('start',$month);
  328. $this->assign('date',date('Y年m月',strtotime($month)));
  329. return $this->fetch();
  330. }
  331. public function dailyWaterData($month){
  332. $dep = getDay(strtotime($month));
  333. $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
  334. $map[] = ['del','=',0];
  335. $map[] = ['org_id','=',$this->orgId];
  336. $sn = Db::name('energy_water')
  337. ->where($map)
  338. ->where('enable',1)
  339. ->where('parent_id',0)
  340. ->where('type_w',0)
  341. ->column('number');
  342. $hotInSn = Db::name('energy_water')
  343. ->where($map)
  344. ->where('enable',1)
  345. ->where('parent_id',0)
  346. ->where('type_w',1)
  347. ->column('number');
  348. $hotReturnSn = Db::name('energy_water')
  349. ->where($map)
  350. ->where('enable',1)
  351. ->where('parent_id',0)
  352. ->where('type_w',2)
  353. ->column('number');
  354. $res = [];
  355. $allRecords = Db::name('energy_water_record')
  356. ->where($map)
  357. ->field('sn,degree,read_yyyymmdd')
  358. ->select();
  359. $recordsCache = [];
  360. foreach ($allRecords as $record) {
  361. $recordsCache[$record['sn']][$record['read_yyyymmdd']] = $record;
  362. }
  363. $total = 0;
  364. $count = 0;
  365. foreach ($dep as $k => $v) {
  366. $degree = 0;
  367. $degree2 = 0;
  368. $degree3 = 0;
  369. foreach ($sn as $kk => $vv) {
  370. // 获取当前日期和上个月最后一天的记录
  371. $currentRow = $recordsCache[$vv][$v] ?? null;
  372. if ($k == 0) {
  373. $lastRow = $recordsCache[$vv][$lastDayOfLastMonth] ?? null;
  374. if ($currentRow) {
  375. $count +=1;
  376. $res[$k][$kk] = $currentRow;
  377. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
  378. $degree += $res[$k][$kk]['real_degree'];
  379. }
  380. } else {
  381. $lastRow = $recordsCache[$vv][$dep[$k-1]] ?? null;
  382. if ($currentRow) {
  383. $count +=1;
  384. $res[$k][$kk] = $currentRow;
  385. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
  386. $degree += $res[$k][$kk]['real_degree'];
  387. }
  388. }
  389. }
  390. foreach ($hotInSn as $k2=>$v2){
  391. $currentRow = $recordsCache[$v2][$v] ?? null;
  392. if ($currentRow){
  393. $degree2 += sprintf("%.2f", $currentRow['degree']);
  394. }
  395. }
  396. foreach ($hotReturnSn as $k3=>$v3){
  397. $currentRow = $recordsCache[$v3][$v] ?? null;
  398. if ($currentRow){
  399. $degree3 += sprintf("%.2f", $currentRow['degree']);
  400. }
  401. }
  402. $hotDegree = sprintf('%.2f', $degree2-$degree3);
  403. $res[$k]['total'] = sprintf('%.2f', $degree+$hotDegree);
  404. $res[$k]['hot_degree'] = $hotDegree;
  405. $total += $degree+$hotDegree;
  406. }
  407. $total = sprintf('%.2f', $total);
  408. return ['res'=>$res,'total'=>$total,'count'=>$count+1];
  409. }
  410. /**
  411. * 医院每月用水统计
  412. */
  413. public function monthWater()
  414. {
  415. $month = input('start',date('Y'));
  416. $data = $this->monthWaterData($month);
  417. $this->assign('data',$data['res']);
  418. $this->assign('count',$data['count']);
  419. $this->assign('totalData',$data['total']);
  420. $this->assign('start',$month);
  421. $this->assign('date',date('Y年',strtotime($month)));
  422. return $this->fetch();
  423. }
  424. public function monthWaterData($month)
  425. {
  426. $m = get_month($month);
  427. foreach ($m as $k => $v) {
  428. $monthList[] = $v['date'];
  429. $lateMonthList[] = date('Ym', strtotime("-1 month", strtotime($v['date'] . '01')));
  430. }
  431. $map[] = ['del', '=', 0];
  432. $map[] = ['org_id', '=', $this->orgId];
  433. $sn = Db::name('energy_water')
  434. ->where($map)
  435. ->where('enable', 1)
  436. ->where('parent_id', 0)
  437. ->where('type_w', 0)
  438. ->column('number');
  439. $hotInSn = Db::name('energy_water')
  440. ->where($map)
  441. ->where('enable', 1)
  442. ->where('parent_id', 0)
  443. ->where('type_w', 1)
  444. ->column('number');
  445. $hotReturnSn = Db::name('energy_water')
  446. ->where($map)
  447. ->where('enable', 1)
  448. ->where('parent_id', 0)
  449. ->where('type_w', 2)
  450. ->column('number');
  451. $res = [];
  452. $total = 0;
  453. $count = 0;
  454. foreach ($monthList as $k => $v) {
  455. $degree = 0;
  456. foreach ($sn as $kk => $vv) {
  457. $record = Db::name('energy_water_record')
  458. ->where($map)
  459. ->where('sn', $vv)
  460. ->where('read_yyyymm', $v)
  461. ->field('sn,degree,read_yyyymm')
  462. ->order('read_yyyymmdd', ' desc')
  463. ->limit(1)
  464. ->find();
  465. $lastRecord = Db::name('energy_water_record')
  466. ->where($map)
  467. ->where('sn', $vv)
  468. ->where('read_yyyymm', $lateMonthList[$k])
  469. ->field('sn,degree,read_yyyymm')
  470. ->order('read_yyyymmdd', ' desc')
  471. ->limit(1)
  472. ->find();
  473. $a = 0;
  474. $b = 0;
  475. if (isset($lastRecord)) {
  476. $b = $lastRecord['degree'];
  477. }
  478. if (isset($record)) {
  479. $a = $record['degree'];
  480. $count += 1;
  481. }
  482. $res[$k][$kk] = $record;
  483. $res[$k][$kk]['real_degree'] =($a-$b)>0? sprintf("%.2f", $a - $b):sprintf("%.2f", 0);
  484. $degree += $res[$k][$kk]['real_degree'];
  485. }
  486. $degree2 = Db::name('energy_water_record')//热水进水
  487. ->where($map)
  488. ->where('sn', 'in', $hotInSn)
  489. ->where('read_yyyymm', $v)
  490. ->field('sn,degree,read_yyyymm')
  491. ->sum('degree');
  492. $degree3 = Db::name('energy_water_record')//热水进水
  493. ->where($map)
  494. ->where('sn', 'in', $hotReturnSn)
  495. ->where('read_yyyymm', $v)
  496. ->field('sn,degree,read_yyyymm')
  497. ->sum('degree');
  498. $hotDegree = sprintf('%.2f', $degree2 - $degree3);
  499. $res[$k]['total'] = sprintf('%.2f', $degree + $hotDegree);
  500. $res[$k]['hot_degree'] = $hotDegree;
  501. $total += $degree + $hotDegree;
  502. }
  503. $total = sprintf('%.2f', $total);
  504. return ['res' => $res, 'total' => $total, 'count' => $count + 1];
  505. }
  506. /**
  507. * 科室月冷热水量统计
  508. */
  509. public function monthDepWater()
  510. {
  511. $month = input('start', date('Y'));
  512. for ($i = 1; $i < 13; $i++) {
  513. $monthList[] = $i.'月份';
  514. }
  515. $data = $this->monthDepWaterData($month);
  516. $this->assign('data', $data);
  517. $this->assign('monthList', $monthList);
  518. $this->assign('start', $month);
  519. // halt($data);
  520. return $this->fetch();
  521. }
  522. public function monthDepWaterData($month)
  523. {
  524. $month = $month.'0101';
  525. for ($i = 1; $i < 13; $i++) {
  526. if ($i<10){
  527. $date[] = date('Y'.'0'.$i,strtotime($month));
  528. if ($i==1){
  529. $time = strtotime($date[0].'01');
  530. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  531. }else{
  532. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  533. }
  534. }else{
  535. $date[] = date('Y'.$i,strtotime($month));
  536. if ($i==10){
  537. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  538. }else{
  539. $lastDate[] = date('Y'.($i-1),strtotime($month));
  540. }
  541. }
  542. }
  543. $map[] = ['del','=',0];
  544. $map[] = ['org_id','=',$this->orgId];
  545. $list = [];
  546. $dep = Db::name('energy_dep')
  547. ->where($map)
  548. ->where('enable',1)
  549. ->field('id,name,area,address')
  550. ->select();
  551. foreach ($dep as $item){
  552. $re = Db::name('energy_water')
  553. ->Where($map)
  554. ->where('enable',1)
  555. ->where('','exp',Db::raw('FIND_IN_SET('.$item['id'].',dep)'))
  556. ->select();
  557. if(!empty($re)){
  558. $list[] = $re;
  559. }
  560. }
  561. if (empty($list)){
  562. return $list;
  563. }
  564. $newList = $this->getNewList($list);
  565. $addressIds = [];
  566. $depIds = [];
  567. foreach ($newList as $k => $v) {
  568. foreach ($v as $k2 => $v2) {
  569. $address = json_decode($v2['address'], true);
  570. $dep_id = explode(',',$v2['dep']);
  571. $addressIds[] = $address[1];
  572. $addressIds[] = $address[2];
  573. $depIds[] = $dep_id[0];
  574. }
  575. }
  576. $uniqueAddressIds = array_unique($addressIds);
  577. $floors = Db::name('energy_area')->where('id', 'in', $uniqueAddressIds)->column('title', 'id');
  578. $departments = Db::name('energy_dep')->where('id', 'in', array_unique($depIds))->column('name', 'id');
  579. $snList = [];
  580. foreach ($newList as $k => $v) {
  581. foreach ($v as $k2 => $v2) {
  582. $snList[] = $v2['number'];
  583. }
  584. }
  585. $uniqueSnList = array_unique($snList);
  586. $records = Db::name('energy_water_record')
  587. ->field('sn,degree,read_yyyymm')
  588. ->where($map)
  589. ->where('sn', 'in', $uniqueSnList)
  590. ->select();
  591. $recordsGroupBySn = [];
  592. foreach ($records as $record) {
  593. $recordsGroupBySn[$record['sn']][$record['read_yyyymm']] = $record;
  594. }
  595. foreach ($newList as $k => $v) {
  596. foreach ($v as $k2 => $v2) {
  597. $address = json_decode($v2['address'], true);
  598. $dep_id = explode(',',$v2['dep']);
  599. $newList[$k][$k2]['info']['floor1'] = $floors[$address[1]] ?? null;
  600. $newList[$k][$k2]['info']['floor2'] = $floors[$address[2]] ?? null;
  601. $newList[$k][$k2]['info']['dep'] = $departments[$dep_id[0]] ?? null;
  602. if ($v2['type_w'] == 0) {
  603. $newList[$k]['sn'][] = $v2['number'];
  604. $coldData = [];
  605. foreach ($date as $k3 => $v3) {
  606. $re = $recordsGroupBySn[$v2['number']][$v3] ?? 0;
  607. $re2 = $recordsGroupBySn[$v2['number']][$lastDate[$k3]] ?? 0;
  608. $coldDegrees[$v2['number']][$k3] = $re['degree']?$re['degree'] - $re2['degree']:0;
  609. if ($re && $re['degree']) {
  610. $cold_degree = ($re['degree'] - ($re2['degree'] ?? 0)) * ($v2['share'] == 1 || (string)$v2['share'] == '0' ? $v2['percent'] : 1);
  611. $re['cold_degree'] = $cold_degree;
  612. }
  613. $coldData[] = $re;
  614. }
  615. $newList[$k]['cold'][] = $coldData;
  616. } elseif ($v2['type_w'] == 1) {
  617. $hotInData = [];
  618. foreach ($date as $k4 => $v4) {
  619. $hotIn = 0;
  620. foreach ($recordsGroupBySn[$v2['number']] ?? [] as $record) {
  621. if ($record['read_yyyymm'] == $v4) {
  622. $hotIn += $record['degree'];
  623. }
  624. }
  625. $hotInDegrees[$v2['number']][$k4] = $hotIn;
  626. $hotIn = $v2['share'] == 1 ? $hotIn * $v2['percent'] : $hotIn;
  627. $hotInData[] = $hotIn;
  628. }
  629. $newList[$k]['hotIn'][] = $hotInData;
  630. } elseif ($v2['type_w'] == 2) {
  631. $hotReturnData = [];
  632. foreach ($date as $k5 => $v5) {
  633. $hotReturn = 0;
  634. foreach ($recordsGroupBySn[$v2['number']] ?? [] as $record) {
  635. if ($record['read_yyyymm'] == $v5) {
  636. $hotReturn += $record['degree'];
  637. }
  638. }
  639. $hotReturnDegrees[$v2['number']][$k5] = $hotReturn;
  640. $hotReturn = $v2['share'] == 1 ? $hotReturn * $v2['percent'] : $hotReturn;
  641. $hotReturnData[] = $hotReturn;
  642. }
  643. $newList[$k]['hotReturn'][] = $hotReturnData;
  644. }
  645. }
  646. }
  647. /**
  648. * 计算拆分电表
  649. */
  650. foreach ($newList as $k => $v) {
  651. foreach ($v as $k2 => $v2) {
  652. if (isset($v2['id'])){
  653. if ($v2['split']) {
  654. $split = explode(',', $v2['split']);
  655. $info = Db::name('energy_water')->field('number,split')->where('id', 'in', $split)->select();
  656. foreach ($v['cold'] as $k4 => $v4) {
  657. foreach ($v4 as $k5 => $v5) {
  658. foreach ($info as $value) {
  659. if ((string)$v2['type_w'] == '0') {
  660. if (isset($v4['cold_degree'])) {
  661. $newList[$k]['cold'][$k5]['cold_degree'] -= $coldDegrees[$value['number']][$k5];
  662. }
  663. }else if ((string)$v2['type_w'] == '1'){
  664. $newList[$k]['hotIn'][$k5] -= $hotInDegrees[$value['number']][$k5];
  665. }else{
  666. $newList[$k]['hotReturn'][$k5] -= $hotReturnDegrees[$value['number']][$k5];
  667. }
  668. }
  669. }
  670. }
  671. }
  672. }
  673. }
  674. }
  675. foreach ($newList as $k=> $v){
  676. if (!isset($v['hotIn'])){
  677. foreach ($date as $k1 => $v1) {
  678. $newList[$k]['hotIn'][] = 0;
  679. }
  680. }
  681. if (!isset($v['hotReturn'])){
  682. foreach ($date as $k1 => $v1) {
  683. $newList[$k]['hotReturn'][] = 0;
  684. }
  685. }
  686. }
  687. foreach ($newList as $k=> $v){
  688. foreach ($date as $k1 => $v1) {
  689. $totalCold = 0;
  690. $totalHotIn = 0;
  691. $totalHotReturn = 0;
  692. if (isset($v['cold'])){
  693. foreach ($v['cold'] as $k2 => $v2){
  694. $totalCold += $v2[$k1]['cold_degree'] ?? 0;
  695. }
  696. }
  697. if (isset($v['hotIn'])) {
  698. foreach ($v['hotIn'] as $k3 => $v3) {
  699. $totalHotIn += $v3[$k1];
  700. }
  701. }
  702. if (isset($v['hotReturn'])){
  703. foreach ($v['hotReturn'] as $k4 => $v4){
  704. $totalHotReturn += $v4[$k1];
  705. }
  706. }
  707. $newList[$k]['totalCold'][] =$totalCold;
  708. $newList[$k]['totalHotIn'][] =$totalHotIn;
  709. $newList[$k]['totalHotReturn'][] =$totalHotReturn;
  710. unset($newList[$k]['hotIn']);
  711. unset($newList[$k]['hotReturn']);
  712. }
  713. }
  714. // halt($newList);
  715. return $newList;
  716. }
  717. /**
  718. * 医院每日燃气用量统计
  719. */
  720. public function dailyGas()
  721. {
  722. $month = input('start',date('Y-m'));
  723. $data = $this->dailyGasData($month);
  724. $this->assign('data',$data['res']);
  725. $this->assign('count',$data['count']);
  726. $this->assign('totalData',$data['total']);
  727. $this->assign('start',$month);
  728. $this->assign('date',date('Y年m月',strtotime($month)));
  729. return $this->fetch();
  730. }
  731. public function dailyGasData($month){
  732. $dep = getDay(strtotime($month));
  733. $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
  734. $map[] = ['del','=',0];
  735. $map[] = ['org_id','=',$this->orgId];
  736. $sn = Db::name('energy_gas')
  737. ->where($map)
  738. ->where('enable',1)
  739. ->where('parent_id',0)
  740. ->column('number');
  741. $res = [];
  742. $allRecords = Db::name('energy_gas_record')
  743. ->where($map)
  744. ->field('sn,degree,read_yyyymmdd')
  745. ->select();
  746. $recordsCache = [];
  747. foreach ($allRecords as $record) {
  748. $recordsCache[$record['sn']][$record['read_yyyymmdd']] = $record;
  749. }
  750. $total = 0;
  751. foreach ($dep as $k => $v) {
  752. $degree = 0;
  753. foreach ($sn as $kk => $vv) {
  754. $currentRow = $recordsCache[$vv][$v] ?? null;
  755. if ($k == 0) {
  756. $lastRow = $recordsCache[$vv][$lastDayOfLastMonth] ?? null;
  757. if ($currentRow) {
  758. $res[$k][$kk] = $currentRow;
  759. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
  760. $degree += $res[$k][$kk]['real_degree'];
  761. }
  762. } else {
  763. $lastRow = $recordsCache[$vv][$dep[$k-1]] ?? null;
  764. if ($currentRow) {
  765. $res[$k][$kk] = $currentRow;
  766. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($currentRow['degree'] - $lastRow['degree']));
  767. $degree += $res[$k][$kk]['real_degree'];
  768. }
  769. }
  770. }
  771. $res[$k]['total'] = sprintf('%.2f', $degree);
  772. $total += $degree;
  773. }
  774. $total = sprintf('%.2f', $total);
  775. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  776. }
  777. /**
  778. * 医院每月用燃气统计
  779. */
  780. public function monthGas()
  781. {
  782. $month = input('start',date('Y'));
  783. $data = $this->monthGasData($month);
  784. $this->assign('data',$data['res']);
  785. $this->assign('count',$data['count']);
  786. $this->assign('totalData',$data['total']);
  787. $this->assign('start',$month);
  788. $this->assign('date',date('Y年',strtotime($month)));
  789. return $this->fetch();
  790. }
  791. public function monthGasData($month){
  792. $m = get_month($month);
  793. foreach ($m as $k => $v) {
  794. $monthList[] = $v['date'];
  795. $lateMonthList[] = date('Ym',strtotime("-1 month", strtotime($v['date'].'01')));
  796. }
  797. $map[] = ['del','=',0];
  798. $map[] = ['org_id','=',$this->orgId];
  799. $sn = Db::name('energy_gas')
  800. ->where($map)
  801. ->where('enable',1)
  802. ->where('parent_id',0)
  803. ->column('number');
  804. $res = [];
  805. $total = 0;
  806. foreach ($monthList as $k => $v) {
  807. $degree = 0;
  808. foreach ($sn as $kk => $vv) {
  809. $record = Db::name('energy_gas_record')
  810. ->where($map)
  811. ->where('sn',$vv)
  812. ->where('read_yyyymm',$v)
  813. ->field('sn,degree,read_yyyymm')
  814. ->order('read_yyyymmdd desc')
  815. ->limit(1)
  816. ->find();
  817. $lastRecord = Db::name('energy_gas_record')
  818. ->where($map)
  819. ->where('sn',$vv)
  820. ->where('read_yyyymm',$lateMonthList[$k])
  821. ->field('sn,degree,read_yyyymm')
  822. ->order('read_yyyymmdd desc')
  823. ->limit(1)
  824. ->find();
  825. $a = 0;
  826. $b =0;
  827. if (isset($record)){
  828. $a = $record['degree'];
  829. }
  830. if (isset($lastRecord)){
  831. $b = $lastRecord['degree'];
  832. }
  833. $res[$k][$kk] = $record;
  834. $res[$k][$kk]['real_degree'] =($a-$b)>0? sprintf("%.2f", $a - $b):sprintf("%.2f", 0);
  835. $degree += $res[$k][$kk]['real_degree'];
  836. }
  837. $res[$k]['total'] = sprintf('%.2f', $degree);
  838. $total += $degree;
  839. }
  840. $total = sprintf('%.2f', $total);
  841. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  842. }
  843. /**
  844. * 科室月燃气用量统计
  845. */
  846. public function monthDepGas()
  847. {
  848. $month = input('start', date('Y'));
  849. for ($i = 1; $i < 13; $i++) {
  850. $monthList[] = $i.'月份';
  851. }
  852. $data = $this->monthDepGasData($month);
  853. $this->assign('data', $data['newList']);
  854. $this->assign('count', $data['count']);
  855. $this->assign('total', $data['total']);
  856. $this->assign('monthList', $monthList);
  857. $this->assign('start', $month);
  858. // halt($data);
  859. return $this->fetch();
  860. }
  861. public function monthDepGasData($month)
  862. {
  863. $month = $month.'0101';
  864. for ($i = 1; $i < 13; $i++) {
  865. if ($i<10){
  866. $date[] = date('Y'.'0'.$i,strtotime($month));
  867. if ($i==1){
  868. $time = strtotime($date[0].'01');
  869. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  870. }else{
  871. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  872. }
  873. }else{
  874. $date[] = date('Y'.$i,strtotime($month));
  875. if ($i==10){
  876. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  877. }else{
  878. $lastDate[] = date('Y'.($i-1),strtotime($month));
  879. }
  880. }
  881. }
  882. $map[] = ['del','=',0];
  883. $map[] = ['org_id','=',$this->orgId];
  884. $list = [];
  885. $dep = Db::name('energy_dep')
  886. ->where($map)
  887. ->where('enable',1)
  888. ->field('id,name,area,address')
  889. ->select();
  890. foreach ($dep as $item){
  891. $re = Db::name('energy_gas')
  892. ->Where($map)
  893. ->where('enable',1)
  894. ->where('','exp',Db::raw('FIND_IN_SET('.$item['id'].',dep)'))
  895. ->select();
  896. if(!empty($re)){
  897. $list[] = $re;
  898. }
  899. }
  900. if (empty($list)){
  901. return ['newList'=>[],'count'=>0,'total'=>0];
  902. }
  903. $newList = $this->getNewList($list);
  904. $addressIds = [];
  905. $depIds = [];
  906. $numbers = [];
  907. foreach ($newList as $k => $v){
  908. foreach ($v as $k2 => $v2){
  909. $address = json_decode($v2['address']);
  910. $dep_id = explode(',',$v2['dep']);
  911. $numbers[] = $v2['number'];
  912. if (!in_array($address[1], $addressIds)) {
  913. $addressIds[] = $address[1];
  914. }
  915. if (!in_array($address[2], $addressIds)) {
  916. $addressIds[] = $address[2];
  917. }
  918. if (!in_array($dep_id[0], $depIds)) {
  919. $depIds[] = $dep_id[0];
  920. }
  921. }
  922. }
  923. $energyAreaData = Db::name('energy_area')->where('id', 'in', $addressIds)->column('title', 'id');
  924. $energyDepData = Db::name('energy_dep')->where('id', 'in', $depIds)->column('name', 'id');
  925. $gasRecords = Db::name('energy_gas_record')->field('sn,degree,read_yyyymm')->where($map)->select();
  926. foreach ($newList as $k => $v){
  927. foreach ($v as $k2 => $v2){
  928. $address = json_decode($v2['address']);
  929. $dep_id = explode(',',$v2['dep']);
  930. $newList[$k][$k2]['info']['floor1'] = $energyAreaData[$address[1]] ?? null;
  931. $newList[$k][$k2]['info']['floor2'] = $energyAreaData[$address[2]] ?? null;
  932. $newList[$k][$k2]['info']['dep'] = $energyDepData[$dep_id[0]] ?? null;
  933. foreach ($date as $k3 => $v3){
  934. $re = null;
  935. $re2 = null;
  936. foreach ($gasRecords as $record) {
  937. if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $v3) {
  938. $re = $record;
  939. }
  940. if ($record['sn'] == $v2['number'] && $record['read_yyyymm'] == $lastDate[$k3]) {
  941. $re2 = $record;
  942. }
  943. }
  944. $degrees[$v2['number']][$k3] = $re['degree'] - $re2['degree'];
  945. if ($re && $re['degree']){
  946. if ($v2['share'] == 1 || (string)$v2['share'] == '0'){
  947. $re['real_degree'] = ($re['degree'] - $re2['degree']) * $v2['percent'];
  948. }else{
  949. $re['real_degree'] = $re['degree'] - $re2['degree'];
  950. }
  951. }
  952. $newList[$k][$k2]['data'][] = $re;
  953. }
  954. }
  955. }
  956. //计算拆分电表
  957. $newList = $this->split($newList,$degrees,'energy_gas');
  958. $total = [];
  959. foreach ($date as $k=>$v){
  960. $degree = 0;
  961. foreach ($newList as $k2 => $v2){
  962. $count=0;
  963. foreach ($v2 as $k3=>$v3){
  964. if (!empty($v2[0]['data'][$k])){
  965. $count = $v2[0]['data'][$k]['real_degree'];
  966. }
  967. $degree+=$count;
  968. }
  969. $total[$k] = $degree;
  970. }
  971. }
  972. return ['newList'=>$newList,'count'=>count($newList),'total'=>$total];
  973. }
  974. /**
  975. * 医院月设备电度统计
  976. */
  977. public function monthDeviceElectricity()
  978. {
  979. $month = input('start', date('Y'));
  980. for ($i = 1; $i < 13; $i++) {
  981. $monthList[] = $i.'月份';
  982. }
  983. $data = $this->monthDeviceElectricityData($month);
  984. $this->assign('data', $data);
  985. $this->assign('monthList', $monthList);
  986. $this->assign('start', $month);
  987. return $this->fetch();
  988. }
  989. public function monthDeviceElectricityData($month)
  990. {
  991. $month = $month.'0101';
  992. for ($i = 1; $i < 13; $i++) {
  993. if ($i<10){
  994. $date[] = date('Y'.'0'.$i,strtotime($month));
  995. if ($i==1){
  996. $time = strtotime($date[0].'01');
  997. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  998. }else{
  999. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  1000. }
  1001. }else{
  1002. $date[] = date('Y'.$i,strtotime($month));
  1003. if ($i==10){
  1004. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  1005. }else{
  1006. $lastDate[] = date('Y'.($i-1),strtotime($month));
  1007. }
  1008. }
  1009. }
  1010. $map[] = ['del','=',0];
  1011. $map[] = ['org_id','=',$this->orgId];
  1012. $list = Db::name('energy_device_electricity')
  1013. ->field('name,number,type_e')
  1014. ->where($map)
  1015. ->where('enable',1)
  1016. ->select();
  1017. $sort = Db::name('energy_sort')
  1018. ->where($map)
  1019. ->where('enable',1)
  1020. ->column('name','id');
  1021. $device = array();
  1022. $nameCount = array();
  1023. foreach ($list as $item) {
  1024. if (!isset($nameCount[$item['name']])) {
  1025. $nameCount[$item['name']] = 1;
  1026. } else {
  1027. $nameCount[$item['name']]++;
  1028. }
  1029. }
  1030. foreach ($nameCount as $name => $count) {
  1031. if ($count > 1) {
  1032. $device[] = array_filter($list, function ($device) use ($name) {
  1033. return $device['name'] === $name;
  1034. });
  1035. } else {
  1036. foreach ($list as $d) {
  1037. if ($d['name'] === $name) {
  1038. $device[] = array($d);
  1039. break;
  1040. }
  1041. }
  1042. }
  1043. }
  1044. foreach ($device as $k => $v){
  1045. $device[$k] = array_values($v);
  1046. }
  1047. foreach ($device as $k=>$v){
  1048. foreach ($v as $k2=>$v2){
  1049. $device[$k][$k2]['type_e'] = $sort[$v2['type_e']];
  1050. foreach ($date as $k3=>$v3){
  1051. $re = Db::name('energy_device_electricity_record')
  1052. ->field('sn,degree,rate,read_yyyymm')
  1053. ->where($map)
  1054. ->where('read_yyyymm',$v3)
  1055. ->where('sn',$v2['number'])
  1056. ->find();
  1057. $re2 = Db::name('energy_device_electricity_record')
  1058. ->field('sn,degree')
  1059. ->where($map)
  1060. ->where('read_yyyymm',$lastDate[$k3])
  1061. ->where('sn',$v2['number'])
  1062. ->find();
  1063. if (isset($re['sn'])){
  1064. $device[$k][$k2]['rate'] = $re['rate'];
  1065. }
  1066. if ($re['degree']){
  1067. $re['real_degree'] =($re['degree'] - $re2['degree']) * $re['rate'];
  1068. }
  1069. $device[$k][$k2]['data'][] = $re;
  1070. }
  1071. }
  1072. }
  1073. foreach ($date as $k=>$v){
  1074. for($i =0;$i<count($device);$i++){
  1075. $count = 0;
  1076. foreach ($device[$i] as $k2=>$v2){
  1077. $count += isset($v2['data'][$k]['real_degree'])?$v2['data'][$k]['real_degree']:0;
  1078. $total[$i][$k]=$count;
  1079. }
  1080. }
  1081. }
  1082. if (isset($total)){
  1083. foreach ($total as $k=>$v){
  1084. foreach ($v as $k2=>$v2){
  1085. $device[$k][0]['data'][$k2]['total']=$v2;
  1086. }
  1087. }
  1088. }
  1089. return $device;
  1090. }
  1091. /**
  1092. * 医院每日水电燃气数据分析图表
  1093. */
  1094. public function dailyView(){
  1095. $month = input('month',date('Y-m'));
  1096. $data = $this->dailyViewData($month);
  1097. $this->assign('date',$data['date']);
  1098. $this->assign('data',$data['data']);
  1099. $this->assign('month',$month);
  1100. $this->assign('year',date('Y',strtotime($month)));
  1101. return $this->fetch();
  1102. }
  1103. public function dailyViewData($month)
  1104. {
  1105. $map = [
  1106. ['del', '=', 0],
  1107. ['org_id', '=', $this->orgId],
  1108. // ['min_temperature', '<>', 'null'],
  1109. // ['max_temperature', '<>', 'null'],
  1110. // ['beds', '<>', 'null'],
  1111. ['read_yyyymm', '=', date('Ym',strtotime($month))],
  1112. ];
  1113. $date = getMonth($month);
  1114. $lastYear = date('Y-m', strtotime("-1 year", strtotime($month)));
  1115. $lastDate = getMonth($lastYear);
  1116. // 获取电、水、气的数据
  1117. $eInfo = $this->dailyElectricityData($month);
  1118. $eInfoLast = $this->dailyElectricityData($lastYear);
  1119. $wInfo = $this->dailyWaterData($month);
  1120. $wInfoLast = $this->dailyWaterData($lastYear);
  1121. $gInfo = $this->dailyGasData($month);
  1122. $gInfoLast = $this->dailyGasData($lastYear);
  1123. // 初始化数据数组
  1124. $data = [
  1125. 'electricity' => [],
  1126. 'lastElectricity' => [],
  1127. 'water' => [],
  1128. 'lastWater' => [],
  1129. 'gas' => [],
  1130. 'lastGas' => [],
  1131. 'electricityTempMin' => [],
  1132. 'electricityBeds' => [],
  1133. 'electricityTempMax' => [],
  1134. 'waterTempMin' => [],
  1135. 'waterBeds' => [],
  1136. 'waterTempMax' => [],
  1137. 'gasTempMin' => [],
  1138. 'gasBeds' => [],
  1139. 'gasTempMax' => []
  1140. ];
  1141. // 合并电、水、气的数据
  1142. foreach ($eInfo['res'] as $k => $v) {
  1143. $data['electricity'][$k] = $v['total'];
  1144. $data['lastElectricity'][$k] = $eInfoLast['res'][$k]['total'];
  1145. }
  1146. foreach ($wInfo['res'] as $k => $v) {
  1147. $data['water'][$k] = $v['total'];
  1148. $data['lastWater'][$k] = $wInfoLast['res'][$k]['total'];
  1149. }
  1150. foreach ($gInfo['res'] as $k => $v) {
  1151. $data['gas'][$k] = $v['total'];
  1152. $data['lastGas'][$k] = $gInfoLast['res'][$k]['total'];
  1153. }
  1154. // 一次性获取电的记录
  1155. $records = Db::name('energy_electricity_record')
  1156. ->where($map)
  1157. ->whereOr('read_yyyymm',date('Ym',strtotime($lastYear)))
  1158. ->order('read_yyyymmdd', 'asc')
  1159. ->column('min_temperature, max_temperature, beds', 'read_time');
  1160. // 处理今年电的数据
  1161. foreach ($date['ymd'] as $k => $v) {
  1162. $data['electricityTempMin'][$k] = isset($records[$v]) ? $records[$v]['min_temperature'] : 0;
  1163. $data['electricityTempMax'][$k] = isset($records[$v]) ? $records[$v]['max_temperature'] : 0;
  1164. $data['electricityBeds'][$k] = isset($records[$v]) ? $records[$v]['beds'] : 0;
  1165. $data['LastElectricityTempMin'][$k] = isset($records[$lastDate['ymd'][$k]]) ? $records[$lastDate['ymd'][$k]]['min_temperature'] : 0;
  1166. $data['LastElectricityTempMax'][$k] = isset($records[$lastDate['ymd'][$k]]) ? $records[$lastDate['ymd'][$k]]['max_temperature'] : 0;
  1167. }
  1168. // 一次性获取水的记录
  1169. $wRecords = Db::name('energy_water_record')
  1170. ->where($map)
  1171. ->order('create_time', 'desc')
  1172. ->column('min_temperature, max_temperature, beds', 'read_time');
  1173. // 处理水的数据
  1174. foreach ($date['ymd'] as $k => $v) {
  1175. $data['waterTempMin'][$k] = isset($wRecords[$v]) ? $wRecords[$v]['min_temperature'] : 0;
  1176. $data['waterTempMax'][$k] = isset($wRecords[$v]) ? $wRecords[$v]['max_temperature'] : 0;
  1177. $data['waterBeds'][$k] = isset($wRecords[$v]) ? $wRecords[$v]['beds'] : 0;
  1178. }
  1179. // 一次性获取气的记录
  1180. $gRecords = Db::name('energy_gas_record')
  1181. ->where($map)
  1182. ->order('create_time', 'desc')
  1183. ->column('min_temperature, max_temperature, beds', 'read_time');
  1184. // 处理气的数据
  1185. foreach ($date['ymd'] as $k => $v) {
  1186. $data['gasTempMin'][$k] = isset($gRecords[$v]) ? $gRecords[$v]['min_temperature'] : 0;
  1187. $data['gasTempMax'][$k] = isset($gRecords[$v]) ? $gRecords[$v]['max_temperature'] : 0;
  1188. $data['gasBeds'][$k] = isset($gRecords[$v]) ? $gRecords[$v]['beds'] : 0;
  1189. }
  1190. return ['data' => $data, 'date' => $date];
  1191. }
  1192. /**
  1193. * 医院每月水电燃气数据分析图表
  1194. */
  1195. public function dailyView2(){
  1196. $month = input('month',date('Y'));
  1197. $data = $this->dailyViewData2($month);
  1198. $this->assign('date',$data['date']);
  1199. $this->assign('data',$data['data']);
  1200. $this->assign('month',$month);
  1201. $this->assign('year',$month);
  1202. return $this->fetch();
  1203. }
  1204. public function dailyViewData2($month)
  1205. {
  1206. $map = [
  1207. ['del', '=', 0],
  1208. ['org_id', '=', $this->orgId],
  1209. ['read_yyyy', '=', $month]
  1210. ];
  1211. $map2 = [
  1212. ['del', '=', 0],
  1213. ['org_id', '=', $this->orgId],
  1214. ['enable', '=', 1],
  1215. ['parent_id', '=', 0],
  1216. ];
  1217. $lastYear = $month-1;
  1218. $lastYear2 = $month-2;
  1219. $lastYear3 = $month-3;
  1220. // 获取电、水、气的数据
  1221. $eInfo = $this->monthElectricityData($month);
  1222. $eInfoLast = $this->monthElectricityData($lastYear);
  1223. $eInfoLast2 = $this->monthElectricityData($lastYear2);
  1224. $eInfoLast3 = $this->monthElectricityData($lastYear3);
  1225. $wInfo = $this->monthWaterData($month);
  1226. $wInfoLast = $this->monthWaterData($lastYear);
  1227. $wInfoLast2 = $this->monthWaterData($lastYear2);
  1228. $wInfoLast3 = $this->monthWaterData($lastYear3);
  1229. $gInfo = $this->monthGasData($month);
  1230. $gInfoLast = $this->monthGasData($lastYear);
  1231. $gInfoLast2 = $this->monthGasData($lastYear2);
  1232. $gInfoLast3 = $this->monthGasData($lastYear3);
  1233. for ($i =1;$i<=12;$i++){
  1234. if($i<10){
  1235. $date[] = $month.'0'.$i;
  1236. }else{
  1237. $date[] = $month.$i;
  1238. }
  1239. $date2[] = $i.'月';
  1240. }
  1241. // 初始化数据数组
  1242. $data = [
  1243. 'electricity' => [],
  1244. 'lastElectricity' => [],
  1245. 'water' => [],
  1246. 'lastWater' => [],
  1247. 'gas' => [],
  1248. 'lastGas' => [],
  1249. 'electricityTempMin' => [],
  1250. 'electricityBeds' => [],
  1251. 'electricityTempMax' => [],
  1252. 'waterTempMin' => [],
  1253. 'waterBeds' => [],
  1254. 'waterTempMax' => [],
  1255. 'gasTempMin' => [],
  1256. 'gasBeds' => [],
  1257. 'gasTempMax' => []
  1258. ];
  1259. // 合并电、水、气的数据
  1260. foreach ($eInfo['res'] as $k => $v) {
  1261. $data['electricity'][$k] = $v['total'];
  1262. $data['lastElectricity'][$k] = $eInfoLast['res'][$k]['total'];
  1263. $data['lastElectricity2'][$k] = $eInfoLast2['res'][$k]['total'];
  1264. $data['lastElectricity3'][$k] = $eInfoLast3['res'][$k]['total'];
  1265. }
  1266. foreach ($wInfo['res'] as $k => $v) {
  1267. $data['water'][$k] = $v['total'];
  1268. $data['lastWater'][$k] = $wInfoLast['res'][$k]['total'];
  1269. $data['lastWater2'][$k] = $wInfoLast2['res'][$k]['total'];
  1270. $data['lastWater3'][$k] = $wInfoLast3['res'][$k]['total'];
  1271. }
  1272. foreach ($gInfo['res'] as $k => $v) {
  1273. $data['gas'][$k] = $v['total'];
  1274. $data['lastGas'][$k] = $gInfoLast['res'][$k]['total'];
  1275. $data['lastGas2'][$k] = $gInfoLast2['res'][$k]['total'];
  1276. $data['lastGas3'][$k] = $gInfoLast3['res'][$k]['total'];
  1277. }
  1278. $eSn = Db::name('energy_electricity')
  1279. ->where($map2)
  1280. ->column('number');
  1281. // 一次性获取所有记录
  1282. $records = Db::name('energy_electricity_record')
  1283. ->where($map)
  1284. ->where('sn','in',$eSn)
  1285. ->order('create_time', 'desc')
  1286. ->column('min_temperature, max_temperature, beds', 'read_yyyymm');
  1287. // 处理电的数据
  1288. foreach ($date as $k => $v) {
  1289. $data['electricityTempMin'][$k] = isset($records[$v]) && $records[$v]['min_temperature']!=null ? $records[$v]['min_temperature'] : 0;
  1290. $data['electricityTempMax'][$k] = isset($records[$v]) && $records[$v]['max_temperature']!=null ? $records[$v]['max_temperature'] : 0;
  1291. $data['electricityBeds'][$k] = isset($records[$v]) && $records[$v]['beds']!=null ? $records[$v]['beds'] : 0;
  1292. }
  1293. $wSn = Db::name('energy_water')
  1294. ->where($map2)
  1295. ->column('number');
  1296. // 一次性获取水的记录
  1297. $wRecords = Db::name('energy_water_record')
  1298. ->where($map)
  1299. ->where('sn','in',$wSn)
  1300. ->order('create_time', 'desc')
  1301. ->column('min_temperature, max_temperature, beds', 'read_yyyymm');
  1302. // 处理水的数据
  1303. foreach ($date as $k => $v) {
  1304. $data['waterTempMin'][$k] = isset($wRecords[$v]) && $wRecords[$v]['min_temperature']!=null ? $wRecords[$v]['min_temperature'] : 0;
  1305. $data['waterTempMax'][$k] = isset($wRecords[$v]) && $wRecords[$v]['max_temperature']!=null ? $wRecords[$v]['max_temperature'] : 0;
  1306. $data['waterBeds'][$k] = isset($wRecords[$v]) && $wRecords[$v]['beds']!=null ? $wRecords[$v]['beds'] : 0;
  1307. }
  1308. $gSn = Db::name('energy_gas')
  1309. ->where($map2)
  1310. ->column('number');
  1311. // 一次性获取气的记录
  1312. $gRecords = Db::name('energy_gas_record')
  1313. ->where($map)
  1314. ->where('sn','in',$gSn)
  1315. ->order('create_time', 'desc')
  1316. ->column('min_temperature, max_temperature, beds', 'read_yyyymm');
  1317. // 处理气的数据
  1318. foreach ($date as $k => $v) {
  1319. $data['gasTempMin'][$k] = isset($gRecords[$v]) && $gRecords[$v]['min_temperature']!=null ? $gRecords[$v]['min_temperature'] : 0;
  1320. $data['gasTempMax'][$k] = isset($gRecords[$v]) && $gRecords[$v]['max_temperature']!=null ? $gRecords[$v]['max_temperature'] : 0;
  1321. $data['gasBeds'][$k] = isset($gRecords[$v]) && $gRecords[$v]['beds']!=null ? $gRecords[$v]['beds'] : 0;
  1322. }
  1323. return ['data' => $data, 'date' => $date2];
  1324. }
  1325. /**
  1326. * 医院每日水电燃气数据分析图表
  1327. */
  1328. public function monthView(){
  1329. set_time_limit(0);
  1330. ini_set("memory_limit","2048M");
  1331. $map = [
  1332. ['org_id','=',$this->orgId],
  1333. ['enable','=',1],
  1334. ['del','=',0]
  1335. ];
  1336. $month = input('month',date('Y'));
  1337. $id = Db::name('energy_dep')->where($map)->order('create_time')->limit(1)->value('id');
  1338. $depId = input('depId',$id);
  1339. for ($i = 1; $i < 13; $i++) {
  1340. $monthList[] = $i.'月份';
  1341. }
  1342. $data = $this->monthViewData($month,$depId);
  1343. foreach ($data['dep'] as $k => $v) {
  1344. if ($v['id'] == $depId) {
  1345. $depName = $v['name'];
  1346. }
  1347. }
  1348. $this->assign('data',$data['data']);
  1349. $this->assign('dep',$data['dep']);
  1350. $this->assign('depId',$depId);
  1351. $this->assign('depName',$depName??'');
  1352. $this->assign('month',$month);
  1353. $this->assign('monthList',$monthList);
  1354. return $this->fetch();
  1355. }
  1356. public function monthViewData($year,$depId)
  1357. {
  1358. $zero = [0,0,0,0,0,0,0,0,0,0,0,0];
  1359. $data = [
  1360. 'electricity'=>$zero,
  1361. 'water'=>$zero,
  1362. 'lastElectricity'=>$zero,
  1363. 'lastWater'=>$zero,
  1364. 'gas'=>$zero,
  1365. 'lastGas'=>$zero,
  1366. ];
  1367. $map = [
  1368. ['del', '=', 0],
  1369. ['org_id', '=', $this->orgId],
  1370. ];
  1371. $depInfo = Db::name('energy_dep')->field('name,id')
  1372. ->where($map)
  1373. ->where('enable',1)
  1374. ->select();
  1375. $lastYear = $year-1;
  1376. $list = $this->publicDepTotalData($year,'0');
  1377. $lastList = $this->publicDepTotalData($lastYear,'0');
  1378. foreach ($list as $k => $v) {
  1379. if ($depId == $v['id']) {
  1380. $data['electricity'] = isset($v['electricity']) ? $v['electricity'] : $zero;
  1381. $data['water'] = isset($v['water']) ? $v['water'] : $zero;
  1382. $data['lastElectricity'] = isset($lastList[$k]['electricity']) ? $lastList[$k]['electricity'] : $zero;
  1383. $data['lastWater'] = isset($lastList[$k]['water']) ? $lastList[$k]['water'] : $zero;
  1384. break;
  1385. }
  1386. }
  1387. $gas = $this->monthDepGasData($year);
  1388. $lastGas = $this->monthDepGasData($lastYear);
  1389. foreach ($depInfo as $k => $v) {
  1390. foreach ($gas['newList'] as $k1 => $v1){
  1391. $id = explode(',',$v1[0]['dep']);
  1392. if ($v['id'] == $id[0]) {
  1393. foreach ($v1[0]['data'] as $k2 => $v2){
  1394. $depInfo[$k]['data'][] = isset($v2['real_degree']) ? $v2['real_degree'] : 0;
  1395. $depInfo[$k]['lastData'][] = isset($lastGas['newList'][$k1][0]['data'][$k2]['real_degree']) ? $lastGas['newList'][$k1][0]['data'][$k2]['real_degree'] : 0;
  1396. }
  1397. break;
  1398. }
  1399. }
  1400. }
  1401. foreach ($depInfo as $k => $v){
  1402. if (!isset($v['data'])) {
  1403. $depInfo[$k]['data'] = $zero;
  1404. $depInfo[$k]['lastData'] = $zero;
  1405. }
  1406. }
  1407. foreach ($depInfo as $k => $v) {
  1408. if ($depId == $v['id']) {
  1409. $data['gas'] = $v['data'];
  1410. $data['lastGas'] = $v['lastData'];
  1411. break;
  1412. }
  1413. }
  1414. $sn = Db::name('energy_electricity')
  1415. ->where($map)
  1416. ->where('enable',1)
  1417. ->where('','exp',Db::raw("FIND_IN_SET('.$depId.',dep)"))
  1418. ->column('number');
  1419. $months = [];
  1420. for ($i = 1; $i <= 12; $i++) {
  1421. $months[] = date('Ym', strtotime($year . '-' . $i));
  1422. $months[] = date('Ym', strtotime($lastYear . '-' . $i));
  1423. }
  1424. $temp = Db::name('energy_electricity_record')
  1425. ->where($map)
  1426. ->where('read_yyyymm', 'in', $months)
  1427. ->where('sn', 'in', $sn)
  1428. ->field('read_yyyymm,min_temperature as maxMinTemp,max_temperature as maxMaxTemp,beds')
  1429. ->group('read_yyyymm')
  1430. ->select();//温度
  1431. $groupedTemp = [];
  1432. foreach ($temp as $k => $v) {
  1433. $groupedTemp[$v['read_yyyymm']] = $v;
  1434. }
  1435. for ($i = 1; $i <= 12; $i++) {
  1436. $readYyyyMm = date('Ym', strtotime($year . '-' . $i));
  1437. $readYyyyMm2 = date('Ym', strtotime($lastYear . '-' . $i));
  1438. $record = $groupedTemp[$readYyyyMm] ?? null;
  1439. $lastRecord = $groupedTemp[$readYyyyMm2] ?? null;
  1440. $data['tempMin'][] = isset($record['maxMinTemp']) && $record['maxMinTemp'] >0 ? $record['maxMinTemp'] : 0;
  1441. $data['tempMax'][] = isset($record['maxMaxTemp']) && $record['maxMaxTemp'] >0 ? $record['maxMaxTemp'] : 0;
  1442. $data['LastTempMin'][] = isset($lastRecord['maxMinTemp']) && $lastRecord['maxMinTemp'] >0 ? $lastRecord['maxMinTemp'] : 0;
  1443. $data['LastTempMax'][] = isset($lastRecord['maxMaxTemp']) && $lastRecord['maxMaxTemp'] >0 ? $lastRecord['maxMaxTemp'] : 0;
  1444. $data['beds'][] = isset($record['beds']) && $record['beds'] >0 ? $record['beds'] : 0;
  1445. }
  1446. return ['data'=>$data,'dep'=>$depInfo];
  1447. }
  1448. /**
  1449. *科室公用设备电量分摊
  1450. */
  1451. public function publicDepElectricity()
  1452. {
  1453. set_time_limit(0);
  1454. ini_set("memory_limit","1024M");
  1455. $month = input('start',date('Y-m'));
  1456. $type = input('type','0');
  1457. $data = $this->publicDepElectricityData($month,$type);
  1458. $this->assign('data',$data['data']);
  1459. $this->assign('type',$type);
  1460. $this->assign('device',$data['device']);
  1461. $this->assign('start',$month);
  1462. return $this->fetch();
  1463. }
  1464. public function publicDepElectricityData($month,$type)
  1465. {
  1466. $map['del'] = 0;
  1467. $map['enable'] = 1;
  1468. $map['org_id'] = $this->orgId;
  1469. $totalArea = Db::name('energy_area')
  1470. ->where($map)
  1471. ->where('pid',0)
  1472. ->sum('area'); //医院总面积
  1473. $floor = Db::name('energy_area')
  1474. ->where($map)
  1475. ->column('title','id'); //医院总面积
  1476. $device = Db::name('energy_sort')
  1477. ->where($map)
  1478. ->column('name', 'id');
  1479. $depInfo = Db::name('energy_dep')
  1480. ->where($map)
  1481. ->Field('id,name,area,address,percent')
  1482. ->select();
  1483. //将多地址科室进行拆分
  1484. $dep = array();
  1485. foreach ($depInfo as $item) {
  1486. $addresses = json_decode($item['address'], true);
  1487. $percents = explode(',', $item['percent']);
  1488. $itemCount = count($addresses);
  1489. for ($i = 0; $i < $itemCount; $i++) {
  1490. $newItem = array(
  1491. "id" => $item['id'],
  1492. "name" => $item['name'],
  1493. "area" => $item['area'],
  1494. "address" => json_encode(array($addresses[$i])),
  1495. "percent" => ($i < count($percents) ? trim($percents[$i]) : '')
  1496. );
  1497. $dep[] = $newItem;
  1498. }
  1499. }
  1500. foreach ($dep as $k => $v){
  1501. substr($dep[$k]['address'],1,strlen($dep[$k]['address'])-2);
  1502. if ($dep[$k]['percent']){
  1503. $depPercent = substr($dep[$k]['percent'],0,2);
  1504. $dep[$k]['area'] = $dep[$k]['area']*($depPercent/100);
  1505. }
  1506. $percent = sprintf('%.3f',$dep[$k]['area']/$totalArea);//面积占比
  1507. $dep[$k]['publicPercent'] = $percent;
  1508. if ($type == '1'){
  1509. $e = $this->ElectricitySplit($month);
  1510. foreach($e as $k2 => $v2){
  1511. $address = substr($v['address'],1,strlen($v['address'])-2);
  1512. $id = explode(',',$v2['dep']);
  1513. if ($address == $v2['address'] && (string) $v['id'] == $id[0] ) {
  1514. $dep[$k]['publicPercent'] = $v2['percent'];
  1515. }
  1516. //待改进
  1517. $depId = array_column($e,'dep');
  1518. if (!in_array('['.$v['id'].']',$depId)){
  1519. $dep[$k]['publicPercent'] = 0;
  1520. }
  1521. }
  1522. }
  1523. }
  1524. //计算用电
  1525. $publicDevice = $this->monthDeviceElectricityData2($month);
  1526. foreach ($dep as $k => $v){
  1527. $address = json_decode($v['address'], true);
  1528. $dep[$k]['floor1'] = $floor[$address[0][1]];
  1529. $dep[$k]['floor2'] = $floor[$address[0][2]];
  1530. $total = 0;
  1531. foreach ($device as $k2 => $v2){
  1532. foreach ($publicDevice as $k3 => $v3){
  1533. if ($k2 == $v3['type_e']){
  1534. $dep[$k]['data'][$k2] = $v3['total'] * $v['publicPercent'];
  1535. $total += $dep[$k]['data'][$k2];
  1536. }
  1537. }
  1538. }
  1539. $dep[$k]['total'] = $total;
  1540. }
  1541. return ['data'=>$dep,'device'=>$device];
  1542. }
  1543. public function monthDeviceElectricityData2($month)
  1544. {
  1545. $month = date('Ym',strtotime($month));
  1546. $lastMonth = date('Ym', strtotime('-1 month', strtotime($month)));
  1547. $map[] = ['del','=',0];
  1548. $map[] = ['org_id','=',$this->orgId];
  1549. $list = Db::name('energy_device_electricity')
  1550. ->field('name,number,type_e')
  1551. ->where($map)
  1552. ->where('enable',1)
  1553. ->select();
  1554. $device = array();
  1555. foreach ($list as $item) {
  1556. // 检查是否已经为该type_e创建了组
  1557. if (!isset($device[$item['type_e']])) {
  1558. $device[$item['type_e']] = array($item);
  1559. } else {
  1560. $device[$item['type_e']][] = $item;
  1561. }
  1562. }
  1563. foreach ($device as $k => $v){
  1564. $device[$k] = array_values($v);
  1565. }
  1566. // foreach ($device as $k=>$v){
  1567. // foreach ($v as $k2=>$v2){
  1568. // $re = Db::name('energy_device_electricity_record')
  1569. // ->field('sn,degree,rate,read_yyyymm')
  1570. // ->where($map)
  1571. // ->where('read_yyyymm',$month)
  1572. // ->where('sn',$v2['number'])
  1573. // ->find();
  1574. //
  1575. // $re2 = Db::name('energy_device_electricity_record')
  1576. // ->field('sn,degree')
  1577. // ->where($map)
  1578. // ->where('read_yyyymm',$lastMonth)
  1579. // ->where('sn',$v2['number'])
  1580. // ->find();
  1581. // if (isset($re['sn'])){
  1582. // $device[$k][$k2]['rate'] = $re['rate'];
  1583. // }
  1584. // if ($re['degree']){
  1585. // $re['real_degree'] =($re['degree'] - $re2['degree']) * $re['rate'];
  1586. // }
  1587. //
  1588. // $device[$k][$k2]['data'] = $re;
  1589. // }
  1590. // }
  1591. $allNumbers = [];
  1592. foreach ($device as $group) {
  1593. foreach ($group as $item) {
  1594. if (!empty($item['number'])) {
  1595. $allNumbers[] = $item['number'];
  1596. }
  1597. }
  1598. }
  1599. // 去重并确保有设备需要查询
  1600. $allNumbers = array_unique(array_filter($allNumbers));
  1601. if (!empty($allNumbers)) {
  1602. // 批量查询当月记录
  1603. $currentRecordsData = Db::name('energy_device_electricity_record')
  1604. ->field('sn,degree,rate,read_yyyymm')
  1605. ->where($map)
  1606. ->where('read_yyyymm', $month)
  1607. ->whereIn('sn', $allNumbers)
  1608. ->select();
  1609. // 转换为以sn为键的数组
  1610. $currentRecords = [];
  1611. foreach ($currentRecordsData as $record) {
  1612. $currentRecords[$record['sn']] = $record;
  1613. }
  1614. // 批量查询上月记录
  1615. $lastRecordsData = Db::name('energy_device_electricity_record')
  1616. ->field('sn,degree')
  1617. ->where($map)
  1618. ->where('read_yyyymm', $lastMonth)
  1619. ->whereIn('sn', $allNumbers)
  1620. ->select();
  1621. // 转换为以sn为键的数组
  1622. $lastRecords = [];
  1623. foreach ($lastRecordsData as $record) {
  1624. $lastRecords[$record['sn']] = $record;
  1625. }
  1626. // 处理数据
  1627. foreach ($device as &$group) {
  1628. foreach ($group as &$item) {
  1629. $sn = $item['number'] ?? null;
  1630. if (!$sn) continue;
  1631. $currentRecord = $currentRecords[$sn] ?? null;
  1632. if (!$currentRecord) {
  1633. $item['data'] = [
  1634. 'sn' => $sn,
  1635. 'degree' => 0,
  1636. 'rate' => 1,
  1637. 'read_yyyymm' => $month,
  1638. 'real_degree' => 0
  1639. ];
  1640. continue;
  1641. }
  1642. // 确保数据类型正确
  1643. $currentDegree = (float)$currentRecord['degree'];
  1644. $currentRate = (float)($currentRecord['rate'] ?? 1);
  1645. $lastDegree = isset($lastRecords[$sn]['degree']) ? (float)$lastRecords[$sn]['degree'] : 0;
  1646. // 计算实际度数(当前度数 - 上月度数)× 倍率
  1647. $realDegree = ($currentDegree - $lastDegree) * $currentRate;
  1648. // 更新记录
  1649. $item['rate'] = $currentRate;
  1650. $item['data'] = array_merge($currentRecord, [
  1651. 'real_degree' => max(0, $realDegree) // 确保不为负数
  1652. ]);
  1653. }
  1654. }
  1655. unset($group, $item);
  1656. }
  1657. // 收集所有设备编号
  1658. foreach ($device as $k=>$v){
  1659. $count = 0;
  1660. foreach ($v as $k2=>$v2){
  1661. $count += $v2['data']['real_degree']?$v2['data']['real_degree']:0;
  1662. $device[$k][0]['total'] = $count;
  1663. }
  1664. }
  1665. foreach ($device as $k=>$v){
  1666. $device[$k] = ['type_e'=>$v[0]['type_e'],'total'=>$v[0]['total']];
  1667. }
  1668. return $device;
  1669. }
  1670. /**
  1671. * 科室公用水量分摊
  1672. */
  1673. public function publicDepWater()
  1674. {
  1675. $month = input('start',date('Y-m'));
  1676. $type = input('type','0');
  1677. $data = $this->publicDepWaterData($month,$type);
  1678. $this->assign('data',$data);
  1679. $this->assign('type',$type);
  1680. $this->assign('start',$month);
  1681. return $this->fetch();
  1682. }
  1683. public function publicDepWaterData($month,$type)
  1684. {
  1685. $data = $this->monthDepWaterData($month);
  1686. $date = date('n',strtotime($month))-1;
  1687. $waterData = $this->dailyWaterData($month);
  1688. $depTotalDegree = $waterData['total'];//医院月总用水量
  1689. $totalDegree = 0;//科室月冷热水总量
  1690. $e = [];//能耗占比
  1691. $totalArea = Db::name('energy_area')
  1692. ->where('org_id',$this->orgId)
  1693. ->where('pid',0)
  1694. ->where('del',0)
  1695. ->where('enable',1)
  1696. ->sum('area'); //医院总面积
  1697. $depArea = Db::name('energy_dep')
  1698. ->where('org_id',$this->orgId)
  1699. ->column('area', 'id'); //科室面积
  1700. $dep = Db::name('energy_dep')
  1701. ->where('org_id',$this->orgId)
  1702. ->where('del',0)
  1703. ->where('enable',1)
  1704. ->select(); //医院总面积
  1705. $addressInfo = Db::name('energy_area')
  1706. ->where('org_id',$this->orgId)
  1707. ->where('del',0)
  1708. ->where('enable',1)
  1709. ->column('title','id'); //医院总面积
  1710. foreach ($dep as $k=>$v){
  1711. $totalWater = [];
  1712. foreach ($data as $k2=>$v2){
  1713. $id = explode(',',$v2[0]['dep']);
  1714. if ($v['id'] == $id[0]){
  1715. $totalWater = $v2['totalCold'][$date]+$v2['totalHotIn'][$date]-$v2['totalHotReturn'][$date];
  1716. $dep[$k]['water'] = $totalWater;
  1717. $dep[$k]['floor1'] = $v2[0]['info']['floor1'];
  1718. $dep[$k]['floor2'] = $v2[0]['info']['floor2'];
  1719. }
  1720. }
  1721. }
  1722. foreach ($dep as $k=>$v){
  1723. if (!isset($v['water'])){
  1724. $address = json_decode($v['address'],true);
  1725. $dep[$k]['water'] = 0;
  1726. $dep[$k]['floor1'] = $addressInfo[$address[0][1]];
  1727. $dep[$k]['floor2'] = $addressInfo[$address[0][2]];
  1728. }
  1729. $totalDegree += isset($v['water']) ? $v['water'] : 0;
  1730. }
  1731. foreach ($dep as $k=>$v){
  1732. $area = $totalArea;//医院面积
  1733. $depId = $v['id'];
  1734. $area2 = $depArea[$depId];//科室面积
  1735. $percent = sprintf('%.3f',$area2/$area);//面积占比
  1736. $dep[$k]['publicPercent'] = $percent;
  1737. $dep[$k]['splitDegree'] =($depTotalDegree-$totalDegree)*$percent;//分摊水量
  1738. if ($type == '1'){
  1739. $e = $this->ElectricitySplit($month);
  1740. $result = [];
  1741. foreach ($e as $item) {
  1742. $depKey = trim($item['dep']); // 去掉空格以确保匹配
  1743. if (!isset($result[$depKey])) {
  1744. $result[$depKey] = [
  1745. "dep" => $depKey,
  1746. "percent" => (float)$item['percent'], // 转换为浮点数
  1747. ];
  1748. } else {
  1749. $result[$depKey]['percent'] += (float)$item['percent'];
  1750. }
  1751. }
  1752. $finalResult = array_values($result);
  1753. foreach($dep as $k => $v){
  1754. foreach($finalResult as $k2 => $v2){
  1755. $id = explode(',',$v2['dep']);
  1756. if ($v['id'] == $id[0] ) {
  1757. $dep[$k]['publicPercent'] = $v2['percent'];
  1758. $dep[$k]['splitDegree'] =($depTotalDegree-$totalDegree)*$v2['percent'];//分摊水量
  1759. }
  1760. $depIds = array_column($e,'dep');
  1761. if (!in_array('['.$v['id'].']',$depIds)){
  1762. $dep[$k]['publicPercent'] = 0;
  1763. $dep[$k]['splitDegree'] = 0;
  1764. }
  1765. }
  1766. }
  1767. }
  1768. }
  1769. return $dep ;
  1770. }
  1771. /**
  1772. * 科室水电总使用量
  1773. */
  1774. public function publicDepTotal()
  1775. {
  1776. $month = input('start',date('Y'));
  1777. for ($i = 1; $i < 13; $i++) {
  1778. $monthList[] = $i.'月份';
  1779. }
  1780. $type = input('type','0');
  1781. $data = $this->publicDepTotalData($month,$type);
  1782. $this->assign('monthList', $monthList);
  1783. $this->assign('data', $data);
  1784. $this->assign('type',$type);
  1785. $this->assign('start',$month);
  1786. return $this->fetch();
  1787. }
  1788. public function publicDepTotalData($month,$type)
  1789. {
  1790. $dep = Db::name('energy_dep')
  1791. ->field('id,name,address')
  1792. ->where('org_id',$this->orgId)
  1793. ->where('del',0)
  1794. ->where('enable',1)
  1795. ->select();
  1796. if (empty($dep)){
  1797. return [];
  1798. }
  1799. $totalWaterData = $this->monthDepWaterData($month);
  1800. $totalElectricityData = $this->monthDepElectricityData($month);
  1801. $totalElectricityData = $totalElectricityData['data'];
  1802. foreach ($dep as $k=>$v){
  1803. $totalWater = [];
  1804. foreach ($totalWaterData as $k2=>$v2){ //计算合计水量
  1805. $id = explode(',',$v2[0]['dep']);
  1806. if ($v['id'] == $id[0]){
  1807. foreach ($v2['totalCold'] as $k3=>$v3){
  1808. $totalWater[] = $v2['totalCold'][$k3]+$v2['totalHotIn'][$k3]-$v2['totalHotReturn'][$k3];
  1809. }
  1810. $dep[$k]['water'] = $totalWater;
  1811. }
  1812. }
  1813. }
  1814. //计算分摊水量
  1815. $splitWaterData = $this->splitWaterData($month,$type);
  1816. foreach ($dep as $k=>$v){
  1817. foreach ($splitWaterData as $k2=>$v2){
  1818. if (isset($v2[0]['dep'])){
  1819. $id = explode(',',$v2[0]['dep']);
  1820. if ($v['id'] == $id[0]){
  1821. $dep[$k]['splitWater'] = $v2['splitDegree'];
  1822. }
  1823. }
  1824. }
  1825. }
  1826. foreach ($dep as $k=>$v){ //计算合并电量
  1827. $totalElectricity = [];
  1828. foreach ($totalElectricityData as $k2=>$v2){ //计算合计水量
  1829. $id = explode(',',$v2[0]['dep']);
  1830. if ($v['id'] == $id[0]){
  1831. $dep[$k]['electricity'][] = $v2[0]['data'];
  1832. }
  1833. }
  1834. }
  1835. foreach ($dep as $k=>$v){//处理上面合计电量数据
  1836. if (isset($v['electricity'])){
  1837. if (count($v['electricity']) == 1){
  1838. foreach ($v['electricity'][0] as $k2=>$v2){
  1839. $dep[$k]['electricity'][$k2] = $v2['total'];
  1840. }
  1841. }else{
  1842. $sumArray = [];
  1843. $groups = $v['electricity'];
  1844. foreach ($groups as $group) {
  1845. foreach (array_keys($group) as $key) {
  1846. if (!is_numeric($key)) {
  1847. continue;
  1848. }
  1849. if (isset($sumArray[$key])) {
  1850. if ($sumArray[$key]['total'] === null) {
  1851. $sumArray[$key]['total'] = 0;
  1852. }
  1853. $sumArray[$key]['total'] += $group[$key]['total'];
  1854. } else {
  1855. $sumArray[$key] = ['total' => $group[$key]['total']];
  1856. }
  1857. }
  1858. $total = array_map(function($item) {
  1859. return $item['total'];
  1860. }, $sumArray);
  1861. $dep[$k]['electricity']= $total;
  1862. }
  1863. }
  1864. }
  1865. }
  1866. //计算分摊电量
  1867. $splitElectricityData = $this->publicDepElectricityData2($month,$type);
  1868. foreach ($dep as $k => $v){
  1869. foreach ($splitElectricityData as $k2=>$v2){
  1870. if ($v['id'] == $v2['id']) {
  1871. $dep[$k]['splitElectricity'] = $v2['data'];
  1872. }
  1873. }
  1874. }
  1875. //计算总计水量
  1876. foreach ($dep as $k=>$v){
  1877. $totalWater = 0;
  1878. $totalElectricity = 0;
  1879. for ($i = 0; $i < 12; $i++) {
  1880. $water = isset($v['water'])?$v['water'][$i]:0;
  1881. $splitWater = isset($v['splitWater'])?$v['splitWater'][$i]:0;
  1882. $totalWater += $water+$splitWater;
  1883. $electricity = isset($v['electricity'])?$v['electricity'][$i]:0;
  1884. $splitElectricity= isset($v['splitElectricity'])?$v['splitElectricity'][$i]:0;
  1885. $totalElectricity += $electricity+$splitElectricity;
  1886. }
  1887. $dep[$k]['totalWater'] = $totalWater;
  1888. $dep[$k]['totalElectricity'] = $totalElectricity;
  1889. }
  1890. return $dep;
  1891. }
  1892. /**
  1893. * 科室水电总量——分摊水量
  1894. */
  1895. public function splitWaterData($month,$type)
  1896. {
  1897. $data = $this->monthDepWaterData($month);
  1898. for ($i = 1; $i < 13; $i++) {
  1899. if ($i<10){
  1900. $date[] =$month.'-0'.$i;
  1901. }else{
  1902. $date[] =$month.'-'.$i;
  1903. }
  1904. }
  1905. foreach ($date as $k=>$v){
  1906. $waterData = $this->dailyWaterData($v);
  1907. $depTotalDegree[] = $waterData['total'];//医院月总用水量
  1908. }
  1909. $e = [];//能耗占比
  1910. $totalArea = Db::name('energy_area')
  1911. ->where('org_id',$this->orgId)
  1912. ->where('pid',0)
  1913. ->where('del',0)
  1914. ->where('enable',1)
  1915. ->sum('area'); //医院总面积
  1916. $depArea = Db::name('energy_dep')
  1917. ->where('org_id',$this->orgId)
  1918. ->column('area', 'id'); //科室面积
  1919. for ($i=0;$i<12;$i++){
  1920. $totalDegree = 0;
  1921. foreach ($data as $k=>$v){
  1922. if (isset($v['totalCold']) && isset($v['totalHotIn']) && isset($v['totalHotReturn'])){
  1923. $totalDegree += $v['totalCold'][$i]+($v['totalHotIn'][$i]-$v['totalHotReturn'][$i]);
  1924. }
  1925. }
  1926. $data[0]['totalDegree'][] = $totalDegree;
  1927. }
  1928. //去掉多余数据
  1929. foreach ($data as $k=>$v){
  1930. foreach ($v as $k2=>$v2){
  1931. if ($k2 != 0 || $k2 != 'totalDegree'){
  1932. unset($data[$k][$k2]);
  1933. }
  1934. }
  1935. if (isset($v[0]['dep'])){
  1936. $area = $totalArea;//医院面积
  1937. $d = explode(',',$v[0]['dep']);
  1938. $dep = $d[0];
  1939. $area2 = $depArea[$dep];//科室面积
  1940. $percent = sprintf('%.2f',$area2/$area);//面积占比
  1941. foreach ($data[0]['totalDegree'] as $k3=>$v3){
  1942. $data[$k]['splitDegree'][$k3] =($depTotalDegree[$k3]-$data[0]['totalDegree'][$k3])*$percent;//分摊水量
  1943. }
  1944. if ($type == '1'){
  1945. $e = $this->ElectricitySplit2($month);
  1946. foreach($data as $k => $v){
  1947. foreach($e as $k2 => $v2){
  1948. if ( $v[0]['dep'] == $v2[0]['dep'] ) {
  1949. foreach ($data[0]['totalDegree'] as $k3=>$v3){
  1950. $data[$k]['splitDegree'][$k3] =($depTotalDegree[$k3]-$data[0]['totalDegree'][$k3])*$v2[$k3]['percent'];//分摊水量
  1951. }
  1952. }
  1953. }
  1954. }
  1955. }
  1956. }
  1957. }
  1958. return $data ;
  1959. }
  1960. //对取到的数据进行整理,根据地址和科室进行分类整合
  1961. public function getNewList($list,$flag=0)
  1962. {
  1963. //根据number进行分组
  1964. $grouped_array = [];
  1965. foreach ($list as $group) {
  1966. foreach ($group as $item) {
  1967. $number = $item['number'];
  1968. // 如果这个number还没有分组,则创建一个新的分组
  1969. if (!isset($grouped_array[$number])) {
  1970. $grouped_array[$number] = [];
  1971. }
  1972. // 添加元素到对应的分组
  1973. $grouped_array[$number][] = $item;
  1974. }
  1975. }
  1976. $grouped_array = array_values($grouped_array);
  1977. //分配比例
  1978. foreach ($grouped_array as $k => $v){
  1979. if (count($v)>1){
  1980. $index = 0;
  1981. foreach ($v as $k2=>$v2){
  1982. if ($v2['share'] == 1){ //按比例分摊
  1983. $dep = explode(',',$v2['dep']);
  1984. $percent = explode(':',$v2['percent']);
  1985. $m = array_sum($percent);//分母
  1986. $p = sprintf("%.2f", $percent[$index]/$m);
  1987. $grouped_array[$k][$k2]['percent'] = $p ;
  1988. $grouped_array[$k][$k2]['dep'] = $dep[$index] ;
  1989. }
  1990. if ((string)$v2['share'] == '0' ){ //按面积分摊
  1991. $dep = explode(',',$v2['dep']);
  1992. $areas = Db::name('energy_dep')->where('id', 'in', $dep)->column('area', 'id');
  1993. $m = array_sum(array_values($areas));//分母
  1994. $area = $areas[$dep[$index]];
  1995. $p = sprintf("%.2f", $area/$m);
  1996. $grouped_array[$k][$k2]['percent'] = $p ;
  1997. $grouped_array[$k][$k2]['dep'] = $dep[$index] ;
  1998. }
  1999. $index++;
  2000. }
  2001. }
  2002. }
  2003. $otherArrays = array_slice($grouped_array, 1);
  2004. $list = array_merge($grouped_array[0], ...$otherArrays);
  2005. $list2 = [];
  2006. foreach ($list as $item) {
  2007. // 创建组合键
  2008. if ($flag ==1){//设备电表
  2009. $combinedKey = $item['address'] . '|' . $item['name'];
  2010. }else{
  2011. $combinedKey = $item['address'] . '|' . $item['dep'];
  2012. }
  2013. if (!isset($list2[$combinedKey])) {
  2014. $list2[$combinedKey] = [];
  2015. }
  2016. $list2[$combinedKey][] = $item;
  2017. }
  2018. $list2 = array_values($list2);
  2019. $newList = [];
  2020. foreach ($list2 as $subArray) {
  2021. $processedSubArray = []; // 用于存储当前子数组处理后的结果
  2022. $seen = []; // 用于记录已经见过的组合
  2023. foreach ($subArray as $item) {
  2024. $dep = explode(',',$item['dep']);
  2025. $uniqueKey = $item['number'] . '|' . implode(',', $dep);
  2026. if (!isset($seen[$uniqueKey])) {
  2027. $processedSubArray[] = $item;
  2028. $seen[$uniqueKey] = true;
  2029. }
  2030. }
  2031. $newList[] = $processedSubArray;
  2032. }
  2033. return $newList;
  2034. }
  2035. //拆分电表,存在问题
  2036. public function split($newList,$degrees,$table)
  2037. {
  2038. foreach ($newList as $k => $v) {
  2039. foreach ($v as $k2 => $v2) {
  2040. if ($v2['split']) {
  2041. $split = explode(',', $v2['split']);
  2042. $info = Db::name($table)->field('number,split')->where('id', 'in', $split)->select();
  2043. foreach ($v2['data'] as $k4 => $v4) {
  2044. foreach ($info as $value) {
  2045. if (isset($v4['real_degree'])) {
  2046. $newList[$k][$k2]['data'][$k4]['real_degree'] -= $degrees[$value['number']][$k4];
  2047. }
  2048. }
  2049. }
  2050. }
  2051. }
  2052. }
  2053. return $newList;
  2054. }
  2055. /**
  2056. * 能耗占比计算
  2057. */
  2058. public function ElectricitySplit($month)
  2059. {
  2060. $data2 = $this->monthDepElectricityData($month);
  2061. $data2 = $data2['data'];
  2062. $date = date('n',strtotime($month))-1;
  2063. $depTotalDegree2 = 0;//所有科室月总用电量
  2064. foreach ($data2 as $k=>$v){
  2065. $data2[$k][0]['totalDegree'] = $v[0]['data'][$date]['total'];//科室月度电量
  2066. $depTotalDegree2 += $data2[$k][0]['totalDegree'];
  2067. }
  2068. foreach ($data2 as $k=>$v){
  2069. foreach ($v as $k2=>$v2){
  2070. if ($k2 != 0 || $k2 != 'totalDegree'){
  2071. unset($data2[$k][$k2]);
  2072. }
  2073. if ($k2 == 0){
  2074. unset($data2[$k][0]['rate']);
  2075. unset($data2[$k][0]['data']);
  2076. }
  2077. }
  2078. $percent = $depTotalDegree2>0?sprintf('%.3f',$data2[$k][0]['totalDegree']/$depTotalDegree2):0;//科室能耗占比
  2079. $data2[$k][0]['publicPercent'] = $percent;
  2080. $e[] = ['address'=>$data2[$k][0]['address'],'dep'=>$data2[$k][0]['dep'],'percent'=>$data2[$k][0]['publicPercent']];
  2081. }
  2082. return $e;
  2083. }
  2084. //按年计算
  2085. public function ElectricitySplit2($month)
  2086. {
  2087. $data2 = $this->monthDepElectricityData($month);
  2088. $data2 = $data2['data'];
  2089. for ($i=0;$i<12;$i++){
  2090. $total = 0;
  2091. foreach ($data2 as $k=>$v){
  2092. $depDegree2 = 0;
  2093. $depDegree2 += $v[0]['data'][$i]['total'];//科室月度电量
  2094. $total+=$depDegree2;
  2095. $data2[$k][0]['depDegree'][$i] = $depDegree2;
  2096. }
  2097. $totalDegree[$i] = $total;//每个月所有科室总用电
  2098. }
  2099. //合并相同科室,地址不同数据
  2100. $result = array();
  2101. $depSums = array();
  2102. $processedDeps = array();
  2103. foreach ($data2 as $group) {
  2104. $dep = $group[0]['dep'];
  2105. $depDegree = $group[0]['depDegree'];
  2106. // 如果是第一次处理这个dep,初始化累加器
  2107. if (!isset($processedDeps[$dep])) {
  2108. $processedDeps[$dep] = true;
  2109. $depSums[$dep] = $depDegree;
  2110. $result[] = array($group[0]); // 将第一组添加到结果中
  2111. } else {
  2112. // 累加depDegree的对应索引值
  2113. foreach ($depDegree as $key => $value) {
  2114. $depSums[$dep][$key] += $value;
  2115. }
  2116. }
  2117. }
  2118. foreach ($result as $key => $value) {
  2119. $dep = $value[0]['dep'];
  2120. $result[$key][0]['depDegree'] = $depSums[$dep];
  2121. }
  2122. foreach ($result as $k => $v) {
  2123. for ($i=0;$i<12;$i++) {
  2124. $percent = $totalDegree[$i] >0 ?sprintf('%.3f', $result[$k][0]['depDegree'][$i] / $totalDegree[$i]):0;//科室能耗占比
  2125. $e[$k][$i] = ['dep' => $result[$k][0]['dep'], 'percent' => $percent,'total' =>$result[$k][0]['depDegree'][$i]];
  2126. }
  2127. }
  2128. return $e;
  2129. }
  2130. public function publicDepElectricityData2($month,$type)
  2131. {
  2132. $map['del'] = 0;
  2133. $map['enable'] = 1;
  2134. $map['org_id'] = $this->orgId;
  2135. $totalArea = Db::name('energy_area')
  2136. ->where($map)
  2137. ->where('pid',0)
  2138. ->sum('area'); //医院总面积
  2139. $dep = Db::name('energy_dep')
  2140. ->where($map)
  2141. ->Field('id,name,area,address,percent')
  2142. ->select();
  2143. foreach ($dep as $k => $v){
  2144. substr($dep[$k]['address'],1,strlen($dep[$k]['address'])-2);
  2145. $percent = sprintf('%.3f',$dep[$k]['area']/$totalArea);//面积占比
  2146. $dep[$k]['publicPercent'] = $percent;
  2147. if ($type == '1'){
  2148. $e = $this->ElectricitySplit2($month);
  2149. foreach($e as $k2 => $v2){
  2150. $id = explode(',',$v2[0]['dep']);
  2151. if ((string) $v['id'] == $id[0] ) {
  2152. $dep[$k]['publicPercent'] = $v2;
  2153. }
  2154. }
  2155. }
  2156. }
  2157. $publicDevice = $this->monthDeviceElectricityData($month);
  2158. for ($i=0;$i<12;$i++){
  2159. $totalDegree = 0;//每个月总用电量
  2160. foreach ($publicDevice as $k=>$v){
  2161. $totalDegree += $v[0]['data'][$i]['total'];
  2162. }
  2163. $total[$i] = $totalDegree;
  2164. }
  2165. foreach ($dep as $k=>$v){
  2166. foreach ($total as $k2=>$v2){
  2167. if ($type == '1'){
  2168. if (is_array($dep[$k]['publicPercent'])){
  2169. $dep[$k]['data'][$k2] = $dep[$k]['publicPercent'][$k2]['percent']*$v2;
  2170. }else{
  2171. $dep[$k]['data'][$k2] = 0;
  2172. }
  2173. }else{
  2174. $dep[$k]['data'][$k2] = $v['publicPercent']*$v2;
  2175. }
  2176. }
  2177. }
  2178. return $dep;
  2179. }
  2180. }