EnergyStatisticsOld.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. <?php
  2. namespace app\admin\controller;
  3. use think\Db;
  4. class EnergyStatisticsOld extends Auth
  5. {
  6. //医院每日用电电统计
  7. public function dailyElectricity()
  8. {
  9. $month = input('start',date('Y-m'));
  10. $data = $this->dailyElectricityData($month);
  11. $this->assign('data',$data['res']);
  12. $this->assign('count',$data['count']);
  13. $this->assign('totalData',$data['total']);
  14. $this->assign('start',$month);
  15. $this->assign('date',date('Y年m月',strtotime($month)));
  16. return $this->fetch();
  17. }
  18. public function dailyElectricityData($month){
  19. $dep = getDay(strtotime($month));
  20. $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
  21. $map[] = ['del','=',0];
  22. $map[] = ['org_id','=',$this->orgId];
  23. $sn = Db::name('energy_electricity')
  24. ->where($map)
  25. ->where('enable',1)
  26. ->where('parent_id',0)
  27. ->column('number');
  28. $res = [];
  29. $total = 0;
  30. foreach ($dep as $k=>$v){
  31. $degree = 0;
  32. foreach ($sn as $kk =>$vv){
  33. $row = Db::name('energy_electricity_record')
  34. ->where($map)
  35. ->where('read_yyyymmdd',$v)
  36. ->where('sn',$vv)
  37. ->field('sn,rate,degree')
  38. ->find();
  39. $res[$k][$kk] = $row;
  40. if ($k > 0 && !empty($row)){
  41. // $res[$k][$kk]['real_degree'] = number_format(($res[$k][$kk]['degree'] - $res[$k-1][$kk]['degree']) * $res[$k][$kk]['rate'],2,'.','');
  42. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($res[$k][$kk]['degree'] - $res[$k-1][$kk]['degree']) * $res[$k][$kk]['rate']);
  43. $degree += $res[$k][$kk]['real_degree'];
  44. }
  45. if($k == 0){
  46. $row2= Db::name('energy_electricity_record')
  47. ->where($map)
  48. ->where('read_yyyymmdd',$lastDayOfLastMonth)
  49. ->where('sn',$vv)
  50. ->field('sn,rate,degree')
  51. ->find();
  52. // $row2['degree'] = isset($row2['degree'])?$row2['degree']:0;
  53. //$res[$k][$kk]['real_degree'] = number_format(($res[$k][$kk]['degree'] - $row2['degree']) * $res[$k][$kk]['rate'],2,'.','');
  54. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($res[$k][$kk]['degree'] - $row2['degree']) * $res[$k][$kk]['rate']);
  55. $degree += $res[$k][$kk]['real_degree'];
  56. }
  57. }
  58. $res[$k]['total'] = sprintf('%.2f',$degree);
  59. $total+=$degree;
  60. }
  61. $total = sprintf('%.2f',$total);
  62. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  63. }
  64. //科室月电度统计
  65. public function monthDepElectricity()
  66. {
  67. $month = input('start', date('Y'));
  68. for ($i = 1; $i < 13; $i++) {
  69. $monthList[] = $i.'月份';
  70. }
  71. $data = $this->monthDepElectricityData($month);
  72. $this->assign('data', $data);
  73. $this->assign('monthList', $monthList);
  74. $this->assign('start', $month);
  75. // halt($data);
  76. return $this->fetch();
  77. }
  78. public function monthDepElectricityData($month)
  79. {
  80. $month = $month.'0101';
  81. for ($i = 1; $i < 13; $i++) {
  82. if ($i<10){
  83. $date[] = date('Y'.'0'.$i,strtotime($month));
  84. if ($i==1){
  85. $time = strtotime($date[0].'01');
  86. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  87. }else{
  88. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  89. }
  90. }else{
  91. $date[] = date('Y'.$i,strtotime($month));
  92. if ($i==10){
  93. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  94. }else{
  95. $lastDate[] = date('Y'.($i-1),strtotime($month));
  96. }
  97. }
  98. }
  99. $map[] = ['del','=',0];
  100. $map[] = ['org_id','=',$this->orgId];
  101. $list = [];
  102. $dep = Db::name('energy_dep')
  103. ->where($map)
  104. ->where('enable',1)
  105. ->field('id,name,area,address')
  106. ->select();
  107. // halt($dep);
  108. foreach ($dep as $item){
  109. $re = Db::name('energy_electricity')
  110. ->Where($map)
  111. ->where('enable',1)
  112. ->Where('dep','like','%'.$item['id'].'%')
  113. ->select();
  114. if(!empty($re)){
  115. $list[] = $re;
  116. }
  117. }
  118. $newList = $this->getNewList($list);
  119. foreach ($newList as $k => $v){
  120. foreach ($v as $k2=>$v2){
  121. $address = json_decode($v2['address']);
  122. $dep_id = json_decode($v2['dep']);
  123. $newList[$k][$k2]['info']['floor1'] = Db::name('energy_area')->where('id',$address[1])->value('title');
  124. $newList[$k][$k2]['info']['floor2'] = Db::name('energy_area')->where('id',$address[2])->value('title');
  125. $newList[$k][$k2]['info']['dep'] = Db::name('energy_dep')->where('id',$dep_id[0])->value('name');
  126. $newList[$k][$k2]['info']['type'] = Db::name('energy_sort')->where('id',$v2['type_e'])->value('name');
  127. foreach ($date as $k3=>$v3){
  128. $re = Db::name('energy_electricity_record')
  129. ->field('sn,degree,rate,read_yyyymm')
  130. ->where($map)
  131. ->where('read_yyyymm',$v3)
  132. ->where('sn',$v2['number'])
  133. ->find();
  134. $re2 = Db::name('energy_electricity_record')
  135. ->field('sn,degree')
  136. ->where($map)
  137. ->where('read_yyyymm',$lastDate[$k3])
  138. ->where('sn',$v2['number'])
  139. ->find();
  140. if (isset($re['sn'])){
  141. $newList[$k][$k2]['rate'] = $re['rate'];
  142. }
  143. if ($re['degree']){
  144. if ($v2['share'] == 1 || (string)$v2['share'] == '0'){
  145. $re['real_degree'] = ($re['degree'] - $re2['degree']) * $re['rate'] * $v2['percent'];
  146. }else{
  147. $re['real_degree'] =($re['degree'] - $re2['degree']) * $re['rate'];
  148. }
  149. }
  150. $newList[$k][$k2]['data'][] = $re;
  151. }
  152. }
  153. }
  154. foreach ($date as $k=>$v){
  155. for($i =0;$i<count($newList);$i++){
  156. $count = 0;
  157. foreach ($newList[$i] as $k2=>$v2){
  158. $count += $v2['data'][$k]['real_degree']?$v2['data'][$k]['real_degree']:0;
  159. $total[$i][$k]=$count;
  160. }
  161. }
  162. }
  163. foreach ($total as $k=>$v){
  164. foreach ($v as $k2=>$v2){
  165. $newList[$k][0]['data'][$k2]['total']=$v2;
  166. }
  167. }
  168. return $newList;
  169. }
  170. //医院每日用水统计
  171. public function dailyWater()
  172. {
  173. $month = input('start',date('Y-m'));
  174. $data = $this->dailyWaterData($month);
  175. $this->assign('data',$data['res']);
  176. $this->assign('count',$data['count']);
  177. $this->assign('totalData',$data['total']);
  178. $this->assign('start',$month);
  179. $this->assign('date',date('Y年m月',strtotime($month)));
  180. return $this->fetch();
  181. }
  182. public function dailyWaterData($month){
  183. $dep = getDay(strtotime($month));
  184. $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
  185. $map[] = ['del','=',0];
  186. $map[] = ['org_id','=',$this->orgId];
  187. $sn = Db::name('energy_water')
  188. ->where($map)
  189. ->where('enable',1)
  190. ->where('parent_id',0)
  191. ->column('number');
  192. $res = [];
  193. $total = 0;
  194. foreach ($dep as $k=>$v){
  195. $degree = 0;
  196. foreach ($sn as $kk =>$vv){
  197. $row = Db::name('energy_water_record')
  198. ->where($map)
  199. ->where('read_yyyymmdd',$v)
  200. ->where('sn',$vv)
  201. ->field('sn,degree')
  202. ->find();
  203. $res[$k][$kk] = $row;
  204. if ($k > 0 && !empty($row)){
  205. // $res[$k][$kk]['real_degree'] = number_format(($res[$k][$kk]['degree'] - $res[$k-1][$kk]['degree']) ,2,'.','');
  206. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($res[$k][$kk]['degree'] - $res[$k-1][$kk]['degree']));
  207. $degree += $res[$k][$kk]['real_degree'];
  208. }
  209. if($k == 0){
  210. $row2= Db::name('energy_water_record')
  211. ->where($map)
  212. ->where('read_yyyymmdd',$lastDayOfLastMonth)
  213. ->where('sn',$vv)
  214. ->field('sn,degree')
  215. ->find();
  216. // $row2['degree'] = isset($row2['degree'])?$row2['degree']:0;
  217. //$res[$k][$kk]['real_degree'] = number_format(($res[$k][$kk]['degree'] - $row2['degree']) ,2,'.','');
  218. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($res[$k][$kk]['degree'] - $row2['degree']));
  219. $degree += $res[$k][$kk]['real_degree'];
  220. }
  221. }
  222. $res[$k]['total'] = sprintf('%.2f',$degree);
  223. $total+=$degree;
  224. }
  225. $total = sprintf('%.2f',$total);
  226. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  227. }
  228. //科室月冷热水量统计
  229. public function monthDepWater()
  230. {
  231. $month = input('start', date('Y'));
  232. for ($i = 1; $i < 13; $i++) {
  233. $monthList[] = $i.'月份';
  234. }
  235. $data = $this->monthDepWaterData($month);
  236. $this->assign('data', $data);
  237. $this->assign('monthList', $monthList);
  238. $this->assign('start', $month);
  239. // halt($data);
  240. return $this->fetch();
  241. }
  242. public function monthDepWaterData($month)
  243. {
  244. $month = $month.'0101';
  245. for ($i = 1; $i < 13; $i++) {
  246. if ($i<10){
  247. $date[] = date('Y'.'0'.$i,strtotime($month));
  248. if ($i==1){
  249. $time = strtotime($date[0].'01');
  250. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  251. }else{
  252. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  253. }
  254. }else{
  255. $date[] = date('Y'.$i,strtotime($month));
  256. if ($i==10){
  257. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  258. }else{
  259. $lastDate[] = date('Y'.($i-1),strtotime($month));
  260. }
  261. }
  262. }
  263. $map[] = ['del','=',0];
  264. $map[] = ['org_id','=',$this->orgId];
  265. $list = [];
  266. $dep = Db::name('energy_dep')
  267. ->where($map)
  268. ->where('enable',1)
  269. ->field('id,name,area,address')
  270. ->select();
  271. foreach ($dep as $item){
  272. $re = Db::name('energy_water')
  273. ->Where($map)
  274. ->where('enable',1)
  275. ->Where('dep','like','%'.$item['id'].'%')
  276. ->select();
  277. if(!empty($re)){
  278. $list[] = $re;
  279. }
  280. }
  281. if (empty($list)){
  282. return $list;
  283. }
  284. $newList = $this->getNewList($list);
  285. foreach ($newList as $k => $v){
  286. foreach ($v as $k2=>$v2) {
  287. $address = json_decode($v2['address']);
  288. $dep_id = json_decode($v2['dep']);
  289. $newList[$k][$k2]['info']['floor1'] = Db::name('energy_area')->where('id', $address[1])->value('title');
  290. $newList[$k][$k2]['info']['floor2'] = Db::name('energy_area')->where('id', $address[2])->value('title');
  291. $newList[$k][$k2]['info']['dep'] = Db::name('energy_dep')->where('id', $dep_id[0])->value('name');
  292. if ($v2['type_w'] == 0) {//统计冷水
  293. foreach ($date as $k3 => $v3) {
  294. $re = Db::name('energy_water_record')
  295. ->field('sn,degree,read_yyyymm')
  296. ->where($map)
  297. ->where('read_yyyymm', $v3)
  298. ->where('sn', $v2['number'])
  299. ->find();
  300. $re2 = Db::name('energy_water_record')
  301. ->field('sn,degree')
  302. ->where($map)
  303. ->where('read_yyyymm', $lastDate[$k3])
  304. ->where('sn', $v2['number'])
  305. ->find();
  306. if ($re['degree']) {
  307. if ($v2['share'] == 1 || (string)$v2['share'] == '0'){
  308. $re['cold_degree'] = ($re['degree'] - $re2['degree']) * $v2 ['percent'];
  309. }else{
  310. $re['cold_degree'] = ($re['degree'] - $re2['degree']);
  311. }
  312. }
  313. $newList[$k]['sn'] = $v2['number'];
  314. $newList[$k]['cold'][] = $re;
  315. }
  316. }
  317. if ($v2['type_w'] == 1) {
  318. $hotIn = 0;
  319. foreach ($date as $k4 => $v4) {
  320. $hotIn = Db::name('energy_water_record')
  321. ->field('sn,degree,read_yyyymm')
  322. ->where($map)
  323. ->where('read_yyyymm', $v4)
  324. ->where('sn', $v2['number'])
  325. ->sum('degree');
  326. if ($v2['share'] == 1){
  327. $hotIn = $hotIn*$v2['percent'];
  328. }
  329. $newList[$k]['hotIn'][] = $hotIn;
  330. }
  331. }
  332. if ($v2['type_w'] == 2) {
  333. $hotReturn = 0;
  334. foreach ($date as $k5 => $v5) {
  335. $hotReturn = Db::name('energy_water_record')
  336. ->field('sn,degree,read_yyyymm')
  337. ->where($map)
  338. ->where('read_yyyymm', $v5)
  339. ->where('sn', $v2['number'])
  340. ->sum('degree');
  341. if ($v2['share'] == 1){
  342. $hotReturn = $hotReturn*$v2['percent'];
  343. }
  344. $newList[$k]['hotReturn'][] = $hotReturn;
  345. }
  346. }
  347. }
  348. }
  349. foreach ($newList as $k=> $v){
  350. if (!isset($v['cold'])){
  351. foreach ($date as $k1 => $v1) {
  352. $newList[$k]['cold'][] = 0;
  353. }
  354. }
  355. if (!isset($v['hotIn'])){
  356. foreach ($date as $k1 => $v1) {
  357. $newList[$k]['hotIn'][] = 0;
  358. }
  359. }
  360. if (!isset($v['hotReturn'])){
  361. foreach ($date as $k1 => $v1) {
  362. $newList[$k]['hotReturn'][] = 0;
  363. }
  364. }
  365. }
  366. return $newList;
  367. }
  368. //医院每日燃气用量统计
  369. public function dailyGas()
  370. {
  371. $month = input('start',date('Y-m'));
  372. $data = $this->dailyGasData($month);
  373. $this->assign('data',$data['res']);
  374. $this->assign('count',$data['count']);
  375. $this->assign('totalData',$data['total']);
  376. $this->assign('start',$month);
  377. $this->assign('date',date('Y年m月',strtotime($month)));
  378. return $this->fetch();
  379. }
  380. public function dailyGasData($month){
  381. $dep = getDay(strtotime($month));
  382. $lastDayOfLastMonth = date('Ymd', strtotime("-1 day", strtotime(date("Y-m-01", strtotime($month)))));
  383. $map[] = ['del','=',0];
  384. $map[] = ['org_id','=',$this->orgId];
  385. $sn = Db::name('energy_gas')
  386. ->where($map)
  387. ->where('enable',1)
  388. ->where('parent_id',0)
  389. ->column('number');
  390. $res = [];
  391. $total = 0;
  392. foreach ($dep as $k=>$v){
  393. $degree = 0;
  394. foreach ($sn as $kk =>$vv){
  395. $row = Db::name('energy_gas_record')
  396. ->where($map)
  397. ->where('read_yyyymmdd',$v)
  398. ->where('sn',$vv)
  399. ->field('sn,degree')
  400. ->find();
  401. $res[$k][$kk] = $row;
  402. if ($k > 0 && !empty($row)){
  403. //$res[$k][$kk]['real_degree'] = number_format(($res[$k][$kk]['degree'] - $res[$k-1][$kk]['degree']) ,2,'.','');
  404. $res[$k][$kk]['real_degree'] =sprintf("%.2f", ($res[$k][$kk]['degree'] - $res[$k-1][$kk]['degree'])) ;
  405. $degree += $res[$k][$kk]['real_degree'];
  406. }
  407. if($k == 0){
  408. $row2= Db::name('energy_gas_record')
  409. ->where($map)
  410. ->where('read_yyyymmdd',$lastDayOfLastMonth)
  411. ->where('sn',$vv)
  412. ->field('sn,degree')
  413. ->find();
  414. // $row2['degree'] = isset($row2['degree'])?$row2['degree']:0;
  415. // $res[$k][$kk]['real_degree'] = number_format(($res[$k][$kk]['degree'] - $row2['degree']) ,2,'.','');
  416. $res[$k][$kk]['real_degree'] = sprintf("%.2f", ($res[$k][$kk]['degree'] - $row2['degree']));
  417. $degree += $res[$k][$kk]['real_degree'];
  418. }
  419. }
  420. $res[$k]['total'] = sprintf('%.2f',$degree);
  421. $total+=$degree;
  422. }
  423. $total = sprintf('%.2f',$total);
  424. return ['res'=>$res,'total'=>$total,'count'=>count($sn)];
  425. }
  426. //科室月燃气用量统计
  427. public function monthDepGas()
  428. {
  429. $month = input('start', date('Y'));
  430. for ($i = 1; $i < 13; $i++) {
  431. $monthList[] = $i.'月份';
  432. }
  433. $data = $this->monthDepGasData($month);
  434. $this->assign('data', $data['newList']);
  435. $this->assign('count', $data['count']);
  436. $this->assign('total', $data['total']);
  437. $this->assign('monthList', $monthList);
  438. $this->assign('start', $month);
  439. // halt($data);
  440. return $this->fetch();
  441. }
  442. public function monthDepGasData($month)
  443. {
  444. $month = $month.'0101';
  445. for ($i = 1; $i < 13; $i++) {
  446. if ($i<10){
  447. $date[] = date('Y'.'0'.$i,strtotime($month));
  448. if ($i==1){
  449. $time = strtotime($date[0].'01');
  450. $lastDate[] = date('Ym',strtotime('-1 month',$time));
  451. }else{
  452. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  453. }
  454. }else{
  455. $date[] = date('Y'.$i,strtotime($month));
  456. if ($i==10){
  457. $lastDate[] = date('Y'.'0'.($i-1),strtotime($month));
  458. }else{
  459. $lastDate[] = date('Y'.($i-1),strtotime($month));
  460. }
  461. }
  462. }
  463. $map[] = ['del','=',0];
  464. $map[] = ['org_id','=',$this->orgId];
  465. $list = [];
  466. $dep = Db::name('energy_dep')
  467. ->where($map)
  468. ->where('enable',1)
  469. ->field('id,name,area,address')
  470. ->select();
  471. foreach ($dep as $item){
  472. $re = Db::name('energy_gas')
  473. ->Where($map)
  474. ->where('enable',1)
  475. ->Where('dep','like','%'.$item['id'].'%')
  476. ->select();
  477. if(!empty($re)){
  478. $list[] = $re;
  479. }
  480. }
  481. $newList = $this->getNewList($list);
  482. foreach ($newList as $k => $v){
  483. foreach ($v as $k2=>$v2){
  484. $address = json_decode($v2['address']);
  485. $dep_id = json_decode($v2['dep']);
  486. $newList[$k][$k2]['info']['floor1'] = Db::name('energy_area')->where('id',$address[1])->value('title');
  487. $newList[$k][$k2]['info']['floor2'] = Db::name('energy_area')->where('id',$address[2])->value('title');
  488. $newList[$k][$k2]['info']['dep'] = Db::name('energy_dep')->where('id',$dep_id[0])->value('name');
  489. foreach ($date as $k3=>$v3){
  490. $re = Db::name('energy_gas_record')
  491. ->field('sn,degree,read_yyyymm')
  492. ->where($map)
  493. ->where('read_yyyymm',$v3)
  494. ->where('sn',$v2['number'])
  495. ->find();
  496. $re2 = Db::name('energy_gas_record')
  497. ->field('sn,degree')
  498. ->where($map)
  499. ->where('read_yyyymm',$lastDate[$k3])
  500. ->where('sn',$v2['number'])
  501. ->find();
  502. if ($re['degree']){
  503. if ($v2['share'] == 1 || (string)$v2['share'] == '0'){
  504. $re['real_degree'] = $re['degree'] - $re2['degree']*$v2['percent'];
  505. }else{
  506. $re['real_degree'] = $re['degree'] - $re2['degree'];
  507. }
  508. }
  509. $newList[$k][$k2]['data'][] = $re;
  510. }
  511. }
  512. }
  513. $total = [];
  514. foreach ($date as $k=>$v){
  515. $degree = 0;
  516. foreach ($newList as $k2 => $v2){
  517. $count=0;
  518. foreach ($v2 as $k3=>$v3){
  519. if (!empty($v2[0]['data'][$k])){
  520. $count = $v2[0]['data'][$k]['real_degree'];
  521. }
  522. $degree+=$count;
  523. }
  524. $total[$k] = $degree;
  525. }
  526. }
  527. //halt($newList);
  528. return ['newList'=>$newList,'count'=>count($newList),'total'=>$total];
  529. }
  530. //对取到的数据进行整理,根据地址和科室进行分类整合
  531. public function getNewList($list)
  532. {
  533. //根据number进行分组
  534. $grouped_array = [];
  535. foreach ($list as $group) {
  536. foreach ($group as $item) {
  537. $number = $item['number'];
  538. // 如果这个number还没有分组,则创建一个新的分组
  539. if (!isset($grouped_array[$number])) {
  540. $grouped_array[$number] = [];
  541. }
  542. // 添加元素到对应的分组
  543. $grouped_array[$number][] = $item;
  544. }
  545. }
  546. $grouped_array = array_values($grouped_array);
  547. //分配比例
  548. foreach ($grouped_array as $k => $v){
  549. if (count($v)>1){
  550. $index = 0;
  551. foreach ($v as $k2=>$v2){
  552. if ($v2['share'] == 1){ //按比例分摊
  553. $dep = json_decode($v2['dep']);
  554. $percent = explode(':',$v2['percent']);
  555. $m = 0; //分母
  556. foreach ($percent as $k3=>$v3){
  557. $m +=$percent[$k3];
  558. }
  559. $p = sprintf("%.2f", $percent[$index]/$m);
  560. $grouped_array[$k][$k2]['percent'] = $p ;
  561. $grouped_array[$k][$k2]['dep'] = '['.$dep[$index].']' ;
  562. $index+=1;
  563. }
  564. if ((string)$v2['share'] == '0' ){ //按面积分摊
  565. $dep = json_decode($v2['dep']);
  566. $ids = [];
  567. foreach ($dep as $v3) {
  568. $ids[] = $v3;
  569. }
  570. $areas = Db::name('energy_dep')->where('id', 'in', $ids)->column('area', 'id');
  571. $m = 0;//分母
  572. foreach ($dep as $k3 => $v3) {
  573. $m += $areas[$v3];
  574. }
  575. $area = $areas[$dep[$index]];
  576. $p = sprintf("%.2f", $area/$m);
  577. $grouped_array[$k][$k2]['percent'] = $p ;
  578. $grouped_array[$k][$k2]['dep'] = '['.$dep[$index].']' ;
  579. $index+=1;
  580. }
  581. }
  582. }
  583. }
  584. // $modifiedArray = [];
  585. // // 遍历数组的每个子数组
  586. // foreach ($grouped_array as $firstKey => $subArray) {
  587. // foreach ($subArray as $secondKey => $item) {
  588. // // 解析 dep 字段
  589. // $deps = json_decode($item['dep'], true);
  590. // if (is_array($deps) && count($deps) > 1) {
  591. // // 如果 dep 包含多个元素,为每个元素创建新的数组项
  592. // foreach ($deps as $depValue) {
  593. // $newItem = $item; // 复制原数组项
  594. // $newItem['dep'] = json_encode([$depValue]); // 更新 dep 字段
  595. // // 直接替换掉原有的数组项
  596. // $modifiedArray[$firstKey][] = $newItem;
  597. //
  598. // }
  599. // } else {
  600. // $modifiedArray[$firstKey][] = $item;
  601. // }
  602. // }
  603. // }
  604. // 根据相同地址和科室组合电表
  605. $otherArrays = array_slice($grouped_array, 1);
  606. // 合并数组
  607. $list = array_merge($grouped_array[0], ...$otherArrays);
  608. // 初始化新数组
  609. $list2 = [];
  610. // 遍历原始列表,将每个项目添加到对应的地址和部门组合索引下
  611. foreach ($list as $item) {
  612. // 创建组合键
  613. $combinedKey = $item['address'] . '|' . $item['dep'];
  614. if (!isset($list2[$combinedKey])) {
  615. // 如果这个组合键还不存在,就创建一个新的分组
  616. $list2[$combinedKey] = [];
  617. }
  618. // 将项目添加到新数组的对应组合键下
  619. $list2[$combinedKey][] = $item;
  620. }
  621. $list2 = array_values($list2);
  622. //对数组进行去重操作
  623. $newList = [];
  624. foreach ($list2 as $subArray) {
  625. $processedSubArray = []; // 用于存储当前子数组处理后的结果
  626. $seen = []; // 用于记录已经见过的组合
  627. // 遍历子数组的每个项目
  628. foreach ($subArray as $item) {
  629. // 解析 dep 字段
  630. $dep = json_decode($item['dep'], true);
  631. // 创建一个用于识别的唯一键
  632. $uniqueKey = $item['number'] . '|' . implode(',', $dep);
  633. // 如果这个组合还没有被处理过
  634. if (!isset($seen[$uniqueKey])) {
  635. // 添加到当前处理后的子数组
  636. $processedSubArray[] = $item;
  637. // 标记这个组合为已处理
  638. $seen[$uniqueKey] = true;
  639. }
  640. }
  641. // 将处理后的子数组添加到处理后的数组
  642. $newList[] = $processedSubArray;
  643. }
  644. return $newList;
  645. }
  646. }