diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/controller/UserApplicationController.java b/backend/src/main/java/ru/micord/ervu/account_applications/controller/UserApplicationController.java index 964ec757..2a5be036 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/controller/UserApplicationController.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/controller/UserApplicationController.java @@ -28,8 +28,9 @@ public class UserApplicationController { } @PutMapping(value = "/status", consumes = MediaType.APPLICATION_JSON_VALUE) - public void updateStatus(@RequestBody ProcessResponseDto data) { + public Long updateStatus(@RequestBody ProcessResponseDto data) { String traceId = data.traceId(); + Long appNumber = 0L; switch (data.className()) { case UPDATE -> { @@ -38,17 +39,19 @@ public class UserApplicationController { if (StringUtils.hasText(tempPass)) { String encryptedPassword = encryptionService.encrypt(tempPass); - applicationService.savePassword(traceId, encryptedPassword); + appNumber = applicationService.savePassword(traceId, encryptedPassword); } else { - applicationService.saveAcceptedStatus(traceId); + appNumber = applicationService.saveAcceptedStatus(traceId); } } case PROCESS_ERROR -> { String msg = data.body().msg().message(); LOGGER.error("error by traceId = {}, message: {}", traceId, msg); - applicationService.saveError(traceId, msg); + appNumber = applicationService.saveError(traceId, msg); } } + + return appNumber; } } diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/dao/UserApplicationListDao.java b/backend/src/main/java/ru/micord/ervu/account_applications/dao/UserApplicationListDao.java index f07277af..4d324e56 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/dao/UserApplicationListDao.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/dao/UserApplicationListDao.java @@ -31,27 +31,30 @@ public class UserApplicationListDao { .execute(); } - public void savePassword(String traceId, String encodedPass) { - dslContext.update(USER_APPLICATION_LIST) + public Long savePassword(String traceId, String encodedPass) { + return dslContext.update(USER_APPLICATION_LIST) .set(USER_APPLICATION_LIST.APPLICATION_STATUS, ACCEPTED.name()) .set(USER_APPLICATION_LIST.USER_PASSWORD, encodedPass) .where(USER_APPLICATION_LIST.TRACE_ID.eq(traceId)) - .execute(); + .returning() + .fetchOne(USER_APPLICATION_LIST.NUMBER_APP); } - public void saveAcceptedStatus(String traceId) { - dslContext.update(USER_APPLICATION_LIST) + public Long saveAcceptedStatus(String traceId) { + return dslContext.update(USER_APPLICATION_LIST) .set(USER_APPLICATION_LIST.APPLICATION_STATUS, ACCEPTED.name()) .where(USER_APPLICATION_LIST.TRACE_ID.eq(traceId)) - .execute(); + .returning() + .fetchOne(USER_APPLICATION_LIST.NUMBER_APP); } - public void saveError(String traceId, String errorMsg) { - dslContext.update(USER_APPLICATION_LIST) + public Long saveError(String traceId, String errorMsg) { + return dslContext.update(USER_APPLICATION_LIST) .set(USER_APPLICATION_LIST.APPLICATION_STATUS, AGREED.name()) .set(USER_APPLICATION_LIST.EDIT_COMMENT, errorMsg) .where(USER_APPLICATION_LIST.TRACE_ID.eq(traceId)) - .execute(); + .returning() + .fetchOne(USER_APPLICATION_LIST.NUMBER_APP); } public boolean userExists(String login) { diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java b/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java index 553d68dc..a1152cfd 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java @@ -35,27 +35,30 @@ public class UserApplicationListService { dao.saveTraceId(traceId, appNumber); } - public void savePassword(String traceId, String encodedPass) { - dao.savePassword(traceId, encodedPass); + public Long savePassword(String traceId, String encodedPass) { + Long appNumber = dao.savePassword(traceId, encodedPass); saveAuditStatusByTraceId(traceId, ACCEPTED.name()); + return appNumber; } public boolean userExists(String login){ return dao.userExists(login); } - public void saveAcceptedStatus(String traceId) { - dao.saveAcceptedStatus(traceId); + public Long saveAcceptedStatus(String traceId) { + Long appNumber = dao.saveAcceptedStatus(traceId); saveAuditStatusByTraceId(traceId, ACCEPTED.name()); + return appNumber; } public void saveAgreedStatus(long appNumber) { dao.saveAgreedStatus(appNumber); } - public void saveError(String traceId, String errorMsg) { - dao.saveError(traceId, errorMsg); + public Long saveError(String traceId, String errorMsg) { + Long appNumber = dao.saveError(traceId, errorMsg); saveAuditStatusByTraceId(traceId, AGREED.name()); + return appNumber; } private void saveAuditStatusByTraceId(String traceId, String status) { diff --git a/frontend/src/ts/account_applications/component/grid/RowUpdateService.ts b/frontend/src/ts/account_applications/component/grid/RowUpdateService.ts new file mode 100644 index 00000000..ef09614b --- /dev/null +++ b/frontend/src/ts/account_applications/component/grid/RowUpdateService.ts @@ -0,0 +1,36 @@ +import {AnalyticalScope, Behavior, GridV2, NotNull} from "@webbpm/base-package"; +import {StatusUpdateService} from "../../../modules/app/service/status-update.service"; +import {Subscription} from "rxjs"; +import {OnDestroy} from "@angular/core"; + +@AnalyticalScope(GridV2) +export class RowUpdateService extends Behavior implements OnDestroy { + + @NotNull() + public statusColId: string; + + private updateService: StatusUpdateService; + private subscription: Subscription; + + initialize() { + super.initialize(); + let grid = this.getScript(GridV2); + this.updateService = this.injector.get(StatusUpdateService); + this.subscription = this.updateService.statusMessage.subscribe(value => { + if (!value) { + return; + } + grid.gridApi.forEachNode(rowNode => { + if (rowNode.id == value.appNumber) { + let rowData = rowNode.data; + rowData[this.statusColId] = value.status; + rowNode.updateData(rowData); + } + }); + }); + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } +} diff --git a/frontend/src/ts/modules/app/app.module.ts b/frontend/src/ts/modules/app/app.module.ts index ad0409d5..a86ac57a 100644 --- a/frontend/src/ts/modules/app/app.module.ts +++ b/frontend/src/ts/modules/app/app.module.ts @@ -26,6 +26,7 @@ import {DropdownTreeviewSelectComponent} from "../../account_applications/compon import {TreeviewModule} from "ngx-treeview"; import {ErvuStaticGrid} from "../../account_applications/component/grid/ErvuStaticGrid"; import {TemporaryFileUpload} from "../../account_applications/component/field/TemporaryFileUpload"; +import {AuthorizationService} from "./service/authorization.service"; registerLocaleData(localeRu); export const DIRECTIVES = [ @@ -62,7 +63,7 @@ export const DIRECTIVES = [ DIRECTIVES ], providers: [ - TokenInterceptor, + TokenInterceptor, AuthorizationService, {provide: ProgressIndicationService, useClass: AppProgressIndicationService } ], bootstrap: [], diff --git a/frontend/src/ts/modules/app/component/app-header.component.ts b/frontend/src/ts/modules/app/component/app-header.component.ts index e96cbaac..49037cfa 100644 --- a/frontend/src/ts/modules/app/component/app-header.component.ts +++ b/frontend/src/ts/modules/app/component/app-header.component.ts @@ -1,7 +1,6 @@ import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy} from "@angular/core"; import {AuthorizationService} from "../service/authorization.service"; -import {WebsocketService} from "../websocket/websocket.service"; -import {HttpClient} from "@angular/common/http"; +import {Subscription} from "rxjs"; @Component({ moduleId: module.id, @@ -14,30 +13,18 @@ export class AppHeaderComponent implements OnDestroy { name: string; realm: string; - constructor(protected authService: AuthorizationService, protected cd: ChangeDetectorRef, - protected websocketService: WebsocketService, protected httpClient: HttpClient) { - authService.onSessionUpdate + private subscription: Subscription; + + constructor(protected authService: AuthorizationService, protected cd: ChangeDetectorRef) { + this.subscription = authService.onSessionUpdate .subscribe(session => { this.name = session.name; this.realm = session.realm; cd.markForCheck(); - - if (this.authService.hasRole('security_administrator')) { - this.websocketService.subscribe(({data}) => { - let parsedObj = JSON.parse(data); - - if (parsedObj && parsedObj.traceId) { - if (parsedObj.className === 'update' || parsedObj.className === 'processError') { - this.httpClient.put('status', parsedObj).toPromise() - .catch(err => console.log('failed to update application status', err)); - } - } - }); - } }) } ngOnDestroy(): void { - this.websocketService.unsubscribe(); + this.subscription.unsubscribe(); } } diff --git a/frontend/src/ts/modules/app/service/authorization.service.ts b/frontend/src/ts/modules/app/service/authorization.service.ts index 9aedf3ac..25fb045b 100644 --- a/frontend/src/ts/modules/app/service/authorization.service.ts +++ b/frontend/src/ts/modules/app/service/authorization.service.ts @@ -1,6 +1,8 @@ -import {Injectable} from "@angular/core"; +import {Injectable, OnDestroy} from "@angular/core"; import {Subject} from "rxjs"; import {HttpClient} from "@angular/common/http"; +import {WebsocketService} from "../websocket/websocket.service"; +import {StatusUpdateService} from "./status-update.service"; export interface UserSession { userId: string, @@ -11,13 +13,14 @@ export interface UserSession { } @Injectable({providedIn: 'root'}) -export class AuthorizationService { +export class AuthorizationService implements OnDestroy { private session: UserSession; public onSessionUpdate: Subject = new Subject(); - constructor(protected httpClient: HttpClient) {} + constructor(protected httpClient: HttpClient, protected websocketService: WebsocketService, + protected statusUpdateService: StatusUpdateService) {} public getCurrentSession(): Promise { if (this.session) return new Promise(resolve => resolve(this.session)); @@ -26,6 +29,18 @@ export class AuthorizationService { .then((session: UserSession) => { this.session = session; this.onSessionUpdate.next(session); + + if (this.hasRole('security_administrator')) { + this.websocketService.subscribe(({data}) => { + let parsedObj = JSON.parse(data); + + if (parsedObj && parsedObj.traceId) { + if (parsedObj.className === 'update' || parsedObj.className === 'processError') { + this.statusUpdateService.update(parsedObj); + } + } + }); + } return session; }) } @@ -61,4 +76,8 @@ export class AuthorizationService { getRoles(): string[] { return this.isAuthorized() ? this.session.roles : null; } + + ngOnDestroy(): void { + this.websocketService.unsubscribe(); + } } diff --git a/frontend/src/ts/modules/app/service/status-update.service.ts b/frontend/src/ts/modules/app/service/status-update.service.ts new file mode 100644 index 00000000..267e7d2a --- /dev/null +++ b/frontend/src/ts/modules/app/service/status-update.service.ts @@ -0,0 +1,28 @@ +import {Injectable} from "@angular/core"; +import {BehaviorSubject} from "rxjs"; +import {HttpClient} from "@angular/common/http"; + +enum ApplicationStatus { + AGREED = 'Согласована', + ACCEPTED = 'Исполнена' +} + +@Injectable({providedIn: 'root'}) +export class StatusUpdateService { + + constructor(private httpClient: HttpClient) { + } + + public statusMessage = new BehaviorSubject(null); + + public update(responseObj: any): void { + this.httpClient.put('status', responseObj) + .toPromise() + .then(appNumber => this.statusMessage.next( + { + appNumber: appNumber, + status: responseObj.className === 'update' ? ApplicationStatus.ACCEPTED : ApplicationStatus.AGREED + })) + .catch(err => console.log('failed to update application status', err)); + } +} diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page index 979bc307..2b8b95c5 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page @@ -4832,6 +4832,22 @@ + + + RowUpdateService + account_applications.component.grid + + true + true + + + statusColId + + "user_application_list$application_status" + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 695a9110-b72a-4abe-99bc-66166b5fa864