function_helper.php 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. <?php
  2. /*
  3. ** 通用函数helper
  4. */
  5. function set_log($file,$data){
  6. $file = fopen('../upload/'.$file, 'a+');
  7. fwrite($file, $data.'---'.date('Y-m-d H:i:s',time()).'
  8. ');
  9. fclose($file);
  10. }
  11. //移除空参数
  12. function remove_null_params($data = array()) {
  13. foreach ($data as $key => $value) {
  14. if ($value === NULL || $value === '') {
  15. unset($data[$key]);
  16. }
  17. }
  18. return $data;
  19. }
  20. // 通过pm2.5获取aqi的值
  21. function get_aqi_and_level_by_pm25($pm25){
  22. if ($pm25 < 35) { // 很好
  23. $aqi = 50 / 35 * $pm25;
  24. }elseif ($pm25 >= 35 && $pm25 < 75) { // 好
  25. $aqi = 50 / 40 * ($pm25 - 35) + 50;
  26. }elseif ($pm25 >= 75 && $pm25 < 115) { // 一般
  27. $aqi = 50 / 40 * ($pm25 - 75) + 100;
  28. }elseif ($pm25 >= 115 && $pm25 < 150) { // 较差
  29. $aqi = 50 / 35 * ($pm25 - 115) + 150;
  30. }elseif ($pm25 >= 150 && $pm25 < 250) { // 差
  31. $aqi = 100 / 100 * ($pm25 - 150) + 200;
  32. }elseif ($pm25 >= 250 && $pm25 < 350) { // 很差
  33. $aqi = 100 / 100 * ($pm25 - 250) + 300;
  34. }elseif ($pm25 >= 350) { // 非常差
  35. $aqi = 100 / 150 * ($pm25 - 350) + 400;
  36. }
  37. $level = get_aqi_str($aqi);
  38. return array('aqi'=>round($aqi),'level'=>$level);
  39. }
  40. function get_aqi_str($aqi){
  41. if ($aqi < 50) { // 很好
  42. $level = 'Very good';
  43. }elseif ($aqi >= 50 && $aqi < 100) { // 好
  44. $level = 'Good';
  45. }elseif ($aqi >= 100 && $aqi < 150) { // 一般
  46. $level = 'Commonly';
  47. }elseif ($aqi >= 150 && $aqi < 200) { // 较差
  48. $level = 'Poor';
  49. }elseif ($aqi >= 200 && $aqi < 300) { // 差
  50. $level = 'Difference';
  51. }elseif ($aqi >= 300 && $aqi < 400) { // 很差
  52. $level = 'Very bad';
  53. }elseif ($aqi >= 400) { // 非常差
  54. $level = 'Very bad';
  55. }
  56. return $level;
  57. }
  58. // modbus crc 16 校验码计算
  59. function crc16($string) {
  60. $crc = 0xFFFF;
  61. for ($x = 0; $x < strlen ($string); $x++) {
  62. $crc = $crc ^ ord($string[$x]);
  63. for ($y = 0; $y < 8; $y++) {
  64. if (($crc & 0x0001) == 0x0001) {
  65. $crc = (($crc >> 1) ^ 0xA001);
  66. } else { $crc = $crc >> 1; }
  67. }
  68. }
  69. $crc = strval(base_convert($crc, 10, 16));
  70. $crc = substr('0000'.$crc, -4);
  71. return substr($crc, -2).substr($crc, 0,2);
  72. }
  73. function crc_result($cmd){
  74. $begin = pack('H*',substr($cmd, 0,2));
  75. for ($i=0; $i < intval(strlen($cmd) / 2) - 1; $i++) {
  76. $begin = $begin ^ pack('H*',substr($cmd, $i*2+2,2));
  77. }
  78. $begin = unpack('H*', $begin);
  79. return substr('00'.$begin[1], -2);
  80. }
  81. function lampMqttCmd($sendTopic,$backTopic,$sendData,$timeout = 5,$seq = ''){
  82. require_once './application/libraries/Mqtt.php';
  83. // 订阅信息,接收一个信息后退出
  84. $CI =& get_instance();
  85. $server = $CI->config->item('WIFIMqttServer');
  86. $port = $CI->config->item('WIFIMqttPort');
  87. $username = $CI->config->item('WIFIMqttUsername');
  88. $password = $CI->config->item('WIFIMqttPassword');
  89. $client_id = time().rand(100000,999999); // 设置你的连接客户端id
  90. $mqtt = new Mqtt($server, $port, $client_id);
  91. if($mqtt->connect(true, NULL, $username, $password)) { //链接不成功再重复执行监听连接
  92. $mqtt->publish($sendTopic, $sendData, 2);
  93. // $mqtt->publish('/WEGW/ReadIn/865860046894466', pack('H*','010AA00B'), 2);
  94. }else{
  95. return '';
  96. }
  97. $topics[$backTopic] = array("qos" => 2,"function" => "procmsg");
  98. // $topics['/WEGW/ReadOut/865860046894466'] = array("qos" => 2, "function" => "procmsg");
  99. // 订阅主题
  100. $mqtt->subscribe($topics, 2);
  101. $true = 1;
  102. $t = time();
  103. while($true == 1){
  104. $true = $mqtt->proc();
  105. if (!empty($seq) && $true != 1){
  106. $res = unpack('H*', substr($true['msg'],2));
  107. if (substr($res[1], 0,2) != strtolower($seq)) $true = 1;
  108. }
  109. if (time() - $t >= $timeout) {
  110. return '';
  111. }
  112. }
  113. $mqtt->close();
  114. $true['msg'] = substr($true['msg'], 2);
  115. return $true;
  116. }
  117. function get_seq(){
  118. $seq = rand(0,255);
  119. $seq = base_convert($seq, 10, 16);
  120. return substr('00'.$seq, -2);
  121. }
  122. function get_check_sum($data){
  123. $sum = 0;
  124. for ($i=0; $i < strlen($data)/2; $i++) {
  125. $sum += base_convert(substr($data, $i*2,2), 16, 10);
  126. }
  127. $sum = base_convert($sum, 10, 16);
  128. $sum = substr('00'.$sum, -2);
  129. return $sum;
  130. }
  131. // 设置时区
  132. function set_timezone($date,$timezone){
  133. $time = strtotime($date) + $timezone*3600;
  134. return date('Y-m-d H:i:s',$time);
  135. }
  136. //小时数
  137. function secToTime($times){
  138. $result = '00';
  139. if ($times>0) {
  140. $hour = floor($times/3600);
  141. $minute = floor(($times-3600 * $hour)/60);
  142. $second = floor((($times-3600 * $hour) - 60 * $minute) % 60);
  143. $result = $hour;
  144. }
  145. return $result;
  146. }
  147. // 发送邮件
  148. function send_email($to,$msg,$title = '维修通知'){
  149. // $this->load->library('Smtp');
  150. require_once FCPATH.'application/libraries/Smtp.php';
  151. //******************** 配置信息 ********************************
  152. $CI =& get_instance();
  153. $config = $CI->config->config['email'];
  154. $smtpserver = $config['smtp_host'];//SMTP服务器
  155. $smtpserverport = $config['smtp_port'];//SMTP服务器端口
  156. $smtpusermail = $config['user_email'];//SMTP服务器的用户邮箱
  157. $smtpemailto = $to;//发送给谁
  158. $smtpuser = $config['smtp_user'];//SMTP服务器的用户帐号,注:部分邮箱只需@前面的用户名
  159. $smtppass = $config['smtp_pass'];//SMTP服务器的用户密码
  160. $mailtitle = $title;//邮件主题
  161. $mailcontent = $msg;//邮件内容
  162. $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件
  163. //************************ 配置信息 ****************************
  164. $smtp = new Smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
  165. $smtp->debug = false;//是否显示发送的调试信息
  166. return $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
  167. }
  168. /**
  169. * 获取密码安全等级
  170. * @param string $password 密码
  171. * @return int 0:低,1:中,2:高
  172. */
  173. function get_password_level($password){
  174. if(preg_match('/^([0-9]{6,16})$/',$password)){
  175. return 0;
  176. } else if (preg_match('/^[0-9 a-z]{6,16}$/',$password)){
  177. return 1;
  178. } else if (preg_match('/^[0-9 a-z A-Z !@#$%^&*]{6,16}$/',$password)) {
  179. return 2;
  180. }
  181. return 0;
  182. }
  183. // 天气信息翻译
  184. function weather_translate_en($code){
  185. $data = array(
  186. '100' => 'Sunny/Clear',
  187. '101' => 'Cloudy',
  188. '102' => 'Few Clouds',
  189. '103' => 'Partly Cloudy',
  190. '104' => 'Overcast',
  191. '200' => 'Windy',
  192. '201' => 'Calm',
  193. '202' => 'Light Breeze',
  194. '203' => 'Moderate/Gentle Breeze',
  195. '204' => 'Fresh Breeze',
  196. '205' => 'Strong Breeze',
  197. '206' => 'High Wind, Near Gale',
  198. '207' => 'Gale',
  199. '208' => 'Strong Gale',
  200. '209' => 'Storm',
  201. '210' => 'Violent Storm',
  202. '211' => 'Hurricane',
  203. '212' => 'Tornado',
  204. '213' => 'Tropical Storm',
  205. '300' => 'Shower Rain',
  206. '301' => 'Heavy Shower Rain',
  207. '302' => 'Thundershower',
  208. '303' => 'Heavy Thunderstorm',
  209. '304' => 'Thundershower with hail',
  210. '305' => 'Light Rain',
  211. '306' => 'Moderate Rain',
  212. '307' => 'Heavy Rain',
  213. '308' => 'Extreme Rain',
  214. '309' => 'Drizzle Rain',
  215. '310' => 'Storm',
  216. '311' => 'Heavy Storm',
  217. '312' => 'Severe Storm',
  218. '313' => 'Freezing Rain',
  219. '314' => 'Light to moderate rain',
  220. '315' => 'Moderate to heavy rain',
  221. '316' => 'Heavy rain to storm',
  222. '317' => 'Storm to heavy storm',
  223. '318' => 'Heavy to severe storm',
  224. '399' => 'Rain',
  225. '400' => 'Light Snow',
  226. '401' => 'Moderate Snow',
  227. '402' => 'Heavy Snow',
  228. '403' => 'Snowstorm',
  229. '404' => 'Sleet',
  230. '405' => 'Rain And Snow',
  231. '406' => 'Shower Snow',
  232. '407' => 'Snow Flurry',
  233. '408' => 'Light to moderate snow',
  234. '409' => 'Moderate to heavy snow',
  235. '410' => 'Heavy snow to snowstorm',
  236. '499' => 'Snow',
  237. '500' => 'Mist',
  238. '501' => 'Foggy',
  239. '502' => 'Haze',
  240. '503' => 'Sand',
  241. '504' => 'Dust',
  242. '507' => 'Duststorm',
  243. '508' => 'Sandstorm',
  244. '509' => 'Dense fog',
  245. '510' => 'Strong fog',
  246. '511' => 'Moderate haze',
  247. '512' => 'Heavy haze',
  248. '513' => 'Severe haze',
  249. '514' => 'Heavy fog',
  250. '515' => 'Extra heavy fog',
  251. '900' => 'Hot',
  252. '901' => 'Cold',
  253. '999' => 'Unknown',
  254. );
  255. return isset($data[$code]) ? $data[$code] : '';
  256. }
  257. function weather_translate_cn($code){
  258. $data = array(
  259. '100' => '晴',
  260. '101' => '多云',
  261. '102' => '少云',
  262. '103' => '晴间多云',
  263. '104' => '阴',
  264. '200' => '有风',
  265. '201' => '平静',
  266. '202' => '微风',
  267. '203' => '和风',
  268. '204' => '清风',
  269. '205' => '强风/劲风',
  270. '206' => '疾风',
  271. '207' => '大风',
  272. '208' => '烈风',
  273. '209' => '风暴',
  274. '210' => '狂爆风',
  275. '211' => '飓风',
  276. '212' => '龙卷风',
  277. '213' => '热带风暴',
  278. '300' => '阵雨',
  279. '301' => '强阵雨',
  280. '302' => '雷阵雨',
  281. '303' => '强雷阵雨',
  282. '304' => '雷阵雨伴有冰雹',
  283. '305' => '小雨',
  284. '306' => '中雨',
  285. '307' => '大雨',
  286. '308' => '极端降雨',
  287. '309' => '毛毛雨/细雨',
  288. '310' => '暴雨',
  289. '311' => '大暴雨',
  290. '312' => '特大暴雨',
  291. '313' => '冻雨',
  292. '314' => '小到中雨',
  293. '315' => '中到大雨',
  294. '316' => '大到暴雨',
  295. '317' => '暴雨到大暴雨',
  296. '318' => '大暴雨到特大暴雨',
  297. '399' => '雨',
  298. '400' => '小雪',
  299. '401' => '中雪',
  300. '402' => '大雪',
  301. '403' => '暴雪',
  302. '404' => '雨夹雪',
  303. '405' => '雨雪天气',
  304. '406' => '阵雨夹雪',
  305. '407' => '阵雪',
  306. '408' => '小到中雪',
  307. '409' => '中到大雪',
  308. '410' => '大到暴雪',
  309. '499' => '雪',
  310. '500' => '薄雾',
  311. '501' => '雾',
  312. '502' => '霾',
  313. '503' => '扬沙',
  314. '504' => '浮尘',
  315. '507' => '沙尘暴',
  316. '508' => '强沙尘暴',
  317. '509' => '浓雾',
  318. '510' => '强浓雾',
  319. '511' => '中度霾',
  320. '512' => '重度霾',
  321. '513' => '严重霾',
  322. '514' => '大雾',
  323. '515' => '特强浓雾',
  324. '900' => '热',
  325. '901' => '冷',
  326. '999' => '未知',
  327. );
  328. return isset($data[$code]) ? $data[$code] : '';
  329. }
  330. function weather_translate_ru($code){
  331. $data = array(
  332. '100' => 'чинг',
  333. '101' => 'облачно',
  334. '102' => 'Меньше облако',
  335. '103' => 'Ясная и облачная',
  336. '104' => 'инь',
  337. '200' => 'дует',
  338. '201' => 'спокойствие',
  339. '202' => 'ветерок',
  340. '203' => 'зефир',
  341. '204' => 'Свежий ветер',
  342. '205' => 'Сильный ветер/сильный ветер',
  343. '206' => 'шквал',
  344. '207' => 'ветер',
  345. '208' => 'шторм',
  346. '209' => 'шторм',
  347. '210' => 'Сильный ветер',
  348. '211' => 'ураган',
  349. '212' => 'Торнадо',
  350. '213' => 'Тропический шторм',
  351. '300' => 'ливень',
  352. '301' => 'Сильный душ',
  353. '302' => 'Грозовой дождь',
  354. '303' => 'Сильный грозовой дождь',
  355. '304' => 'Ливень сопровождается градом',
  356. '305' => 'дождик',
  357. '306' => 'Средний дождь',
  358. '307' => 'дождь',
  359. '308' => 'Экстремальный дождь',
  360. '309' => 'Дождик/мелкий дождь',
  361. '310' => 'Проливной дождь',
  362. '311' => 'Сильный дождь',
  363. '312' => 'Сильный ливень',
  364. '313' => 'Ледяной дождь',
  365. '314' => 'Немного дождя',
  366. '315' => 'Под дождём',
  367. '316' => 'Большой до грозы',
  368. '317' => 'От грозы до грозы',
  369. '318' => 'Сильные ливни, сильные ливни',
  370. '399' => 'дождь',
  371. '400' => 'Мелкий снежок',
  372. '401' => 'средний снег',
  373. '402' => 'снегопад',
  374. '403' => 'Снежная буря',
  375. '404' => 'Дождь и снег',
  376. '405' => 'Дождливая и снежная погода',
  377. '406' => 'Дождь и снег',
  378. '407' => 'снежный',
  379. '408' => 'Маленький до снега',
  380. '409' => 'Прямо в снег',
  381. '410' => 'От большой до снежной бури',
  382. '499' => 'снег',
  383. '500' => 'дымка',
  384. '501' => 'туман',
  385. '502' => 'мгла',
  386. '503' => 'янша',
  387. '504' => 'пыль',
  388. '507' => 'Песчаная буря',
  389. '508' => 'Сильная песчаная буря',
  390. '509' => 'Густой туман',
  391. '510' => 'Сильный густой туман',
  392. '511' => 'Умеренный туман',
  393. '512' => 'Тяжелая смола',
  394. '513' => 'Туман',
  395. '514' => 'Сильный туман',
  396. '515' => 'Густой туман',
  397. '900' => 'горячая',
  398. '901' => 'холодно',
  399. '999' => 'неизвестный',
  400. );
  401. return isset($data[$code]) ? $data[$code] : '';
  402. }
  403. //输出json
  404. // function json_result($code, $msg, $data = array()) {
  405. function json_result($code, $msg, $data = array(),$resType = 0) {
  406. $data = empty($data) && $resType == 0? new stdClass() : $data;
  407. $res = array('code' => $code,'msg' => $msg,'data' => $data);
  408. $CI =& get_instance();
  409. $clientId = $CI->input->post('clientId',true);
  410. if (!empty($clientId)) {
  411. if (is_array($res['data']) && !isset($res['data']['status'])) {
  412. $res['data']['status'] = 2;
  413. }else{
  414. $res['data'] = array('status'=>2);
  415. }
  416. exit(send_websocket($clientId,$res));
  417. }else{
  418. echo json_encode($res);
  419. }
  420. }
  421. // 获取jwt的token值
  422. function get_jwt_token(){
  423. $CI =& get_instance();
  424. $CI->load->library('Jwt');
  425. $payload=array("iss"=>"chirpstack-application-server","aud"=>"chirpstack-application-server","nbf"=>time()-60, "exp"=>time()+7200,'sub'=>'user','username'=>'admin');
  426. return $CI->jwt->getToken($payload);
  427. }
  428. //发送命令到server
  429. function send_cmd($cmd, $timeout = 30, $ms_timeout = 200) {
  430. return false;
  431. $CI =& get_instance();
  432. $host = $CI->config->item('cmd_server');
  433. $ip = $host['ip'];
  434. $port = $host['port'];
  435. $client = @stream_socket_client("tcp://{$ip}:{$port}", $errno, $errstr, 30);
  436. if ($client) {
  437. fwrite($client, $cmd);
  438. stream_set_timeout($client, $timeout, $ms_timeout);
  439. $result = fread($client, 8196);
  440. fclose($client);
  441. return $result;
  442. } else {
  443. return false;
  444. }
  445. }
  446. /**
  447. * 模拟post进行url请求
  448. * @param string $url
  449. * @param string $param
  450. */
  451. function request_post($url = '', $data = '',$header=array(),$timeout = 30) {
  452. $tuCurl = curl_init();
  453. //参数
  454. curl_setopt($tuCurl, CURLOPT_URL,$url);
  455. curl_setopt($tuCurl, CURLOPT_POSTFIELDS, $data);
  456. curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, false);
  457. // curl_setopt($tuCurl, CURLOPT_SSL_VERIFYHOST, false);
  458. curl_setopt($tuCurl, CURLOPT_SSLVERSION, 1);
  459. curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1);
  460. curl_setopt($tuCurl, CURLOPT_TIMEOUT, $timeout);
  461. if (!empty($header)) {
  462. curl_setopt($tuCurl, CURLOPT_HTTPHEADER, $header);
  463. }
  464. $tuData = curl_exec($tuCurl);
  465. curl_close($tuCurl);
  466. return $tuData;
  467. }
  468. // 通过时区获取当地时间
  469. function get_time_by_timezone($timezone){
  470. $time = strtotime(gmdate("Y-m-d H:i:s"));
  471. return date('Y-m-d H:i:s',$time + $timezone*3600);
  472. }
  473. // 给定时间、时区计算目标时区时间
  474. function date_change($date,$start,$end){
  475. $H = intval(date('H',strtotime($date)));
  476. $d = intval(date('d',strtotime($date)));
  477. $m = intval(date('m',strtotime($date)));
  478. $Y = intval(date('Y',strtotime($date)));
  479. if ($m <= 1) {
  480. $beginDateMonth = date(($Y-1).'-12-01', strtotime($date));
  481. }else{
  482. $beginDateMonth = date($Y.'-'.($m-1).'-01', strtotime($date));
  483. }
  484. $day = intval(date('d', strtotime("$beginDateMonth +1 month -1 day")));
  485. $day1 = intval(date('d', strtotime(date('Y-m-01',strtotime($date))." +1 month -1 day")));
  486. $H1 = $H-($start - $end);
  487. if ($H1 < 0) {
  488. $H1 += 24;
  489. if ($d <= 1) {
  490. $d = $day;
  491. if ($m <= 1) {
  492. $Y -= 1;
  493. $m = 12;
  494. }else{
  495. $m -= 1;
  496. }
  497. }else{
  498. $d -= 1;
  499. }
  500. }elseif ($H1 >= 24) {
  501. $H1 -= 24;
  502. if ($d >= $day1) {
  503. $d = 1;
  504. if ($m >= 12) {
  505. $m = 1;
  506. $Y += 1;
  507. }else{
  508. $m += 1;
  509. }
  510. }else{
  511. $d += 1;
  512. }
  513. }
  514. if ($m < 10) $m = '0'.$m;
  515. if ($d < 10) $d = '0'.$d;
  516. if ($H1 < 10) $H1 = '0'.$H1;
  517. return date("{$Y}-{$m}-{$d} {$H1}:i:s",strtotime($date));
  518. }
  519. // 文件下载
  520. function file_download($filePath){
  521. $file_name = basename($filePath); //下载文件名
  522. //检查文件是否存在
  523. if (! file_exists ( $filePath )) {
  524. exit (json_result('0012','找不到文件',array()));
  525. } else {
  526. //打开文件
  527. $file = fopen ( $filePath, "r" );
  528. //输入文件标签
  529. Header ( "Content-type: application/octet-stream" );
  530. Header ( "Accept-Ranges: bytes" );
  531. Header ( "Accept-Length: " . filesize ( $filePath) );
  532. Header ( "Content-Disposition: attachment; filename=" . $file_name );
  533. //输出文件内容
  534. //读取文件内容并直接输出到浏览器
  535. echo fread ( $file, filesize ( $filePath ) );
  536. fclose ( $file );
  537. exit ();
  538. }
  539. }
  540. /**
  541. * 模拟get进行url请求
  542. * @param string $url
  543. */
  544. function http_get($url,$header = array()) {
  545. $ch = curl_init();
  546. curl_setopt($ch, CURLOPT_URL, $url);
  547. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  548. curl_setopt($ch, CURLOPT_HEADER, 0);
  549. if (!empty($header)) {
  550. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  551. }
  552. // curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
  553. $result = curl_exec($ch);
  554. curl_close($ch);
  555. return $result;
  556. }
  557. //截取字符串
  558. function cut_str($string, $length, $append=true) {
  559. if(strlen($string) <= $length ) {
  560. return $string;
  561. } else {
  562. $i = 0;
  563. while ($i < $length) {
  564. $stringTMP = substr($string,$i,1);
  565. if ( ord($stringTMP) >=224 ) {
  566. $stringTMP = substr($string,$i,3);
  567. $i = $i + 3;
  568. } elseif( ord($stringTMP) >=192 ) {
  569. $stringTMP = substr($string,$i,2);
  570. $i = $i + 2;
  571. } else {
  572. $i = $i + 1;
  573. }
  574. $stringLast[] = $stringTMP;
  575. }
  576. $stringLast = implode("",$stringLast);
  577. if($append) {
  578. $stringLast .= "...";
  579. }
  580. return $stringLast;
  581. }
  582. }
  583. //填充数组不存在的键值对
  584. function fillUnsetData($array, $length) {
  585. for ($i=1; $i <= $length; $i++) {
  586. if (!isset($array[$i])) {
  587. $array[$i] = '';
  588. }
  589. }
  590. return $array;
  591. }
  592. //查找数组第一个元素的key
  593. function findFirstKey($array) {
  594. foreach ($array as $k => $v){
  595. return $k;
  596. }
  597. }
  598. function doAsyncRequest($url, $param=array()){
  599. $urlinfo = parse_url($url);
  600. $host = $urlinfo['host'];
  601. $path = $urlinfo['path'];
  602. $query = isset($param)? http_build_query($param) : '';
  603. $port = 80;
  604. $errno = 0;
  605. $errstr = '';
  606. $timeout = 10;
  607. $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
  608. $out = "POST ".$path." HTTP/1.1\r\n";
  609. $out .= "host:".$host."\r\n";
  610. $out .= "content-length:".strlen($query)."\r\n";
  611. $out .= "content-type:application/x-www-form-urlencoded\r\n";
  612. $out .= "connection:close\r\n\r\n";
  613. $out .= $query;
  614. fputs($fp, $out);
  615. fclose($fp);
  616. }
  617. function send_websocket($clientid,$data = array(),$resType='cmd')
  618. {
  619. if (!empty($clientid)) {
  620. $CI =& get_instance();
  621. if (isset($data['data'])) $data['data']['status'] = 2;
  622. $CI->db->insert('message',['client'=>$clientid,'msg'=>json_encode($data)]);
  623. }
  624. }
  625. //token生成算法
  626. function generate_token($username, $password, $client_key) {
  627. $CI =& get_instance();
  628. $salt = $CI->config->config['encryption_key'];
  629. return md5($username.$password.$client_key.$salt);
  630. // return md5($username.$password.date('yyyy').date('mm').$client_key.$salt);
  631. }
  632. //获取汉字拼音的第一个字母
  633. function get_first_char($str) {
  634. $firstchar_ord = ord(strtoupper($str{0}));
  635. if (($firstchar_ord >= 65 and $firstchar_ord <= 91) or ($firstchar_ord >= 48 and $firstchar_ord <= 57)) return $str{0};
  636. $s = iconv("UTF-8", "GBK//TRANSLIT//IGNORE", $str);
  637. $asc = ord($s{0}) * 256 + ord($s{1}) - 65536;
  638. if ($asc >= - 20319 and $asc <= - 20284) return "A";
  639. if ($asc >= - 20283 and $asc <= - 19776) return "B";
  640. if ($asc >= - 19775 and $asc <= - 19219) return "C";
  641. if ($asc >= - 19218 and $asc <= - 18711) return "D";
  642. if ($asc >= - 18710 and $asc <= - 18527) return "E";
  643. if ($asc >= - 18526 and $asc <= - 18240) return "F";
  644. if ($asc >= - 18239 and $asc <= - 17923) return "G";
  645. if ($asc >= - 17922 and $asc <= - 17418) return "H";
  646. if ($asc >= - 17417 and $asc <= - 16475) return "J";
  647. if ($asc >= - 16474 and $asc <= - 16213) return "K";
  648. if ($asc >= - 16212 and $asc <= - 15641) return "L";
  649. if ($asc >= - 15640 and $asc <= - 15166) return "M";
  650. if ($asc >= - 15165 and $asc <= - 14923) return "N";
  651. if ($asc >= - 14922 and $asc <= - 14915) return "O";
  652. if ($asc >= - 14914 and $asc <= - 14631) return "P";
  653. if ($asc >= - 14630 and $asc <= - 14150) return "Q";
  654. if ($asc >= - 14149 and $asc <= - 14091) return "R";
  655. if ($asc >= - 14090 and $asc <= - 13319) return "S";
  656. if ($asc >= - 13318 and $asc <= - 12839) return "T";
  657. if ($asc >= - 12838 and $asc <= - 12557) return "W";
  658. if ($asc >= - 12556 and $asc <= - 11848) return "X";
  659. if ($asc >= - 11847 and $asc <= - 11056) return "Y";
  660. if ($asc >= - 11055 and $asc <= - 10247) return "Z";
  661. return '~';
  662. }
  663. //翻译错误
  664. function transfer_error_tips($msg) {
  665. if(strpos($msg,'project not existed') !== false) {
  666. return '项目不存在';
  667. } else if(strpos($msg,'all of networks in this project are not online') !== false) {
  668. return '当前项目下所有网络都不在线';
  669. } else if(strpos($msg,'error check_code') !== false) {
  670. return '路灯发生未知错误';
  671. } else if(strpos($msg,'cmd not existed') !== false) {
  672. return '未知命令';
  673. } else if(strpos($msg,'address not correct') !== false) {
  674. return '无线模块地址不正确';
  675. } else if(strpos($msg,'current address not online') !== false) {
  676. return '无线模块不在线';
  677. } else if(strpos($msg,'time out no response') !== false) {
  678. return '超时未响应';
  679. } else if(strpos($msg,'PDU error') !== false) {
  680. return 'PDU错误';
  681. } else if(strpos($msg,'not online') !== false) {
  682. return '网络不在线';
  683. } else if(strpos($msg,'send command timeout') !== false) {
  684. return '下发指令超时';
  685. } else if(strpos($msg,'The file you are attempting to upload is larger than the permitted size.') !== false) {
  686. return '上传文件过大';
  687. } else if(strpos($msg,'The filetype you are attempting to upload is not allowed.') !== false) {
  688. return '上传文件类型错误';
  689. }else if($msg == '') {
  690. return '未知错误';
  691. } else {
  692. return '未知错误';
  693. }
  694. }
  695. //俄语翻译错误
  696. function transfer_error_tips_ru($msg) {
  697. if(strpos($msg,'project not existed') !== false) {
  698. return 'Проект не существует';
  699. } else if(strpos($msg,'all of networks in this project are not online') !== false) {
  700. return 'Все сети в рамках текущего проекта не подключены';
  701. } else if(strpos($msg,'error check_code') !== false) {
  702. return 'Неизвестная ошибка уличных фонарей';
  703. } else if(strpos($msg,'cmd not existed') !== false) {
  704. return 'Неизвестная команда';
  705. } else if(strpos($msg,'address not correct') !== false) {
  706. return 'Неверный адрес модуля';
  707. } else if(strpos($msg,'current address not online') !== false) {
  708. return 'беспроводной модуль не подключен';
  709. } else if(strpos($msg,'time out no response') !== false) {
  710. return 'задержка без ответа';
  711. } else if(strpos($msg,'PDU error') !== false) {
  712. return 'ошибка PDU';
  713. } else if(strpos($msg,'not online') !== false) {
  714. return 'сеть не работает';
  715. } else if(strpos($msg,'send command timeout') !== false) {
  716. return 'время ожидания следующей команды';
  717. } else if(strpos($msg,'The file you are attempting to upload is larger than the permitted size.') !== false) {
  718. return 'загружать слишком большой файл';
  719. } else if(strpos($msg,'The filetype you are attempting to upload is not allowed.') !== false) {
  720. return 'Ошибка загрузки типа файла';
  721. }else if($msg == '') {
  722. return 'Неизвестная ошибка';
  723. } else {
  724. return 'Неизвестная ошибка';
  725. }
  726. }
  727. /**
  728. * 把返回的数据集转换成Tree
  729. * @param array $list 要转换的数据集
  730. * @param string $pid parent标记字段
  731. * @param string $level level标记字段
  732. * @return array
  733. * @author 麦当苗儿 <zuojiazi@vip.qq.com>
  734. */
  735. function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
  736. // 创建Tree
  737. $tree = array();
  738. if(is_array($list)) {
  739. // 创建基于主键的数组引用
  740. $refer = array();
  741. foreach ($list as $key => $data) {
  742. $refer[$data[$pk]] =& $list[$key];
  743. }
  744. foreach ($list as $key => $data) {
  745. // 判断是否存在parent
  746. $parentId = $data[$pid];
  747. if ($root == $parentId) {
  748. $tree[] =& $list[$key];
  749. }else{
  750. if (isset($refer[$parentId])) {
  751. $parent =& $refer[$parentId];
  752. $parent[$child][] =& $list[$key];
  753. }
  754. }
  755. }
  756. }
  757. return $tree;
  758. }
  759. function getTree($data, $pId)
  760. {
  761. $tree = [];
  762. foreach($data as $k => $v)
  763. {
  764. if($v['pid'] == $pId)
  765. {
  766. $v['subList'] = getTree($data, $v['id']);
  767. $tree[] = $v;
  768. unset($data[$k]);
  769. }
  770. }
  771. return $tree;
  772. }
  773. // 编号设置
  774. function set_number($n){
  775. $n = intval($n);
  776. $res = $n + 1000000;
  777. return substr($res, 1);
  778. }
  779. function get_fields_by_type($fileds,$type){
  780. // 系统默认
  781. $data = array(
  782. 'number' => array('name'=>'路灯编号','enname'=>'Lamp number'),
  783. 'section' => array('name'=>'路段','enname'=>'Road'),
  784. 'lampstatus' => array('name'=>'路灯状态','enname'=>'Lamp status'),
  785. 'status' => array('name'=>'信号状态','enname'=>'Network status'),
  786. 'updatetime' => array('name'=>'更新时间','enname'=>'Update time'),
  787. 'lighteness' => array('name'=>'路灯亮度(%)','enname'=>'Brightness(%)'),
  788. 'address' => array('name'=>'无线模块地址','enname'=>'Wireless module address'),
  789. 'loadpower' => array('name'=>'额定功率(W)','enname'=>'load power(W)'),
  790. 'chargestage' => array('name'=>'蓄电池充电阶段','enname'=>'Charging stage'),
  791. 'battvoltage' => array('name'=>'蓄电池电压(V)','enname'=>'Battery voltage(V)'),
  792. 'overtimes' => array('name'=>'蓄电池总过放次数','enname'=>'Over discharge times'),
  793. 'solarpower' => array('name'=>'太阳能板功率(W)','enname'=>'Solar panel power(W)'),
  794. 'isfaulted' => array('name'=>'是否故障','enname'=>'Fault'),
  795. 'id' => array('name'=>'路灯id','enname'=>'Lamp ID'),
  796. 'networkname' => array('name'=>'网络名称','enname'=>'Network name'),
  797. 'projectname' => array('name'=>'项目名称','enname'=>'Project name'),
  798. 'longitude' => array('name'=>'经度','enname'=>'Longitude'),
  799. 'latitude' => array('name'=>'纬度','enname'=>'Latitude'),
  800. 'simid' => array('name'=>'sim卡号','enname'=>'SIM card number'),
  801. 'packageSurplus' => array('name'=>'套餐剩余','enname'=>'Package surplus'),
  802. 'poleheight' => array('name'=>'灯杆高度(m)','enname'=>'Lamp-post length(m)'),
  803. 'polediameter' => array('name'=>'灯杆直径(m)','enname'=>'Lamp-post diameter(m)'),
  804. 'polematerial' => array('name'=>'灯杆材质','enname'=>'Lamp-post materials'),
  805. 'lighttype' => array('name'=>'灯具类型','enname'=>'Light type'),
  806. 'lamptype' => array('name'=>'路灯类型','enname'=>'Lamp type'),
  807. 'boardtype' => array('name'=>'太阳能板类型','enname'=>'Solar panel type'),
  808. 'boardpower' => array('name'=>'太阳能板功率(W)','enname'=>'Solar panel power(W)'),
  809. 'batterytype' => array('name'=>'蓄电池类型','enname'=>'Battery type'),
  810. 'batteryah' => array('name'=>'蓄电池AH数(ah)','enname'=>'Battery capacity(ah)'),
  811. 'lamppower' => array('name'=>'负载功率(W)','enname'=>'LED power(W)'),
  812. 'electricleft' => array('name'=>'蓄电池剩余电量','enname'=>'Remaining battery capacity(Ah)'),
  813. 'lampvoltage' => array('name'=>'路灯电压(V)','enname'=>'Lamp voltage(V)'),
  814. 'lampcurrent' => array('name'=>'路灯电流(A)','enname'=>'Lamp current(A)'),
  815. 'temper' => array('name'=>'灯头温度(℃)','enname'=>'Lamp temperature(℃)'),
  816. 'solarvoltage' => array('name'=>'太阳能板电压(V)','enname'=>'Solar panel voltage(V)'),
  817. 'solarcurrent' => array('name'=>'太阳能板电流(A)','enname'=>'Solar panel current(A)'),
  818. 'battstatus' => array('name'=>'蓄电池状态','enname'=>'Battery status'),
  819. 'chargecurrent' => array('name'=>'蓄电池充电电流(A)','enname'=>'Charging current(A)'),
  820. 'discharcurrent' => array('name'=>'蓄电池放电电流(A)','enname'=>'Discharging current(A)'),
  821. 'chargepower' => array('name'=>'蓄电池充电功率(w)','enname'=>'Charging power(w)'),
  822. 'dischargepower' => array('name'=>'蓄电池放电功率(w)','enname'=>'Discharging power(w)'),
  823. 'batttemper' => array('name'=>'蓄电池表面温度(℃)','enname'=>'Battery surface temperature(℃)'),
  824. 'electrictotal' => array('name'=>'蓄电池总电量','enname'=>'Total battery capacity(Ah)'),
  825. 'electricSOC' => array('name'=>'蓄电池电量SOC(%)','enname'=>'Battery SOC(%)'),
  826. 'voltagedaymin' => array('name'=>'当天最低电压(V)','enname'=>'Minimum voltage(V)'),
  827. 'voltagedaymax' => array('name'=>'当天最高电压(V)','enname'=>'Highest voltage(V)'),
  828. // 'daychargeah' => array('name'=>'当天充电安时数(ah)','enname'=>'Charging AH(ah)'),
  829. // 'daydischarah' => array('name'=>'当天放电安时数(ah)','enname'=>'Discharging AH(ah)'),
  830. 'daychargemaxpow' => array('name'=>'当天充电最大功率(W)','enname'=>'Charging max-power(W)'),
  831. 'daydischarmaxpow' => array('name'=>'当天放电最大功率(W)','enname'=>'Discharging max-power(W)'),
  832. 'daychargemincurrent' => array('name'=>'当天灯亮时间(hh:mm)','enname'=>'Turn-on duration'),
  833. 'daycharmaxcurrent' => array('name'=>'当天充电最大电流(A)','enname'=>'Highest charging current(A)'),
  834. 'daydischargemincurrent' => array('name'=>'当天充电时间(hh:mm)','enname'=>'Charging duration'),
  835. 'daydischarmaxcurrent' => array('name'=>'当天放电最大电流(A)','enname'=>'Highest discharging current(A)'),
  836. 'daybattmintemper' => array('name'=>'当天蓄电池最低温度(℃)','enname'=>'Battery min-temperature(℃)'),
  837. 'daybattmaxtemper' => array('name'=>'当天蓄电池最高温度(℃)','enname'=>'Battery max-temperature(℃)'),
  838. 'daygeneration' => array('name'=>'当天发电量(W)','enname'=>'Power generation(W)'),
  839. 'dayconsumption' => array('name'=>'当天用电量(W)','enname'=>'Power consumption(W)'),
  840. 'totalgeneration' => array('name'=>'累计发电量(W)','enname'=>'Cumulative power generation(W)'),
  841. 'totalconsumption' => array('name'=>'累计用电量(W)','enname'=>'Cumulative power consumption(W)'),
  842. 'sysvoltage' => array('name'=>'系统电压(V)','enname'=>'System voltage(V)'),
  843. 'syscurrent' => array('name'=>'系统电流(A)','enname'=>'System current(A)'),
  844. 'controlTemper' => array('name'=>'控制器温度(℃)','enname'=>'Controller temperature(℃)'),
  845. 'rundays' => array('name'=>'运行天数','enname'=>'Running duration'),
  846. 'fulltimes' => array('name'=>'蓄电池总充满次数','enname'=>'Full charge times'),
  847. // 'totalchargeah' => array('name'=>'蓄电池总充电安时数(ah)','enname'=>'Total charge AH(ah)'),
  848. // 'totaldischarah' => array('name'=>'蓄电池总放电安时数(ah)','enname'=>'Total discharge AH(ah)'),
  849. 'policyid' => array('name'=>'当前策略','enname'=>'Current strategy'),
  850. 'street_light_SN' => array('name'=>'Street light SN','enname'=>'Street light SN'),
  851. 'customer_ID' => array('name'=>'Customer ID','enname'=>'Customer ID'),
  852. 'customer_name' => array('name'=>'Customer name','enname'=>'Customer name'),
  853. 'fascal_year' => array('name'=>'Fiscal year','enname'=>'Fiscal year'),
  854. 'fascal_year_phase' => array('name'=>'Fiscal year phase','enname'=>'Fiscal year phase'),
  855. 'po_name' => array('name'=>'PO name','enname'=>'PO name'),
  856. 'supplier_name' => array('name'=>'Supplier name','enname'=>'Supplier name'),
  857. 'MFRS_name' => array('name'=>'MFRS name','enname'=>'MFRS name'),
  858. 'softwareVersion' => array('name'=>'版本号','enname'=>'Version information'),
  859. 'model_name' => array('name'=>'型号','enname'=>'Model'),
  860. );
  861. $temp = [];
  862. $filedArr = explode(',', $fileds);
  863. if ($type == 0) {
  864. foreach ($filedArr as $f) {
  865. if (!empty($data[$f])) {
  866. $temp[] = $data[$f]['name'];
  867. }
  868. }
  869. }else{
  870. foreach ($filedArr as $f) {
  871. if (!empty($data[$f])) {
  872. $temp[] = $data[$f]['enname'];
  873. }
  874. }
  875. }
  876. return $temp;
  877. }
  878. // 翻译故障信息
  879. function alarm_translate($msg){
  880. $data = array(
  881. '过放' => 'over release',
  882. '超压' => 'overpressure',
  883. '负载短路' => 'load short circuit',
  884. '电池故障' => 'Error display',
  885. '内部超温' => 'internal overtemperature',
  886. '外部超温' => 'external overtemperature',
  887. '负载开路' => 'load opening',
  888. '输出电容超压保护' => 'output capacitance overvoltage protection',
  889. '电池板过流' => 'panel overcurrent',
  890. '电池板短路' => 'panel short circuit',
  891. '电池板超压' => 'panel overpressure',
  892. '充电逆流' => 'charging current',
  893. '锂电池低温关闭充电' => 'the lithium battery is turned off and charged at low temperature',
  894. '电池电压异常' => 'Abnormal battery voltage'
  895. );
  896. return isset($data[$msg]) ? $data[$msg] : 'unknown error';
  897. }
  898. // 新控制器翻译故障信息
  899. function modbus_alarm_translate($msg){
  900. $data = array(
  901. 'BMS过充保护' => 'BMS Overcharge Protection',
  902. '电池低温保护,停止充电' => 'Battery Low Temperature Protection, Stop Charging',
  903. '电池反接' => 'Battery reverse connection',
  904. '电容超压' => 'Capacitance overpressure',
  905. '感应探头损坏' => 'Damage of induction probe',
  906. '负载开路' => 'Load open circuit',
  907. '蓄电池过放' => 'Battery Overdischarge',
  908. '蓄电池超压' => 'Battery overvoltage',
  909. '欠压警告' => 'Undervoltage warning',
  910. '负载短路' => 'Load short circuit',
  911. '负载功率过大或负载过流' => 'Excessive Load Power or Overcurrent',
  912. '控制器温度过高' => 'Controller temperature is too high',
  913. '外部环境温度过高' => 'External ambient temperature is too high',
  914. '光伏输入功率过大' => 'Excessive input power of photovoltaic',
  915. '光伏输入端短路' => 'Photovoltaic Input Short Circuit',
  916. '光伏输入端超压' => 'Photovoltaic Input Overvoltage',
  917. '太阳板逆流' => 'Solar plate countercurrent',
  918. '太阳板工作点超压' => 'Operating point overpressure of solar panel',
  919. '太阳板反接' => 'Solar Plate Reverse Connection'
  920. );
  921. return isset($data[$msg]) ? $data[$msg] : 'unknown error';
  922. }
  923. function alarm_translate_ch($msg){
  924. $data = array(
  925. 'over release' => '过放',
  926. 'overpressure' => '超压',
  927. 'load short circuit' => '负载短路',
  928. 'battery failure' => '电池故障',
  929. 'internal overtemperature' => '内部超温',
  930. 'external overtemperature' => '外部超温',
  931. 'load opening' => '负载开路',
  932. 'output capacitance overvoltage protection' => '输出电容超压保护',
  933. 'panel overcurrent' => '电池板过流',
  934. 'panel short circuit' => '电池板短路',
  935. 'panel overpressure' => '电池板超压',
  936. 'charging current' => '充电逆流',
  937. 'the lithium battery is turned off and charged at low temperature' => '锂电池低温关闭充电',
  938. 'BMS Overcharge Protection'=>'BMS过充保护',
  939. 'Battery Low Temperature Protection, Stop Charging'=>'电池低温保护,停止充电',
  940. 'Battery reverse connection'=>'电池反接',
  941. 'Capacitance overpressure'=>'电容超压',
  942. 'Damage of induction probe'=>'感应探头损坏',
  943. 'Undervoltage warning'=>'欠压警告',
  944. 'Excessive Load Power or Overcurrent'=>'负载功率过大或负载过流',
  945. 'Controller temperature is too high'=>'控制器温度过高',
  946. 'External ambient temperature is too high'=>'外部环境温度过高',
  947. 'Excessive input power of photovoltaic'=>'光伏输入功率过大',
  948. 'Photovoltaic Input Short Circuit'=>'光伏输入端短路',
  949. 'Photovoltaic Input Overvoltage'=>'光伏输入端超压',
  950. 'Solar plate countercurrent'=>'太阳板逆流',
  951. 'Operating point overpressure of solar panel'=>'太阳板工作点超压',
  952. 'Solar Plate Reverse Connection'=>'太阳板反接',
  953. );
  954. return isset($data[$msg]) ? $data[$msg] : '';
  955. }
  956. /* 导出excel函数*/
  957. function push_excel($data,$fileName='Excel',$type = 0){
  958. set_time_limit(120);
  959. if (empty($type)) {
  960. // header('Content-Type: application/vnd.ms-excel');
  961. // header('Content-Disposition: attachment;filename="amazon_product_quantity.csv"');
  962. // header('Cache-Control: max-age=0');
  963. // $res = (new ListModel);
  964. // $counts = $res->query('select count(*) from test');
  965. $counts = count($data);
  966. $coun = 1000;
  967. $limit = ceil($counts/$coun);
  968. // 打开PHP文件句柄,php://output 表示直接输出到浏览器
  969. $filePath = FCPATH.'../upload/file/';
  970. if (!file_exists(FCPATH.'../upload/file')) {
  971. mkdir(FCPATH.'../upload/file');
  972. }
  973. $_savePath = $filePath.$fileName.'.csv';
  974. $fp = fopen($_savePath, 'w');
  975. $head = $data[0];
  976. foreach ($head as $i => $v) {
  977. // CSV的Excel支持GBK编码,一定要转换,否则乱码
  978. $head[$i] =iconv("utf-8","gb2312//IGNORE",$v);
  979. }
  980. array_shift($data);
  981. fputcsv($fp, $head);
  982. $i = 1;
  983. $n = 1;
  984. while($n <= $limit){
  985. $max = $counts >= $n*$coun ? $n*$coun : $counts-1;
  986. for ($s=($n-1)*$coun; $s < $max; $s++) {
  987. $temp = array();
  988. foreach ($data[$s] as $x => $y) {
  989. // CSV的Excel支持GBK编码,一定要转换,否则乱码
  990. $y = $y."\t";
  991. $temp[$x] =iconv("utf-8","gb2312//IGNORE",$y);
  992. }
  993. fputcsv($fp, $temp);
  994. $i++;
  995. }
  996. if($i>20000){//读取一部分数据刷新下输出buffer
  997. ob_flush();
  998. flush();
  999. $i = 0;
  1000. }
  1001. $n++;
  1002. /*
  1003. if($n == 300){
  1004. break;
  1005. }
  1006. */
  1007. }
  1008. return base_url('upload/file/'.$fileName.'.csv');
  1009. }else{
  1010. require_once FCPATH . 'application/third_party/phpExcel/PHPExcel.php';
  1011. $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
  1012. if (!\PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) {
  1013. die($cacheMethod . " 缓存方法不可用" . EOL);
  1014. }
  1015. $obj = new PHPExcel();
  1016. //横向单元格标识
  1017. $cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
  1018. //填写数据
  1019. if($data){
  1020. foreach($data AS $k=>$_v){
  1021. if ($k > 0) {
  1022. $obj->createSheet();
  1023. }
  1024. $obj->setactivesheetindex($k);
  1025. $obj->getActiveSheet()->setTitle($_v['name']); //设置sheet名称
  1026. $i = 0;
  1027. foreach ($_v['dataList'] as $k2=>$d) {
  1028. $_row = 1; //设置纵向单元格标识
  1029. $j = 0;
  1030. foreach($d AS $_cell){
  1031. $obj->getActiveSheet()->setCellValue($cellName[$j] . ($i+$_row), $_cell);
  1032. $j++;
  1033. }
  1034. $i++;
  1035. }
  1036. }
  1037. }
  1038. $filePath = FCPATH.'file/temp/';
  1039. if (!file_exists(FCPATH.'file/temp')) {
  1040. mkdir(FCPATH.'file/temp');
  1041. }
  1042. $objWrite = PHPExcel_IOFactory::createWriter($obj, 'Excel5');
  1043. $_fileName = iconv("utf-8", "gb2312", $fileName); //转码
  1044. $_savePath = $filePath.$_fileName.'.xls';
  1045. $objWrite->save($_savePath);
  1046. return base_url('api/file/temp/'.$fileName.'.xls');
  1047. }
  1048. }
  1049. ?>