implemented road missions taradod reports page

This commit is contained in:
2026-01-26 15:51:17 +03:30
parent a7fb0f5bc1
commit 1cbcc4bb90
15 changed files with 624 additions and 496 deletions

View File

@@ -1,7 +1,7 @@
import WithPermission from "@/core/middlewares/withPermission"; import WithPermission from "@/core/middlewares/withPermission";
import ReportPage from "@/components/dashboard/roadMissions/reports"; import MissionsReportPage from "@/components/dashboard/roadMissions/reports/missionsReports";
export const metadata = { export const metadata = {
title: "کارتابل گزارش ماموریت", title: "کارتابل گزارش ماموریت ها",
}; };
const Page = () => { const Page = () => {
return ( return (
@@ -10,7 +10,7 @@ const Page = () => {
"all", // TODO : change permission "all", // TODO : change permission
]} ]}
> >
<ReportPage /> <MissionsReportPage />
</WithPermission> </WithPermission>
); );
}; };

View File

@@ -0,0 +1,3 @@
export default function ViolationReportsPage() {
return <div>ViolationReportsPage</div>;
}

View File

@@ -1,84 +0,0 @@
"use client";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { Box } from "@mui/material";
import { useMemo } from "react";
import Toolbar from "./Toolbar";
const ReportLists = ({ data, specialFilter }) => {
const columns = useMemo(() => {
return [
{
accessorKey: "edare_name",
header: "اداره کل",
id: "edare_name",
enableColumnFilter: false,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
},
{
accessorKey: "no_mission_count",
header: "تردد بدون ماموریت",
id: "no_mission_count",
enableColumnFilter: false,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
muiTableBodyCellProps: {
sx: {
textAlign: "center",
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) => {
return renderedCellValue;
},
},
{
accessorKey: "out_of_area_count",
header: "تردد خارج محدوده",
id: "out_of_area_count",
enableColumnFilter: false,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
muiTableBodyCellProps: {
sx: {
textAlign: "center",
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) => {
return renderedCellValue;
},
},
];
}, []);
return (
<Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}>
<DataTableWithAuth
TableToolbar={Toolbar}
columns={columns}
data={data.data}
page_name={"roadMissionReport"}
table_name={"roadMissionReportList"}
enablePagination={false}
specialFilter={specialFilter}
/>
</Box>
);
};
export default ReportLists;

View File

@@ -1,5 +1,8 @@
"use client"; "use client";
import { EXPORT_COUNTRY_ROAD_MISSIONS_REPORTS, EXPORT_PROVINCE_ROAD_MISSIONS_REPORTS } from "@/core/utils/routes"; import {
EXPORT_MISSIONS_REPORT_TARADOD_COUNTRY_EXCEL_ACTIVITY,
EXPORT_MISSIONS_REPORT_TARADOD_PROVINCE_EXCEL_ACTIVITY,
} from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest"; import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react"; import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description"; import DescriptionIcon from "@mui/icons-material/Description";
@@ -34,8 +37,8 @@ const PrintExcel = ({ table, filterData }) => {
const CountryOrProvince = activeFilters.find((item) => item.id === "province_id"); const CountryOrProvince = activeFilters.find((item) => item.id === "province_id");
const requestUrl = const requestUrl =
CountryOrProvince.value === "-1" CountryOrProvince.value === "-1"
? EXPORT_COUNTRY_ROAD_MISSIONS_REPORTS ? EXPORT_MISSIONS_REPORT_TARADOD_COUNTRY_EXCEL_ACTIVITY
: EXPORT_PROVINCE_ROAD_MISSIONS_REPORTS; : EXPORT_MISSIONS_REPORT_TARADOD_PROVINCE_EXCEL_ACTIVITY;
requestServer(`${requestUrl}?${filterParams}`, "get", { requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" }, requestOptions: { responseType: "blob" },
}) })

View File

