276 lines
11 KiB
JavaScript
276 lines
11 KiB
JavaScript
/**
|
||
* 资源利用率分析 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();
|