added protocol > query > dept, deptUser

This commit is contained in:
leejh 2019-09-25 16:13:24 +09:00
parent 1c2c457187
commit d4abaeea32
5 changed files with 384 additions and 2 deletions

View File

@ -0,0 +1,199 @@
import {
ProtocolRequest,
ProtocolResponse,
ProtocolEncoder,
PacketBody,
ProtocolDecoder,
ProtocolMessage,
PacketBodyValue,
BodyStringDivider,
ProtocolStream
} from '@ucap-webmessenger/protocol';
import {
DeviceType,
FileTransferPermissions,
OrganizationChartPermissions,
DefaultScreen,
VideoConferenceType
} from '@ucap-webmessenger/core';
import { DeptType, DeptSearchType } from '../types/dept.type';
import { EmployeeType } from '@ucap-webmessenger/protocol-room';
import { RoleCode } from '@ucap-webmessenger/protocol-authentication';
export interface DeptUserRequest extends ProtocolRequest {
// DivCD(s)
divCd: string;
// 기관코드(s)
companyCode: string;
// 부서SEQ(n)
seq?: number;
// 검색string(s)
search?: string;
// 검색범위(s)
searchRange: DeptSearchType;
// 요청리스트(n) 사용안하면 0 최대 200
pageListCount?: number;
// 요청페이지(n) 사용안하면 0 처음은 1
pageCurrent?: number;
// 발신자회사코드(s)
senderCompanyCode: string;
// 발신자임직원유형(s)
senderEmployeeType: EmployeeType;
}
export interface UserInfoSS {
// 사용자SEQ
seq: number;
// 사용자명
name: string;
// 사진파일
profileImageFile: string;
// 직급
grade: string;
// 업무소개
intro: string;
// 기관코드
companyCode: string;
// 핸드폰번호
hpNumber: string;
// 내선번호
lineNumber: string;
// 이메일
email: string;
// 모바일YN
isMobile: boolean;
// 부서명
deptName: string;
// 조회순서
order: string;
// ActiveYN
isActive: boolean;
// 역할코드
roleCd: RoleCode;
// 사번
employeeNum: string;
// MADN
madn: string;
// HARDPHONE_SADN
hardSadn: string;
// FMC_SADN
fmcSadn: string;
// CALL_MODE
callMode: string;
// 사용자명(영어)
nameEn: string;
// 사용자명(중국어)
nameCn: string;
// 직급(영어)
gradeEn: string;
// 직급(중국어)
gradeCn: string;
// 부서명(영어)
deptNameEn: string;
// 부서명(중국어)
deptNameCn: string;
// 부서SEQ
deptSeq: number;
// 이용약관동의여부YN
isPrivacyAgree: boolean;
// 유효접속여부YN
isValidLogin: boolean;
// 임직원유형(s)
employeeType: EmployeeType;
}
export interface DeptUserData extends ProtocolStream {
// DivCD(s)
divCd: string;
// {부서정보-S}...
userInfos: UserInfoSS[];
}
export interface DeptUserResponse extends ProtocolResponse {
// DivCD(s)
divCd: string;
// 전체갯수(n)
pageTotalCount: number;
// 요청리스트(n)
pageListCount?: number;
// 페이지(n)
pageCurrent?: number;
}
export const encodeDeptUser: ProtocolEncoder<DeptUserRequest> = (
req: DeptUserRequest
) => {
const bodyList: PacketBody[] = [];
bodyList.push({ type: PacketBodyValue.String, value: req.divCd });
bodyList.push({ type: PacketBodyValue.String, value: req.companyCode });
bodyList.push({ type: PacketBodyValue.Integer, value: req.seq || 0 });
bodyList.push({ type: PacketBodyValue.String, value: req.search || '' });
bodyList.push({ type: PacketBodyValue.String, value: req.searchRange });
bodyList.push({
type: PacketBodyValue.Integer,
value: req.pageListCount || 0
});
bodyList.push({ type: PacketBodyValue.Integer, value: req.pageCurrent || 0 });
bodyList.push({ type: PacketBodyValue.String, value: req.senderCompanyCode });
bodyList.push({
type: PacketBodyValue.String,
value: req.senderEmployeeType
});
return bodyList;
};
export const decodeDeptUserData: ProtocolDecoder<DeptUserData> = (
message: ProtocolMessage
) => {
const userInfos: UserInfoSS[] = [];
message.bodyList.slice(1).forEach(userInfo => {
const info = userInfo.split(BodyStringDivider);
let i = 0;
userInfos.push({
seq: info[i],
name: info[i++],
profileImageFile: info[i++],
grade: info[i++],
intro: info[i++],
companyCode: info[i++],
hpNumber: info[i++],
lineNumber: info[i++],
email: info[i++],
isMobile: info[i++] === 'Y' ? true : false,
deptName: info[i++],
order: info[i++],
isActive: info[i++] === 'Y' ? true : false,
roleCd: info[i++] as RoleCode,
employeeNum: info[i++],
madn: info[i++],
hardSadn: info[i++],
fmcSadn: info[i++],
callMode: info[i++],
nameEn: info[i++],
nameCn: info[i++],
gradeEn: info[i++],
gradeCn: info[i++],
deptNameEn: info[i++],
deptNameCn: info[i++],
deptSeq: info[i++],
isPrivacyAgree: info[i++] === 'Y' ? true : false,
isValidLogin: info[i++] === 'Y' ? true : false,
employeeType: info[i++] as EmployeeType
});
});
return {
divCd: message.bodyList[0],
userInfos
} as DeptUserData;
};
export const decodeDeptUser: ProtocolDecoder<DeptUserResponse> = (
message: ProtocolMessage
) => {
return {
divCd: message.bodyList[0],
pageTotalCount: message.bodyList[1],
pageListCount: message.bodyList[2],
pageCurrent: message.bodyList[3]
} as DeptUserResponse;
};

