From d4abaeea328f0f80132cb9dca48b9072aae8937d Mon Sep 17 00:00:00 2001 From: leejh Date: Wed, 25 Sep 2019 16:13:24 +0900 Subject: [PATCH] added protocol > query > dept, deptUser --- .../src/lib/models/dept-user.ts | 199 ++++++++++++++++++ .../src/lib/models/dept.ts | 95 +++++++++ .../lib/services/query-protocol.service.ts | 70 +++++- .../src/lib/types/dept.type.ts | 19 ++ .../src/public-api.ts | 3 + 5 files changed, 384 insertions(+), 2 deletions(-) create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/dept-user.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/dept.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/types/dept.type.ts diff --git a/projects/ucap-webmessenger-protocol-query/src/lib/models/dept-user.ts b/projects/ucap-webmessenger-protocol-query/src/lib/models/dept-user.ts new file mode 100644 index 00000000..af5e2ad5 --- /dev/null +++ b/projects/ucap-webmessenger-protocol-query/src/lib/models/dept-user.ts @@ -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 = ( + 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 = ( + 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 = ( + message: ProtocolMessage +) => { + return { + divCd: message.bodyList[0], + pageTotalCount: message.bodyList[1], + pageListCount: message.bodyList[2], + pageCurrent: message.bodyList[3] + } as DeptUserResponse; +}; diff --git a/projects/ucap-webmessenger-protocol-query/src/lib/models/dept.ts b/projects/ucap-webmessenger-protocol-query/src/lib/models/dept.ts new file mode 100644 index 00000000..1e5b56ac --- /dev/null +++ b/projects/ucap-webmessenger-protocol-query/src/lib/models/dept.ts @@ -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 = (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 = ( + 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 = ( + message: ProtocolMessage +) => { + return { divCd: message.bodyList[0] } as DeptResponse; +}; diff --git a/projects/ucap-webmessenger-protocol-query/src/lib/services/query-protocol.service.ts b/projects/ucap-webmessenger-protocol-query/src/lib/services/query-protocol.service.ts index f2df4933..e79ac75f 100644 --- a/projects/ucap-webmessenger-protocol-query/src/lib/services/query-protocol.service.ts +++ b/projects/ucap-webmessenger-protocol-query/src/lib/services/query-protocol.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ProtocolService } from '@ucap-webmessenger/protocol'; import { Observable } from 'rxjs'; -import { take, map } from 'rxjs/operators'; +import { take, map, takeWhile } from 'rxjs/operators'; import { AuthRequest, AuthResponse, @@ -10,8 +10,30 @@ import { } from '../models/auth'; import { 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'; +import { + DeptRequest, + DeptResponse, + encodeDept, + decodeDept, + decodeDeptData, + DeptData +} from '../models/dept'; +import { + encodeDeptUser, + decodeDeptUser, + decodeDeptUserData, + DeptUserRequest, + DeptUserData, + DeptUserResponse +} from '../models/dept-user'; @Injectable({ providedIn: 'root' @@ -27,4 +49,48 @@ export class QueryProtocolService { map(res => decodeAuth(res)) ); } + + public dept(req: DeptRequest): Observable { + 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 { + 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 + }; + }) + ); + } } diff --git a/projects/ucap-webmessenger-protocol-query/src/lib/types/dept.type.ts b/projects/ucap-webmessenger-protocol-query/src/lib/types/dept.type.ts new file mode 100644 index 00000000..2783f927 --- /dev/null +++ b/projects/ucap-webmessenger-protocol-query/src/lib/types/dept.type.ts @@ -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' +} diff --git a/projects/ucap-webmessenger-protocol-query/src/public-api.ts b/projects/ucap-webmessenger-protocol-query/src/public-api.ts index 14062a62..8e28590a 100644 --- a/projects/ucap-webmessenger-protocol-query/src/public-api.ts +++ b/projects/ucap-webmessenger-protocol-query/src/public-api.ts @@ -3,9 +3,12 @@ */ 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/types/dept.type'; export * from './lib/types/service'; export * from './lib/ucap-query-protocol.module';