@@ -0,0 +1,141 @@
"use client";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { Box } from "@mui/material";
import { useEffect, useMemo } from "react";
import Toolbar from "./Toolbar";
const MissionsReportLists = ({ data, specialFilter }) => {
useEffect(() => {
console.log(data);
}, [data]);
const columns = useMemo(() => {
return [
{
accessorKey: "edare_name",
header: "اداره کل",
id: "edare_name",
enableColumnFilter: false,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
},
{
accessorKey: "total",
header: "کل ماموریت ها",
id: "total",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "khareg_mahdode",
header: "تردد خارج از محدوده",
id: "khareg_mahdode",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "durations",
header: "جمع ساعات ماموریت",
id: "duration",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "gps",
header: "جمع ساعات gps",
id: "gps",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "far_h",
header: "با فرایند ساعتی",
id: "far_h",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "far_d",
header: "با فرایند روزانه",
id: "far_d",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "un_far_h",
header: "بدون فرایند ساعتی",
id: "un_far_h",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "un_far_d",
header: "بدون فرایند روزانه",
id: "un_far_d",
enableColumnFilter: false,
enableSorting: false,
datatype: "numeric",
grow: false,
size: 50,
},
{
accessorKey: "item",
header: "فعالیت روزانه",
id: "item",
enableColumnFilter: false,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
},
{
accessorKey: "patrol",
header: "گشت راهداری",
id: "patrol",
enableColumnFilter: false,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
},
];
}, []);
return (
<Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}>
<DataTableWithAuth
TableToolbar={Toolbar}
columns={columns}
data={data.data}
page_name={"roadMissionReport"}
table_name={"roadMissionReportList"}
enablePagination={false}
specialFilter={specialFilter}
/>
</Box>
);
};
export default MissionsReportLists;

View File