View File

@ -0,0 +1,95 @@
import {
ProtocolRequest,
ProtocolResponse,
ProtocolEncoder,
PacketBody,
ProtocolDecoder,
ProtocolMessage,
PacketBodyValue,
BodyStringDivider,
ProtocolStream
} from '@ucap-webmessenger/protocol';
import { DeptType } from '../types/dept.type';
export interface DeptRequest extends ProtocolRequest {
// DivCD(s)
divCd: string;
// 기관코드(s)
companyCode: string;
}
export interface DeptInfo {
// 부서SEQ
seq: number;
// 부서명
name: string;
// 기관코드
companyCode: string;
// 부서타입
type: DeptType;
// 본부SEQ
rootSeq: number;
// 상위부서SEQ
parentSeq: number;
// 조회순서
order: string;
// 조회레벨
depth: number;
// ActiveYN
isActive: boolean;
// 부서명(영어)
nameEn: string;
// 부서명(중국어)
nameCn: string;
}
export interface DeptData extends ProtocolStream {
// DivCD(s)
divCd: string;
// {부서정보-S}...
departmentInfos: DeptInfo[];
}
export interface DeptResponse extends ProtocolResponse {
// DivCD(s)
divCd: string;
}
export const encodeDept: ProtocolEncoder<DeptRequest> = (req: DeptRequest) => {
const bodyList: PacketBody[] = [];
bodyList.push({ type: PacketBodyValue.String, value: req.divCd });
bodyList.push({ type: PacketBodyValue.String, value: req.companyCode });
return bodyList;
};
export const decodeDeptData: ProtocolDecoder<DeptData> = (
message: ProtocolMessage
) => {
const departmentInfos: DeptInfo[] = [];
message.bodyList.slice(1).forEach(deptInfo => {
const info = deptInfo.split(BodyStringDivider);
let i = 0;
departmentInfos.push({
seq: info[i],
name: info[i++],
companyCode: info[i++],
type: info[i++] as DeptType,
rootSeq: info[i++],
parentSeq: info[i++],
order: info[i++],
depth: info[i++],
isActive: info[i++] === 'Y' ? true : false,
nameEn: info[i++],
nameCn: info[i++]
});
});
return {
divCd: message.bodyList[0],
departmentInfos
} as DeptData;
};
export const decodeDept: ProtocolDecoder<DeptResponse> = (
message: ProtocolMessage
) => {
return { divCd: message.bodyList[0] } as DeptResponse;
};

