Files
Rasadyar_FrontEnd/src/features/city/components/city-hatching-unassigned/CityHatchingUnassigned.js

692 lines
25 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
Button,
IconButton,
TextField,
Tooltip,
Typography,
} from "@mui/material";
import axios from "axios";
import { useContext, useEffect, useState } from "react";
import { RiFileExcel2Fill, RiSearchLine } from "react-icons/ri";
import { Grid } from "../../../../components/grid/Grid";
import { SPACING } from "../../../../data/spacing";
import { formatTime, formatJustDate } from "../../../../utils/formatTime";
import { getFaUserRole } from "../../../../utils/getFaUserRole";
import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl";
import { CityManageHatchingsArchiveActions } from "../city-manage-hatchings-operations/CityManageHatchingsOperations";
import { useDispatch, useSelector } from "react-redux";
import { AppContext } from "../../../../contexts/AppContext";
import { cityGetHatchingInfoFull } from "../../services/city-get-hatching-info-full";
import ResponsiveTable from "../../../../components/responsive-table/ResponsiveTable";
import {
// DRAWER,
LOADING_END,
LOADING_START,
OPEN_MODAL,
} from "../../../../lib/redux/slices/appSlice";
import { SimpleTable } from "../../../../components/simple-table/SimpleTable";
import ShowImage from "../../../../components/show-image/ShowImage";
import RemoveRedEyeIcon from "@mui/icons-material/RemoveRedEye";
import ArticleIcon from "@mui/icons-material/Article";
import {
ROUTE_ADMINXـHATCHINGS,
ROUTE_CITY_JIHADـHATCHINGS,
ROUTE_CITY_POULTRYـHATCHINGS,
ROUTE_PROVINCE_SUPERVISORـHATCHINGS,
ROUTE_PROVINCEـHATCHINGS,
ROUTE_SUPER_ADMINـHATCHINGS,
ROUTE_SUPPORTERـHATCHINGS,
} from "../../../../routes/routes";
import { useNavigate } from "react-router-dom";
// import { CityHatchingShowTableDetail } from "../city-hatching-show-table-detail/CityHatchingShowTableDetail";
export const CityHatchingUnassigned = ({ readOnly }) => {
const dispatch = useDispatch();
const isReadOnly = readOnly || false;
const [selectedAge1, setSelectedAge1] = useState(0);
const [selectedAge2, setSelectedAge2] = useState(0);
const [data, setData] = useState([]);
const [totalRows, setTotalRows] = useState(0);
const [perPage, setPerPage] = useState(10);
const [textValue, setTextValue] = useState("");
const [page, setPage] = useState(1);
const [tableData, setTableData] = useState([]);
const userKey = useSelector((state) => state.userSlice.userProfile.key);
const navigate = useNavigate();
const [openNotif] = useContext(AppContext);
const handleTextChange = (event) => {
setTextValue(event.target.value);
};
const hatchingAdded = useSelector((state) => state.citySlice.hatchingAdded);
useEffect(() => {
fetchApiData();
}, [hatchingAdded]);
const fetchApiData = async (pageParam = page, perPageParam = perPage) => {
dispatch(LOADING_START());
const response = await axios.get("poultry_hatching/", {
params: {
unknown: true,
search: "filter",
value: textValue,
role: getRoleFromUrl(),
page: pageParam,
page_size: perPageParam,
age1: selectedAge1 || 0,
age2: selectedAge2 || 0,
},
});
dispatch(LOADING_END());
setData(response.data.results);
setTotalRows(response.data.count);
};
const handlePageChange = (page) => {
setPage(page);
fetchApiData(page, perPage);
};
const handlePerRowsChange = (perRows) => {
setPerPage(perRows);
setPage(1);
};
useEffect(() => {
fetchApiData();
}, [perPage]);
const updateTable = () => {
fetchApiData();
};
// const killedNumber = (item) => {
// let killedNumber = "";
// killedNumber = item.quantity - item.losses - item.leftOver;
// return killedNumber;
// };
useEffect(() => {
const d = data?.map((item, i) => {
return [
<CityManageHatchingsArchiveActions
selectedAge1={null}
selectedAge2={null}
updateTable={updateTable}
item={item}
key={"archive-actions"}
readOnly={isReadOnly}
/>,
<Tooltip placement="left" title="جزئیات جوجه ریزی" key={item?.key}>
<IconButton
color="primary"
onClick={() => {
navigate(
getRoleFromUrl() === "AdminX"
? `${ROUTE_ADMINXـHATCHINGS}/${item.key}`
: getRoleFromUrl() === "Supporter"
? `${ROUTE_SUPPORTERـHATCHINGS}/${item.key}`
: getRoleFromUrl() === "SuperAdmin"
? `${ROUTE_SUPER_ADMINـHATCHINGS}/${item.key}`
: getRoleFromUrl() === "CityPoultry"
? `${ROUTE_CITY_POULTRYـHATCHINGS}/${item.key}`
: getRoleFromUrl() === "ProvinceSupervisor"
? `${ROUTE_PROVINCE_SUPERVISORـHATCHINGS}/${item.key}`
: getRoleFromUrl() === "ProvinceOperator"
? `${ROUTE_PROVINCEـHATCHINGS}/${item.key}`
: getRoleFromUrl() === "CityJahad"
? `${ROUTE_CITY_JIHADـHATCHINGS}/${item.key}`
: ""
);
}}
>
<RemoveRedEyeIcon />
</IconButton>
</Tooltip>,
page === 1 ? i + 1 : i + perPage * (page - 1) + 1,
<Tooltip
disableHoverListener={
!(item?.killingInfo?.violationMessage && item?.violation)
}
key={item?.key}
title={
item?.violation
? `متن گزارش تخلف: ${item?.killingInfo?.violationMessage}`
: null
}
sx={{
"&:hover": {
cursor: item?.violation ? "pointer" : "default",
},
}}
placement="top"
>
<Typography
variant="body2"
color={item?.violation ? "error" : "primary"}
>
{item?.violation ? "پیگیری" : "عادی"}
</Typography>
</Tooltip>,
item?.licenceNumber,
item?.poultry?.breedingUniqueId,
item?.CertId,
// item?.commitmentType === "free" ? "آزاد" : "دولتی",
item?.poultry?.unitName || "-",
`${item?.poultry?.userprofile?.fullName ?? "-"} (${
item?.poultry?.userprofile?.mobile ?? "-"
}) ${item?.violationReport ? "✉️" : ""}`,
item?.InteractTypeName ? (
<Typography
variant="body2"
color={item?.hasTenant ? "success.main" : ""}
fontWeight={item?.hasTenant ? "bold" : "normal"}
>
{item?.InteractTypeName}
</Typography>
) : (
"-"
),
item?.PersonTypeName,
item?.UnionTypeName,
`${item?.poultry?.address?.city?.name ?? "-"}/${
item?.poultry?.cityOperator
? item?.poultry?.cityOperator
: "بدون تعاونی"
}`,
item?.vetFarm?.vetFarmMobile
? `${item?.vetFarm?.vetFarmFullName} (${item?.vetFarm?.vetFarmMobile})`
: "-",
item.hall,
item.period,
formatTime(item?.createDate),
formatTime(item?.date),
item?.poultry?.killingAveAge?.toLocaleString(),
item?.predicateDate ? formatJustDate(item?.predicateDate) : "-",
item.chickenBreed,
item.age,
item?.quantity?.toLocaleString(),
item?.increaseQuantity?.toLocaleString(),
`${item.losses} (%${((item.losses * 100) / item.quantity).toFixed(0)})`,
<Tooltip
key={item?.key}
placement="top"
title="جهت مشاهده ثبت کننده تلفات کلیک کنید"
>
<Button
// variant="outlined"
style={{ color: "rgba(0,0,0,0.87)" }}
onClick={() => {
dispatch(
OPEN_MODAL({
title: "ویرایش تعداد جوجه ریزی",
content: (
<Grid container xs={12}>
{!item?.directLossesInputer &&
!item?.directLossesInputer ? (
<Typography variant="body1">
برای این جوجه ریزی تلفاتی ثبت نشده است.
</Typography>
) : (
<Grid xs={12}>
<Typography variant="body1">
ثبت کننده تلفات اتحادیه:{" "}
{item?.directLossesInputer
? `${
item?.directLossesInputer
} در تاریخ ${formatJustDate(
item?.directLossesDate
)}`
: " - "}
</Typography>
<Typography variant="body1">
ویرایش کننده تلفات اتحادیه:
{item?.directLossesEditor
? `${
item?.directLossesEditor
} در تاریخ ${formatJustDate(
item?.directLossesLastEditDate
)}`
: " - "}
</Typography>
</Grid>
)}
</Grid>
),
})
);
}}
>
{`${item?.directLosses?.toLocaleString()} (%${(
(item.directLosses * 100) /
item.quantity
).toFixed(0)})`}
</Button>
</Tooltip>,
`${item?.totalLosses?.toLocaleString()} (%${(
(item.totalLosses * 100) /
item.quantity
).toFixed(0)})`,
`${item?.totalCommitmentQuantity?.toLocaleString()}`,
`${item?.totalFreeCommitmentQuantity?.toLocaleString()}`,
`${item?.governmentalQuantity?.toLocaleString()}`,
`${item?.governmentalKilledQuantity?.toLocaleString()}`,
`${item?.freeQuantity?.toLocaleString()}`,
`${item?.freeKilledQuantity?.toLocaleString()}`,
`${item?.outProvinceKilledQuantity?.toLocaleString()}`,
`${item?.outProvinceKilledWeight?.toLocaleString()}`,
`${item?.barDifferenceRequestQuantity?.toLocaleString()}`,
`${item?.barDifferenceRequestWeight?.toLocaleString()}`,
`${item?.killingInfo?.provinceKillRequests?.toLocaleString()}`,
`${item?.killingInfo?.provinceKillRequestsQuantity?.toLocaleString()}`,
`${item?.killingInfo?.provinceKillRequestsWeight?.toLocaleString()}`,
item?.killedQuantity?.toLocaleString() +
` (%${((item?.killedQuantity * 100) / item.quantity).toFixed(0)})`,
item?.leftOver?.toLocaleString(),
`%${((item?.leftOver * 100) / item?.quantity).toFixed(0)}`,
// item?.totalCommitment?.toLocaleString(),
`%${((item.totalLosses * 100) / item.quantity).toFixed(0)}`,
`%${((item?.killedQuantity * 100) / item.quantity).toFixed(0)}`,
`%${((item?.leftOver * 100) / item?.quantity).toFixed(0)}`,
`%${(
((item?.killedQuantity + item?.totalLosses) * 100) /
item?.quantity
).toFixed(0)}`,
item?.samasatDischargePercentage
? `%${item?.samasatDischargePercentage}`
: "-",
item?.totalCommitment?.toLocaleString(),
item?.governmentalKilledQuantity?.toLocaleString(),
item?.freeKilledQuantity?.toLocaleString(),
item?.totalAverageKilledWeight?.toLocaleString(),
item?.totalKilledWeight?.toLocaleString(),
item?.activeKill?.activeKill ? "دارد" : "ندارد",
item?.activeKill?.countOfRequest ? item.activeKill.countOfRequest : "-",
item?.killingInfo?.killHouseRequests?.toLocaleString(),
item?.killingInfo?.killHouseRequestsFirstQuantity?.toLocaleString(),
item?.killingInfo?.killHouseRequestsFirstWeight?.toLocaleString(),
item?.killingInfo?.barCompleteWithKillHouse?.toLocaleString(),
item?.killingInfo?.acceptedRealWightFinal?.toLocaleString(),
item?.chainKilledQuantity?.toLocaleString(),
item?.chainKilledWeight?.toLocaleString(),
item?.exportKilledQuantity?.toLocaleString(),
item?.exportKilledWeight?.toLocaleString(),
item?.killingInfo?.wareHouseBars?.toLocaleString(),
item?.killingInfo?.wareHouseBarsQuantity?.toLocaleString(),
item?.killingInfo?.wareHouseBarsWeight?.toLocaleString(),
item?.killingInfo?.wareHouseBarsWeightLose?.toFixed(2),
item.lastChange
? `${item.lastChange.fullName} (${getFaUserRole(
item.lastChange.role
)}) در تاریخ ${formatTime(item.lastChange.date)}`
: "-",
item.latestHatchingChange
? `${item.latestHatchingChange.fullName} (${getFaUserRole(
item.latestHatchingChange.role
)}) در تاریخ ${formatTime(item.latestHatchingChange.date)}`
: "-",
item?.violationReport ? (
<Tooltip title="مشاهده گزارش" placement="top" key={item?.key}>
<IconButton
color="primary"
onClick={() => {
dispatch(
OPEN_MODAL({
title: "گزارش ",
content: (
<SimpleTable
columns={[
"ثبت کننده",
"تاریخ ثبت",
"تخلف",
"متن گزارش",
"سند",
]}
data={[
[
item?.violationReporter,
formatJustDate(item?.violationReportDate),
item?.violation ? "دارد" : "ندارد",
item?.violationReport,
<Grid
key={item?.key}
container
xs={12}
justifyContent="center"
gap={1}
>
{item?.violationImage?.map((option, index) => (
<ShowImage
key={`${option}-${index}`}
src={option}
/>
))}
</Grid>,
],
]}
/>
),
})
);
}}
>
<ArticleIcon />
</IconButton>
</Tooltip>
) : (
"-"
),
];
});
setTableData(d);
}, [data]);
const handleSubmit = async (event) => {
event.preventDefault();
dispatch(LOADING_START());
dispatch(
cityGetHatchingInfoFull({
age1: selectedAge1,
age2: selectedAge2,
tab: "unknown",
textValue: textValue,
})
);
try {
const response = await axios.get(
`poultry_hatching/?role=${getRoleFromUrl()}&age1=${
selectedAge1 ? selectedAge1 : 0
}&age2=${
selectedAge2 ? selectedAge2 : 0
}&search=filter&value=${textValue}&page=${1}&page_size=${perPage}&unknown=true`
);
setData(response.data.results);
setTotalRows(response.data.count);
dispatch(LOADING_END());
} catch (error) {
console.error("Error fetching data:", error);
}
};
const handleRemoveFilter = async (event) => {
event.preventDefault();
setSelectedAge1(0);
setSelectedAge2(0);
dispatch(LOADING_START());
setTextValue("");
dispatch(
cityGetHatchingInfoFull({
age1: 0,
age2: 0,
tab: "unknown",
textValue: textValue,
})
);
try {
const response = await axios.get(
`poultry_hatching?role=${getRoleFromUrl()}&page=${page}&page_size=${perPage}&search=filter&value=${textValue}&unknown=true`
);
setData(response.data.results);
setTotalRows(response.data.count);
} catch (error) {
console.error("Error fetching data:", error);
} finally {
dispatch(LOADING_END());
}
};
const [lastUpdateData, setLastUpdateData] = useState();
useEffect(() => {
async function fetchData() {
try {
const response = await axios.get(`last_update/?type=poultry_hatching`);
setLastUpdateData(response.data);
} catch (error) {
console.error("Error fetching data:", error);
}
}
fetchData();
}, []);
const tableTitle = (
<Grid
container
alignItems="center"
justifyContent="space-between"
gap={2}
paddingTop={2}
mb={1}
xs={12}
mt={2}
>
<form onSubmit={handleSubmit} style={{ flex: 1 }}>
<Grid container alignItems="center" gap={SPACING.SMALL}>
<Grid sx={{ width: { xs: "72px", sm: "80px" } }}>
<TextField
size="small"
label="از سن"
id="outlined-controlled"
value={selectedAge1}
onChange={(event) => {
setSelectedAge1(event.target.value);
}}
/>
</Grid>
<Grid sx={{ width: { xs: "72px", sm: "80px" } }}>
<TextField
size="small"
label="تا سن"
id="outlined-controlled"
value={selectedAge2}
onChange={(event) => {
setSelectedAge2(event.target.value);
}}
/>
</Grid>
<TextField
id="outlined-basic"
size="small"
label="جستجو"
variant="outlined"
sx={{ maxWidth: { xs: "100%", sm: 250 } }}
value={textValue}
onChange={handleTextChange}
onKeyDown={(e) => {
if (e.key === "Enter") {
handleSubmit(e);
}
}}
/>
<Button type="submit" endIcon={<RiSearchLine />}>
جستجو
</Button>
<Tooltip title="خروجی اکسل" px={0}>
<Button
color="success"
onClick={() => {
openNotif({
vertical: "top",
horizontal: "center",
msg: "فایل اکسل در حال دانلود می باشد، این علمیات ممکن است زمان بر باشد لطفا صبر کنید.",
severity: "success",
});
const link = `${
axios.defaults.baseURL
}0/hatching_excel/?unknown=true&role=${getRoleFromUrl()}&key=${userKey}&age1=${
selectedAge1 ? selectedAge1 : 0
}&age2=${
selectedAge2 ? selectedAge2 : 0
}&search=filter&value=${textValue}`;
window.location.href = link;
}}
>
<RiFileExcel2Fill size={32} />
</Button>
</Tooltip>
</Grid>
</form>
<Button onClick={handleRemoveFilter} color="error">
حذف فیلتر
</Button>
</Grid>
);
const { hatchingInfoFull } = useSelector((state) => state.citySlice);
useEffect(() => {
dispatch(
cityGetHatchingInfoFull({
age1: selectedAge1,
age2: selectedAge2,
tab: "unknown",
textValue: textValue,
})
);
}, []);
return (
<Grid alignItems="center" justifyContent="center" mt={2} xs={12}>
<Grid alignItems="center" justifyContent="center" isDashboard xs={12}>
<ResponsiveTable
noPagination
isDashboard
title={
lastUpdateData &&
`آخرین بروزرسانی : ${formatTime(lastUpdateData)} ${" "}`
}
columns={[
"تعداد فارم",
"تعداد جوجه ریزی",
"حجم کل جوجه ریزی",
"حجم باقی مانده در سالن",
"حجم کشتار شده",
"وزن کشتار شده",
"حجم کل تلفات",
"حجم تلفات اتحادیه",
"حجم تلفات دامپزشک",
"مانده سالن ( 20 تا 30 روزه)",
"مانده سالن ( 30 تا 40 روزه)",
"مانده سالن ( 40 تا 50 روزه)",
"مانده سالن ( 50 تا 60 روزه)",
"بیشتر از 60 روزه",
]}
data={[
[
hatchingInfoFull?.poultries?.toLocaleString(),
hatchingInfoFull?.hatchings?.toLocaleString(),
hatchingInfoFull?.totalHatchingQuantity?.toLocaleString(),
hatchingInfoFull?.totalHatchingLeftOverQuantity?.toLocaleString(),
hatchingInfoFull?.totalHatchingKilledQuantity?.toLocaleString(),
hatchingInfoFull?.totalHatchingKilledWeight?.toLocaleString(),
hatchingInfoFull?.totalHatchingAllLosses?.toLocaleString(),
hatchingInfoFull?.totalHatchingUnionLosses?.toLocaleString(),
hatchingInfoFull?.totalHatchingVetLosses?.toLocaleString(),
hatchingInfoFull?.age2030?.toLocaleString(),
hatchingInfoFull?.age3040?.toLocaleString(),
hatchingInfoFull?.age4050?.toLocaleString(),
hatchingInfoFull?.age5060?.toLocaleString(),
hatchingInfoFull?.ageMoreThan60?.toLocaleString(),
],
]}
/>
</Grid>
{tableTitle}
<ResponsiveTable
data={tableData}
columns={[
"عملیات",
"جزئیات",
"ردیف",
"وضعیت",
"شماره مجوز جوجه ریزی",
"شناسه یکتا",
"مجوز بهداشتی جوجه ریزی",
// "نوع تعهد",
"نام فارم",
"مرغدار",
"بهره برداری",
"مالکیت",
"ارتباط",
"شهر/تعاونی",
"دامپزشک فارم",
"سالن",
"دوره جوجه ریزی",
"تاریخ ثبت جوجه ریزی",
"تاریخ جوجه ریزی",
"میانگین سن کشتار",
"پیش بینی تاریخ کشتار",
"نژاد",
"سن",
"حجم جوجه ریزی",
"حجم افزایشی",
"تلفات دامپزشک",
"تلفات اتحادیه",
"تلفات کل",
"حجم تعهد دولتی",
"حجم تعهد آزاد",
"حجم کشتار دولتی",
"وزن کشتار دولتی",
"حجم کشتار آزاد",
"وزن کشتار شده آزاد",
"حجم فروش به خارج استان",
"وزن فروش به خارج استان",
"حجم اختلاف کشتار",
"وزن اختلاف کشتار",
"تخصیصات بدون بار",
"حجم تخصیصات بدون بار",
"وزن تخصیصات بدون بار",
"حجم کشتار شده",
"حجم مانده در سالن",
" درصد مانده در سالن",
" تلفات",
" کشتار شده",
" باقی مانده در سالن",
"تایید تخلیه رصدیار",
" تایید تخلیه در سماصط",
"وزن تعهد دولتی",
"وزن کشتار دولتی",
"وزن کشتار آزاد",
"میانگین وزن کشتار",
"وزن کل کشتار شده",
"تعداد کشتار فعال",
"تعداد درخواست کشتار",
"تعداد بارها",
"حجم بارها",
"وزن بارها",
"حجم بارهای تحویلی",
"وزن بارهای تحویلی",
"حجم زنجیره",
"وزن زنجیره",
"حجم صادرات",
"وزن صادرات",
"بارهای ورودی به انبار",
"حجم لاشه های انبار",
"وزن لاشه های انبار",
"درصد افت بارها",
"آخرین تغییر",
"سازنده جوجه ریزی",
"گزارش",
]}
handlePageChange={handlePageChange}
totalRows={totalRows}
page={page}
perPage={perPage}
handlePerRowsChange={handlePerRowsChange}
title="تعیین تکلیف نشده‌ها"
/>
</Grid>
);
};