ЦИТК-878 - "Доски задач" - доработана под логику смены статуса события с релиза "июнь 2025", исправлена ошибка инициализации клиента с пустым хранилищем, купирована ошибка с отсутствием профиля настроек

This commit is contained in:
Mikhail Chechnev 2025-10-10 21:58:03 +03:00
parent fe1e3ba04f
commit 9cbc52cff2
4 changed files with 65 additions and 70 deletions

View File

@ -95,7 +95,7 @@ const useColorRules = () => {
const [colorRules, setColorRules] = useState({ const [colorRules, setColorRules] = useState({
loaded: false, loaded: false,
rules: [], rules: [],
selectedColorRule: JSON.parse(getLocalStorageValue("settingsColorRule") || {}) selectedColorRule: JSON.parse(getLocalStorageValue("settingsColorRule")) || {}
}); });
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером

View File

@ -160,7 +160,7 @@ const useTasksFunctions = () => {
callBack: sendPrms => { callBack: sendPrms => {
const mainArgs = { const mainArgs = {
NIDENT: pointInfo.NIDENT, NIDENT: pointInfo.NIDENT,
NSTEP: 3, NSTEP: 4,
NEVENT: nEvent, NEVENT: nEvent,
SEVENT_STAT: pointInfo.SEVENT_STAT, SEVENT_STAT: pointInfo.SEVENT_STAT,
SSEND_CLIENT: sendPrms.outParameters.out_CLIENT_CODE, SSEND_CLIENT: sendPrms.outParameters.out_CLIENT_CODE,
@ -182,7 +182,7 @@ const useTasksFunctions = () => {
//Общие аргументы //Общие аргументы
const mainArgs = { const mainArgs = {
NIDENT: pointInfo.NIDENT, NIDENT: pointInfo.NIDENT,
NSTEP: 3, NSTEP: 4,
NEVENT: nEvent, NEVENT: nEvent,
SEVENT_STAT: pointInfo.SEVENT_STAT SEVENT_STAT: pointInfo.SEVENT_STAT
}; };
@ -193,46 +193,71 @@ const useTasksFunctions = () => {
[handleEventRoutesPointExecutersOpen, handleStateChange] [handleEventRoutesPointExecutersOpen, handleStateChange]
); );
//При выполнении третьего шага
const handleMakeThirdStep = useCallback(
async ({ nEvent, pointInfo, onReload = null, onNoteOpen = null }) => {
//Выполняем переход на следующий шаг
await executeStored({
stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE",
args: {
NIDENT: pointInfo.NIDENT,
NSTEP: 3,
NPASS: pointInfo.NPASS
}
});
//Выполняем выбор исполнителя
handleExecuterSelect({
nEvent,
pointInfo,
onReload,
onNoteOpen
});
},
[executeStored, handleExecuterSelect]
);
//При выполнении второго шага //При выполнении второго шага
const handleMakeSecondStep = useCallback( const handleMakeSecondStep = useCallback(
async ({ nIdent, nPass }) => { async ({ nEvent, pointInfo, onReload = null, onNoteOpen = null }) => {
//Состояние параметров текущего действия
let currentPointInfo = { ...pointInfo };
//Выполняем переход на следующий шаг //Выполняем переход на следующий шаг
const secondStep = await executeStored({ const secondStep = await executeStored({
stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE",
args: { args: {
NIDENT: nIdent, NIDENT: currentPointInfo.NIDENT,
NSTEP: 2, NSTEP: 2,
NPASS: nPass NPASS: currentPointInfo.NPASS
} }
}); });
//Возвращаем параметры выполнения //Устанавливаем признак необходимости выбора исполнителя
return secondStep; currentPointInfo.NSELECT_EXEC = secondStep.NSELECT_EXEC;
//Выполняем третий шаг
handleMakeThirdStep({ nEvent, pointInfo: currentPointInfo, onReload, onNoteOpen });
}, },
[executeStored] [executeStored, handleMakeThirdStep]
); );
//При выборе следующей точки события //При выборе следующей точки события
const handleNextPointSelect = useCallback( const handleNextPointSelect = useCallback(
({ nEvent, pointInfo, onReload = null, onNoteOpen = null }) => { ({ nEvent, pointInfo, onReload = null, onNoteOpen = null }) => {
//Состояние параметров текущего действия
let currentPointInfo = { ...pointInfo };
//Открываем раздел "Маршруты событий (точки перехода)" для выбора следующей точки //Открываем раздел "Маршруты событий (точки перехода)" для выбора следующей точки
handleEventRoutesPointsPassessOpen({ handleEventRoutesPointsPassessOpen({
sEventType: pointInfo.SEVENT_TYPE, sEventType: currentPointInfo.SEVENT_TYPE,
sEventStatus: pointInfo.SEVENT_STAT, sEventStatus: currentPointInfo.SEVENT_STAT,
nPoint: pointInfo.NPOINT, nPoint: currentPointInfo.NPOINT,
callBack: async point => { callBack: async point => {
//Устанавливаем полученную точку перехода
currentPointInfo.NPASS = point.outParameters.out_RN;
currentPointInfo.SEVENT_STAT = point.outParameters.out_NEXT_POINT;
//Выполняем второй шаг //Выполняем второй шаг
let secondStep = await handleMakeSecondStep({ nIdent: pointInfo.NIDENT, nPass: point.outParameters.out_RN }); handleMakeSecondStep({ nEvent, pointInfo: currentPointInfo, onReload, onNoteOpen });
//Выполняем выбор исполнителя
handleExecuterSelect({
nEvent,
pointInfo: { ...pointInfo, SEVENT_STAT: point.outParameters.out_NEXT_POINT, NSELECT_EXEC: secondStep.NSELECT_EXEC },
onReload,
onNoteOpen
});
} }
}); });
}, },
[handleEventRoutesPointsPassessOpen, handleMakeSecondStep, handleExecuterSelect] [handleEventRoutesPointsPassessOpen, handleMakeSecondStep]
); );
//По нажатию действия "Перейти" //По нажатию действия "Перейти"
@ -259,17 +284,12 @@ const useTasksFunctions = () => {
onNoteOpen onNoteOpen
}); });
} else { } else {
//Выполняем перехода без выбора точки //Выполняем второй шаг
handleExecuterSelect({ handleMakeSecondStep({ nEvent, pointInfo: eventInfo, onReload, onNoteOpen });
nEvent,
pointInfo: eventInfo,
onReload,
onNoteOpen
});
} }
} }
}, },
[executeStored, handleExecuterSelect, handleNextPointSelect] [executeStored, handleMakeSecondStep, handleNextPointSelect]
); );
return { handleTaskStateChange, handleTaskSend }; return { handleTaskStateChange, handleTaskSend };

