hb_zhgd_screen/js/pages/newDataAnalysis/resourceApiService.js

276 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 资源利用率分析 API 服务
* 用于对接后端接口,处理数据请求和响应
*/
class ResourceApiService {
constructor() {
this.baseUrl = 'http://127.0.0.1:13030/zhgd/screen/api/resource';
this.token = token || localStorage.getItem('token'); // 假设token已经全局定义
this.projectId = parent.$('#bidPro').val() || 'default_project'; // 获取当前项目ID
}
/**
* 通用请求方法
*/
async request(url, options = {}) {
const defaultOptions = {
method: 'GET',
headers: {
'Authorization': `Bearer ${this.token}`,
'Content-Type': 'application/json',
'decrypt': 'decrypt' // 项目中的解密标识
}
};
const config = { ...defaultOptions, ...options };
try {
const response = await fetch(url, config);
const result = await response.json();
// 根据项目中的数据处理逻辑进行解密等处理
const processedData = modifyResponseData(result);
if (processedData.code === 200) {
return processedData.data;
} else {
throw new Error(processedData.message || '请求失败');
}
} catch (error) {
console.error('API请求失败:', error);
// 返回模拟数据作为降级方案
return this.getFallbackData(url);
}
}
/**
* 获取资源利用率概览数据
*/
async getResourceOverview(timeRange = 'today') {
const url = `${this.baseUrl}/overview?projectId=${this.projectId}&timeRange=${timeRange}`;
return await this.request(url);
}
/**
* 获取资源详细信息列表
*/
async getResourceDetails(resourceType = '', page = 1, pageSize = 20) {
let url = `${this.baseUrl}/details?projectId=${this.projectId}&page=${page}&pageSize=${pageSize}`;
if (resourceType) {
url += `&resourceType=${resourceType}`;
}
return await this.request(url);
}
/**
* 获取资源利用率趋势数据
*/
async getResourceTrends(startDate, endDate, granularity = 'day') {
// 如果没有传入日期默认获取最近7天
if (!startDate || !endDate) {
// 使用数据库中更新后的日期范围
startDate = '2025-03-07';
endDate = '2025-03-14';
}
const url = `${this.baseUrl}/trends?projectId=${this.projectId}&startDate=${startDate}&endDate=${endDate}&granularity=${granularity}`;
console.log('趋势数据请求URL:', url); // 调试日志
try {
const result = await this.request(url);
console.log('趋势数据API返回:', result); // 调试日志
return result;
} catch (error) {
console.error('获取趋势数据失败:', error);
// 返回降级数据
return this.getFallbackData(url);
}
}
/**
* 获取资源利用率分布数据
*/
async getResourceDistribution(date = '') {
let url = `${this.baseUrl}/distribution?projectId=${this.projectId}`;
if (date) {
url += `&date=${date}`;
}
return await this.request(url);
}
/**
* 获取优化建议
*/
async getOptimizationSuggestions(limit = 5) {
const url = `${this.baseUrl}/suggestions?projectId=${this.projectId}&limit=${limit}`;
return await this.request(url);
}
/**
* 获取实时资源状态
*/
async getRealtimeStatus(lastUpdateTime = '') {
let url = `${this.baseUrl}/realtime?projectId=${this.projectId}`;
if (lastUpdateTime) {
url += `&lastUpdateTime=${lastUpdateTime}`;
}
return await this.request(url);
}
/**
* 获取降级数据当API调用失败时使用
*/
getFallbackData(url) {
console.warn('使用降级数据:', url);
if (url.includes('/overview')) {
return {
overallStats: {
totalRate: 85.2,
personnelRate: 100.0,
equipmentRate: 82.3,
materialRate: 84.8
},
resourceOverview: {
personnel: { count: 0, rate: 88.5, status: "normal" },
equipment: { count: 0, rate: 82.3, status: "normal" },
material: { count: 89, rate: 84.8, status: "normal" },
energy: { count: 76, rate: 91.2, status: "normal" }
}
};
}
if (url.includes('/details')) {
return {
total: 15,
list: [
{ id: "001", type: "人员", name: "土建班组", status: "rest", rate: 100.0, assessment: "良好", location: "1号楼3层" },
{ id: "002", type: "人员", name: "钢筋班组", status: "rest", rate: 100.0, assessment: "良好", location: "2号楼1层" },
{ id: "003", type: "人员", name: "混凝土班组", status: "rest", rate: 100.0, assessment: "良好", location: "休息区" },
{ id: "004", type: "设备", name: "塔吊-T1", status: "offline", rate: 89.3, assessment: "优秀", location: "施工区域A" },
{ id: "005", type: "设备", name: "挖掘机-H2", status: "offline", rate: 78.6, assessment: "一般", location: "施工区域B" },
{ id: "006", type: "设备", name: "混凝土泵车", status: "offline", rate: 76.4, assessment: "一般", location: "维护区" },
{ id: "007", type: "设备", name: "起重机-T1", status: "offline", rate: 0, assessment: "较差", location: "停车场" },
{ id: "008", type: "材料", name: "钢筋", status: "low_stock", rate: 91.2, assessment: "优秀", location: "材料仓库" },
{ id: "009", type: "材料", name: "混凝土", status: "low_stock", rate: 83.5, assessment: "良好", location: "材料仓库" },
{ id: "010", type: "材料", name: "砂石料", status: "low_stock", rate: 79.8, assessment: "一般", location: "材料仓库" },
{ id: "011", type: "材料", name: "水泥", status: "low_stock", rate: 65.2, assessment: "较差", location: "材料仓库" },
{ id: "012", type: "能源", name: "电力系统", status: "standby", rate: 93.1, assessment: "优秀", location: "配电房" },
{ id: "013", type: "能源", name: "柴油储备", status: "standby", rate: 88.4, assessment: "良好", location: "油库" },
{ id: "014", type: "能源", name: "天然气", status: "standby", rate: 85.6, assessment: "良好", location: "气站" },
{ id: "015", type: "能源", name: "备用电源", status: "standby", rate: 100, assessment: "优秀", location: "备用机房" }
]
};
}
if (url.includes('/trends')) {
return {
dates: ['2025-03-07', '2025-03-08', '2025-03-09', '2025-03-10', '2025-03-11', '2025-03-12', '2025-03-13'],
trends: {
personnel: [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0],
equipment: [78.9, 80.3, 82.1, 81.7, 82.3, 83.1, 82.3],
material: [82.1, 83.5, 84.2, 84.8, 85.1, 84.6, 84.8],
energy: [89.5, 90.2, 91.2, 90.8, 91.5, 91.0, 91.2]
}
};
}
if (url.includes('/distribution')) {
return [
{ name: "人员", value: 100.0, color: "#16baaa" },
{ name: "设备", value: 82.3, color: "#20d3c2" },
{ name: "材料", value: 84.8, color: "#25e5d0" },
{ name: "能源", value: 91.2, color: "#2af0dd" }
];
}
if (url.includes('/suggestions')) {
return [
{
id: "001",
title: "设备调度优化",
description: "挖掘机-H2利用率偏低建议调整作业计划提高设备运转效率",
priority: "高优先级",
category: "equipment"
},
{
id: "002",
title: "材料库存管理",
description: "砂石料库存不足,建议提前采购补充,避免影响施工进度",
priority: "中优先级",
category: "material"
}
];
}
return {};
}
/**
* 数据转换方法 - 将API返回的数据转换为前端需要的格式
*/
transformOverviewData(apiData) {
return {
overallStats: apiData.overallStats,
resourceOverview: apiData.resourceOverview
};
}
transformDetailsData(apiData) {
return {
total: apiData.total,
list: apiData.list.map(item => ({
type: item.type,
name: item.name,
status: item.status,
rate: item.rate,
assessment: item.assessment
}))
};
}
transformTrendsData(apiData) {
// 兼容不同的后端数据格式
if (apiData.trends) {
// 格式1: { dates: [], trends: { personnel: [], equipment: [], material: [], energy: [] } }
return {
dates: apiData.dates,
trends: {
personnel: apiData.trends.personnel,
equipment: apiData.trends.equipment,
material: apiData.trends.material,
energy: apiData.trends.energy
}
};
} else {
// 格式2: { dates: [], personnel: [], equipment: [], material: [], energy: [] }
return {
dates: apiData.dates,
personnel: apiData.personnel,
equipment: apiData.equipment,
material: apiData.material,
energy: apiData.energy
};
}
}
transformDistributionData(apiData) {
return apiData.map(item => ({
name: item.name,
value: item.value,
color: item.color
}));
}
transformSuggestionsData(apiData) {
return apiData.map(item => ({
title: item.title,
description: item.description,
priority: item.priority
}));
}
}
// 创建全局API服务实例
window.resourceApiService = new ResourceApiService();