asset_number)) { $data[] = 'device:' . $device_record->asset_number . ' '; } } foreach ($part_records as $part_record) { if (!empty($part_record->asset_number)) { $data[] = 'part:' . $part_record->asset_number . ' '; } } foreach ($software_records as $software_record) { if (!empty($software_record->asset_number)) { $data[] = 'soft:' . $software_record->asset_number . ' '; } } return $data; } /** * 物品履历 形成清单数组(未排序). * * @param $template * @param $item_track * @param array $data * * @return array */ public static function itemTrack($template, $item_track, $data = []): array { $template['status'] = '+'; $template['datetime'] = json_decode($item_track, true)['created_at']; $data[] = $template; if (!empty($item_track->deleted_at)) { $template['status'] = '-'; $template['datetime'] = json_decode($item_track, true)['deleted_at']; $data[] = $template; } return $data; } /** * 计算盘点任务记录的数量. * * @param $check_id * @param string $type * * @return int */ public static function checkTrackCounts($check_id, $type = 'A'): int { $check_record = CheckRecord::where('id', $check_id)->first(); if (empty($check_record)) { return 0; } return match ($type) { 'Y' => CheckTrack::where('check_id', $check_id) ->where('status', 1) ->count(), 'N' => CheckTrack::where('check_id', $check_id) ->where('status', 2) ->count(), 'L' => CheckTrack::where('check_id', $check_id) ->where('status', 0) ->count(), default => CheckTrack::where('check_id', $check_id) ->withTrashed() ->count(), }; } /** * 设备id获取操作系统标识. * * @param $device_id * * @return string */ public static function getSoftwareIcon($device_id): string { $software_tracks = SoftwareTrack::where('device_id', $device_id) ->get(); $tags = Data::softwareTags(); $keys = array_keys($tags); foreach ($software_tracks as $software_track) { $name = trim($software_track->software()->withTrashed()->first()->name); for ($n = 0; $n < count($tags); $n++) { for ($i = 0; $i < count($tags[$keys[$n]]); $i++) { if (stristr($name, $tags[$keys[$n]][$i]) != false) { return $keys[$n]; } } } } return ''; } /** * 构造WebSSH连接字符串. * * @param $host * @param $port * @param $username * @param $password * * @return string */ public static function getSSHBaseUrl($host, $port, $username, $password): string { return "http://127.0.0.1:8222/?hostname=$host&port=$port&username=$username&password=$password"; } /** * 通过类名获取对应物资的模型. * * @param $item * @param $item_id * * @return null */ public static function getItemRecordByClass($item, $item_id) { return match ($item) { 'part' => PartRecord::where('id', $item_id)->first(), 'software' => SoftwareRecord::where('id', $item_id)->first(), default => DeviceRecord::where('id', $item_id)->first(), }; } /** * 获取折旧后的价格 * * @param $price * @param $date * @param $depreciation_rule_id * * @return float|int|null */ public static function depreciationPrice($price, $date, $depreciation_rule_id): float|int|null { $depreciation = DepreciationRule::where('id', $depreciation_rule_id)->first(); if (!empty($depreciation)) { $purchased_timestamp = strtotime($date); $now_timestamp = time(); $diff = $now_timestamp - $purchased_timestamp; if ($diff < 0) { return $price; } $data = $depreciation['rules']; // 数组过滤器 $return = array_filter($data, function ($item) use ($diff) { $number = match ($item['scale']) { 'month' => (int)$item['number'] * 24 * 60 * 60 * 30, 'year' => (int)$item['number'] * 24 * 60 * 60 * 365, default => (int)$item['number'] * 24 * 60 * 60, }; return $diff >= $number; }); if (!empty($return)) { array_multisort(array_column($return, 'number'), SORT_DESC, $return); $price = $price * (float)$return[0]['ratio']; } } return $price; } /** * 根据模型查找折旧规则的id(记录的优先级>分类的优先级). * * @param Model $model * * @return int|null */ public static function getDepreciationRuleId(Model $model): ?int { $depreciation_rule_id = null; if (empty($model->depreciation_rule_id)) { $category = null; if ($model instanceof DeviceRecord) { $category = DeviceCategory::where('id', $model->category_id)->first(); } if ($model instanceof PartRecord) { $category = PartCategory::where('id', $model->category_id)->first(); } if (!empty($category) && !empty($category->depreciation_rule_id)) { $depreciation_rule_id = $category->depreciation_rule_id; } } else { $depreciation_rule_id = $model->depreciation_rule_id; } return $depreciation_rule_id; } /** * 判断是否切换到selectCreate. * * @return bool */ public static function ifSelectCreate(): bool { if (admin_setting('switch_to_select_create') && Admin::extension()->enabled('celaraze.dcat-extension-plus')) { return true; } else { return false; } } /** * 获取服务异常总览(看板). * * @return ServiceRecord[]|Collection */ public static function getServiceIssueStatus(): Collection|array { $services = ServiceRecord::all(); foreach ($services as $service) { $service_status = $service->status; $service->start = null; $service->end = null; $service_track = ServiceTrack::where('service_id', $service->id) ->first(); if (empty($service_track) || empty($service_track->device)) { $service->device_name = '未知'; } else { $service->device_name = $service_track->device->asset_number; } $issues = []; $service_issues = ServiceIssue::where('service_id', $service->id) ->get(); foreach ($service_issues as $service_issue) { if (empty($service->start)) { $service->start = $service_issue->start; } if (strtotime($service_issue->start) < strtotime($service->start)) { $service->start = $service_issue->start; } // 如果异常待修复 if ($service_issue->status == 1) { $service->status = 1; $issue = $service_issue->issue . '
'; $issues[] = $issue; } // 如果是修复的 if ($service_issue->status == 2) { $service->status = 0; $issue = '[已修复最近一个问题] ' . $service_issue->issue . '
'; if ((time() - strtotime($service_issue->end)) > (24 * 60 * 60)) { $issue = ''; $service->start = ''; } else { // 如果结束时间是空,还没修复 if (empty($service->end)) { $service->end = $service_issue->end; } // 如果结束时间大于开始时间,修复了 if (strtotime($service_issue->end) > strtotime($service->end)) { $service->end = $service_issue->end; } } $issues[] = $issue; } } // 如果暂停了 if ($service_status == 1) { $service->status = 3; $service->start = date('Y-m-d H:i:s', strtotime($service->updated_at)); } $service->issues = $issues; } return json_decode($services, true); } /** * 返回某一年的开始时间和结束时间. * * @param $year * @param string $field * * @return string */ public static function makeYearDate($year, string $field = 'from'): string { $from = date('Y-m-d', mktime(0, 0, 0, 1, 1, $year)); $to = date('Y-m-d', mktime(23, 59, 59, 12, 31, $year)); if ($field == 'to') { return $to; } return $from; } /** * 设备详情页的归属关系拓扑图的数据. * * @param $device_id * * @return array|false|string */ public static function makeDeviceRelatedChartData($device_id): bool|array|string { $return = []; $device_record = DeviceRecord::where('id', $device_id)->first(); if (!empty($device_record)) { $return = [ 'name' => $device_record->asset_number, 'children' => [ [ 'name' => trans('main.part'), 'children' => [], ], [ 'name' => trans('main.software'), 'children' => [], ], [ 'name' => trans('main.service'), 'children' => [], ], ], ]; foreach ($device_record->part as $part) { $return['children'][0]['children'][] = ['name' => $part->asset_number]; } foreach ($device_record->software as $software) { $return['children'][1]['children'][] = ['name' => $software->name]; } foreach ($device_record->service as $service) { $return['children'][2]['children'][] = ['name' => $service->name]; } } return json_encode($return); } /** * 判断当前资产编号是否被用过 * @param $asset_number * @return bool */ public static function ifAssetNumberUsed($asset_number): bool { $device_record = DeviceRecord::where('asset_number', $asset_number)->withTrashed()->first(); if (!empty($device_record)) { return true; } $part_record = PartRecord::where('asset_number', $asset_number)->withTrashed()->first(); if (!empty($part_record)) { return true; } $software_record = SoftwareRecord::where('asset_number', $asset_number)->withTrashed()->first(); if (!empty($software_record)) { return true; } return false; } /** * 单选选择用户格式定制. * @param $key * @return array */ public static function selectUsers($key): array { $users = User::all(); $return = []; foreach ($users as $user) { $return[$user->$key] = $user->name . ' - ' . $user->username; } return $return; } }