Merge branch 'feature/SUPPORT-9136_dynamic_status_update' into develop

This commit is contained in:
gulnaz 2025-04-24 17:47:54 +03:00
commit d2eb16f6b6
9 changed files with 138 additions and 42 deletions

View file

@ -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;
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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();
}
}

View file

@ -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: [],

View file

@ -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();
}
}

View file

@ -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<UserSession> = new Subject<UserSession>();
constructor(protected httpClient: HttpClient) {}
constructor(protected httpClient: HttpClient, protected websocketService: WebsocketService,
protected statusUpdateService: StatusUpdateService) {}
public getCurrentSession(): Promise<any> {
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();
}
}

View file

@ -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<any>(null);
public update(responseObj: any): void {
this.httpClient.put<number>('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));
}
}

View file

@ -4832,6 +4832,22 @@
</entry>
</properties>
</scripts>
<scripts id="f1c2e3ed-5672-4ef9-844c-71ba5e0f36ba">
<classRef type="TS">
<className>RowUpdateService</className>
<packageName>account_applications.component.grid</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>statusColId</key>
<value>
<simple>"user_application_list$application_status"</simple>
</value>
</entry>
</properties>
</scripts>
<children id="695a9110-b72a-4abe-99bc-66166b5fa864">
<prototypeId>364c8faa-5e56-46cd-9203-d2ec6ef2dc74</prototypeId>
<componentRootId>695a9110-b72a-4abe-99bc-66166b5fa864</componentRootId>