import DateFormatter from "../date/date-formatter"; import DataFormatter from "./data-formatter"; import { RESPONSE_HEADERS_CONTENT_TYPE } from "../common/constants"; import { EvChargerInfo } from "./types"; export default class FileDownloader { /** * data와 파일이름이 인자값으로 주어지면 엑셀파일을 다운로드 한다. * * @static * @public * @return string * @param data ArrayBuffer * @param fileName */ static downloadExcelFile(data: ArrayBuffer, fileName?: string) { const blob = new Blob([data], { type: RESPONSE_HEADERS_CONTENT_TYPE.EXCEL_FILE, }); const link = document.createElement("a"); const blobUrl = URL.createObjectURL(blob); link.href = blobUrl; if (fileName) { link.download = fileName; } link.click(); URL.revokeObjectURL(blobUrl); } /** * type에 따른 엑셀파일 이름 만들어 return한다. * * 아우토크립트_충전소목록_2023-12-20 //evStation * 아우토크립트_충전기목록_2023-12-20 //evCharger * 아우토크립트_충전내역_2023-12-20-2023-12-23 //chargingHistory * * @static * @public * @return string * @param type "evStation" | "evCharger" | "chargingHistory" * @param option operatingInstitutionList: 운영기관 리스트, dataRage: {start: 시작하는 날, end: 마지막 날} */ static generateExcelFileName( type: "evStation" | "evCharger" | "chargingHistory", option: { operatingInstitutionList?: string[]; dateRange?: { start: Date; end: Date; }; } ) { const { operatingInstitutionList, dateRange } = option; const downloadDateStr = DateFormatter.divideDateDuration( new Date(), "yyyy-MM-dd" ); const operatingInstitutionStr = operatingInstitutionList ? FileDownloader.generateOperatingInstitutionStr(operatingInstitutionList) : ""; const dateRangeStr = `${DateFormatter.divideDateDuration( dateRange?.start, "yyyy-MM-dd" )}-${DateFormatter.divideDateDuration(dateRange?.end, "yyyy-MM-dd")}`; switch (type) { case "evStation": return `${operatingInstitutionStr}_충전소목록_${downloadDateStr}`; case "evCharger": return `${operatingInstitutionStr}_충전기목록_${downloadDateStr}`; case "chargingHistory": return `충전내역_${dateRangeStr}_${downloadDateStr}`; } } /** * 운영기관이 1개일 때는 그대로 return하며 2개 이상일 경우 ~외~개로 format해 return한다. * * ["아우토크립트"] -> 아우토크립트 * ["아우토크립트", "차밥스"] -> 아우토크립트외1개 * * @static * @private * @return 운영기관 이름 * @param operatingInstitutionList 운영기관 리스트 */ static generateOperatingInstitutionStr(operatingInstitutionList: string[]) { const operatingInstitutionNum = operatingInstitutionList.length; const firstOperatingInstitutionName = DataFormatter.formatOperatingInstitutionName(operatingInstitutionList[0]); return 1 === operatingInstitutionNum ? firstOperatingInstitutionName : `${firstOperatingInstitutionName}외${operatingInstitutionNum - 1}개`; } /** * 운영기관을 전체 or 부분 선택을 했을 경우 운영기관 리스트 return한다. * * @static * @public * @return * @param type "ALL", "PARTIAL" * @param operatingInstitutionList: {label: string, value: string}[] * @param selected */ static getSelectedOperatingInstitution( type: any, operatingInstitutionList: any[], selected: EvChargerInfo[] ) { if ("ALL" === type) { return [...operatingInstitutionList.map((item) => item.label)]; } else if ("PARTIAL" === type) { return [ ...new Set([...selected.map((value) => value.operatingInstitution)]), ]; } } }