import request from '@/utils/request'; import axios from 'axios'; import { Loading } from 'element-ui'; const baseUrl = '/aps/factory/calendar'; const pendingRequests = {}; let loadingInstance = null; let loadingCount = 0; function showLoading(text = '加载中...') { loadingCount += 1; if (!loadingInstance) { loadingInstance = Loading.service({ lock: true, text, spinner: 'el-icon-loading', background: 'rgba(255, 255, 255, 0.68)', customClass: 'factory-calendar-loading' }); } else { loadingInstance.text = text; } } function hideLoading() { loadingCount = Math.max(loadingCount - 1, 0); if (!loadingCount && loadingInstance) { loadingInstance.close(); loadingInstance = null; } } async function requestWithLoading(requestFactory, text) { showLoading(text); try { return await requestFactory(); } finally { hideLoading(); } } function onceRequest(key, requestFactory) { if (pendingRequests[key]) { return pendingRequests[key]; } pendingRequests[key] = requestFactory().finally(() => { delete pendingRequests[key]; }); return pendingRequests[key]; } function normalizeTimeValue(value) { if (typeof value !== 'string' || !/^\d{2}:\d{2}$/.test(value)) { return value; } return `${value}:00`; } function normalizeDateTimeValue(value) { if (typeof value !== 'string') { return value; } if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/.test(value)) { return value.replace('T', ' '); } if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(value)) { return `${value}:00`; } return value; } function normalizeTimePayload(data) { if (Array.isArray(data)) { return data.map((item) => normalizeTimePayload(item)); } if ( !data || typeof data !== 'object' || Object.prototype.toString.call(data) !== '[object Object]' ) { return data; } return Object.keys(data).reduce((next, key) => { const value = data[key]; if (key === 'startTime' || key === 'endTime') { next[key] = normalizeTimeValue(value); } else if (key === 'effectiveTime' || key === 'expireTime') { next[key] = normalizeDateTimeValue(value); } else { next[key] = normalizeTimePayload(value); } return next; }, {}); } function normalizeSegmentContent(data) { if (!data || typeof data.newContent !== 'string') { return data; } try { const parsed = JSON.parse(data.newContent); return { ...data, newContent: JSON.stringify(normalizeTimePayload(parsed)) }; } catch (e) { return data; } } function normalizeRequestData(data) { return normalizeSegmentContent(normalizeTimePayload(data)); } function unwrap(res) { if (res.data.code == 0) { return res.data.data; } return Promise.reject(new Error(res.data.message)); } export async function addCalendar(data) { const res = await requestWithLoading( () => request.post(`${baseUrl}/add`, normalizeRequestData(data)), '保存日历中...' ); return unwrap(res); } export async function editCalendar(data) { const res = await requestWithLoading( () => request.put(`${baseUrl}/edit`, normalizeRequestData(data)), '保存日历中...' ); return unwrap(res); } export async function deleteCalendar(data) { const res = await requestWithLoading( () => request.delete(`${baseUrl}/delete`, { data }), '删除日历中...' ); return unwrap(res); } export async function updateCalendarStatus(data) { const res = await requestWithLoading( () => request.put(`${baseUrl}/status`, data), '同步状态中...' ); return unwrap(res); } export async function pageCalendar(params) { const res = await requestWithLoading( () => request.get(`${baseUrl}/list`, { params }), '加载日历数据中...' ); return unwrap(res); } export async function copyCalendar(data) { const res = await requestWithLoading( () => request.post(`${baseUrl}/copy`, data), '复制日历中...' ); return unwrap(res); } export async function exportCalendarList(params) { const res = await requestWithLoading( () => request.get(`${baseUrl}/batch/export`, { params }), '导出日历中...' ); return unwrap(res); } export async function viewCalendar(params) { const res = await requestWithLoading( () => request.get(`${baseUrl}/view`, { params }), '加载日历视图中...' ); return unwrap(res); } export async function saveCalendarDetail(data) { const res = await requestWithLoading( () => request.post(`${baseUrl}/detail/save`, normalizeRequestData(data)), '保存时段明细中...' ); return unwrap(res); } export async function checkCalendarConflict(data) { const payload = normalizeRequestData(data); const res = await requestWithLoading( () => onceRequest(`conflict-check:${JSON.stringify(payload)}`, () => request.post(`${baseUrl}/conflict/check`, payload) ), '检测冲突中...' ); return unwrap(res); } export async function checkAllCalendarConflict(params) { const payload = normalizeRequestData(params); const res = await requestWithLoading( () => onceRequest(`conflict-all:${JSON.stringify(payload)}`, () => request.get(`${baseUrl}/conflict/all`, { params: payload }) ), '年度冲突检测中...' ); return unwrap(res); } export async function applyCalendarAdjust(data) { const res = await requestWithLoading( () => request.post(`${baseUrl}/adjust/apply`, normalizeRequestData(data)), '提交调整申请中...' ); return unwrap(res); } export async function approveCalendarAdjust(data) { const res = await requestWithLoading( () => request.put(`${baseUrl}/adjust/approve`, data), '审批处理中...' ); return unwrap(res); } export async function pageCalendarAdjust(params) { const res = await requestWithLoading( () => request.get(`${baseUrl}/adjust/list`, { params }), '加载调整申请中...' ); return unwrap(res); } export async function getPlanRelation(params) { const res = await requestWithLoading( () => request.get(`${baseUrl}/plan/relation`, { params: normalizeRequestData(params) }), '加载关联计划中...' ); return unwrap(res); } export async function refreshCalendarPlan(data) { const res = await requestWithLoading( () => request.post(`${baseUrl}/plan/refresh`, data), '刷新关联计划中...' ); return unwrap(res); } export async function getMonthStat(params) { const res = await requestWithLoading( () => request.get(`${baseUrl}/stat/month`, { params }), '加载统计数据中...' ); return unwrap(res); } export async function getPublicLegalHolidays(year) { const res = await axios.get( `https://api.jiejiariapi.com/v1/holidays/${year}`, { timeout: 8000 } ); return res.data; }