ReportFormsService.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace App\Service;
  3. use App\Model\SystemL;
  4. /**
  5. * 设备相关设置报表
  6. * Class ReportFormsService
  7. * @package App\Service
  8. */
  9. class ReportFormsService extends Service
  10. {
  11. /**
  12. * 数据分析图
  13. * @param $data
  14. * @return array
  15. */
  16. public function deviceStatisticsReportChart($data){
  17. if(empty($data['time'][0]) || empty($data['time'][1])) return [false, '时间必须选择!'];
  18. $day = $this->returnDays($data['time'], false);
  19. if($day > 31) return [false, '查询时间仅支持范围区间在31天内'];
  20. $return = [];
  21. foreach (SystemL::$device as $key => $value){
  22. $list = [];
  23. for ($i = $data['time'][0]; $i <= $data['time'][1]; $i+= 86400){
  24. $tmp['time'] = date("Y-m-d", $i);
  25. $tmp['num'] = mt_rand(1100, 1200);
  26. $list[] = $tmp;
  27. }
  28. $return[] = [
  29. "title" => $key,
  30. "list" => $list
  31. ];
  32. }
  33. return [true, $return];
  34. }
  35. /**
  36. * 数据OEE分析图
  37. * @param $data
  38. * @return array
  39. */
  40. public function deviceStatisticsReportOEEChart1($data){
  41. if(empty($data['time'][0]) || empty($data['time'][1])) return [false, '时间必须选择!'];
  42. $site = $data['header'][2];
  43. $day = $this->returnDays($data['time'], false);
  44. if($day > 10) return [false, '查询时间仅支持范围区间在10天内'];
  45. $device = SystemL::$device[$site];
  46. $return = [];
  47. // 获取今天凌晨 00:00:00 的时间戳,用于区分过去和未来
  48. $todayStart = strtotime(date('Y-m-d'));
  49. foreach ($device as $key => $value){
  50. $list = [];
  51. for ($i = $data['time'][0]; $i <= $data['time'][1]; $i += 86400){
  52. $currentDate = date("Y-m-d", $i);
  53. $tmp['time'] = $currentDate;
  54. // 逻辑判断:
  55. if ($i > $todayStart) {
  56. // 1. 如果是未来的日期(大于今天凌晨),数值设为空
  57. $tmp['num'] = null;
  58. } else {
  59. // 2. 如果是今天或过去的日期,通过“设备名+日期”锁定随机种子
  60. // 这样每次查询同一天,getRandomFloat 产生的随机数就会完全一样
  61. mt_srand(crc32($key . $currentDate));
  62. $tmp['num'] = $this->getRandomFloat(35);
  63. }
  64. $list[] = $tmp;
  65. }
  66. // 关键:每一个设备循环完后,重置随机种子,避免干扰系统其他功能
  67. mt_srand();
  68. $return[] = [
  69. "title" => $key,
  70. "list" => $list
  71. ];
  72. }
  73. return [true, $return];
  74. }
  75. public function deviceStatisticsReportOEEChart($data){
  76. if(empty($data['time'][0]) || empty($data['time'][1])) return [false, '时间必须选择!'];
  77. $site = $data['header'][2];
  78. $day = $this->returnDays($data['time'], false);
  79. if($day > 10) return [false, '查询时间仅支持范围区间在10天内'];
  80. $device = SystemL::$device[$site];
  81. $return = [];
  82. $todayStart = strtotime(date('Y-m-d'));
  83. foreach ($device as $key => $value){
  84. $list = [];
  85. for ($i = $data['time'][0]; $i <= $data['time'][1]; $i += 86400){
  86. $currentDate = date("Y-m-d", $i);
  87. $tmp['time'] = $currentDate;
  88. if ($i > $todayStart) {
  89. $tmp['num'] = null;
  90. } else {
  91. // --- 核心逻辑开始 ---
  92. // 使用 设备+日期 锁定种子
  93. mt_srand(crc32($key . $currentDate));
  94. // 模拟 15% 的概率设备不工作 (你可以调整这个 85)
  95. if (mt_rand(1, 100) > 85) {
  96. $tmp['num'] = 0; // 或者设为 null,取决于你前端图表想怎么展示
  97. } else {
  98. $tmp['num'] = $this->getRandomFloat(35);
  99. }
  100. // --- 核心逻辑结束 ---
  101. }
  102. $list[] = $tmp;
  103. }
  104. mt_srand(); // 重置种子
  105. $return[] = [
  106. "title" => $key,
  107. "list" => $list
  108. ];
  109. }
  110. return [true, $return];
  111. }
  112. function getRandomFloat($min = 40, $max = 43) {
  113. // 生成一个在[0, 100)范围内的随机整数(乘以100是为了扩大范围,便于计算)
  114. $randomInt = mt_rand(0, 99);
  115. // 将随机整数转换为浮点数,并乘以范围(45-40),然后加上最小值40
  116. $randomFloat = ($randomInt / 100) * ($max - $min) + $min;
  117. // 返回两位小数
  118. return round($randomFloat, 2);
  119. }
  120. /**
  121. * 用于计算时间
  122. * @param $minute
  123. * @return string
  124. */
  125. public function calTimeReturnMin($minute){
  126. return number_format($minute * 1.5 / 60,2);
  127. }
  128. function returnDays($time = [], $is_mirco_time = true){
  129. // 示例时间戳
  130. $timestamp1 = $time[0];
  131. $timestamp2 = $time[1];
  132. // 计算时间差
  133. $difference = abs($timestamp2 - $timestamp1);
  134. // 将时间差转换为天数
  135. $days = floor($difference / (60 * 60 * 24));
  136. if($is_mirco_time) $days = $days / 1000;
  137. return $days;
  138. }
  139. }