View File

@ -183,9 +183,7 @@ export const formatSqlDate = timeStamp => {
}; };
//Считывание значений из локального хранилища //Считывание значений из локального хранилища
export const getLocalStorageValue = (sName, defaultValue = null) => { export const getLocalStorageValue = (sName, defaultValue = null) => localStorage.getItem(sName) || defaultValue;
return localStorage.getItem(sName) ? localStorage.getItem(sName) : defaultValue;
};
//Форматирование фильтра в массив для отбора //Форматирование фильтра в массив для отбора
export const convertFilterValuesToArray = filterValues => { export const convertFilterValuesToArray = filterValues => {

View File

@ -94,7 +94,7 @@ create or replace package PKG_P8PANELS_CLNTTSKBRD as
SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей
SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей
NPOINT in out number, -- Текущая точка маршрута NPOINT in out number, -- Текущая точка маршрута
NPASS in number, -- Точка перехода NPASS in out number, -- Точка перехода
NSELECT_EXEC out number, -- Признак необходимости выбора исполнителя NSELECT_EXEC out number, -- Признак необходимости выбора исполнителя
SEXECUTEMETHOD out varchar2, -- Мнемокод метода SEXECUTEMETHOD out varchar2, -- Мнемокод метода
SSEND_CLIENT in varchar2, -- Направить организация SSEND_CLIENT in varchar2, -- Направить организация
@ -1770,7 +1770,7 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей
SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей
NPOINT in out number, -- Текущая точка маршрута NPOINT in out number, -- Текущая точка маршрута
NPASS in number, -- Точка перехода NPASS in out number, -- Точка перехода
NSELECT_EXEC out number, -- Признак необходимости выбора исполнителя NSELECT_EXEC out number, -- Признак необходимости выбора исполнителя
SEXECUTEMETHOD out varchar2, -- Мнемокод метода SEXECUTEMETHOD out varchar2, -- Мнемокод метода
SSEND_CLIENT in varchar2, -- Направить организация SSEND_CLIENT in varchar2, -- Направить организация
@ -1882,43 +1882,17 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
NSEND_PREDEFINED_PROC => NSEND_PREDEFINED_PROC); NSEND_PREDEFINED_PROC => NSEND_PREDEFINED_PROC);
/* Если это первый шаг и уже известен следующий статус */ /* Если это первый шаг и уже известен следующий статус */
if ((NSTEP_CURRENT = 1) and (SNEXT_STAT is not null)) then if ((NSTEP_CURRENT = 1) and (SNEXT_STAT is not null)) then
/* Сразу выполняем следующее действие */ /* Определим точку перехода */
P_CLNEVENTS_CHANGE_STATE_WEB(NCOMPANY => NCOMPANY, NPASS := EVRTPTPASS_NEXT_GET(NCOMPANY => NCOMPANY,
NIDENT => NIDENT, SEVENT_TYPE => SEVENT_TYPE,
NSTEP => NSTEP, NPOINT => NPOINT,
NEVENT => NEVENT, SEVENT_STAT => SEVENT_STAT,
SEVENT => SEVENT, SNEXT_STAT => SNEXT_STAT);
SEVENT_TYPE => SEVENT_TYPE,
SEVENT_STAT => SEVENT_STAT,
SINIT_PERSON => SINIT_PERSON,
SINIT_AUTHNAME => SINIT_AUTHNAME,
SCLIENT_CLIENT => SCLIENT_CLIENT,
SCLIENT_PERSON => SCLIENT_PERSON,
NPOINT => NPOINT,
NPASS => EVRTPTPASS_NEXT_GET(NCOMPANY => NCOMPANY,
SEVENT_TYPE => SEVENT_TYPE,
NPOINT => NPOINT,
SEVENT_STAT => SEVENT_STAT,
SNEXT_STAT => SNEXT_STAT),
NSELECT_EXEC => NSELECT_EXEC,
NCONFIRM_REQUIRED => NCONFIRM_REQUIRED,
SCONFIRM_TEXT => SCONFIRM_TEXT,
SEXECUTEMETHOD => SEXECUTEMETHOD,
SSEND_CLIENT => SSEND_CLIENT,
SSEND_DIVISION => SSEND_DIVISION,
SSEND_POST => SSEND_POST,
SSEND_PERFORM => SSEND_PERFORM,
SSEND_PERSON => SSEND_PERSON,
SSEND_STAFFGRP => SSEND_STAFFGRP,
SSEND_USER_GROUP => SSEND_USER_GROUP,
SSEND_USER_NAME => SSEND_USER_NAME,
NSEND_PREDEFINED_EXEC => NSEND_PREDEFINED_EXEC,
NSEND_PREDEFINED_PROC => NSEND_PREDEFINED_PROC);
/* Указываем следующий статус */ /* Указываем следующий статус */
SEVENT_STAT := SNEXT_STAT; SEVENT_STAT := SNEXT_STAT;
end if; end if;
/* Если это последний шаг */ /* Если это последний шаг */
if (NSTEP_CURRENT = 3) then if (NSTEP_CURRENT = 4) then
/* Если добавлено примечание */ /* Если добавлено примечание */
if (SNOTE is not null) then if (SNOTE is not null) then
P_CLNEVNOTES_INSERT(NCOMPANY => NCOMPANY, P_CLNEVNOTES_INSERT(NCOMPANY => NCOMPANY,
@ -2351,9 +2325,7 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
and U.UNITCODE = SUNIT_CLNEVENTS; and U.UNITCODE = SUNIT_CLNEVENTS;
exception exception
when others then when others then
P_EXCEPTION(0, return null;
'Профиль пользователя "%s" для раздела "События" не найден.',
SAUTHID);
end; end;
/* Возвращаем результат */ /* Возвращаем результат */
return BRESULT; return BRESULT;
@ -2361,6 +2333,11 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
begin begin
/* Считываем профиль пользователя для раздела "События" */ /* Считываем профиль пользователя для раздела "События" */
BXML := USERPROFILES_GET(NCOMPANY => NCOMPANY, SAUTHID => SAUTHID); BXML := USERPROFILES_GET(NCOMPANY => NCOMPANY, SAUTHID => SAUTHID);
/* Проверим, что профиль не пустой */
if (BXML is null) then
return;
end if;
/* Данные в профиле есть - будем разбирать */
begin begin
/* Формируем XML данных */ /* Формируем XML данных */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);