From 6388a824b4a8124e7bd29df7460b5e5c290f0179 Mon Sep 17 00:00:00 2001 From: Lixian Zhou Date: Thu, 12 Mar 2026 13:12:57 -0400 Subject: [PATCH] fix --- app/.DS_Store | Bin 28676 -> 0 bytes app/controllers/report.controller.js | 10 +++++++++- .../components/trans-routes/RoutesDashboard.js | 14 +++++++++++++- .../components/trans-routes/RoutesHistory.js | 14 +++++++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) delete mode 100644 app/.DS_Store diff --git a/app/.DS_Store b/app/.DS_Store deleted file mode 100644 index f0385b8afc988e06752d350adf8fe8dd252335f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28676 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 T3;F*-{$JuL_>qnk{r~?1dYw1b diff --git a/app/controllers/report.controller.js b/app/controllers/report.controller.js index 491edfa..9dfe080 100644 --- a/app/controllers/report.controller.js +++ b/app/controllers/report.controller.js @@ -29,10 +29,17 @@ const toObjectIdText = (value) => { const findTemplatePathBySite = (site) => { const safeSite = [1, 2, 3].includes(Number(site)) ? Number(site) : 1; const fileName = `pdf_templete${safeSite}.pdf`; + const cwd = process.cwd(); const candidatePaths = [ path.join(ROOT_DIR, "app", "views", "upload", fileName), path.join(ROOT_DIR, "client", "build", "upload", fileName), - path.join(ROOT_DIR, "client", "public", "upload", fileName) + path.join(ROOT_DIR, "client", "public", "upload", fileName), + path.join(cwd, "app", "views", "upload", fileName), + path.join(cwd, "client", "build", "upload", fileName), + path.join(cwd, "client", "public", "upload", fileName), + path.join("/www/wwwroot/upload", fileName), + path.join(`/www/wwwroot/worldshine${safeSite}`, "app", "views", "upload", fileName), + path.join(`/www/wwwroot/worldshine${safeSite}-tspt`, "app", "views", "upload", fileName) ]; return candidatePaths.find((candidate) => fs.existsSync(candidate)) || ""; }; @@ -307,6 +314,7 @@ exports.exportRouteReportZip = async (req, res) => { archive.finalize(); } catch (err) { + console.error("Failed to export route report zip:", err); res.status(500).send({ message: err.message || "Failed to export route reports." }); diff --git a/client/src/components/trans-routes/RoutesDashboard.js b/client/src/components/trans-routes/RoutesDashboard.js index 761f91d..1a72564 100644 --- a/client/src/components/trans-routes/RoutesDashboard.js +++ b/client/src/components/trans-routes/RoutesDashboard.js @@ -14,6 +14,17 @@ import RouteCustomerTable from "./RouteCustomerTable"; const RoutesDashboard = () => { + const getErrorMessageFromBlob = async (blobData, fallback = 'Failed to export route report.') => { + try { + if (!blobData) return fallback; + const text = await blobData.text(); + if (!text) return fallback; + const parsed = JSON.parse(text); + return parsed?.message || fallback; + } catch (_err) { + return fallback; + } + }; const HIDDEN_CUSTOMER_TYPE_FILTER_VALUES = ['transferred', 'deceased', 'discharged']; const navigate = useNavigate(); const dispatch = useDispatch(); @@ -882,7 +893,8 @@ const RoutesDashboard = () => { window.URL.revokeObjectURL(downloadUrl); } catch (error) { console.error('Failed to export route report:', error); - window.alert('Failed to export route report.'); + const message = await getErrorMessageFromBlob(error?.response?.data); + window.alert(message); } } const goToHistoryPage = () => { diff --git a/client/src/components/trans-routes/RoutesHistory.js b/client/src/components/trans-routes/RoutesHistory.js index 33ee834..ce40466 100644 --- a/client/src/components/trans-routes/RoutesHistory.js +++ b/client/src/components/trans-routes/RoutesHistory.js @@ -8,6 +8,17 @@ import DatePicker from "react-datepicker"; import { AuthService, ReportService } from "../../services"; const RoutesHistory = () => { + const getErrorMessageFromBlob = async (blobData, fallback = 'Failed to export route report.') => { + try { + if (!blobData) return fallback; + const text = await blobData.text(); + if (!text) return fallback; + const parsed = JSON.parse(text); + return parsed?.message || fallback; + } catch (_err) { + return fallback; + } + }; const navigate = useNavigate(); const dispatch = useDispatch(); const inboundRoutes = useSelector(selectHistoryInboundRoutes); @@ -47,7 +58,8 @@ const RoutesHistory = () => { window.URL.revokeObjectURL(downloadUrl); } catch (error) { console.error('Failed to export route report:', error); - window.alert('Failed to export route report.'); + const message = await getErrorMessageFromBlob(error?.response?.data); + window.alert(message); } }