View File

@ -1,7 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { ProtocolService } from '@ucap-webmessenger/protocol'; import { ProtocolService } from '@ucap-webmessenger/protocol';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { take, map } from 'rxjs/operators'; import { take, map, takeWhile } from 'rxjs/operators';
import { import {
AuthRequest, AuthRequest,
AuthResponse, AuthResponse,
@ -10,8 +10,30 @@ import {
} from '../models/auth'; } from '../models/auth';
import { import {
SVC_TYPE_QUERY_DATA, SVC_TYPE_QUERY_DATA,
SSVC_TYPE_QUERY_AUTH_REQ SSVC_TYPE_QUERY_AUTH_REQ,
SSVC_TYPE_QUERY_DEPT_REQ,
SSVC_TYPE_QUERY_DEPT_RES,
SSVC_TYPE_QUERY_DEPT_DATA,
SSVC_TYPE_QUERY_DEPT_USER_RES,
SSVC_TYPE_QUERY_DEPT_USER_DATA,
SSVC_TYPE_QUERY_DEPT_USER_REQ
} from '../types/service'; } from '../types/service';
import {
DeptRequest,
DeptResponse,
encodeDept,
decodeDept,
decodeDeptData,
DeptData
} from '../models/dept';
import {
encodeDeptUser,
decodeDeptUser,
decodeDeptUserData,
DeptUserRequest,
DeptUserData,
DeptUserResponse
} from '../models/dept-user';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -27,4 +49,48 @@ export class QueryProtocolService {
map(res => decodeAuth(res)) map(res => decodeAuth(res))
); );
} }
public dept(req: DeptRequest): Observable<DeptResponse | DeptData> {
return this.protocolService
.call(SVC_TYPE_QUERY_DATA, SSVC_TYPE_QUERY_DEPT_REQ, ...encodeDept(req))
.pipe(
takeWhile(res => SSVC_TYPE_QUERY_DEPT_RES !== res.subServiceType, true),
map(res => {
if (SSVC_TYPE_QUERY_DEPT_DATA === res.subServiceType) {
return { ...decodeDeptData(res), Type: SSVC_TYPE_QUERY_DEPT_DATA };
}
return { ...decodeDept(res), Type: SSVC_TYPE_QUERY_DEPT_RES };
})
);
}
public deptUser(
req: DeptUserRequest
): Observable<DeptUserResponse | DeptUserData> {
return this.protocolService
.call(
SVC_TYPE_QUERY_DATA,
SSVC_TYPE_QUERY_DEPT_USER_REQ,
...encodeDeptUser(req)
)
.pipe(
takeWhile(
res => SSVC_TYPE_QUERY_DEPT_USER_RES !== res.subServiceType,
true
),
map(res => {
if (SSVC_TYPE_QUERY_DEPT_USER_DATA === res.subServiceType) {
return {
...decodeDeptUserData(res),
Type: SSVC_TYPE_QUERY_DEPT_USER_DATA
};
}
return {
...decodeDeptUser(res),
Type: SSVC_TYPE_QUERY_DEPT_USER_RES
};
})
);
}
} }

View File

@ -0,0 +1,19 @@
export enum DeptType {
// R: 기관Root
Root = 'R',
// D: 본부
Department = 'D',
// T: 부서
Team = 'T'
}
export enum DeptSearchType {
// A: 부서, 인원
All = 'A',
// U: 인원
User = 'U',
// D: 부서
Department = 'D',
// M: 다중부서 cf) 여러 부서(하위전체)를 쿼리할 때 1, 2, 3, 4..이렇게 부서SEQ들을, 로 연결해서 보냄 (검색string 필드를 사용함)
MultiDepartment = 'M'
}

View File

@ -3,9 +3,12 @@
*/ */
export * from './lib/models/auth'; export * from './lib/models/auth';
export * from './lib/models/dept';
export * from './lib/models/dept-user';
export * from './lib/services/query-protocol.service'; export * from './lib/services/query-protocol.service';
export * from './lib/types/dept.type';
export * from './lib/types/service'; export * from './lib/types/service';
export * from './lib/ucap-query-protocol.module'; export * from './lib/ucap-query-protocol.module';