Support.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <?php
  2. namespace App\Support;
  3. use App\Models\CheckRecord;
  4. use App\Models\CheckTrack;
  5. use App\Models\DepreciationRule;
  6. use App\Models\DeviceCategory;
  7. use App\Models\DeviceRecord;
  8. use App\Models\PartCategory;
  9. use App\Models\PartRecord;
  10. use App\Models\ServiceIssue;
  11. use App\Models\ServiceRecord;
  12. use App\Models\ServiceTrack;
  13. use App\Models\SoftwareRecord;
  14. use App\Models\SoftwareTrack;
  15. use App\Models\User;
  16. use Dcat\Admin\Admin;
  17. use Illuminate\Database\Eloquent\Collection;
  18. use Illuminate\Database\Eloquent\Model;
  19. class Support
  20. {
  21. /**
  22. * 获取所有物品的资产编号,加入到数组中返回.
  23. *
  24. * @return array
  25. */
  26. public static function getAllItemTypeAndId(): array
  27. {
  28. $data = [];
  29. $device_records = DeviceRecord::all();
  30. $part_records = PartRecord::all();
  31. $software_records = SoftwareRecord::all();
  32. foreach ($device_records as $device_record) {
  33. if (!empty($device_record->asset_number)) {
  34. $data[] = 'device:' . $device_record->asset_number . '&#10;';
  35. }
  36. }
  37. foreach ($part_records as $part_record) {
  38. if (!empty($part_record->asset_number)) {
  39. $data[] = 'part:' . $part_record->asset_number . '&#10;';
  40. }
  41. }
  42. foreach ($software_records as $software_record) {
  43. if (!empty($software_record->asset_number)) {
  44. $data[] = 'soft:' . $software_record->asset_number . '&#10;';
  45. }
  46. }
  47. return $data;
  48. }
  49. /**
  50. * 物品履历 形成清单数组(未排序).
  51. *
  52. * @param $template
  53. * @param $item_track
  54. * @param array $data
  55. *
  56. * @return array
  57. */
  58. public static function itemTrack($template, $item_track, $data = []): array
  59. {
  60. $template['status'] = '+';
  61. $template['datetime'] = json_decode($item_track, true)['created_at'];
  62. $data[] = $template;
  63. if (!empty($item_track->deleted_at)) {
  64. $template['status'] = '-';
  65. $template['datetime'] = json_decode($item_track, true)['deleted_at'];
  66. $data[] = $template;
  67. }
  68. return $data;
  69. }
  70. /**
  71. * 计算盘点任务记录的数量.
  72. *
  73. * @param $check_id
  74. * @param string $type
  75. *
  76. * @return int
  77. */
  78. public static function checkTrackCounts($check_id, $type = 'A'): int
  79. {
  80. $check_record = CheckRecord::where('id', $check_id)->first();
  81. if (empty($check_record)) {
  82. return 0;
  83. }
  84. return match ($type) {
  85. 'Y' => CheckTrack::where('check_id', $check_id)
  86. ->where('status', 1)
  87. ->count(),
  88. 'N' => CheckTrack::where('check_id', $check_id)
  89. ->where('status', 2)
  90. ->count(),
  91. 'L' => CheckTrack::where('check_id', $check_id)
  92. ->where('status', 0)
  93. ->count(),
  94. default => CheckTrack::where('check_id', $check_id)
  95. ->withTrashed()
  96. ->count(),
  97. };
  98. }
  99. /**
  100. * 设备id获取操作系统标识.
  101. *
  102. * @param $device_id
  103. *
  104. * @return string
  105. */
  106. public static function getSoftwareIcon($device_id): string
  107. {
  108. $software_tracks = SoftwareTrack::where('device_id', $device_id)
  109. ->get();
  110. $tags = Data::softwareTags();
  111. $keys = array_keys($tags);
  112. foreach ($software_tracks as $software_track) {
  113. $name = trim($software_track->software()->withTrashed()->first()->name);
  114. for ($n = 0; $n < count($tags); $n++) {
  115. for ($i = 0; $i < count($tags[$keys[$n]]); $i++) {
  116. if (stristr($name, $tags[$keys[$n]][$i]) != false) {
  117. return $keys[$n];
  118. }
  119. }
  120. }
  121. }
  122. return '';
  123. }
  124. /**
  125. * 构造WebSSH连接字符串.
  126. *
  127. * @param $host
  128. * @param $port
  129. * @param $username
  130. * @param $password
  131. *
  132. * @return string
  133. */
  134. public static function getSSHBaseUrl($host, $port, $username, $password): string
  135. {
  136. return "http://127.0.0.1:8222/?hostname=$host&port=$port&username=$username&password=$password";
  137. }
  138. /**
  139. * 通过类名获取对应物资的模型.
  140. *
  141. * @param $item
  142. * @param $item_id
  143. *
  144. * @return null
  145. */
  146. public static function getItemRecordByClass($item, $item_id)
  147. {
  148. return match ($item) {
  149. 'part' => PartRecord::where('id', $item_id)->first(),
  150. 'software' => SoftwareRecord::where('id', $item_id)->first(),
  151. default => DeviceRecord::where('id', $item_id)->first(),
  152. };
  153. }
  154. /**
  155. * 获取折旧后的价格
  156. *
  157. * @param $price
  158. * @param $date
  159. * @param $depreciation_rule_id
  160. *
  161. * @return float|int|null
  162. */
  163. public static function depreciationPrice($price, $date, $depreciation_rule_id): float|int|null
  164. {
  165. $depreciation = DepreciationRule::where('id', $depreciation_rule_id)->first();
  166. if (!empty($depreciation)) {
  167. $purchased_timestamp = strtotime($date);
  168. $now_timestamp = time();
  169. $diff = $now_timestamp - $purchased_timestamp;
  170. if ($diff < 0) {
  171. return $price;
  172. }
  173. $data = $depreciation['rules'];
  174. // 数组过滤器
  175. $return = array_filter($data, function ($item) use ($diff) {
  176. $number = match ($item['scale']) {
  177. 'month' => (int)$item['number'] * 24 * 60 * 60 * 30,
  178. 'year' => (int)$item['number'] * 24 * 60 * 60 * 365,
  179. default => (int)$item['number'] * 24 * 60 * 60,
  180. };
  181. return $diff >= $number;
  182. });
  183. if (!empty($return)) {
  184. array_multisort(array_column($return, 'number'), SORT_DESC, $return);
  185. $price = $price * (float)$return[0]['ratio'];
  186. }
  187. }
  188. return $price;
  189. }
  190. /**
  191. * 根据模型查找折旧规则的id(记录的优先级>分类的优先级).
  192. *
  193. * @param Model $model
  194. *
  195. * @return int|null
  196. */
  197. public static function getDepreciationRuleId(Model $model): ?int
  198. {
  199. $depreciation_rule_id = null;
  200. if (empty($model->depreciation_rule_id)) {
  201. $category = null;
  202. if ($model instanceof DeviceRecord) {
  203. $category = DeviceCategory::where('id', $model->category_id)->first();
  204. }
  205. if ($model instanceof PartRecord) {
  206. $category = PartCategory::where('id', $model->category_id)->first();
  207. }
  208. if (!empty($category) && !empty($category->depreciation_rule_id)) {
  209. $depreciation_rule_id = $category->depreciation_rule_id;
  210. }
  211. } else {
  212. $depreciation_rule_id = $model->depreciation_rule_id;
  213. }
  214. return $depreciation_rule_id;
  215. }
  216. /**
  217. * 判断是否切换到selectCreate.
  218. *
  219. * @return bool
  220. */
  221. public static function ifSelectCreate(): bool
  222. {
  223. if (admin_setting('switch_to_select_create') && Admin::extension()->enabled('celaraze.dcat-extension-plus')) {
  224. return true;
  225. } else {
  226. return false;
  227. }
  228. }
  229. /**
  230. * 获取服务异常总览(看板).
  231. *
  232. * @return ServiceRecord[]|Collection
  233. */
  234. public static function getServiceIssueStatus(): Collection|array
  235. {
  236. $services = ServiceRecord::all();
  237. foreach ($services as $service) {
  238. $service_status = $service->status;
  239. $service->start = null;
  240. $service->end = null;
  241. $service_track = ServiceTrack::where('service_id', $service->id)
  242. ->first();
  243. if (empty($service_track) || empty($service_track->device)) {
  244. $service->device_name = '未知';
  245. } else {
  246. $service->device_name = $service_track->device->asset_number;
  247. }
  248. $issues = [];
  249. $service_issues = ServiceIssue::where('service_id', $service->id)
  250. ->get();
  251. foreach ($service_issues as $service_issue) {
  252. if (empty($service->start)) {
  253. $service->start = $service_issue->start;
  254. }
  255. if (strtotime($service_issue->start) < strtotime($service->start)) {
  256. $service->start = $service_issue->start;
  257. }
  258. // 如果异常待修复
  259. if ($service_issue->status == 1) {
  260. $service->status = 1;
  261. $issue = $service_issue->issue . '<br>';
  262. $issues[] = $issue;
  263. }
  264. // 如果是修复的
  265. if ($service_issue->status == 2) {
  266. $service->status = 0;
  267. $issue = '<span class="status-recovery">[已修复最近一个问题]</span> ' . $service_issue->issue . '<br>';
  268. if ((time() - strtotime($service_issue->end)) > (24 * 60 * 60)) {
  269. $issue = '';
  270. $service->start = '';
  271. } else {
  272. // 如果结束时间是空,还没修复
  273. if (empty($service->end)) {
  274. $service->end = $service_issue->end;
  275. }
  276. // 如果结束时间大于开始时间,修复了
  277. if (strtotime($service_issue->end) > strtotime($service->end)) {
  278. $service->end = $service_issue->end;
  279. }
  280. }
  281. $issues[] = $issue;
  282. }
  283. }
  284. // 如果暂停了
  285. if ($service_status == 1) {
  286. $service->status = 3;
  287. $service->start = date('Y-m-d H:i:s', strtotime($service->updated_at));
  288. }
  289. $service->issues = $issues;
  290. }
  291. return json_decode($services, true);
  292. }
  293. /**
  294. * 返回某一年的开始时间和结束时间.
  295. *
  296. * @param $year
  297. * @param string $field
  298. *
  299. * @return string
  300. */
  301. public static function makeYearDate($year, string $field = 'from'): string
  302. {
  303. $from = date('Y-m-d', mktime(0, 0, 0, 1, 1, $year));
  304. $to = date('Y-m-d', mktime(23, 59, 59, 12, 31, $year));
  305. if ($field == 'to') {
  306. return $to;
  307. }
  308. return $from;
  309. }
  310. /**
  311. * 设备详情页的归属关系拓扑图的数据.
  312. *
  313. * @param $device_id
  314. *
  315. * @return array|false|string
  316. */
  317. public static function makeDeviceRelatedChartData($device_id): bool|array|string
  318. {
  319. $return = [];
  320. $device_record = DeviceRecord::where('id', $device_id)->first();
  321. if (!empty($device_record)) {
  322. $return = [
  323. 'name' => $device_record->asset_number,
  324. 'children' => [
  325. [
  326. 'name' => trans('main.part'),
  327. 'children' => [],
  328. ],
  329. [
  330. 'name' => trans('main.software'),
  331. 'children' => [],
  332. ],
  333. [
  334. 'name' => trans('main.service'),
  335. 'children' => [],
  336. ],
  337. ],
  338. ];
  339. foreach ($device_record->part as $part) {
  340. $return['children'][0]['children'][] = ['name' => $part->asset_number];
  341. }
  342. foreach ($device_record->software as $software) {
  343. $return['children'][1]['children'][] = ['name' => $software->name];
  344. }
  345. foreach ($device_record->service as $service) {
  346. $return['children'][2]['children'][] = ['name' => $service->name];
  347. }
  348. }
  349. return json_encode($return);
  350. }
  351. /**
  352. * 判断当前资产编号是否被用过
  353. * @param $asset_number
  354. * @return bool
  355. */
  356. public static function ifAssetNumberUsed($asset_number): bool
  357. {
  358. $device_record = DeviceRecord::where('asset_number', $asset_number)->withTrashed()->first();
  359. if (!empty($device_record)) {
  360. return true;
  361. }
  362. $part_record = PartRecord::where('asset_number', $asset_number)->withTrashed()->first();
  363. if (!empty($part_record)) {
  364. return true;
  365. }
  366. $software_record = SoftwareRecord::where('asset_number', $asset_number)->withTrashed()->first();
  367. if (!empty($software_record)) {
  368. return true;
  369. }
  370. return false;
  371. }
  372. /**
  373. * 单选选择用户格式定制.
  374. * @param $key
  375. * @return array
  376. */
  377. public static function selectUsers($key): array
  378. {
  379. $users = User::all();
  380. $return = [];
  381. foreach ($users as $user) {
  382. $return[$user->$key] = $user->name . ' - ' . $user->username;
  383. }
  384. return $return;
  385. }
  386. }