ЦИТК-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({
loaded: false,
rules: [],
selectedColorRule: JSON.parse(getLocalStorageValue("settingsColorRule") || {})
selectedColorRule: JSON.parse(getLocalStorageValue("settingsColorRule")) || {}
});
//Подключение к контексту взаимодействия с сервером

View File

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

View File

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

View File

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