@@ -5,7 +5,10 @@ const SearchReportList = ({ handleSubmit, onSearchSubmit, control, hasProvincesP
return ( return (
<> <>
<StyledForm onSubmit={handleSubmit(onSearchSubmit)}> <StyledForm onSubmit={handleSubmit(onSearchSubmit)}>
<SearchReportField control={control} hasProvincesPermission={hasProvincesPermission} /> <SearchReportField
control={control}
// hasProvincesPermission={hasProvincesPermission}
/>
</StyledForm> </StyledForm>
</> </>
); );

View File

@@ -1,6 +1,9 @@
"use client"; "use client";
import PageTitle from "@/core/components/PageTitle"; import PageTitle from "@/core/components/PageTitle";
import { GET_COUNTRY_ACTIVITY_REPORT, GET_PROVINCE_ACTIVITY_REPORT } from "@/core/utils/routes"; import {
GET_MISSIONS_REPORT_TARADOD_COUNTRY_ACTIVITY,
GET_MISSIONS_REPORT_TARADOD_PROVINCE_ACTIVITY,
} from "@/core/utils/routes";
import { useAuth } from "@/lib/contexts/auth"; import { useAuth } from "@/lib/contexts/auth";
import { usePermissions } from "@/lib/hooks/usePermissions"; import { usePermissions } from "@/lib/hooks/usePermissions";
import useRequest from "@/lib/hooks/useRequest"; import useRequest from "@/lib/hooks/useRequest";
@@ -10,20 +13,20 @@ import moment from "jalali-moment";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import * as yup from "yup"; import * as yup from "yup";
import ReportLists from "./ReportLists"; import MissionsReportLists from "./MissionsReportLists";
import SearchReportList from "./Search"; import SearchReportList from "./Search";
const ReportPage = () => { const MissionsReportPage = () => {
const [data, setData] = useState(null); const [data, setData] = useState(null);
const { data: userPermissions } = usePermissions(); const { data: userPermissions } = usePermissions();
const { user } = useAuth(); const { user } = useAuth();
const requestServer = useRequest(); const requestServer = useRequest();
const hasProvincesPermission = userPermissions?.includes("mission-report-country"); // const hasProvincesPermission = userPermissions?.includes("mission-report-country");
const defaultValues = { const defaultValues = {
from_date: moment(new Date()).format("YYYY-MM-DD"), from_date: moment(new Date()).format("YYYY-MM-DD"),
date_to: moment(new Date()).format("YYYY-MM-DD"), date_to: moment(new Date()).format("YYYY-MM-DD"),
province_id: hasProvincesPermission ? "-1" : user.province_id, province_id: user.province_id || "-1",
}; };
const defaultFilter = [ const defaultFilter = [
{ value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, { value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" },
@@ -43,8 +46,8 @@ const ReportPage = () => {
]); ]);
if (data.province_id === "-1") { if (data.province_id === "-1") {
try { try {
params.set("province_id", `${data.province_id}`); // params.set("province_id", `${data.province_id}`);
const response = await requestServer(`${GET_COUNTRY_ACTIVITY_REPORT}?${params}`); const response = await requestServer(`${GET_MISSIONS_REPORT_TARADOD_COUNTRY_ACTIVITY}?${params}`);
const result = response.data.data; const result = response.data.data;
const nationalReportForItem = result.activities.find((report) => report.province_id === "-1"); const nationalReportForItem = result.activities.find((report) => report.province_id === "-1");
const nationalReport = { const nationalReport = {
@@ -71,7 +74,7 @@ const ReportPage = () => {
} else { } else {
try { try {
params.set("province_id", `${data.province_id}`); params.set("province_id", `${data.province_id}`);
const response = await requestServer(`${GET_PROVINCE_ACTIVITY_REPORT}?${params}`); const response = await requestServer(`${GET_MISSIONS_REPORT_TARADOD_PROVINCE_ACTIVITY}?${params}`);
const result = response.data.data; const result = response.data.data;
const nationalReportForItem = result.activities.find((report) => report.city_id === "-1"); const nationalReportForItem = result.activities.find((report) => report.city_id === "-1");
@@ -127,12 +130,12 @@ const ReportPage = () => {
<PageTitle title={"کارتابل گزارش ماموریت"} /> <PageTitle title={"کارتابل گزارش ماموریت"} />
<SearchReportList <SearchReportList
control={control} control={control}
hasProvincesPermission={hasProvincesPermission} // hasProvincesPermission={hasProvincesPermission}
handleSubmit={handleSubmit} handleSubmit={handleSubmit}
onSearchSubmit={onSearchSubmit} onSearchSubmit={onSearchSubmit}
/> />
{!data ? <LinearProgress /> : <ReportLists specialFilter={specialFilter} data={data} />} {!data ? <LinearProgress /> : <MissionsReportLists specialFilter={specialFilter} data={data} />}
</Stack> </Stack>
); );
}; };
export default ReportPage; export default MissionsReportPage;

View File

@@ -33,6 +33,7 @@ import ContactPageIcon from "@mui/icons-material/ContactPage";
import DirectionsBusIcon from "@mui/icons-material/DirectionsBus"; import DirectionsBusIcon from "@mui/icons-material/DirectionsBus";
import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle"; import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle";
import RemoveRoadIcon from "@mui/icons-material/RemoveRoad"; import RemoveRoadIcon from "@mui/icons-material/RemoveRoad";
import { ReportProblem, RvHookup } from "@mui/icons-material";
export const pageMenu = [ export const pageMenu = [
{ {
@@ -167,11 +168,31 @@ export const pageMenu = [
{ {
id: "roadMissionsReports", id: "roadMissionsReports",
label: "گزارشات", label: "گزارشات",
type: "page", type: "menu",
route: "/dashboard/road-missions/reports",
icon: <AssessmentIcon sx={{ width: "inherit", height: "inherit" }} />, icon: <AssessmentIcon sx={{ width: "inherit", height: "inherit" }} />,
// badges: [{ key: "mission.control" }], // TODO: add badge and permission // badges: [{ key: "mission.control" }], // TODO: add badge and permission
permissions: ["all"], permissions: ["all"],
hasSubitems: true,
Subitems: [
{
id: "missionsReports",
label: "ترددها",
icon: <RvHookup sx={{ width: "inherit", height: "inherit" }} />,
type: "page",
route: "/dashboard/road-missions/reports/missionsReports",
badges: [{ key: "mission.request_portal" }],
permissions: ["all"],
},
{
id: "violationsReports",
label: "تخلفات",
icon: <ReportProblem sx={{ width: "inherit", height: "inherit" }} />,
type: "page",
route: "/dashboard/road-missions/reports/violationsReports",
badges: [{ key: "mission.request_portal" }],
permissions: ["all"],
},
],
}, },
], ],
}, },

View File

@@ -1,4 +1,4 @@
import { Mediation } from "@mui/icons-material"; import { Mediation, ReportProblem, RvHookup } from "@mui/icons-material";
import AccountTreeIcon from "@mui/icons-material/AccountTree"; import AccountTreeIcon from "@mui/icons-material/AccountTree";
import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings"; import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings";
import AssessmentIcon from "@mui/icons-material/Assessment"; import AssessmentIcon from "@mui/icons-material/Assessment";
@@ -6,7 +6,9 @@ import AssignmentLateIcon from "@mui/icons-material/AssignmentLate";
import AssistantIcon from "@mui/icons-material/Assistant"; import AssistantIcon from "@mui/icons-material/Assistant";
import BallotIcon from "@mui/icons-material/Ballot"; import BallotIcon from "@mui/icons-material/Ballot";
import BiotechIcon from "@mui/icons-material/Biotech"; import BiotechIcon from "@mui/icons-material/Biotech";
import ContactPageIcon from "@mui/icons-material/ContactPage";
import CottageIcon from "@mui/icons-material/Cottage"; import CottageIcon from "@mui/icons-material/Cottage";
import DirectionsBusIcon from "@mui/icons-material/DirectionsBus";
import DoorbellIcon from "@mui/icons-material/Doorbell"; import DoorbellIcon from "@mui/icons-material/Doorbell";
import DriveEtaIcon from "@mui/icons-material/DriveEta"; import DriveEtaIcon from "@mui/icons-material/DriveEta";
import ElectricBoltIcon from "@mui/icons-material/ElectricBolt"; import ElectricBoltIcon from "@mui/icons-material/ElectricBolt";
@@ -19,19 +21,17 @@ import GroupsIcon from "@mui/icons-material/Groups";
import HandymanIcon from "@mui/icons-material/Handyman"; import HandymanIcon from "@mui/icons-material/Handyman";
import LineAxisIcon from "@mui/icons-material/LineAxis"; import LineAxisIcon from "@mui/icons-material/LineAxis";
import LockPersonIcon from "@mui/icons-material/LockPerson"; import LockPersonIcon from "@mui/icons-material/LockPerson";
import ManageAccountsIcon from "@mui/icons-material/ManageAccounts";
import MapIcon from "@mui/icons-material/Map"; import MapIcon from "@mui/icons-material/Map";
import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork";
import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt";
import RemoveRoadIcon from "@mui/icons-material/RemoveRoad";
import RouteIcon from "@mui/icons-material/Route"; import RouteIcon from "@mui/icons-material/Route";
import ScienceIcon from "@mui/icons-material/Science"; import ScienceIcon from "@mui/icons-material/Science";
import SecurityIcon from "@mui/icons-material/Security";
import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard"; import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard";
import SpeedIcon from "@mui/icons-material/Speed"; import SpeedIcon from "@mui/icons-material/Speed";
import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt";
import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork";
import SecurityIcon from "@mui/icons-material/Security";
import ManageAccountsIcon from "@mui/icons-material/ManageAccounts";
import DirectionsBusIcon from "@mui/icons-material/DirectionsBus";
import ContactPageIcon from "@mui/icons-material/ContactPage";
import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle"; import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle";
import RemoveRoadIcon from "@mui/icons-material/RemoveRoad";
export const pageMenuDev = [ export const pageMenuDev = [
{ {
@@ -166,11 +166,31 @@ export const pageMenuDev = [
{ {
id: "roadMissionsReports", id: "roadMissionsReports",
label: "گزارشات", label: "گزارشات",
type: "page", type: "menu",
route: "/dashboard/road-missions/reports",
icon: <AssessmentIcon sx={{ width: "inherit", height: "inherit" }} />, icon: <AssessmentIcon sx={{ width: "inherit", height: "inherit" }} />,
// badges: [{ key: "mission.control" }], // TODO: add badge and permission // badges: [{ key: "mission.control" }], // TODO: add badge and permission
permissions: ["all"], permissions: ["all"],
hasSubitems: true,
Subitems: [
{
id: "missionsReports",
label: "ترددها",
icon: <RvHookup sx={{ width: "inherit", height: "inherit" }} />,
type: "page",
route: "/dashboard/road-missions/reports/missionsReports",
badges: [{ key: "mission.request_portal" }],
permissions: ["all"],
},
{
id: "violationsReports",
label: "تخلفات",
icon: <ReportProblem sx={{ width: "inherit", height: "inherit" }} />,
type: "page",
route: "/dashboard/road-missions/reports/violationsReports",
badges: [{ key: "mission.request_portal" }],
permissions: ["all"],
},
],
}, },
], ],
}, },

View File

@@ -47,6 +47,24 @@ export const GET_COUNTRY_ACTIVITY_REPORT = api + "/api/v3/missions/report/countr
export const EXPORT_COUNTRY_ROAD_PATROL_REPORTS = api + "/api/v3/road_patrols/report/country_activity_excel"; export const EXPORT_COUNTRY_ROAD_PATROL_REPORTS = api + "/api/v3/road_patrols/report/country_activity_excel";
export const EXPORT_PROVINCE_ROAD_PATROL_REPORTS = api + "/api/v3/road_patrols/report/province_activity_excel"; export const EXPORT_PROVINCE_ROAD_PATROL_REPORTS = api + "/api/v3/road_patrols/report/province_activity_excel";
export const GET_MISSIONS_REPORT_VIOLATION_COUNTRY_ACTIVITY =
api + "/api/v3/missions/report_violation/country_activity";
export const GET_MISSIONS_REPORT_VIOLATION_PROVINCE_ACTIVITY =
api + "/api/v3/missions/report_violation/province_activity";
export const EXPORT_MISSIONS_REPORT_VIOLATION_COUNTRY_ACTIVITY =
api + "/api/v3/missions/report_violation/country_excel_activity";
export const EXPORT_MISSIONS_REPORT_VIOLATION_PROVINCE_ACTIVITY =
api + "/api/v3/missions/report_violation/province_excel_activity";
export const GET_MISSIONS_REPORT_TARADOD_COUNTRY_ACTIVITY =
"http://192.168.1.132:8000" + "/api/v3/missions/report_taradod/country_activity";
export const GET_MISSIONS_REPORT_TARADOD_PROVINCE_ACTIVITY =
"http://192.168.1.132:8000" + "/api/v3/missions/report_taradod/province_activity";
export const EXPORT_MISSIONS_REPORT_TARADOD_COUNTRY_EXCEL_ACTIVITY =
api + "/api/v3/missions/report_taradod/country_excel_activity";
export const EXPORT_MISSIONS_REPORT_TARADOD_PROVINCE_EXCEL_ACTIVITY =
api + "/api/v3/missions/report_taradod/province_excel_activity";
// road items // road items
export const GET_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor"; export const GET_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor";
export const EXPORT_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor/excel"; export const EXPORT_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor/excel";