ЦИТК-827, 863 - Исправление работы со стилями и вызов панели из раздела "Сменные задания"

This commit is contained in:
Mim 2024-08-23 16:06:37 +03:00
commit 4c33a5cb61
9 changed files with 125 additions and 65 deletions

View File

@ -247,7 +247,7 @@ CostJobsSpecsInclude.propTypes = {
//-----------
//Таблица информации о строках сменного задания
const CostJobsSpecsDataGrid = ({ task, haveNote }) => {
const CostJobsSpecsDataGrid = ({ task, haveNote, fromAction }) => {
//Собственное состояние - Включение в задание
const [includeEquipment, setIncludeEquipment] = useState({ NFCJOBSSP: null, NEQCONFIG: null, NVALUE: 0 });
@ -255,7 +255,7 @@ const CostJobsSpecsDataGrid = ({ task, haveNote }) => {
const [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs] = useCostJobsSpecs(task);
//Собственное состояние - таблица рабочих центров
const [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration] = useEquipConfiguration(task);
const [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration] = useEquipConfiguration(task, fromAction);
//При изменении состояния сортировки операций
const costJobsSpecOrderChanged = ({ orders }) => setCostJobsSpecs(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
@ -468,7 +468,8 @@ const CostJobsSpecsDataGrid = ({ task, haveNote }) => {
//Контроль свойств - Таблица информации о строках сменного задания
CostJobsSpecsDataGrid.propTypes = {
task: PropTypes.number.isRequired,
haveNote: PropTypes.bool.isRequired
haveNote: PropTypes.bool.isRequired,
fromAction: PropTypes.bool.isRequired
};
//----------------

View File

@ -1,9 +1,15 @@
/*
Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания
Кастомные хуки
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
//---------
@ -39,18 +45,20 @@ const useCostJobs = () => {
jobList: [],
jobListLoaded: false,
selectedJob: {},
dataLoaded: false
fromAction: false
});
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Подключение к контексту навигации
const { getNavigationSearch } = useContext(NavigationCtx);
//При подключении компонента к странице
useEffect(() => {
const initPlans = async () => {
const initPlans = async NRN => {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCJOBS_INIT",
args: {},
args: { NFCJOBS: NRN ? parseInt(NRN) : null },
respArg: "COUT",
isArray: name => name === "XFCJOBS",
attributeValueProcessor: (name, val) => (["NHAVE_NOTE"].includes(name) ? val == 1 : val)
@ -59,11 +67,16 @@ const useCostJobs = () => {
...pv,
init: true,
jobList: [...(data.XFCJOBS || [])],
jobListLoaded: true
selectedJob: data.XFCJOBS_SELECTED ? data.XFCJOBS_SELECTED : {},
jobListLoaded: true,
fromAction: NRN ? true : false
}));
};
if (!state.init) {
initPlans();
//Считаем параметры, переданные из действия
const actionPrms = getNavigationSearch();
//Иницализируем планы
initPlans(actionPrms.NRN);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
@ -163,7 +176,7 @@ const useCostJobsSpecs = task => {
};
//Хук для таблицы рабочих центров
const useEquipConfiguration = task => {
const useEquipConfiguration = (task, fromAction) => {
//Собственное состояние - таблица данных
const [equipConfiguration, setEquipConfiguration] = useState({
task: null,
@ -232,6 +245,7 @@ const useEquipConfiguration = task => {
stored: "PKG_P8PANELS_MECHREC.EQCONFIG_DG_GET",
args: {
NFCJOBS: task,
NFROM_ACTION: fromAction ? 1 : 0,
CORDERS: { VALUE: object2Base64XML(equipConfiguration.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: equipConfiguration.pageNumber,
NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
@ -261,7 +275,8 @@ const useEquipConfiguration = task => {
equipConfiguration.selectedRow,
equipConfiguration.task,
task,
executeStored
executeStored,
fromAction
]);
return [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration];

View File

@ -96,8 +96,7 @@ const MechRecCostJobs = () => {
setState(pv => ({
...pv,
selectedJob: job,
showJobList: false,
dataLoaded: false
showJobList: false
}));
};
@ -107,8 +106,7 @@ const MechRecCostJobs = () => {
setState(pv => ({
...pv,
selectedJob: {},
showJobList: false,
dataLoaded: false
showJobList: false
}));
};
@ -132,7 +130,7 @@ const MechRecCostJobs = () => {
<>
<Typography variant={"h6"}>{`Сменное задание №${state.selectedJob.SDOC_NUMB} на ${state.selectedJob.SPERIOD}`}</Typography>
<Typography variant={"h6"}>{`${state.selectedJob.SSUBDIV}`}</Typography>
<CostJobsSpecsDataGrid task={state.selectedJob.NRN} haveNote={state.selectedJob.NHAVE_NOTE} />
<CostJobsSpecsDataGrid task={state.selectedJob.NRN} haveNote={state.selectedJob.NHAVE_NOTE} fromAction={state.fromAction} />
</>
) : !state.selectedJob.NRN ? (
<InlineMsgInfo okBtn={false} text={"Укажите сменное задание для отображения информации"} />

View File

@ -20,7 +20,8 @@ import { useCostDeliveryLists } from "./backend_dg"; //Собственные х
//Стили
const STYLES = {
CONTAINER: { margin: "5px 0px", textAlign: "center" }
CONTAINER: { margin: "5px 0px", textAlign: "center" },
DATA_GRID_CELL_COVERED: { backgroundColor: "lightblue" }
};
//------------------------------------
@ -32,7 +33,7 @@ const dataCellRender = ({ row, columnDef }) => {
//Если "Количество план" равно или меньше "Остаток"
if (row["NQUANT_PLAN"] <= row["NREST"]) {
return {
cellStyle: { backgroundColor: "lightblue" },
cellStyle: { ...STYLES.DATA_GRID_CELL_COVERED },
data: row[columnDef]
};
} else {

View File

@ -20,7 +20,8 @@ import { useGoodsParties } from "./backend_dg"; //Собственные хук
//Стили
const STYLES = {
CONTAINER: { margin: "5px 0px", textAlign: "center" }
CONTAINER: { margin: "5px 0px", textAlign: "center" },
DATA_GRID_CELL_COVERED: { backgroundColor: "lightblue" }
};
//------------------------------------
@ -32,7 +33,7 @@ const dataCellRender = ({ row, columnDef, quantPlanSum }) => {
//Если остаток больше суммы "Выдать по норме" - закрашиваем голубым
if (row["NRESTFACT"] >= quantPlanSum) {
return {
cellStyle: { backgroundColor: "lightblue" },
cellStyle: { ...STYLES.DATA_GRID_CELL_COVERED },
data: row[columnDef]
};
} else {

View File

@ -36,7 +36,8 @@ const currentYear = currentDate.getUTCFullYear();
//Стили
const STYLES = {
FILTER_BLOCK: { maxWidth: "200px" }
FILTER_CONTAINER: { display: "flex", flexDirection: "row", justifyContent: "flex-start", alignItems: "flex-end" },
FILTER_BLOCK: { maxWidth: "200px", display: "flex" }
};
//------------------------------------
@ -71,7 +72,7 @@ DepartmentsDataGrid.propTypes = {
//Компонент фильтра
const FilterComponent = ({ filter, setFilter, handleMonthChange, handleSelectDeparture }) => {
return (
<Box display="flex" flexDirection="row" justifyContent="flex-start" alignItems="flex-end" pt={1.5} pl={1}>
<Box sx={STYLES.FILTER_CONTAINER} pt={1.5} pl={1}>
<FormControl sx={STYLES.FILTER_BLOCK} readOnly fullWidth variant="outlined">
<InputLabel required={!filter.department.SCODE} htmlFor="department-outlined">
Цех
@ -95,7 +96,7 @@ const FilterComponent = ({ filter, setFilter, handleMonthChange, handleSelectDep
label="Цех"
/>
</FormControl>
<Box sx={STYLES.FILTER_BLOCK} display="flex" pb={1}>
<Box sx={STYLES.FILTER_BLOCK} pb={1}>
<Box>
<IconButton onClick={() => handleMonthChange(-1)}>
<Icon>navigate_before</Icon>

View File

@ -20,7 +20,8 @@ import { useInsDepartment } from "../hooks"; //Состояние таблицы
//Стили
const STYLES = {
CONTAINER: { margin: "5px 0px", textAlign: "center" }
CONTAINER: { margin: "5px 0px", textAlign: "center" },
DATA_GRID_CELL_DEFAULT: { cursor: "pointer", backgroundColor: "#ADD8E6" }
};
//------------------------------------
@ -30,7 +31,7 @@ const STYLES = {
//Генерация ссылок на строках
const dataCellRender = ({ row, columnDef, handleSelectDeparture }) => {
return {
cellStyle: { cursor: "pointer", backgroundColor: "#ADD8E6" },
cellStyle: { ...STYLES.DATA_GRID_CELL_DEFAULT },
cellProps: {
onClick: () => {
handleSelectDeparture({ NRN: row["NRN"], SCODE: row["SCODE"].toString(), SNAME: row["SNAME"] });

View File

@ -178,7 +178,7 @@ const useFilter = (currentMonth, currentYear) => {
openedDepartment: false,
department: { ...department },
workHours: data.NWORKHOURS,
totalWorkHours: filter.workDays * data.NWORKHOURS
totalWorkHours: Math.round(filter.workDays * data.NWORKHOURS)
}));
},
[executeStored, filter.workDays]

View File

@ -173,12 +173,13 @@ create or replace package PKG_P8PANELS_MECHREC as
/* Получение составов оборудования подразделения */
procedure EQCONFIG_DG_GET
(
NFCJOBS in number, -- Рег. номер сменного задания
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
CORDERS in clob, -- Сортировки
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
NFCJOBS in number, -- Рег. номер сменного задания
NFROM_ACTION in number := 0, -- Признак запуска из действия раздела (false - нет, true - да)
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
CORDERS in clob, -- Сортировки
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
);
/* Получение спецификации сменного задания */
@ -195,7 +196,8 @@ create or replace package PKG_P8PANELS_MECHREC as
/* Инициализация записей раздела "Планы и отчеты производства изделий" */
procedure FCJOBS_INIT
(
COUT out clob -- Список записей раздела "Сменные задания"
NFCJOBS in number := null, -- Рег. номер записи (если вызов из действия раздела)
COUT out clob -- Список записей раздела "Сменные задания"
);
/* Получение количества рабочих часов в сменах подразделения */
@ -710,6 +712,25 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Возвращаем результат */
return NRESULT;
end UTL_FCPRODPLANSP_MAIN_GET;
/* Считывание цеха из заголовка сменного задания */
function UTL_FCJOBS_SUBDIV_GET
(
NFCJOBS in number -- Рег. номер сменного задания
) return number -- Рег. номер подразделения
is
NRESULT PKG_STD.TREF; -- Рег. номер подразделения
begin
/* Считываем цех сменного задания */
begin
select T.SUBDIV into NRESULT from FCJOBS T where T.RN = NFCJOBS;
exception
when others then
NRESULT := null;
end;
/* Возвращаем результат */
return NRESULT;
end UTL_FCJOBS_SUBDIV_GET;
/* Считывание записи строки сменного задания */
function UTL_FCJOBSSP_GET
@ -3041,7 +3062,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOC_INFO,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 2) else 0 end NPROCENT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NPRIOR_PARTY,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SPROD_ORDER');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
@ -4747,6 +4768,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
procedure EQCONFIG_DG_GET
(
NFCJOBS in number, -- Рег. номер сменного задания
NFROM_ACTION in number := 0, -- Признак запуска из действия раздела (false - нет, true - да)
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
CORDERS in clob, -- Сортировки
@ -4821,8 +4843,14 @@ create or replace package body PKG_P8PANELS_MECHREC as
NCOMPANY => NCOMPANY,
SMEAS_MNEMO => SDICMUNTS_WD,
NRN => NDICMUNTS_WD);
/* Считываем рег. номер подразделения пользователя */
NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => UTILIZER());
/* Если выполняется из заголовка СЗ */
if (NFROM_ACTION = 1) then
/* Считываем рег. номер цеха из сменного задания */
NSUBDIV := UTL_FCJOBS_SUBDIV_GET(NFCJOBS => NFCJOBS);
else
/* Считываем рег. номер подразделения пользователя */
NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => UTILIZER());
end if;
/* Если подразделение считано */
if (NSUBDIV is not null) then
/* Обходим данные */
@ -4924,6 +4952,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Инициализация записей раздела "Планы и отчеты производства изделий" */
procedure FCJOBS_INIT
(
NFCJOBS in number := null, -- Рег. номер записи (если вызов из действия раздела)
COUT out clob -- Список записей раздела "Сменные задания"
)
is
@ -4931,9 +4960,18 @@ create or replace package body PKG_P8PANELS_MECHREC as
SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
NVERSION PKG_STD.TREF; -- Версия контрагентов
SDOC_INFO PKG_STD.TSTRING; -- Информация о документе
NSUBDIV PKG_STD.TREF; -- Рег. номер цеха
begin
/* Считываем версию контрагентов */
FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
/* Если вызов из действия раздела */
if (NFCJOBS is not null) then
/* Считываем рег. номер цеха из сменного задания */
NSUBDIV := UTL_FCJOBS_SUBDIV_GET(NFCJOBS => NFCJOBS);
else
/* Считываем рег. номер подразделения пользователя */
NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => SUTILIZER);
end if;
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
@ -4956,28 +4994,29 @@ create or replace package body PKG_P8PANELS_MECHREC as
where S.PRN = T.RN
and S.NOTE is not null
and ROWNUM = 1) NHAVE_NOTE
from FCJOBS T,
from (select J.*
from FCJOBS J
where J.COMPANY = NCOMPANY
and J.STATE = NFCJOBS_STATUS_NOT_WO
and J.DOCDATE >= TRUNC(sysdate)
and J.SUBDIV = NSUBDIV
and exists (select null from V_USERPRIV UP where UP.CATALOG = J.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = J.JUR_PERS
and UP.UNITCODE = 'CostJobs')
union
select J_RN.*
from FCJOBS J_RN
where J_RN.RN = NFCJOBS) T,
DOCTYPES DT,
INS_DEPARTMENT INS,
TBOPERMODESP PER
where T.COMPANY = NCOMPANY
and T.STATE = NFCJOBS_STATUS_NOT_WO
and T.DOCDATE >= TRUNC(sysdate)
and DT.RN = T.DOCTYPE
where DT.RN = T.DOCTYPE
and T.SUBDIV = INS.RN(+)
and T.TBOPERMODESP = PER.RN(+)
and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(T.COMPANY, T.SUBDIV, SUTILIZER) = 1
and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN)
and exists (select null
from V_USERPRIV UP
where UP.JUR_PERS = T.JUR_PERS
and UP.UNITCODE = 'CostJobs')
order by SDOC_INFO)
loop
/* Открываем план */
PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
/* Описываем план */
PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
/* Если указана смена */
if (REC.STBOPERMODESP is not null) then
/* Указываем информацию документа со сменой */
@ -4986,6 +5025,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Указываем информацию документа без смены */
SDOC_INFO := REC.SDOC_INFO;
end if;
/* Открываем план */
PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
/* Описываем план */
PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO);
PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB);
PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
@ -4993,6 +5036,20 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0));
/* Закрываем план */
PKG_XFAST.UP();
/* Если вызов из действия, то указываем выбранный */
if (NFCJOBS = REC.NRN) then
/* Открываем план */
PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS_SELECTED');
/* Описываем план */
PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO);
PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB);
PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0));
/* Закрываем план */
PKG_XFAST.UP();
end if;
end loop;
/* Закрываем корень */
PKG_XFAST.UP();
@ -5150,21 +5207,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.BGNDATE <= :DDATE_TO');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((T.ENDDATE is null) or ((T.ENDDATE is not null) and (T.ENDDATE >= :DDATE_FROM)))');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_MECHREC.UTL_INS_DEP_HIER_EQ_CHECK') || '(T.COMPANY, T.RN, :DDATE_TO) = 1');
/*PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INS_DEPARTMENT H');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where H.COMPANY = :NCOMPANY');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SUBDIVSEQ EQ,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQCONFIG EQC');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where EQ.PRN = H.RN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQC.RN = EQ.EQCONFIG');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQC.OPER_DATE is not null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQC.OPER_DATE <= :DDATE_TO');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true) || ')');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' start with H.RN = T.RN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' connect by prior H.RN = H.PRN)');*/
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ) D) F');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Разбираем его */