--- DATABASE/mysql/all_ebt_ddl_mysql.sql
+++ DATABASE/mysql/all_ebt_ddl_mysql.sql
... | ... | @@ -148,6 +148,8 @@ |
| 148 | 148 |
ESNTL_ID char(20) NOT NULL, |
| 149 | 149 |
CRTFC_DN_VALUE varchar(20) DEFAULT NULL, |
| 150 | 150 |
SBSCRB_DE datetime DEFAULT NULL, |
| 151 |
+ REGISTER_ID varchar(20) DEFAULT NULL COMMENT '등록자(계정을 등록한 관리자 로그인ID)', |
|
| 152 |
+ REGIST_RESN varchar(500) DEFAULT NULL COMMENT '등록사유(권한 부여 사유)', |
|
| 151 | 153 |
PRIMARY KEY (EMPLYR_ID), |
| 152 | 154 |
KEY LETTNEMPLYRINFO_ibfk_2 (GROUP_ID), |
| 153 | 155 |
KEY LETTNEMPLYRINFO_ibfk_1 (ORGNZT_ID), |
+++ DATABASE/mysql/alter_LETTNEMPLYRINFO_register_info.sql
... | ... | @@ -0,0 +1,11 @@ |
| 1 | +-- ===================================================================== | |
| 2 | +-- 전송자격인증제 3.2 접근권한 부여의 적정성 ③ | |
| 3 | +-- : 관리자(업무사용자) 계정 등록 시 "등록자 / 등록사유" 기록 | |
| 4 | +-- 대상 테이블 : LETTNEMPLYRINFO (업무사용자 정보) | |
| 5 | +-- Redmine #5799 | |
| 6 | +-- 적용 순서 : local -> dev -> prod (배포 전 각 환경 DB에 수동 반영) | |
| 7 | +-- ===================================================================== | |
| 8 | + | |
| 9 | +ALTER TABLE LETTNEMPLYRINFO | |
| 10 | + ADD COLUMN REGISTER_ID varchar(20) DEFAULT NULL COMMENT '등록자(계정을 등록한 관리자 로그인ID)' AFTER SBSCRB_DE, | |
| 11 | + ADD COLUMN REGIST_RESN varchar(500) DEFAULT NULL COMMENT '등록사유(권한 부여 사유)' AFTER REGISTER_ID; |
+++ docs/superpowers/.sdd-reports/task-5-report.md
... | ... | @@ -0,0 +1,84 @@ |
| 1 | +# Task 5 Report: 토큰 인증 인터셉터 + 매핑 + 시큐리티 예외 | |
| 2 | + | |
| 3 | +## Files Changed | |
| 4 | + | |
| 5 | +### Created | |
| 6 | +- `src/main/java/itn/com/cmm/interceptor/DashboardApiAuthInterceptor.java` | |
| 7 | + | |
| 8 | +### Modified | |
| 9 | +- `src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml` | |
| 10 | +- `src/main/resources/egovframework/spring/com/context-security.xml` | |
| 11 | + | |
| 12 | +--- | |
| 13 | + | |
| 14 | +## XML Snippets Added | |
| 15 | + | |
| 16 | +### egov-interceptor-servlet.xml — inside `<interceptors>`, first position | |
| 17 | + | |
| 18 | +```xml | |
| 19 | + <!-- 대시보드 요약 API 토큰 인증 --> | |
| 20 | + <interceptor> | |
| 21 | + <mapping path="/api/dashboard/**"/> | |
| 22 | + <beans:bean class="itn.com.cmm.interceptor.DashboardApiAuthInterceptor"/> | |
| 23 | + </interceptor> | |
| 24 | +``` | |
| 25 | + | |
| 26 | +Style mirrors existing interceptors: `<interceptor>`/`<mapping>` are in the default `mvc` namespace; the bean uses the `beans:` prefix as `<beans:bean>`, matching `InterceptorHandler` and `IPIgnoreInterceptorHandler`. | |
| 27 | + | |
| 28 | +### context-security.xml — after existing `security="none"` entries (line 16) | |
| 29 | + | |
| 30 | +```xml | |
| 31 | +<security:http pattern="/api/dashboard/**" security="none"/> | |
| 32 | +``` | |
| 33 | + | |
| 34 | +Placed immediately after the `\A/WEB-INF/jsp/.*\Z` regex entry, before `<egov-security:config>`. | |
| 35 | + | |
| 36 | +--- | |
| 37 | + | |
| 38 | +## @Value / globalSettings Pattern Verification | |
| 39 | + | |
| 40 | +Reference file: `src/main/java/itn/let/mjo/api/sms/web/ApiSmsTestMsgController.java` line 32: | |
| 41 | +```java | |
| 42 | +@Value("#{globalSettings['Globals.api.ip']}") | |
| 43 | +private String API_IP; | |
| 44 | +``` | |
| 45 | + | |
| 46 | +The new interceptor uses: | |
| 47 | +```java | |
| 48 | +@Value("#{globalSettings['Globals.dashboard.api.token']}") | |
| 49 | +private String apiToken; | |
| 50 | +``` | |
| 51 | + | |
| 52 | +Identical SpEL pattern `#{globalSettings['<key>']}`. The `globalSettings` bean is defined in `context-properties.xml` and is available in the dispatcher servlet context (interceptors are registered there and Spring injects `@Value` into interceptor beans declared via `<beans:bean>` in the servlet context). Pattern confirmed to match the reference. | |
| 53 | + | |
| 54 | +--- | |
| 55 | + | |
| 56 | +## XML Well-Formedness Confirmation | |
| 57 | + | |
| 58 | +### egov-interceptor-servlet.xml | |
| 59 | +- Root element: `<beans:beans>` (line 2) — closed at line 40 `</beans:beans>`. Balanced. | |
| 60 | +- `<interceptors>` (line 10) — closed at line 38 `</interceptors>`. Balanced. | |
| 61 | +- New `<interceptor>` block (lines 11-15): `<mapping/>` self-closing, `<beans:bean/>` self-closing, `</interceptor>` closes. Balanced. | |
| 62 | +- Namespaces: `mvc` default, `beans:` prefix. New snippet uses correct prefixes. | |
| 63 | + | |
| 64 | +### context-security.xml | |
| 65 | +- Root element: `<beans>` (line 2) — closed at line 95 (original line 95) `</beans>`. Balanced. | |
| 66 | +- New entry is a self-closing `<security:http ... />` element using the already-declared `security:` namespace. Well-formed. | |
| 67 | + | |
| 68 | +--- | |
| 69 | + | |
| 70 | +## Commit Short Hash | |
| 71 | + | |
| 72 | +(See below — recorded after commit) | |
| 73 | + | |
| 74 | +--- | |
| 75 | + | |
| 76 | +## Concerns / Notes | |
| 77 | + | |
| 78 | +1. **@Value injection into interceptor**: Spring injects `@Value` into interceptor beans only when the bean is instantiated by the application context (i.e., declared as `<beans:bean>` in the servlet XML). This pattern is consistent with how the project already declares interceptor beans in `egov-interceptor-servlet.xml`. | |
| 79 | + | |
| 80 | +2. **IPIgnoreInterceptorHandler also matches `/api/dashboard/**`**: The `/**` mapping interceptor still runs on this path. That interceptor only logs specific URI patterns (`errorLogInsert`, `*Ajax.do`, etc.) and will not block the API flow. | |
| 81 | + | |
| 82 | +3. **mvn/curl verification deferred**: Plan Steps 4-6 (mvn clean package, mvn tomcat7:run, curl 401/200 checks) could NOT be run in this environment — mvn and curl are not available. Verification was performed statically: file content read-back, XML tag balance check, @Value pattern cross-reference. Runtime verification must be performed by the developer in IntelliJ (Run → Deploy, then manual curl or browser test). | |
| 83 | + | |
| 84 | +4. **Token value**: `globals_local.properties` / `globals_dev.properties` / `globals_prod.properties` all contain `Globals.dashboard.api.token=CHANGE_ME_TOKEN`. Replace with a real secret before deploying to production. |
+++ docs/superpowers/n8n/README.md
... | ... | @@ -0,0 +1,23 @@ |
| 1 | +# 대시보드 일일 리포트 → Slack (n8n) | |
| 2 | + | |
| 3 | +## 구성 | |
| 4 | +- `n8n-workflow.json` : import용 워크플로우 (Schedule → HTTP Request → Code → Slack) | |
| 5 | +- `code-node.js` : Code 노드에 붙여넣을 변환 스니펫 | |
| 6 | + | |
| 7 | +## 설정 순서 | |
| 8 | +1. n8n에서 Settings → Variables/Environment에 `MJON_DASH_TOKEN` 추가 | |
| 9 | + (값 = 앱 `globals_<profile>.properties`의 `Globals.dashboard.api.token`). | |
| 10 | +2. `n8n-workflow.json` import. | |
| 11 | +3. HTTP Request 노드의 `CHANGE_ME_HOST`를 관리자 호스트로 교체. | |
| 12 | +4. Code 노드(`Format Slack Blocks`)에 `code-node.js` 내용 붙여넣기. | |
| 13 | +5. Slack 노드: 자격증명 연결 후 `CHANGE_ME_CHANNEL`을 대상 채널로 교체. | |
| 14 | +6. 스케줄: 기본 매일 09:00(`0 9 * * *`). 필요 시 cron 수정. | |
| 15 | + | |
| 16 | +## 수동 검증 | |
| 17 | +- 워크플로우 상단 **Execute Workflow** 실행 → 대상 Slack 채널에 리포트 수신 확인. | |
| 18 | +- 토큰 불일치 시 HTTP Request 노드가 401로 실패하는지 확인. | |
| 19 | + | |
| 20 | +## 참고: 사내 n8n / 테스트 webhook | |
| 21 | +- n8n 호스트: https://n8n.iten.co.kr | |
| 22 | +- 테스트용 webhook(추후 사용): https://n8n.iten.co.kr/webhook-test/b8404529-b7d2-4ed9-8b11-1e4f8f07c554 | |
| 23 | +- 참고: n8n의 `/webhook-test/` URL은 에디터에서 "Listen for test event" 상태일 때만 동작하며, 운영은 `/webhook/` 경로를 사용한다. |
+++ docs/superpowers/n8n/code-node.js
... | ... | @@ -0,0 +1,36 @@ |
| 1 | +// n8n Code 노드: 도메인 JSON → Slack Block Kit | |
| 2 | +// 입력: 이전 HTTP Request 노드의 JSON 응답 | |
| 3 | +const d = $input.first().json; | |
| 4 | +const won = (n) => (n == null ? '0' : Number(n).toLocaleString('ko-KR')) + '원'; | |
| 5 | + | |
| 6 | +const sales = d.sales || {}; | |
| 7 | +const m = d.members || {}; | |
| 8 | +const sms = d.sms || {}; | |
| 9 | + | |
| 10 | +const agentLines = (sms.agents || []) | |
| 11 | + .map(a => `• ${a.agentCode}: 성공 ${Number(a.succCnt).toLocaleString('ko-KR')} / 실패 ${Number(a.failCnt).toLocaleString('ko-KR')} (성공률 ${a.succRate}%)`) | |
| 12 | + .join('\n') || '데이터 없음'; | |
| 13 | + | |
| 14 | +const dayLines = (sales.dayChart || []) | |
| 15 | + .map(p => `${p.label} ${won(p.amt)}`) | |
| 16 | + .join(' | ') || '데이터 없음'; | |
| 17 | + | |
| 18 | +const blocks = [ | |
| 19 | + { type: 'header', text: { type: 'plain_text', text: ` 문자ON 일일 리포트 — ${d.baseDate}`, emoji: true } }, | |
| 20 | + { type: 'section', fields: [ | |
| 21 | + { type: 'mrkdwn', text: `*당일 매출*\n${won(sales.todayAmt)}` }, | |
| 22 | + { type: 'mrkdwn', text: `*연간 누적*\n${won(sales.yearAmtSum)}` }, | |
| 23 | + ] }, | |
| 24 | + { type: 'section', text: { type: 'mrkdwn', text: `*최근 매출(일별)*\n${dayLines}` } }, | |
| 25 | + { type: 'divider' }, | |
| 26 | + { type: 'section', fields: [ | |
| 27 | + { type: 'mrkdwn', text: `*개인/기업 회원*\n${m.userNorCnt} / ${m.userComCnt}` }, | |
| 28 | + { type: 'mrkdwn', text: `*기업 신청/승인/반려*\n${m.cmpApply} / ${m.cmpApprove} / ${m.cmpReject}` }, | |
| 29 | + { type: 'mrkdwn', text: `*금일 탈퇴/정지*\n${m.todayExpireCnt} / ${m.todayStopCnt}` }, | |
| 30 | + { type: 'mrkdwn', text: `*일 가입자수*\n${sms.todaySignupCnt}` }, | |
| 31 | + ] }, | |
| 32 | + { type: 'divider' }, | |
| 33 | + { type: 'section', text: { type: 'mrkdwn', text: `*전송사별 발송*\n${agentLines}` } }, | |
| 34 | +]; | |
| 35 | + | |
| 36 | +return [{ json: { blocks } }]; |
+++ docs/superpowers/n8n/n8n-workflow.json
... | ... | @@ -0,0 +1,63 @@ |
| 1 | +{ | |
| 2 | + "name": "mjon-dashboard-daily-slack", | |
| 3 | + "nodes": [ | |
| 4 | + { | |
| 5 | + "parameters": { | |
| 6 | + "rule": { "interval": [ { "field": "cronExpression", "expression": "0 9 * * *" } ] } | |
| 7 | + }, | |
| 8 | + "id": "schedule", | |
| 9 | + "name": "Schedule Trigger", | |
| 10 | + "type": "n8n-nodes-base.scheduleTrigger", | |
| 11 | + "typeVersion": 1, | |
| 12 | + "position": [ 240, 300 ] | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "parameters": { | |
| 16 | + "url": "https://CHANGE_ME_HOST/api/dashboard/summary.do", | |
| 17 | + "options": {}, | |
| 18 | + "sendHeaders": true, | |
| 19 | + "headerParameters": { | |
| 20 | + "parameters": [ | |
| 21 | + { "name": "X-DASHBOARD-TOKEN", "value": "={{ $env.MJON_DASH_TOKEN }}" } | |
| 22 | + ] | |
| 23 | + } | |
| 24 | + }, | |
| 25 | + "id": "http", | |
| 26 | + "name": "HTTP Request", | |
| 27 | + "type": "n8n-nodes-base.httpRequest", | |
| 28 | + "typeVersion": 4, | |
| 29 | + "position": [ 460, 300 ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "parameters": { | |
| 33 | + "language": "javaScript", | |
| 34 | + "jsCode": "// docs/superpowers/n8n/code-node.js 내용을 여기에 붙여넣는다" | |
| 35 | + }, | |
| 36 | + "id": "code", | |
| 37 | + "name": "Format Slack Blocks", | |
| 38 | + "type": "n8n-nodes-base.code", | |
| 39 | + "typeVersion": 2, | |
| 40 | + "position": [ 680, 300 ] | |
| 41 | + }, | |
| 42 | + { | |
| 43 | + "parameters": { | |
| 44 | + "resource": "message", | |
| 45 | + "operation": "post", | |
| 46 | + "channelId": "CHANGE_ME_CHANNEL", | |
| 47 | + "blocksUi": "={{ $json.blocks }}", | |
| 48 | + "text": "문자ON 일일 리포트" | |
| 49 | + }, | |
| 50 | + "id": "slack", | |
| 51 | + "name": "Slack", | |
| 52 | + "type": "n8n-nodes-base.slack", | |
| 53 | + "typeVersion": 2, | |
| 54 | + "position": [ 900, 300 ] | |
| 55 | + } | |
| 56 | + ], | |
| 57 | + "connections": { | |
| 58 | + "Schedule Trigger": { "main": [ [ { "node": "HTTP Request", "type": "main", "index": 0 } ] ] }, | |
| 59 | + "HTTP Request": { "main": [ [ { "node": "Format Slack Blocks", "type": "main", "index": 0 } ] ] }, | |
| 60 | + "Format Slack Blocks": { "main": [ [ { "node": "Slack", "type": "main", "index": 0 } ] ] } | |
| 61 | + }, | |
| 62 | + "settings": {} | |
| 63 | +} |
+++ docs/superpowers/plans/2026-06-23-dashboard-slack-n8n.md
... | ... | @@ -0,0 +1,849 @@ |
| 1 | +# 대시보드 → n8n → Slack 정기 리포트 Implementation Plan | |
| 2 | + | |
| 3 | +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. | |
| 4 | + | |
| 5 | +**Goal:** 문자ON 대시보드의 매출/회원/문자발송 지표를 토큰 인증 JSON API로 노출하고, n8n이 스케줄로 호출해 Slack에 정기 요약을 게시한다. | |
| 6 | + | |
| 7 | +**Architecture:** 신규 모듈 `itn.let.mjo.dashboardapi`에 `@RestController` 1개 + Service/Impl + 응답 DTO + 토큰 인증 인터셉터를 추가한다. 집계는 기존 검증된 서비스(`mjonPayService`, `conectStatsService`, `mjonMsgService`)를 **재사용**하며 신규 SQL/DAO는 없다. Slack 표현(콤마/원화/Block Kit)은 n8n이 담당하고 앱은 raw 숫자 JSON만 반환한다. | |
| 8 | + | |
| 9 | +**Tech Stack:** Java 1.8, Spring MVC 4.3 (eGovFramework 3.9.0), iBATIS(SqlMapClient), Jackson 2.5.1, Lombok 1.18.24, Maven(WAR). n8n(Schedule + HTTP Request + Code + Slack). | |
| 10 | + | |
| 11 | +## Global Constraints | |
| 12 | + | |
| 13 | +- Java 1.8 / Spring 4.3 문법만 사용. 신규 라이브러리 추가 금지(기존 pom.xml 의존성만). | |
| 14 | +- 신규 SQL/DAO 작성 금지 — 기존 서비스 메서드만 호출. | |
| 15 | +- 기존 4종 패턴 준수: `web`(@Controller/@RestController) / `service`(인터페이스+VO) / `service.impl`(@Service). | |
| 16 | +- 빈 스캔 분리 규칙: 컨트롤러·인터셉터=디스패처 컨텍스트(`*-servlet.xml`), 서비스=루트 컨텍스트(`context-*.xml`). | |
| 17 | +- 관리자 로그 AOP(`itn..*Controller.select*` 등) 회피를 위해 컨트롤러 메서드명은 `getDashboardSummary`(=`select*`/`insert*`/`update*`/`delete*` 아님)로 짓는다. | |
| 18 | +- 토큰 헤더명: `X-DASHBOARD-TOKEN`. 프로퍼티 키: `Globals.dashboard.api.token`. | |
| 19 | +- **테스트 인프라 없음**: 본 저장소는 `src/test`가 없고 surefire `skipTests=true`다. 따라서 각 태스크의 검증은 **`mvn compile` 성공 + 수동 curl/실행 확인**으로 수행한다(자동 단위테스트는 본 작업 범위 아님 — 스펙에서 수동 검증으로 합의됨). | |
| 20 | +- 인코딩 UTF-8. 토큰 값은 로그/응답에 출력 금지. | |
| 21 | + | |
| 22 | +--- | |
| 23 | + | |
| 24 | +### Task 1: 토큰 프로퍼티 추가 | |
| 25 | + | |
| 26 | +**Files:** | |
| 27 | +- Modify: `src/main/resources/egovframework/egovProps/globals.properties` (끝에 추가) | |
| 28 | +- Modify: `src/main/resources/egovframework/egovProps/globals_local.properties` | |
| 29 | +- Modify: `src/main/resources/egovframework/egovProps/globals_dev.properties` | |
| 30 | +- Modify: `src/main/resources/egovframework/egovProps/globals_prod.properties` | |
| 31 | + | |
| 32 | +**Interfaces:** | |
| 33 | +- Consumes: 없음 | |
| 34 | +- Produces: 프로퍼티 키 `Globals.dashboard.api.token` (이후 Task 5 인터셉터가 `globalSettings`로 읽음) | |
| 35 | + | |
| 36 | +- [ ] **Step 1: `globals.properties` 끝에 기본 토큰 추가** | |
| 37 | + | |
| 38 | +`globals.properties` 파일 맨 끝(line 101 이후)에 아래 블록 추가: | |
| 39 | + | |
| 40 | +```properties | |
| 41 | + | |
| 42 | +# 대시보드 요약 API(n8n→Slack) 공유 토큰 | |
| 43 | +Globals.dashboard.api.token=CHANGE_ME_DEV_TOKEN | |
| 44 | +``` | |
| 45 | + | |
| 46 | +- [ ] **Step 2: 환경별 프로퍼티에 동일 키 추가(override)** | |
| 47 | + | |
| 48 | +`globals_local.properties`, `globals_dev.properties`, `globals_prod.properties` 각 파일 끝에 아래를 추가(운영 값은 배포 시 교체): | |
| 49 | + | |
| 50 | +```properties | |
| 51 | + | |
| 52 | +# 대시보드 요약 API(n8n→Slack) 공유 토큰 | |
| 53 | +Globals.dashboard.api.token=CHANGE_ME_TOKEN | |
| 54 | +``` | |
| 55 | + | |
| 56 | +> 활성 프로파일은 `-Dspring.profiles.active`로 결정되며 `globals_<profile>.properties`가 실제 사용된다(`context-properties.xml`의 `globalSettings`). `globals.properties`는 공통 기본값. | |
| 57 | + | |
| 58 | +- [ ] **Step 3: 추가 확인** | |
| 59 | + | |
| 60 | +Run: `grep -rn "Globals.dashboard.api.token" src/main/resources/egovframework/egovProps/` | |
| 61 | +Expected: 4개 파일 모두에서 키가 출력됨. | |
| 62 | + | |
| 63 | +- [ ] **Step 4: Commit** | |
| 64 | + | |
| 65 | +```bash | |
| 66 | +git add src/main/resources/egovframework/egovProps/globals*.properties | |
| 67 | +git commit -m "feat(dashboard-api): 대시보드 요약 API 토큰 프로퍼티 추가" | |
| 68 | +``` | |
| 69 | + | |
| 70 | +--- | |
| 71 | + | |
| 72 | +### Task 2: 응답 DTO (DashboardSummaryVO) | |
| 73 | + | |
| 74 | +**Files:** | |
| 75 | +- Create: `src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryVO.java` | |
| 76 | + | |
| 77 | +**Interfaces:** | |
| 78 | +- Consumes: 없음 | |
| 79 | +- Produces: 아래 타입들(이후 Task 3 서비스가 채우고 Task 4 컨트롤러가 반환). Lombok `@Getter @Setter` 사용. | |
| 80 | + - `DashboardSummaryVO` { `boolean isSuccess`, `String msg`, `String baseDate`, `Sales sales`, `Members members`, `Sms sms` } | |
| 81 | + - `DashboardSummaryVO.Sales` { `long todayAmt`, `List<AmtPoint> dayChart`, `List<AmtPoint> monthChart`, `long yearAmtSum` } | |
| 82 | + - `DashboardSummaryVO.AmtPoint` { `String label`, `long amt` } | |
| 83 | + - `DashboardSummaryVO.Members` { `int userNorCnt, userComCnt, mberNorTot, mberBlockTot, mberSecessTot, cmpApply, cmpApprove, cmpReject, todayExpireCnt, todayStopCnt` } | |
| 84 | + - `DashboardSummaryVO.Sms` { `List<AgentStat> agents`, `int todaySignupCnt` } | |
| 85 | + - `DashboardSummaryVO.AgentStat` { `String agentCode`, `int succCnt`, `int failCnt`, `int succRate` } | |
| 86 | + | |
| 87 | +- [ ] **Step 1: DTO 파일 작성** | |
| 88 | + | |
| 89 | +`src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryVO.java`: | |
| 90 | + | |
| 91 | +```java | |
| 92 | +package itn.let.mjo.dashboardapi.service; | |
| 93 | + | |
| 94 | +import java.io.Serializable; | |
| 95 | +import java.util.ArrayList; | |
| 96 | +import java.util.List; | |
| 97 | + | |
| 98 | +import lombok.Getter; | |
| 99 | +import lombok.Setter; | |
| 100 | + | |
| 101 | +/** | |
| 102 | + * 대시보드 요약 API(n8n→Slack) 응답 DTO. | |
| 103 | + * 앱은 표현 포맷 없이 raw 숫자만 제공한다(콤마/원화는 n8n에서 처리). | |
| 104 | + */ | |
| 105 | +@Getter | |
| 106 | +@Setter | |
| 107 | +public class DashboardSummaryVO implements Serializable { | |
| 108 | + | |
| 109 | + private static final long serialVersionUID = 1L; | |
| 110 | + | |
| 111 | + private boolean isSuccess = true; | |
| 112 | + private String msg = ""; | |
| 113 | + private String baseDate; | |
| 114 | + | |
| 115 | + private Sales sales = new Sales(); | |
| 116 | + private Members members = new Members(); | |
| 117 | + private Sms sms = new Sms(); | |
| 118 | + | |
| 119 | + /** 매출(VAT 포함, 단위: 원) */ | |
| 120 | + @Getter | |
| 121 | + @Setter | |
| 122 | + public static class Sales implements Serializable { | |
| 123 | + private static final long serialVersionUID = 1L; | |
| 124 | + private long todayAmt; | |
| 125 | + private List<AmtPoint> dayChart = new ArrayList<AmtPoint>(); | |
| 126 | + private List<AmtPoint> monthChart = new ArrayList<AmtPoint>(); | |
| 127 | + private long yearAmtSum; | |
| 128 | + } | |
| 129 | + | |
| 130 | + /** 금액 시계열 한 점 (label = "MM-DD" 또는 "N월") */ | |
| 131 | + @Getter | |
| 132 | + @Setter | |
| 133 | + public static class AmtPoint implements Serializable { | |
| 134 | + private static final long serialVersionUID = 1L; | |
| 135 | + private String label; | |
| 136 | + private long amt; | |
| 137 | + | |
| 138 | + public AmtPoint() { | |
| 139 | + } | |
| 140 | + | |
| 141 | + public AmtPoint(String label, long amt) { | |
| 142 | + this.label = label; | |
| 143 | + this.amt = amt; | |
| 144 | + } | |
| 145 | + } | |
| 146 | + | |
| 147 | + /** 회원 현황 */ | |
| 148 | + @Getter | |
| 149 | + @Setter | |
| 150 | + public static class Members implements Serializable { | |
| 151 | + private static final long serialVersionUID = 1L; | |
| 152 | + private int userNorCnt; | |
| 153 | + private int userComCnt; | |
| 154 | + private int mberNorTot; | |
| 155 | + private int mberBlockTot; | |
| 156 | + private int mberSecessTot; | |
| 157 | + private int cmpApply; | |
| 158 | + private int cmpApprove; | |
| 159 | + private int cmpReject; | |
| 160 | + private int todayExpireCnt; | |
| 161 | + private int todayStopCnt; | |
| 162 | + } | |
| 163 | + | |
| 164 | + /** 문자 발송 현황 */ | |
| 165 | + @Getter | |
| 166 | + @Setter | |
| 167 | + public static class Sms implements Serializable { | |
| 168 | + private static final long serialVersionUID = 1L; | |
| 169 | + private List<AgentStat> agents = new ArrayList<AgentStat>(); | |
| 170 | + private int todaySignupCnt; | |
| 171 | + } | |
| 172 | + | |
| 173 | + /** 전송사별 발송 통계 */ | |
| 174 | + @Getter | |
| 175 | + @Setter | |
| 176 | + public static class AgentStat implements Serializable { | |
| 177 | + private static final long serialVersionUID = 1L; | |
| 178 | + private String agentCode; | |
| 179 | + private int succCnt; | |
| 180 | + private int failCnt; | |
| 181 | + private int succRate; | |
| 182 | + } | |
| 183 | +} | |
| 184 | +``` | |
| 185 | + | |
| 186 | +> 주의: Jackson 2.5.1은 `boolean isSuccess` 게터를 `success`로 직렬화할 수 있다. 기존 코드와 동일하게 키를 `isSuccess`로 노출하려면 Task 4에서 확인한다(필요 시 `@com.fasterxml.jackson.annotation.JsonProperty("isSuccess")`를 게터에 부여). 본 DTO는 우선 lombok 기본 게터로 두고 Task 4 검증 단계에서 키를 확정한다. | |
| 187 | + | |
| 188 | +- [ ] **Step 2: 컴파일 확인** | |
| 189 | + | |
| 190 | +Run: `mvn -q -o compile` (오프라인 불가 시 `mvn -q compile`) | |
| 191 | +Expected: BUILD SUCCESS. `DashboardSummaryVO` 컴파일 에러 없음. | |
| 192 | + | |
| 193 | +- [ ] **Step 3: Commit** | |
| 194 | + | |
| 195 | +```bash | |
| 196 | +git add src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryVO.java | |
| 197 | +git commit -m "feat(dashboard-api): 요약 응답 DTO 추가" | |
| 198 | +``` | |
| 199 | + | |
| 200 | +--- | |
| 201 | + | |
| 202 | +### Task 3: 집계 서비스 (Service + Impl) | |
| 203 | + | |
| 204 | +**Files:** | |
| 205 | +- Create: `src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryService.java` | |
| 206 | +- Create: `src/main/java/itn/let/mjo/dashboardapi/service/impl/DashboardSummaryServiceImpl.java` | |
| 207 | + | |
| 208 | +**Interfaces:** | |
| 209 | +- Consumes: | |
| 210 | + - `DashboardSummaryVO` (Task 2) | |
| 211 | + - 기존 빈: `mjonPayService`(`itn.let.mjo.pay.service.MjonPayService`), `conectStatsService`(`itn.let.sts.cst.service.EgovConectStatsService`), `mjonMsgService`(`itn.let.mjo.msg.service.MjonMsgService`) | |
| 212 | +- Produces: `DashboardSummaryService.getDashboardSummary(String baseDate) -> DashboardSummaryVO` | |
| 213 | + | |
| 214 | +- [ ] **Step 1: 서비스 인터페이스 작성** | |
| 215 | + | |
| 216 | +`src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryService.java`: | |
| 217 | + | |
| 218 | +```java | |
| 219 | +package itn.let.mjo.dashboardapi.service; | |
| 220 | + | |
| 221 | +/** | |
| 222 | + * 대시보드 요약 API 집계 서비스. | |
| 223 | + * 기존 대시보드 서비스 메서드를 조합해 raw 숫자 요약을 만든다(신규 SQL 없음). | |
| 224 | + */ | |
| 225 | +public interface DashboardSummaryService { | |
| 226 | + | |
| 227 | + /** | |
| 228 | + * @param baseDate "yyyy-MM-dd" 또는 null(오늘) | |
| 229 | + * @return 매출/회원/문자 요약 | |
| 230 | + */ | |
| 231 | + DashboardSummaryVO getDashboardSummary(String baseDate) throws Exception; | |
| 232 | +} | |
| 233 | +``` | |
| 234 | + | |
| 235 | +- [ ] **Step 2: 구현체 작성** | |
| 236 | + | |
| 237 | +`src/main/java/itn/let/mjo/dashboardapi/service/impl/DashboardSummaryServiceImpl.java`: | |
| 238 | + | |
| 239 | +```java | |
| 240 | +package itn.let.mjo.dashboardapi.service.impl; | |
| 241 | + | |
| 242 | +import java.text.SimpleDateFormat; | |
| 243 | +import java.util.Date; | |
| 244 | +import java.util.List; | |
| 245 | + | |
| 246 | +import javax.annotation.Resource; | |
| 247 | + | |
| 248 | +import org.springframework.stereotype.Service; | |
| 249 | + | |
| 250 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryService; | |
| 251 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryVO; | |
| 252 | +import itn.let.mjo.msg.service.MjonMsgService; | |
| 253 | +import itn.let.mjo.msg.service.MjonMsgStatVO; | |
| 254 | +import itn.let.mjo.msg.service.MjonMsgVO; | |
| 255 | +import itn.let.mjo.pay.service.MjonPayService; | |
| 256 | +import itn.let.mjo.pay.service.MjonPayVO; | |
| 257 | +import itn.let.sts.cst.service.EgovConectStatsService; | |
| 258 | +import itn.let.uss.umt.service.MberManageVO; | |
| 259 | + | |
| 260 | +@Service("dashboardSummaryService") | |
| 261 | +public class DashboardSummaryServiceImpl implements DashboardSummaryService { | |
| 262 | + | |
| 263 | + @Resource(name = "mjonPayService") | |
| 264 | + private MjonPayService mjonPayService; | |
| 265 | + | |
| 266 | + @Resource(name = "conectStatsService") | |
| 267 | + private EgovConectStatsService conectStatsService; | |
| 268 | + | |
| 269 | + @Resource(name = "mjonMsgService") | |
| 270 | + private MjonMsgService mjonMsgService; | |
| 271 | + | |
| 272 | + @Override | |
| 273 | + public DashboardSummaryVO getDashboardSummary(String baseDate) throws Exception { | |
| 274 | + DashboardSummaryVO vo = new DashboardSummaryVO(); | |
| 275 | + | |
| 276 | + if (baseDate == null || baseDate.trim().isEmpty()) { | |
| 277 | + baseDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); | |
| 278 | + } | |
| 279 | + vo.setBaseDate(baseDate); | |
| 280 | + | |
| 281 | + // 지표 블록별 try/catch: 개별 실패가 전체 응답을 막지 않도록 한다. | |
| 282 | + try { | |
| 283 | + fillSales(vo.getSales()); | |
| 284 | + } catch (Exception e) { | |
| 285 | + vo.setSuccess(false); | |
| 286 | + vo.setMsg(appendMsg(vo.getMsg(), "sales:" + e.getMessage())); | |
| 287 | + } | |
| 288 | + try { | |
| 289 | + fillMembers(vo.getMembers()); | |
| 290 | + } catch (Exception e) { | |
| 291 | + vo.setSuccess(false); | |
| 292 | + vo.setMsg(appendMsg(vo.getMsg(), "members:" + e.getMessage())); | |
| 293 | + } | |
| 294 | + try { | |
| 295 | + fillSms(vo.getSms()); | |
| 296 | + } catch (Exception e) { | |
| 297 | + vo.setSuccess(false); | |
| 298 | + vo.setMsg(appendMsg(vo.getMsg(), "sms:" + e.getMessage())); | |
| 299 | + } | |
| 300 | + return vo; | |
| 301 | + } | |
| 302 | + | |
| 303 | + /** 매출(일/월/연) — selectPayDayChartDashboard, selectPayMonthChartDashboard, selectPayYearChart 재사용 */ | |
| 304 | + private void fillSales(DashboardSummaryVO.Sales sales) throws Exception { | |
| 305 | + // 일별(최근 4일, 최신순) | |
| 306 | + MjonPayVO dayReq = new MjonPayVO(); | |
| 307 | + dayReq.setFirstIndex(0); | |
| 308 | + dayReq.setRecordCountPerPage(4); | |
| 309 | + dayReq.setSearchSortCnd("regDate"); | |
| 310 | + dayReq.setSearchSortOrd("desc"); | |
| 311 | + List<MjonPayVO> dayList = mjonPayService.selectPayDayChartDashboard(dayReq); | |
| 312 | + if (dayList != null) { | |
| 313 | + for (MjonPayVO p : dayList) { | |
| 314 | + String label = p.getRegDate(); | |
| 315 | + if (label != null && label.length() >= 10) { | |
| 316 | + label = label.substring(5, 10); // MM-DD | |
| 317 | + } | |
| 318 | + sales.getDayChart().add(new DashboardSummaryVO.AmtPoint(label, toLong(p.getAmtTotSum()))); | |
| 319 | + } | |
| 320 | + if (!dayList.isEmpty()) { | |
| 321 | + sales.setTodayAmt(toLong(dayList.get(0).getAmtTotSum())); // 최신순 첫 행 = 당일 | |
| 322 | + } | |
| 323 | + } | |
| 324 | + | |
| 325 | + // 월별(최근 4개월, 최신순) | |
| 326 | + MjonPayVO monthReq = new MjonPayVO(); | |
| 327 | + monthReq.setFirstIndex(0); | |
| 328 | + monthReq.setRecordCountPerPage(4); | |
| 329 | + monthReq.setSearchSortCnd("regDate"); | |
| 330 | + monthReq.setSearchSortOrd("desc"); | |
| 331 | + List<MjonPayVO> monthList = mjonPayService.selectPayMonthChartDashboard(monthReq); | |
| 332 | + if (monthList != null) { | |
| 333 | + for (MjonPayVO p : monthList) { | |
| 334 | + String label = p.getRegDate(); | |
| 335 | + if (label != null && label.length() >= 7) { | |
| 336 | + label = Integer.parseInt(label.substring(5, 7)) + "월"; | |
| 337 | + } | |
| 338 | + sales.getMonthChart().add(new DashboardSummaryVO.AmtPoint(label, toLong(p.getAmtTotSum()))); | |
| 339 | + } | |
| 340 | + } | |
| 341 | + | |
| 342 | + // 연간 누적 | |
| 343 | + MjonPayVO yearInfo = mjonPayService.selectPayYearChart(new MjonPayVO()); | |
| 344 | + if (yearInfo != null) { | |
| 345 | + sales.setYearAmtSum(toLong(yearInfo.getAmtYearSum())); | |
| 346 | + } | |
| 347 | + } | |
| 348 | + | |
| 349 | + /** 회원 현황 — EgovMainController.selectMemberStatsAjax 로직 재현 */ | |
| 350 | + private void fillMembers(DashboardSummaryVO.Members m) throws Exception { | |
| 351 | + MberManageVO req = new MberManageVO(); | |
| 352 | + | |
| 353 | + req.setHstSttus("01"); | |
| 354 | + List<MberManageVO> apply = conectStatsService.selectMberCmpHstStatsDashboard(req); | |
| 355 | + req.setHstSttus("02"); | |
| 356 | + List<MberManageVO> approve = conectStatsService.selectMberCmpHstStatsDashboard(req); | |
| 357 | + req.setHstSttus("03"); | |
| 358 | + List<MberManageVO> reject = conectStatsService.selectMberCmpHstStatsDashboard(req); | |
| 359 | + m.setCmpApply((apply == null || apply.isEmpty()) ? 0 : apply.get(0).getTotCnt()); | |
| 360 | + m.setCmpApprove((approve == null || approve.isEmpty()) ? 0 : approve.get(0).getTotCnt()); | |
| 361 | + m.setCmpReject((reject == null || reject.isEmpty()) ? 0 : reject.get(0).getTotCnt()); | |
| 362 | + | |
| 363 | + MberManageVO totReq = new MberManageVO(); | |
| 364 | + totReq.setDept("P"); | |
| 365 | + List<MberManageVO> priv = conectStatsService.selectMberTotStats(totReq); | |
| 366 | + totReq.setDept("C"); | |
| 367 | + List<MberManageVO> comp = conectStatsService.selectMberTotStats(totReq); | |
| 368 | + | |
| 369 | + if (priv != null) { | |
| 370 | + for (MberManageVO v : priv) { | |
| 371 | + accumulateMember(m, v, true); | |
| 372 | + } | |
| 373 | + } | |
| 374 | + if (comp != null) { | |
| 375 | + for (MberManageVO v : comp) { | |
| 376 | + accumulateMember(m, v, false); | |
| 377 | + } | |
| 378 | + } | |
| 379 | + | |
| 380 | + String statStr = conectStatsService.selectTodaySttCountString(totReq); | |
| 381 | + if (statStr != null) { | |
| 382 | + String[] split = statStr.split("_"); | |
| 383 | + if (split.length == 3) { | |
| 384 | + m.setTodayExpireCnt(toInt(split[0])); | |
| 385 | + m.setTodayStopCnt(toInt(split[1])); | |
| 386 | + // split[2]=환불신청수는 1차 범위 제외 | |
| 387 | + } | |
| 388 | + } | |
| 389 | + } | |
| 390 | + | |
| 391 | + private void accumulateMember(DashboardSummaryVO.Members m, MberManageVO v, boolean isPrivate) { | |
| 392 | + String sttus = v.getMberSttus(); | |
| 393 | + int cnt = v.getTotCnt(); | |
| 394 | + if ("Y".equals(sttus)) { | |
| 395 | + if (isPrivate) { | |
| 396 | + m.setUserNorCnt(cnt); | |
| 397 | + } else { | |
| 398 | + m.setUserComCnt(cnt); | |
| 399 | + } | |
| 400 | + m.setMberNorTot(m.getMberNorTot() + cnt); | |
| 401 | + } else if ("B".equals(sttus)) { | |
| 402 | + m.setMberBlockTot(m.getMberBlockTot() + cnt); | |
| 403 | + } else if ("N".equals(sttus)) { | |
| 404 | + m.setMberSecessTot(m.getMberSecessTot() + cnt); | |
| 405 | + } | |
| 406 | + } | |
| 407 | + | |
| 408 | + /** 문자 발송 현황 — selectAgentSmsCountStatMainList, selectMemDayChartDashboard 재사용 */ | |
| 409 | + private void fillSms(DashboardSummaryVO.Sms s) throws Exception { | |
| 410 | + MjonMsgStatVO statReq = new MjonMsgStatVO(); | |
| 411 | + statReq.setFirstIndex(0); | |
| 412 | + statReq.setRecordCountPerPage(3); | |
| 413 | + List<MjonMsgStatVO> agents = mjonMsgService.selectAgentSmsCountStatMainList(statReq); | |
| 414 | + if (agents != null) { | |
| 415 | + for (MjonMsgStatVO a : agents) { | |
| 416 | + DashboardSummaryVO.AgentStat stat = new DashboardSummaryVO.AgentStat(); | |
| 417 | + stat.setAgentCode(a.getAgentCode()); | |
| 418 | + int succ = a.getSumSuccCnt(); | |
| 419 | + int fail = a.getSumFailCnt(); | |
| 420 | + stat.setSuccCnt(succ); | |
| 421 | + stat.setFailCnt(fail); | |
| 422 | + int total = succ + fail; | |
| 423 | + stat.setSuccRate(total == 0 ? 0 : (int) Math.round(succ * 100.0 / total)); | |
| 424 | + s.getAgents().add(stat); | |
| 425 | + } | |
| 426 | + } | |
| 427 | + | |
| 428 | + MjonMsgVO memReq = new MjonMsgVO(); | |
| 429 | + memReq.setFirstIndex(0); | |
| 430 | + memReq.setRecordCountPerPage(4); | |
| 431 | + memReq.setSearchSortCnd("regDate"); | |
| 432 | + memReq.setSearchSortOrd("desc"); | |
| 433 | + List<MjonMsgVO> memDay = mjonMsgService.selectMemDayChartDashboard(memReq); | |
| 434 | + if (memDay != null && !memDay.isEmpty()) { | |
| 435 | + s.setTodaySignupCnt(memDay.get(0).getRegCount()); | |
| 436 | + } | |
| 437 | + } | |
| 438 | + | |
| 439 | + /** "12345", "12,345", "12345.0", null → long(0) 안전 변환 */ | |
| 440 | + private long toLong(String s) { | |
| 441 | + if (s == null) { | |
| 442 | + return 0L; | |
| 443 | + } | |
| 444 | + String digits = s.replaceAll("[^0-9-]", ""); | |
| 445 | + if (digits.isEmpty() || "-".equals(digits)) { | |
| 446 | + return 0L; | |
| 447 | + } | |
| 448 | + try { | |
| 449 | + return Long.parseLong(digits); | |
| 450 | + } catch (NumberFormatException e) { | |
| 451 | + return 0L; | |
| 452 | + } | |
| 453 | + } | |
| 454 | + | |
| 455 | + private int toInt(String s) { | |
| 456 | + return (int) toLong(s); | |
| 457 | + } | |
| 458 | + | |
| 459 | + private String appendMsg(String base, String add) { | |
| 460 | + if (base == null || base.isEmpty()) { | |
| 461 | + return add; | |
| 462 | + } | |
| 463 | + return base + "; " + add; | |
| 464 | + } | |
| 465 | +} | |
| 466 | +``` | |
| 467 | + | |
| 468 | +> 검증 포인트(구현 중 확인): `MberManageVO.getTotCnt()`, `MjonMsgStatVO.getSumFailCnt()`, `MjonMsgVO.getRegCount()`가 존재해야 한다(기존 `EgovMainController`/VO에서 사용 중). 시그니처가 다르면 해당 게터명으로 맞춘다. `vo.setSuccess(false)`는 lombok이 `boolean isSuccess` 필드에 대해 생성하는 setter다(필드명 기준 `setSuccess`). | |
| 469 | + | |
| 470 | +- [ ] **Step 3: 컴파일 확인** | |
| 471 | + | |
| 472 | +Run: `mvn -q compile` | |
| 473 | +Expected: BUILD SUCCESS. 메서드/게터 미스매치 없음(에러 시 위 검증 포인트의 실제 게터명으로 수정). | |
| 474 | + | |
| 475 | +- [ ] **Step 4: Commit** | |
| 476 | + | |
| 477 | +```bash | |
| 478 | +git add src/main/java/itn/let/mjo/dashboardapi/service/ | |
| 479 | +git commit -m "feat(dashboard-api): 매출/회원/문자 요약 집계 서비스 추가" | |
| 480 | +``` | |
| 481 | + | |
| 482 | +--- | |
| 483 | + | |
| 484 | +### Task 4: REST 컨트롤러 | |
| 485 | + | |
| 486 | +**Files:** | |
| 487 | +- Create: `src/main/java/itn/let/mjo/dashboardapi/web/DashboardApiController.java` | |
| 488 | + | |
| 489 | +**Interfaces:** | |
| 490 | +- Consumes: `DashboardSummaryService.getDashboardSummary(String)` (Task 3), `DashboardSummaryVO` (Task 2) | |
| 491 | +- Produces: HTTP `GET /api/dashboard/summary.do` → JSON 직렬화된 `DashboardSummaryVO` | |
| 492 | + | |
| 493 | +- [ ] **Step 1: 컨트롤러 작성** | |
| 494 | + | |
| 495 | +`src/main/java/itn/let/mjo/dashboardapi/web/DashboardApiController.java`: | |
| 496 | + | |
| 497 | +```java | |
| 498 | +package itn.let.mjo.dashboardapi.web; | |
| 499 | + | |
| 500 | +import javax.annotation.Resource; | |
| 501 | + | |
| 502 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 503 | +import org.springframework.web.bind.annotation.RequestMethod; | |
| 504 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 505 | +import org.springframework.web.bind.annotation.RestController; | |
| 506 | + | |
| 507 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryService; | |
| 508 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryVO; | |
| 509 | + | |
| 510 | +/** | |
| 511 | + * 대시보드 요약 JSON API(n8n→Slack 전용). | |
| 512 | + * 인증은 DashboardApiAuthInterceptor(토큰 헤더)가 담당한다. | |
| 513 | + * 메서드명은 select* 가 아니어서 관리자 로그 AOP 대상에서 제외된다. | |
| 514 | + */ | |
| 515 | +@RestController | |
| 516 | +public class DashboardApiController { | |
| 517 | + | |
| 518 | + @Resource(name = "dashboardSummaryService") | |
| 519 | + private DashboardSummaryService dashboardSummaryService; | |
| 520 | + | |
| 521 | + @RequestMapping(value = "/api/dashboard/summary.do", method = RequestMethod.GET) | |
| 522 | + public DashboardSummaryVO getDashboardSummary( | |
| 523 | + @RequestParam(value = "date", required = false) String date) throws Exception { | |
| 524 | + return dashboardSummaryService.getDashboardSummary(date); | |
| 525 | + } | |
| 526 | +} | |
| 527 | +``` | |
| 528 | + | |
| 529 | +- [ ] **Step 2: 빌드(WAR) 확인** | |
| 530 | + | |
| 531 | +Run: `mvn -q clean package` | |
| 532 | +Expected: BUILD SUCCESS, `target/mjon.war` 생성. | |
| 533 | + | |
| 534 | +- [ ] **Step 3: 로컬 기동 후 JSON 키 확인(인증 인터셉터 적용 전, 임시)** | |
| 535 | + | |
| 536 | +> 이 시점엔 아직 인증이 없으므로 토큰 없이 호출된다. JSON 직렬화 키만 확인한다. | |
| 537 | + | |
| 538 | +Run(터미널 A): `mvn tomcat7:run` | |
| 539 | +Run(터미널 B): `curl -s "http://localhost/api/dashboard/summary.do?date=2026-06-23"` | |
| 540 | +Expected: `sales`/`members`/`sms` 블록이 있는 JSON. 성공 플래그 키가 `isSuccess`인지 `success`인지 확인. | |
| 541 | +- 키가 `success`로 나오면 `DashboardSummaryVO`의 게터에 `@com.fasterxml.jackson.annotation.JsonProperty("isSuccess")`를 추가: | |
| 542 | + ```java | |
| 543 | + @com.fasterxml.jackson.annotation.JsonProperty("isSuccess") | |
| 544 | + public boolean isSuccess() { return isSuccess; } | |
| 545 | + ``` | |
| 546 | + (lombok 게터와 충돌 시 lombok `@Getter`를 필드에서 제거하고 위 명시 게터만 둔다.) | |
| 547 | +- 확인 후 터미널 A 종료(Ctrl+C). | |
| 548 | + | |
| 549 | +- [ ] **Step 4: Commit** | |
| 550 | + | |
| 551 | +```bash | |
| 552 | +git add src/main/java/itn/let/mjo/dashboardapi/web/DashboardApiController.java src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryVO.java | |
| 553 | +git commit -m "feat(dashboard-api): /api/dashboard/summary.do RestController 추가" | |
| 554 | +``` | |
| 555 | + | |
| 556 | +--- | |
| 557 | + | |
| 558 | +### Task 5: 토큰 인증 인터셉터 + 매핑 + 시큐리티 예외 | |
| 559 | + | |
| 560 | +**Files:** | |
| 561 | +- Create: `src/main/java/itn/com/cmm/interceptor/DashboardApiAuthInterceptor.java` | |
| 562 | +- Modify: `src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml` | |
| 563 | +- Modify: `src/main/resources/egovframework/spring/com/context-security.xml:14` (security="none" 블록 인근에 추가) | |
| 564 | + | |
| 565 | +**Interfaces:** | |
| 566 | +- Consumes: 프로퍼티 `Globals.dashboard.api.token` via `globalSettings`(Task 1) | |
| 567 | +- Produces: `/api/dashboard/**` 요청에 대한 토큰 검증(불일치/누락 시 401 JSON, 컨트롤러 진입 차단) | |
| 568 | + | |
| 569 | +- [ ] **Step 1: 인터셉터 작성** | |
| 570 | + | |
| 571 | +`src/main/java/itn/com/cmm/interceptor/DashboardApiAuthInterceptor.java`: | |
| 572 | + | |
| 573 | +```java | |
| 574 | +package itn.com.cmm.interceptor; | |
| 575 | + | |
| 576 | +import javax.servlet.http.HttpServletRequest; | |
| 577 | +import javax.servlet.http.HttpServletResponse; | |
| 578 | + | |
| 579 | +import org.springframework.beans.factory.annotation.Value; | |
| 580 | +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |
| 581 | + | |
| 582 | +/** | |
| 583 | + * 대시보드 요약 API 토큰 인증. | |
| 584 | + * X-DASHBOARD-TOKEN 헤더가 설정 토큰과 일치할 때만 통과시킨다. | |
| 585 | + */ | |
| 586 | +public class DashboardApiAuthInterceptor extends HandlerInterceptorAdapter { | |
| 587 | + | |
| 588 | + private static final String HEADER = "X-DASHBOARD-TOKEN"; | |
| 589 | + | |
| 590 | + @Value("#{globalSettings['Globals.dashboard.api.token']}") | |
| 591 | + private String apiToken; | |
| 592 | + | |
| 593 | + @Override | |
| 594 | + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | |
| 595 | + throws Exception { | |
| 596 | + | |
| 597 | + String token = request.getHeader(HEADER); | |
| 598 | + | |
| 599 | + boolean ok = apiToken != null && !apiToken.trim().isEmpty() | |
| 600 | + && apiToken.equals(token); | |
| 601 | + | |
| 602 | + if (!ok) { | |
| 603 | + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 | |
| 604 | + response.setContentType("application/json;charset=UTF-8"); | |
| 605 | + response.getWriter().write("{\"isSuccess\":false,\"msg\":\"unauthorized\"}"); | |
| 606 | + return false; // 컨트롤러 진입 차단 (토큰 값은 로그/응답에 출력하지 않음) | |
| 607 | + } | |
| 608 | + return true; | |
| 609 | + } | |
| 610 | +} | |
| 611 | +``` | |
| 612 | + | |
| 613 | +- [ ] **Step 2: 인터셉터 매핑 등록** | |
| 614 | + | |
| 615 | +`egov-interceptor-servlet.xml`의 `<interceptors>` 블록 안(첫 `<interceptor>` 위, line 10 직후)에 추가: | |
| 616 | + | |
| 617 | +```xml | |
| 618 | + <!-- 대시보드 요약 API 토큰 인증 --> | |
| 619 | + <interceptor> | |
| 620 | + <mapping path="/api/dashboard/**"/> | |
| 621 | + <beans:bean class="itn.com.cmm.interceptor.DashboardApiAuthInterceptor"/> | |
| 622 | + </interceptor> | |
| 623 | +``` | |
| 624 | + | |
| 625 | +> 기존 `IPIgnoreInterceptorHandler`는 `/**` 매핑에 `/cmm/**`, `/js/**`, `/publish/**`만 제외한다. `/api/dashboard/**`도 그 인터셉터를 거치지만, 해당 핸들러는 특정 URI(`errorLogInsert`, `*Ajax.do` 등)에만 동작하므로 본 API 흐름에는 영향 없음(통과). 빌드 후 Step 6에서 실제 통과를 확인한다. | |
| 626 | + | |
| 627 | +- [ ] **Step 3: 시큐리티 예외 추가** | |
| 628 | + | |
| 629 | +`context-security.xml`의 `security="none"` 목록(line 9~14 인근)에 한 줄 추가: | |
| 630 | + | |
| 631 | +```xml | |
| 632 | + <security:http pattern="/api/dashboard/**" security="none"/> | |
| 633 | +``` | |
| 634 | + | |
| 635 | +> 이 엔드포인트는 토큰으로 자체 보호하므로 Spring Security 필터 체인/세션이 필요 없다. DB 기반 URL 권한(`secured-object`)에 걸리는 것을 방지한다. | |
| 636 | + | |
| 637 | +- [ ] **Step 4: 빌드 확인** | |
| 638 | + | |
| 639 | +Run: `mvn -q clean package` | |
| 640 | +Expected: BUILD SUCCESS, `target/mjon.war` 생성. | |
| 641 | + | |
| 642 | +- [ ] **Step 5: 토큰 없는 호출 → 401 확인** | |
| 643 | + | |
| 644 | +Run(터미널 A): `mvn tomcat7:run` | |
| 645 | +Run(터미널 B): `curl -s -o /dev/null -w "%{http_code}\n" "http://localhost/api/dashboard/summary.do"` | |
| 646 | +Expected: `401` | |
| 647 | + | |
| 648 | +- [ ] **Step 6: 올바른 토큰 → 200 + JSON 확인** | |
| 649 | + | |
| 650 | +> 토큰 값은 활성 프로파일의 `globals_<profile>.properties`에 설정된 값. 로컬 기동은 보통 `local` 프로파일. | |
| 651 | + | |
| 652 | +Run(터미널 B): | |
| 653 | +```bash | |
| 654 | +curl -s -H "X-DASHBOARD-TOKEN: CHANGE_ME_TOKEN" "http://localhost/api/dashboard/summary.do" | head -c 600 | |
| 655 | +``` | |
| 656 | +Expected: HTTP 200, `sales`/`members`/`sms` 블록이 채워진 JSON. (틀린 토큰으로는 401) | |
| 657 | +- 확인 후 터미널 A 종료. | |
| 658 | + | |
| 659 | +- [ ] **Step 7: Commit** | |
| 660 | + | |
| 661 | +```bash | |
| 662 | +git add src/main/java/itn/com/cmm/interceptor/DashboardApiAuthInterceptor.java \ | |
| 663 | + src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml \ | |
| 664 | + src/main/resources/egovframework/spring/com/context-security.xml | |
| 665 | +git commit -m "feat(dashboard-api): 토큰 인증 인터셉터 및 시큐리티 예외 추가" | |
| 666 | +``` | |
| 667 | + | |
| 668 | +--- | |
| 669 | + | |
| 670 | +### Task 6: n8n 워크플로우 + Slack 산출물 | |
| 671 | + | |
| 672 | +**Files:** | |
| 673 | +- Create: `docs/superpowers/n8n/n8n-workflow.json` | |
| 674 | +- Create: `docs/superpowers/n8n/code-node.js` | |
| 675 | +- Create: `docs/superpowers/n8n/README.md` | |
| 676 | + | |
| 677 | +**Interfaces:** | |
| 678 | +- Consumes: `GET /api/dashboard/summary.do` 응답 JSON(Task 2~5) | |
| 679 | +- Produces: import 가능한 n8n 워크플로우 + Slack Block Kit 변환 스니펫 | |
| 680 | + | |
| 681 | +- [ ] **Step 1: Code 노드 변환 스니펫 작성** | |
| 682 | + | |
| 683 | +`docs/superpowers/n8n/code-node.js`: | |
| 684 | + | |
| 685 | +```javascript | |
| 686 | +// n8n Code 노드: 도메인 JSON → Slack Block Kit | |
| 687 | +// 입력: 이전 HTTP Request 노드의 JSON 응답 | |
| 688 | +const d = $input.first().json; | |
| 689 | +const won = (n) => (n == null ? '0' : Number(n).toLocaleString('ko-KR')) + '원'; | |
| 690 | + | |
| 691 | +const sales = d.sales || {}; | |
| 692 | +const m = d.members || {}; | |
| 693 | +const sms = d.sms || {}; | |
| 694 | + | |
| 695 | +const agentLines = (sms.agents || []) | |
| 696 | + .map(a => `• ${a.agentCode}: 성공 ${Number(a.succCnt).toLocaleString('ko-KR')} / 실패 ${Number(a.failCnt).toLocaleString('ko-KR')} (성공률 ${a.succRate}%)`) | |
| 697 | + .join('\n') || '데이터 없음'; | |
| 698 | + | |
| 699 | +const dayLines = (sales.dayChart || []) | |
| 700 | + .map(p => `${p.label} ${won(p.amt)}`) | |
| 701 | + .join(' | ') || '데이터 없음'; | |
| 702 | + | |
| 703 | +const blocks = [ | |
| 704 | + { type: 'header', text: { type: 'plain_text', text: ` 문자ON 일일 리포트 — ${d.baseDate}`, emoji: true } }, | |
| 705 | + { type: 'section', fields: [ | |
| 706 | + { type: 'mrkdwn', text: `*당일 매출*\n${won(sales.todayAmt)}` }, | |
| 707 | + { type: 'mrkdwn', text: `*연간 누적*\n${won(sales.yearAmtSum)}` }, | |
| 708 | + ] }, | |
| 709 | + { type: 'section', text: { type: 'mrkdwn', text: `*최근 매출(일별)*\n${dayLines}` } }, | |
| 710 | + { type: 'divider' }, | |
| 711 | + { type: 'section', fields: [ | |
| 712 | + { type: 'mrkdwn', text: `*개인/기업 회원*\n${m.userNorCnt} / ${m.userComCnt}` }, | |
| 713 | + { type: 'mrkdwn', text: `*기업 신청/승인/반려*\n${m.cmpApply} / ${m.cmpApprove} / ${m.cmpReject}` }, | |
| 714 | + { type: 'mrkdwn', text: `*금일 탈퇴/정지*\n${m.todayExpireCnt} / ${m.todayStopCnt}` }, | |
| 715 | + { type: 'mrkdwn', text: `*일 가입자수*\n${sms.todaySignupCnt}` }, | |
| 716 | + ] }, | |
| 717 | + { type: 'divider' }, | |
| 718 | + { type: 'section', text: { type: 'mrkdwn', text: `*전송사별 발송*\n${agentLines}` } }, | |
| 719 | +]; | |
| 720 | + | |
| 721 | +return [{ json: { blocks } }]; | |
| 722 | +``` | |
| 723 | + | |
| 724 | +- [ ] **Step 2: 워크플로우 JSON 작성** | |
| 725 | + | |
| 726 | +`docs/superpowers/n8n/n8n-workflow.json`: | |
| 727 | + | |
| 728 | +```json | |
| 729 | +{ | |
| 730 | + "name": "mjon-dashboard-daily-slack", | |
| 731 | + "nodes": [ | |
| 732 | + { | |
| 733 | + "parameters": { | |
| 734 | + "rule": { "interval": [ { "field": "cronExpression", "expression": "0 9 * * *" } ] } | |
| 735 | + }, | |
| 736 | + "id": "schedule", | |
| 737 | + "name": "Schedule Trigger", | |
| 738 | + "type": "n8n-nodes-base.scheduleTrigger", | |
| 739 | + "typeVersion": 1, | |
| 740 | + "position": [ 240, 300 ] | |
| 741 | + }, | |
| 742 | + { | |
| 743 | + "parameters": { | |
| 744 | + "url": "https://CHANGE_ME_HOST/api/dashboard/summary.do", | |
| 745 | + "options": {}, | |
| 746 | + "sendHeaders": true, | |
| 747 | + "headerParameters": { | |
| 748 | + "parameters": [ | |
| 749 | + { "name": "X-DASHBOARD-TOKEN", "value": "={{ $env.MJON_DASH_TOKEN }}" } | |
| 750 | + ] | |
| 751 | + } | |
| 752 | + }, | |
| 753 | + "id": "http", | |
| 754 | + "name": "HTTP Request", | |
| 755 | + "type": "n8n-nodes-base.httpRequest", | |
| 756 | + "typeVersion": 4, | |
| 757 | + "position": [ 460, 300 ] | |
| 758 | + }, | |
| 759 | + { | |
| 760 | + "parameters": { | |
| 761 | + "language": "javaScript", | |
| 762 | + "jsCode": "// docs/superpowers/n8n/code-node.js 내용을 여기에 붙여넣는다" | |
| 763 | + }, | |
| 764 | + "id": "code", | |
| 765 | + "name": "Format Slack Blocks", | |
| 766 | + "type": "n8n-nodes-base.code", | |
| 767 | + "typeVersion": 2, | |
| 768 | + "position": [ 680, 300 ] | |
| 769 | + }, | |
| 770 | + { | |
| 771 | + "parameters": { | |
| 772 | + "resource": "message", | |
| 773 | + "operation": "post", | |
| 774 | + "channelId": "CHANGE_ME_CHANNEL", | |
| 775 | + "blocksUi": "={{ $json.blocks }}", | |
| 776 | + "text": "문자ON 일일 리포트" | |
| 777 | + }, | |
| 778 | + "id": "slack", | |
| 779 | + "name": "Slack", | |
| 780 | + "type": "n8n-nodes-base.slack", | |
| 781 | + "typeVersion": 2, | |
| 782 | + "position": [ 900, 300 ] | |
| 783 | + } | |
| 784 | + ], | |
| 785 | + "connections": { | |
| 786 | + "Schedule Trigger": { "main": [ [ { "node": "HTTP Request", "type": "main", "index": 0 } ] ] }, | |
| 787 | + "HTTP Request": { "main": [ [ { "node": "Format Slack Blocks", "type": "main", "index": 0 } ] ] }, | |
| 788 | + "Format Slack Blocks": { "main": [ [ { "node": "Slack", "type": "main", "index": 0 } ] ] } | |
| 789 | + }, | |
| 790 | + "settings": {} | |
| 791 | +} | |
| 792 | +``` | |
| 793 | + | |
| 794 | +- [ ] **Step 3: README 작성** | |
| 795 | + | |
| 796 | +`docs/superpowers/n8n/README.md`: | |
| 797 | + | |
| 798 | +```markdown | |
| 799 | +# 대시보드 일일 리포트 → Slack (n8n) | |
| 800 | + | |
| 801 | +## 구성 | |
| 802 | +- `n8n-workflow.json` : import용 워크플로우 (Schedule → HTTP Request → Code → Slack) | |
| 803 | +- `code-node.js` : Code 노드에 붙여넣을 변환 스니펫 | |
| 804 | + | |
| 805 | +## 설정 순서 | |
| 806 | +1. n8n에서 Settings → Variables/Environment에 `MJON_DASH_TOKEN` 추가 | |
| 807 | + (값 = 앱 `globals_<profile>.properties`의 `Globals.dashboard.api.token`). | |
| 808 | +2. `n8n-workflow.json` import. | |
| 809 | +3. HTTP Request 노드의 `CHANGE_ME_HOST`를 관리자 호스트로 교체. | |
| 810 | +4. Code 노드(`Format Slack Blocks`)에 `code-node.js` 내용 붙여넣기. | |
| 811 | +5. Slack 노드: 자격증명 연결 후 `CHANGE_ME_CHANNEL`을 대상 채널로 교체. | |
| 812 | +6. 스케줄: 기본 매일 09:00(`0 9 * * *`). 필요 시 cron 수정. | |
| 813 | + | |
| 814 | +## 수동 검증 | |
| 815 | +- 워크플로우 상단 **Execute Workflow** 실행 → 대상 Slack 채널에 리포트 수신 확인. | |
| 816 | +- 토큰 불일치 시 HTTP Request 노드가 401로 실패하는지 확인. | |
| 817 | +``` | |
| 818 | + | |
| 819 | +- [ ] **Step 4: 산출물 확인** | |
| 820 | + | |
| 821 | +Run: `ls docs/superpowers/n8n/` | |
| 822 | +Expected: `README.md code-node.js n8n-workflow.json` | |
| 823 | + | |
| 824 | +- [ ] **Step 5: Commit** | |
| 825 | + | |
| 826 | +```bash | |
| 827 | +git add docs/superpowers/n8n/ | |
| 828 | +git commit -m "feat(dashboard-api): n8n 워크플로우 및 Slack 변환 산출물 추가" | |
| 829 | +``` | |
| 830 | + | |
| 831 | +--- | |
| 832 | + | |
| 833 | +## 검증(통합) 시나리오 | |
| 834 | + | |
| 835 | +모든 태스크 완료 후: | |
| 836 | + | |
| 837 | +1. `mvn clean package` → `target/mjon.war` 생성(BUILD SUCCESS). | |
| 838 | +2. `mvn tomcat7:run` 기동. | |
| 839 | +3. `curl -s -o /dev/null -w "%{http_code}" http://localhost/api/dashboard/summary.do` → `401`. | |
| 840 | +4. `curl -s -H "X-DASHBOARD-TOKEN: <토큰>" http://localhost/api/dashboard/summary.do` → `200` + 매출/회원/문자 JSON. | |
| 841 | +5. n8n: `MJON_DASH_TOKEN` 설정 → 워크플로우 import → **Execute Workflow** → Slack 채널 수신 확인. | |
| 842 | +6. 운영 배포: `globals_prod.properties`의 토큰을 실제 값으로 교체 후 WAR 배포. | |
| 843 | + | |
| 844 | +## 자체 검토 결과 | |
| 845 | + | |
| 846 | +- **스펙 커버리지**: 엔드포인트 계약(Task 2·4) / 인증(Task 1·5) / Java 컴포넌트(Task 2~5) / n8n·Slack(Task 6) / 에러처리·검증(서비스 블록별 try/catch, 통합 시나리오) — 스펙 8개 결정사항 모두 태스크에 매핑됨. | |
| 847 | +- **placeholder**: `CHANGE_ME_*`는 의도된 사용자 치환값(호스트/채널/토큰)이며 코드 placeholder 아님. | |
| 848 | +- **타입 일관성**: `getDashboardSummary(String)`, `DashboardSummaryVO`/`Sales`/`Members`/`Sms`/`AmtPoint`/`AgentStat`, 빈 이름(`dashboardSummaryService`, `mjonPayService`, `conectStatsService`, `mjonMsgService`)이 태스크 간 일치. `setSuccess`(lombok, `boolean isSuccess`) 사용 일관. | |
| 849 | +- **리스크**: 기존 VO 게터명(`getTotCnt`/`getSumFailCnt`/`getRegCount`/`getAmtTotSum`) 미스매치 가능성 → Task 3 Step 3 컴파일에서 검출·수정. Jackson의 `isSuccess`/`success` 키 차이 → Task 4 Step 3에서 확정. |
+++ docs/superpowers/specs/2026-06-23-dashboard-slack-n8n-design.md
... | ... | @@ -0,0 +1,122 @@ |
| 1 | +# 대시보드 → n8n → Slack 정기 리포트 연동 설계 | |
| 2 | + | |
| 3 | +작성일: 2026-06-23 | |
| 4 | + | |
| 5 | +## 1. 목적 / 범위 | |
| 6 | + | |
| 7 | +문자ON 관리자 대시보드(`/cmm/main/mainPage.do`)의 주요 운영 지표를 **매일(또는 매주) 정해진 시각에 Slack 채널로 요약 발송**한다. | |
| 8 | + | |
| 9 | +- 연동 방식: 앱에 **신규 JSON API 엔드포인트**를 추가하고, **n8n이 스케줄로 호출**하여 Slack으로 게시(pull 방식). | |
| 10 | +- 포함 지표(1차): **매출(일/월), 회원 현황, 문자 발송 현황**. | |
| 11 | +- 인증: **공유 토큰**(헤더) 단독. (회사 내부망 사용 전제로 IP 허용목록은 제외) | |
| 12 | +- 비범위(추후): 발신번호/환불 대기 지표, 실시간 이벤트 알림, IP 허용목록. | |
| 13 | + | |
| 14 | +## 2. 현황 (재사용 자산) | |
| 15 | + | |
| 16 | +`itn.let.main.web.EgovMainController`가 대시보드 데이터를 아래 서비스 메서드로 조회하고 있으며, **그대로 재사용**한다(신규 SQL 없음). | |
| 17 | + | |
| 18 | +- 매출: `MjonPayService.selectPayDayChartDashboard`, `selectPayMonthChartDashboard`, `selectPayYearChart` | |
| 19 | +- 회원: `EgovConectStatsService.selectMberTotStats`, `selectMberCmpHstStatsDashboard`, `selectTodaySttCountString` | |
| 20 | +- 문자: `MjonMsgService.selectAgentSmsCountStatMainList`, `selectMemDayChartDashboard` | |
| 21 | + | |
| 22 | +## 3. 엔드포인트 계약 (Contract) | |
| 23 | + | |
| 24 | +**요청** | |
| 25 | +``` | |
| 26 | +GET /api/dashboard/summary.do | |
| 27 | +Header: X-DASHBOARD-TOKEN: <공유 토큰> (필수) | |
| 28 | +Query : ?date=YYYY-MM-DD (선택, 미지정 시 오늘) | |
| 29 | +``` | |
| 30 | + | |
| 31 | +**응답** — 앱은 Slack 포맷이 아닌 **순수 도메인 JSON**만 반환(Slack 표현은 n8n 담당, 앱-Slack 결합도 제거). | |
| 32 | +```jsonc | |
| 33 | +{ | |
| 34 | + "isSuccess": true, | |
| 35 | + "msg": "", | |
| 36 | + "baseDate": "2026-06-23", | |
| 37 | + "sales": { // 매출(VAT 포함, 단위: 원, 숫자) | |
| 38 | + "todayAmt": 1234500, // 당일 매출액 | |
| 39 | + "dayChart": [ {"date":"06-20","amt":900000}, ... ], // 최근 4일 | |
| 40 | + "monthChart": [ {"month":"6월","amt":25000000}, ... ], // 최근 4개월 | |
| 41 | + "yearAmtSum": 310000000 // 연간 누적 | |
| 42 | + }, | |
| 43 | + "members": { // 회원 현황 | |
| 44 | + "userNorCnt": 0, "userComCnt": 0, // 개인/기업 정상회원수 | |
| 45 | + "mberNorTot": 0, // 정상회원 합계 | |
| 46 | + "mberBlockTot": 0, "mberSecessTot": 0,// 정지/탈퇴 누적 | |
| 47 | + "cmpApply": 0, "cmpApprove": 0, "cmpReject": 0, // 기업회원 신청/승인/반려 | |
| 48 | + "todayExpireCnt": 0, "todayStopCnt": 0 // 금일 탈퇴/정지 | |
| 49 | + }, | |
| 50 | + "sms": { // 문자 발송 현황(전송사별) | |
| 51 | + "agents": [ | |
| 52 | + {"agentCode":"ITN019","succCnt":12000,"failCnt":30,"succRate":99}, ... | |
| 53 | + ], | |
| 54 | + "todaySignupCnt": 0 // 일 회원가입자수(참고) | |
| 55 | + } | |
| 56 | +} | |
| 57 | +``` | |
| 58 | + | |
| 59 | +- 원본 서비스가 문자열로 반환하는 금액/건수는 서비스 계층에서 **숫자로 정규화**한다. | |
| 60 | +- 천단위 콤마/원화 표기 등 **표현 포맷은 n8n**에서 처리한다(앱은 raw 숫자만 제공). | |
| 61 | +- 누락 지표는 1차 범위에서 제외하며, 향후 `sales`/`members`/`sms` 블록에 필드를 추가하는 식으로 확장한다. | |
| 62 | + | |
| 63 | +## 4. 인증 / 보호 | |
| 64 | + | |
| 65 | +- `globals.properties`에 `Globals.dashboard.api.token` 추가, 환경별 `globals_*.properties`에서 override. | |
| 66 | +- 신규 인터셉터 `DashboardApiAuthInterceptor`를 **`/api/dashboard/**` 경로에만** 매핑(`egov-interceptor-servlet.xml`). | |
| 67 | + - 요청 헤더 `X-DASHBOARD-TOKEN` 값이 설정 토큰과 불일치/누락 → **401** JSON(`{"isSuccess":false,"msg":"unauthorized"}`)을 직접 작성하고 컨트롤러 진입 차단. | |
| 68 | +- 엔드포인트가 `*.do`이므로 Spring Security의 DB 기반 URL 권한(`context-security.xml`)에 걸릴 수 있다 → `/api/dashboard/**`를 `security="none"`으로 예외 추가(토큰으로 자체 보호, 세션 불필요). | |
| 69 | +- 토큰 값은 응답/로그에 노출 금지. | |
| 70 | + | |
| 71 | +## 5. Java 컴포넌트 구성 (4종 패턴) | |
| 72 | + | |
| 73 | +신규 모듈 `itn.let.mjo.dashboardapi`: | |
| 74 | + | |
| 75 | +| 파일 | 역할 | | |
| 76 | +|---|---| | |
| 77 | +| `web/DashboardApiController.java` | **`@RestController`**. `GET /api/dashboard/summary.do` → `getDashboardSummary(...)`가 `DashboardSummaryVO`를 직접 반환(Jackson 직렬화, jsonView 미사용). 얇게 유지 | | |
| 78 | +| `service/DashboardSummaryService.java` | 인터페이스 | | |
| 79 | +| `service/DashboardSummaryVO.java` | 응답 DTO(sales/members/sms 중첩 + isSuccess/msg/baseDate). Jackson 직렬화용 getter 포함 | | |
| 80 | +| `service/impl/DashboardSummaryServiceImpl.java` | `@Service`. 기존 `mjonPayService`·`conectStatsService`·`mjonMsgService`를 주입해 조합·숫자 정규화 | | |
| 81 | +| `web/DashboardApiAuthInterceptor.java` | 토큰 헤더 검증 인터셉터 | | |
| 82 | + | |
| 83 | +설계 근거 / 규칙: | |
| 84 | +- **DAO 신규 없음** — 기존 검증된 서비스 메서드만 호출. | |
| 85 | +- `@RestController`는 `@Controller`를 메타포함 → 디스패처 컨텍스트의 `@Controller` 스캔에 잡힘. Jackson 컨버터는 `<mvc:annotation-driven/>` + `jackson-databind` 의존성 + 기존 `@ResponseBody` 선례로 동작 검증됨. | |
| 86 | +- 빈 스캔 분리 유지: 컨트롤러/인터셉터=디스패처 컨텍스트, 서비스=루트 컨텍스트. | |
| 87 | +- 관리자 로그 AOP가 `itn..*Controller.select*`에 걸리므로, 메서드명을 `getDashboardSummary`로(=`select*` 아님) 지어 불필요한 잡로그를 피한다. | |
| 88 | +- 지표 블록별 try/catch — 개별 지표 실패가 전체 응답을 막지 않도록 하고 실패 블록은 null/0으로 둔다(기존 대시보드 Ajax 관례). | |
| 89 | + | |
| 90 | +## 6. n8n 워크플로우 / Slack | |
| 91 | + | |
| 92 | +``` | |
| 93 | +[Schedule Trigger] 매일 09:00 (cron) | |
| 94 | + ↓ | |
| 95 | +[HTTP Request] GET https://<admin-host>/api/dashboard/summary.do | |
| 96 | + Header X-DASHBOARD-TOKEN = {{ $env.MJON_DASH_TOKEN }} | |
| 97 | + ↓ | |
| 98 | +[Code (Function)] 도메인 JSON → Slack Block Kit 변환(콤마/원화 포맷 여기서) | |
| 99 | + ↓ | |
| 100 | +[Slack node] 지정 채널 게시(OAuth 또는 Incoming Webhook) | |
| 101 | +``` | |
| 102 | + | |
| 103 | +- Slack 메시지: 제목(` 문자ON 일일 리포트 — {baseDate}`) + 매출/회원/문자 섹션을 Block Kit `section` 블록으로 구성. | |
| 104 | +- 토큰은 n8n 환경변수 `MJON_DASH_TOKEN`에 보관(워크플로우 JSON에 평문 미포함). | |
| 105 | +- 산출물: import 가능한 `n8n-workflow.json` 예시 + Code 노드 포맷 스니펫. | |
| 106 | + | |
| 107 | +## 7. 에러처리 / 테스트 / 배포 | |
| 108 | + | |
| 109 | +- 앱 서비스: 지표 블록별 try/catch, 전역 실패 시 `isSuccess:false` + `msg`. 인증 실패는 인터셉터에서 401 JSON. | |
| 110 | +- 테스트: 본 저장소는 단위테스트 인프라가 없음(surefire `skipTests=true`) → **수동 검증**. | |
| 111 | + - `curl -H "X-DASHBOARD-TOKEN: <token>" http://localhost/api/dashboard/summary.do` (토큰 유/무 케이스 모두). | |
| 112 | + - n8n 워크플로우 Execute → Slack 채널 수신 확인. | |
| 113 | +- 설정: `globals.properties`에 `Globals.dashboard.api.token` 추가, 환경별 override. 운영 토큰은 별도 공유. | |
| 114 | +- 배포: WAR 재빌드 후 WAS 반영. 신규 엔드포인트는 추가 전용이라 기존 기능 영향 없음. | |
| 115 | + | |
| 116 | +## 8. 결정 사항 요약 | |
| 117 | + | |
| 118 | +- 연동: pull(신규 JSON API + n8n 스케줄) ✅ | |
| 119 | +- 집계 위치: 신규 Service(접근안 A) ✅ | |
| 120 | +- 컨트롤러: `@RestController` ✅ | |
| 121 | +- 인증: 공유 토큰 단독(IP 허용목록 제외) ✅ | |
| 122 | +- 지표: 매출(일/월) / 회원 현황 / 문자 발송 현황 ✅ |
+++ src/main/java/itn/com/annotation/PersonalLog.java
... | ... | @@ -0,0 +1,67 @@ |
| 1 | +package itn.com.annotation; | |
| 2 | + | |
| 3 | + | |
| 4 | +import java.lang.annotation.ElementType; | |
| 5 | +import java.lang.annotation.Retention; | |
| 6 | +import java.lang.annotation.RetentionPolicy; | |
| 7 | +import java.lang.annotation.Target; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 개인정보 처리 이력 로그 기록을 위한 메서드 어노테이션. | |
| 11 | + * | |
| 12 | + * <p>개인정보 조회, 수정, 삭제, 다운로드 등이 발생하는 컨트롤러 메서드에 선언한다. | |
| 13 | + * AOP가 메서드 실행 후 이 어노테이션의 설정값과 요청 정보를 읽어 | |
| 14 | + * 개인정보 처리 이력 로그를 저장한다.</p> | |
| 15 | + * | |
| 16 | + * <pre> | |
| 17 | + * {@code | |
| 18 | + * @PersonalLog( | |
| 19 | + * action = "삭제", | |
| 20 | + * description = "기업회원 상세정보", | |
| 21 | + * target = "#{object}.{method}" or "#{object} | |
| 22 | + * search = "#{object}.{method}" or "#{object} | |
| 23 | + * ) | |
| 24 | + * } | |
| 25 | + * </pre> | |
| 26 | + */ | |
| 27 | +@Target(ElementType.METHOD) | |
| 28 | +@Retention(RetentionPolicy.RUNTIME) | |
| 29 | +public @interface PersonalLog { | |
| 30 | + /** | |
| 31 | + * 개인정보 처리 행위. | |
| 32 | + * | |
| 33 | + * <p>예: 조회, 수정, 삭제, 다운로드</p> | |
| 34 | + * | |
| 35 | + * @return 개인정보 처리 행위명 | |
| 36 | + */ | |
| 37 | + String action(); | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 개인정보를 처리한 화면 또는 업무의 설명. | |
| 41 | + * | |
| 42 | + * <p>예: 회원 상세정보, 기업회원 목록, 회원 엑셀 다운로드</p> | |
| 43 | + * | |
| 44 | + * @return 처리 화면·업무 설명 | |
| 45 | + */ | |
| 46 | + String description(); | |
| 47 | + | |
| 48 | + /** | |
| 49 | + * 개인정보 처리 대상. | |
| 50 | + * | |
| 51 | + * <p>단건 처리 시 대상 회원 ID 등을 기록한다. | |
| 52 | + * SpEL 표현식을 사용할 수 있으며, 메서드 첫 번째 인자의 회원 ID는 | |
| 53 | + * {@code "#{object}.{method}"}처럼 지정한다.</p> | |
| 54 | + * | |
| 55 | + * @return 처리 대상 정보, 미지정 시 빈 문자열 | |
| 56 | + */ | |
| 57 | + String target() default ""; | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * 목록 조회 또는 다운로드 시 사용한 검색 조건. | |
| 61 | + * | |
| 62 | + * <p>검색어, 기간, 조회 건수 등 대상 정보를 보완하기 위한 용도다.</p> | |
| 63 | + * | |
| 64 | + * @return 검색 조건 정보, 미지정 시 빈 문자열 | |
| 65 | + */ | |
| 66 | + String search() default ""; | |
| 67 | +} |
+++ src/main/java/itn/com/cmm/interceptor/DashboardApiAuthInterceptor.java
... | ... | @@ -0,0 +1,37 @@ |
| 1 | +package itn.com.cmm.interceptor; | |
| 2 | + | |
| 3 | +import javax.servlet.http.HttpServletRequest; | |
| 4 | +import javax.servlet.http.HttpServletResponse; | |
| 5 | + | |
| 6 | +import org.springframework.beans.factory.annotation.Value; | |
| 7 | +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 대시보드 요약 API 토큰 인증. | |
| 11 | + * X-DASHBOARD-TOKEN 헤더가 설정 토큰과 일치할 때만 통과시킨다. | |
| 12 | + */ | |
| 13 | +public class DashboardApiAuthInterceptor extends HandlerInterceptorAdapter { | |
| 14 | + | |
| 15 | + private static final String HEADER = "X-DASHBOARD-TOKEN"; | |
| 16 | + | |
| 17 | + @Value("#{globalSettings['Globals.dashboard.api.token']}") | |
| 18 | + private String apiToken; | |
| 19 | + | |
| 20 | + @Override | |
| 21 | + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | |
| 22 | + throws Exception { | |
| 23 | + | |
| 24 | + String token = request.getHeader(HEADER); | |
| 25 | + | |
| 26 | + boolean ok = apiToken != null && !apiToken.trim().isEmpty() | |
| 27 | + && apiToken.equals(token); | |
| 28 | + | |
| 29 | + if (!ok) { | |
| 30 | + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 | |
| 31 | + response.setContentType("application/json;charset=UTF-8"); | |
| 32 | + response.getWriter().write("{\"isSuccess\":false,\"msg\":\"unauthorized\"}"); | |
| 33 | + return false; // 컨트롤러 진입 차단 (토큰 값은 로그/응답에 출력하지 않음) | |
| 34 | + } | |
| 35 | + return true; | |
| 36 | + } | |
| 37 | +} |
--- src/main/java/itn/com/cmm/util/StringUtil2.java
+++ src/main/java/itn/com/cmm/util/StringUtil2.java
... | ... | @@ -45,6 +45,14 @@ |
| 45 | 45 |
return (value == null || value.length() == 0); |
| 46 | 46 |
} |
| 47 | 47 |
|
| 48 |
+ public static boolean isEmpty(Object value) {
|
|
| 49 |
+ return value == null || value.toString().trim().isEmpty(); |
|
| 50 |
+ } |
|
| 51 |
+ |
|
| 52 |
+ public static String stringValue(Object value) {
|
|
| 53 |
+ return value == null ? "" : value.toString(); |
|
| 54 |
+ } |
|
| 55 |
+ |
|
| 48 | 56 |
public static boolean isNotEmpty(String value) {
|
| 49 | 57 |
return !isEmpty(value); |
| 50 | 58 |
} |
--- src/main/java/itn/com/cmm/web/EgovFileDownloadController.java
+++ src/main/java/itn/com/cmm/web/EgovFileDownloadController.java
... | ... | @@ -13,6 +13,7 @@ |
| 13 | 13 |
import javax.servlet.http.HttpServletRequest; |
| 14 | 14 |
import javax.servlet.http.HttpServletResponse; |
| 15 | 15 |
|
| 16 |
+import itn.com.annotation.PersonalLog; |
|
| 16 | 17 |
import org.slf4j.Logger; |
| 17 | 18 |
import org.slf4j.LoggerFactory; |
| 18 | 19 |
import org.springframework.beans.factory.annotation.Value; |
... | ... | @@ -124,6 +125,11 @@ |
| 124 | 125 |
* @param response |
| 125 | 126 |
* @throws Exception |
| 126 | 127 |
*/ |
| 128 |
+ @PersonalLog( |
|
| 129 |
+ action = "다운로드", |
|
| 130 |
+ description = "첨부파일 다운로드", |
|
| 131 |
+ search = "#commandMap['atchFileId'] + ':' + #commandMap['fileSn']" |
|
| 132 |
+ ) |
|
| 127 | 133 |
@RequestMapping(value = "/cmm/fms/FileDown.do") |
| 128 | 134 |
public void cvplFileDownload(@RequestParam Map<String, Object> commandMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
|
| 129 | 135 |
|
+++ src/main/java/itn/com/uss/olh/hpc/service/GeoIpBlockLogVO.java
... | ... | @@ -0,0 +1,40 @@ |
| 1 | +package itn.com.uss.olh.hpc.service; | |
| 2 | + | |
| 3 | +import itn.com.cmm.ComDefaultVO; | |
| 4 | + | |
| 5 | +import java.time.LocalDateTime; | |
| 6 | +import java.util.ArrayList; | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +public class GeoIpBlockLogVO extends ComDefaultVO{ | |
| 10 | + | |
| 11 | + private long blockLogId; | |
| 12 | + private String blockDt; | |
| 13 | + private String accessIp; | |
| 14 | + private String requestUri; | |
| 15 | + private String countryCode; | |
| 16 | + private String countryName; | |
| 17 | + private String blockYn; | |
| 18 | + | |
| 19 | + public Long getBlockLogId() { return blockLogId; } | |
| 20 | + public void setBlockLogId(Long blockLogId) { this.blockLogId = blockLogId; } | |
| 21 | + | |
| 22 | + public String getBlockDt() { return blockDt; } | |
| 23 | + public void setBlockDt(String blockDt) { this.blockDt = blockDt; } | |
| 24 | + | |
| 25 | + public String getAccessIp() { return accessIp; } | |
| 26 | + public void setAccessIp(String accessIp) { this.accessIp = accessIp; } | |
| 27 | + | |
| 28 | + public String getRequestUri() { return requestUri; } | |
| 29 | + public void setRequestUri(String requestUri) { this.requestUri = requestUri; } | |
| 30 | + | |
| 31 | + public String getCountryCode() { return countryCode; } | |
| 32 | + public void setCountryCode(String countryCode) { this.countryCode = countryCode; } | |
| 33 | + | |
| 34 | + public String getCountryName() { return countryName; } | |
| 35 | + public void setCountryName(String countryName) { this.countryName = countryName; } | |
| 36 | + | |
| 37 | + public String getBlockYn() { return blockYn; } | |
| 38 | + public void setBlockYn(String blockYn) { this.blockYn = blockYn; } | |
| 39 | + | |
| 40 | +} |
--- src/main/java/itn/com/uss/olh/hpc/service/HackIpService.java
+++ src/main/java/itn/com/uss/olh/hpc/service/HackIpService.java
... | ... | @@ -38,4 +38,11 @@ |
| 38 | 38 |
|
| 39 | 39 |
// 차단아이피가 아닌 고트래픽 유저 검색 후 차단처리 |
| 40 | 40 |
public void selectHighTrafficNotIgnoreIp() throws Exception; |
| 41 |
+ |
|
| 42 |
+ // 해외접근 IP 차단 리스트 |
|
| 43 |
+ public List<GeoIpBlockLogVO> selecForeignAccessBlockList(GeoIpBlockLogVO blockLogVO) throws Exception ; |
|
| 44 |
+ |
|
| 45 |
+ public String updateAccessBlockYn(GeoIpBlockLogVO blockLogVO) throws Exception ; |
|
| 46 |
+ |
|
| 47 |
+ public String selectAccessBlockYn() throws Exception ; |
|
| 41 | 48 |
} |
--- src/main/java/itn/com/uss/olh/hpc/service/impl/HackIpDAO.java
+++ src/main/java/itn/com/uss/olh/hpc/service/impl/HackIpDAO.java
... | ... | @@ -2,6 +2,7 @@ |
| 2 | 2 |
|
| 3 | 3 |
import java.util.List; |
| 4 | 4 |
|
| 5 |
+import itn.com.uss.olh.hpc.service.GeoIpBlockLogVO; |
|
| 5 | 6 |
import org.springframework.stereotype.Repository; |
| 6 | 7 |
|
| 7 | 8 |
import itn.com.cmm.service.impl.EgovComAbstractDAO; |
... | ... | @@ -79,6 +80,18 @@ |
| 79 | 80 |
@SuppressWarnings("unchecked")
|
| 80 | 81 |
public List<HackIpVO> selectHighTrafficNotIgnoreIp() {
|
| 81 | 82 |
return (List<HackIpVO>) list("hackIpDAO.selectHighTrafficNotIgnoreIp");
|
| 82 |
- } |
|
| 83 |
+ } |
|
| 84 |
+ |
|
| 85 |
+ public List<GeoIpBlockLogVO> selecForeignAccessBlockList(GeoIpBlockLogVO blockLogVO) throws Exception{
|
|
| 86 |
+ return (List<GeoIpBlockLogVO>) list("hackIpDAO.selecForeignAccessBlockList", blockLogVO);
|
|
| 87 |
+ } |
|
| 88 |
+ |
|
| 89 |
+ public String updateAccessBlockYn(GeoIpBlockLogVO blockLogVO) throws Exception{
|
|
| 90 |
+ return (String) insert("hackIpDAO.updateAccessBlockYn", blockLogVO);
|
|
| 91 |
+ } |
|
| 92 |
+ |
|
| 93 |
+ public String selectAccessBlockYn() throws Exception{
|
|
| 94 |
+ return (String) select("hackIpDAO.selectAccessBlockYn");
|
|
| 95 |
+ } |
|
| 83 | 96 |
|
| 84 | 97 |
} |
--- src/main/java/itn/com/uss/olh/hpc/service/impl/HackIpServiceImpl.java
+++ src/main/java/itn/com/uss/olh/hpc/service/impl/HackIpServiceImpl.java
... | ... | @@ -5,6 +5,7 @@ |
| 5 | 5 |
|
| 6 | 6 |
import javax.annotation.Resource; |
| 7 | 7 |
|
| 8 |
+import itn.com.uss.olh.hpc.service.GeoIpBlockLogVO; |
|
| 8 | 9 |
import org.springframework.stereotype.Service; |
| 9 | 10 |
|
| 10 | 11 |
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; |
... | ... | @@ -139,5 +140,20 @@ |
| 139 | 140 |
|
| 140 | 141 |
|
| 141 | 142 |
} |
| 142 |
- |
|
| 143 |
+ |
|
| 144 |
+ @Override |
|
| 145 |
+ public List<GeoIpBlockLogVO> selecForeignAccessBlockList(GeoIpBlockLogVO blockLogVO) throws Exception{
|
|
| 146 |
+ return hackIpDAO.selecForeignAccessBlockList(blockLogVO); |
|
| 147 |
+ } |
|
| 148 |
+ |
|
| 149 |
+ @Override |
|
| 150 |
+ public String updateAccessBlockYn(GeoIpBlockLogVO blockLogVO) throws Exception {
|
|
| 151 |
+ return hackIpDAO.updateAccessBlockYn(blockLogVO); |
|
| 152 |
+ } |
|
| 153 |
+ |
|
| 154 |
+ @Override |
|
| 155 |
+ public String selectAccessBlockYn() throws Exception {
|
|
| 156 |
+ return hackIpDAO.selectAccessBlockYn(); |
|
| 157 |
+ } |
|
| 158 |
+ |
|
| 143 | 159 |
} |
--- src/main/java/itn/com/uss/olh/hpc/web/EgovHpcmController.java
+++ src/main/java/itn/com/uss/olh/hpc/web/EgovHpcmController.java
... | ... | @@ -5,14 +5,12 @@ |
| 5 | 5 |
import java.net.HttpURLConnection; |
| 6 | 6 |
import java.net.URL; |
| 7 | 7 |
import java.net.URLEncoder; |
| 8 |
-import java.util.Calendar; |
|
| 9 |
-import java.util.Date; |
|
| 10 |
-import java.util.HashSet; |
|
| 11 |
-import java.util.List; |
|
| 8 |
+import java.util.*; |
|
| 12 | 9 |
|
| 13 | 10 |
import javax.annotation.Resource; |
| 14 | 11 |
import javax.servlet.http.HttpServletRequest; |
| 15 | 12 |
|
| 13 |
+import itn.com.uss.olh.hpc.service.*; |
|
| 16 | 14 |
import org.apache.commons.lang3.StringUtils; |
| 17 | 15 |
import org.json.simple.JSONObject; |
| 18 | 16 |
import org.json.simple.parser.JSONParser; |
... | ... | @@ -22,6 +20,7 @@ |
| 22 | 20 |
import org.springframework.web.bind.annotation.ModelAttribute; |
| 23 | 21 |
import org.springframework.web.bind.annotation.RequestMapping; |
| 24 | 22 |
import org.springframework.web.bind.annotation.RequestParam; |
| 23 |
+import org.springframework.web.bind.annotation.ResponseBody; |
|
| 25 | 24 |
import org.springframework.web.servlet.ModelAndView; |
| 26 | 25 |
import org.springframework.web.servlet.mvc.support.RedirectAttributes; |
| 27 | 26 |
|
... | ... | @@ -35,10 +34,6 @@ |
| 35 | 34 |
import itn.com.cmm.service.EgovCmmUseService; |
| 36 | 35 |
import itn.com.cmm.util.RedirectUrlMaker; |
| 37 | 36 |
import itn.com.cmm.util.StringUtil; |
| 38 |
-import itn.com.uss.olh.hpc.service.EgovHpcmService; |
|
| 39 |
-import itn.com.uss.olh.hpc.service.HackIpService; |
|
| 40 |
-import itn.com.uss.olh.hpc.service.HackIpVO; |
|
| 41 |
-import itn.com.uss.olh.hpc.service.HpcmVO; |
|
| 42 | 37 |
import itn.com.utl.fcc.service.EgovStringUtil; |
| 43 | 38 |
|
| 44 | 39 |
/** |
... | ... | @@ -306,6 +301,52 @@ |
| 306 | 301 |
model.addAttribute("paginationInfo", paginationInfo);
|
| 307 | 302 |
return "/uss/olp/hpc/HackIpList"; |
| 308 | 303 |
} |
| 304 |
+ |
|
| 305 |
+ @RequestMapping(value="/uss/olp/hak/ForeignAccessBlock.do") |
|
| 306 |
+ public String selectForeignAccessBlockList(@ModelAttribute("searchVO") GeoIpBlockLogVO searchVO,
|
|
| 307 |
+ ModelMap model) throws Exception {
|
|
| 308 |
+ |
|
| 309 |
+ if(searchVO.getPageUnit() != 10) {
|
|
| 310 |
+ searchVO.setPageUnit(searchVO.getPageUnit()); |
|
| 311 |
+ } |
|
| 312 |
+ |
|
| 313 |
+ PaginationInfo paginationInfo = new PaginationInfo(); |
|
| 314 |
+ paginationInfo.setCurrentPageNo(searchVO.getPageIndex()); |
|
| 315 |
+ paginationInfo.setRecordCountPerPage(searchVO.getPageUnit()); |
|
| 316 |
+ paginationInfo.setPageSize(searchVO.getPageSize()); |
|
| 317 |
+ |
|
| 318 |
+ searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); |
|
| 319 |
+ searchVO.setLastIndex(paginationInfo.getLastRecordIndex()); |
|
| 320 |
+ searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); |
|
| 321 |
+ |
|
| 322 |
+ List<GeoIpBlockLogVO> blockIpList = hackIpService.selecForeignAccessBlockList(searchVO); |
|
| 323 |
+ String accessBlockYn = hackIpService.selectAccessBlockYn(); |
|
| 324 |
+ model.addAttribute("resultList", blockIpList);
|
|
| 325 |
+ model.addAttribute("accessBlockYn", accessBlockYn);
|
|
| 326 |
+ paginationInfo.setTotalRecordCount(blockIpList.size() > 0 ? blockIpList.get(0).getTotCnt() : 0); |
|
| 327 |
+ model.addAttribute("paginationInfo", paginationInfo);
|
|
| 328 |
+ return "/uss/olp/hpc/ForeignAccessBlockList"; |
|
| 329 |
+ } |
|
| 330 |
+ |
|
| 331 |
+ @RequestMapping("/uss/olp/hak/updateAccessBlockYn.do")
|
|
| 332 |
+ @ResponseBody |
|
| 333 |
+ public Map<String, Object> updateAccessBlockYn( |
|
| 334 |
+ @ModelAttribute("searchVO") GeoIpBlockLogVO searchVO, Model model) throws Exception {
|
|
| 335 |
+ |
|
| 336 |
+ Map<String, Object> resultMap = new HashMap<>(); |
|
| 337 |
+ |
|
| 338 |
+ try {
|
|
| 339 |
+ String blockYn = hackIpService.updateAccessBlockYn(searchVO); |
|
| 340 |
+ |
|
| 341 |
+ resultMap.put("blockYn", blockYn);
|
|
| 342 |
+ resultMap.put("result", "success");
|
|
| 343 |
+ } catch (Exception e) {
|
|
| 344 |
+ resultMap.put("result", "fail");
|
|
| 345 |
+ resultMap.put("message", e.getMessage());
|
|
| 346 |
+ } |
|
| 347 |
+ |
|
| 348 |
+ return resultMap; |
|
| 349 |
+ } |
|
| 309 | 350 |
|
| 310 | 351 |
/** |
| 311 | 352 |
* 로그인 로그 관리 (pageing) |
+++ src/main/java/itn/com/utl/aop/AopExpressionHelper.java
... | ... | @@ -0,0 +1,72 @@ |
| 1 | +package itn.com.utl.aop; | |
| 2 | + | |
| 3 | +import org.aspectj.lang.JoinPoint; | |
| 4 | +import org.aspectj.lang.reflect.MethodSignature; | |
| 5 | +import org.springframework.expression.EvaluationContext; | |
| 6 | +import org.springframework.expression.Expression; | |
| 7 | +import org.springframework.expression.ExpressionParser; | |
| 8 | +import org.springframework.expression.spel.standard.SpelExpressionParser; | |
| 9 | +import org.springframework.expression.spel.support.StandardEvaluationContext; | |
| 10 | +import org.springframework.ui.ModelMap; | |
| 11 | + | |
| 12 | +import java.util.Map; | |
| 13 | +import java.util.concurrent.ConcurrentHashMap; | |
| 14 | +public class AopExpressionHelper { | |
| 15 | + | |
| 16 | + private static final ExpressionParser PARSER = new SpelExpressionParser(); | |
| 17 | + private static final Map<String, Expression> EXPRESSION_CACHE = new ConcurrentHashMap<String, Expression>(); | |
| 18 | + | |
| 19 | + private AopExpressionHelper() { | |
| 20 | + } | |
| 21 | + | |
| 22 | + public static EvaluationContext createContext(JoinPoint joinPoint, MethodSignature signature) { | |
| 23 | + | |
| 24 | + StandardEvaluationContext context = new StandardEvaluationContext(); | |
| 25 | + | |
| 26 | + Object[] args = joinPoint.getArgs(); | |
| 27 | + String[] names = signature.getParameterNames(); | |
| 28 | + | |
| 29 | + if (names != null) { | |
| 30 | + for (int i = 0; i < names.length; i++) { | |
| 31 | + context.setVariable(names[i], args[i]); | |
| 32 | + } | |
| 33 | + } | |
| 34 | + | |
| 35 | + for (Object arg : args) { | |
| 36 | + if (arg instanceof ModelMap) { | |
| 37 | + ModelMap model = (ModelMap) arg; | |
| 38 | + | |
| 39 | + for (Map.Entry<String, Object> entry : model.entrySet()) { | |
| 40 | + context.setVariable(entry.getKey(), entry.getValue()); | |
| 41 | + } | |
| 42 | + } | |
| 43 | + } | |
| 44 | + | |
| 45 | + return context; | |
| 46 | + } | |
| 47 | + | |
| 48 | + public static Object evaluate(EvaluationContext context, String expression) { | |
| 49 | + | |
| 50 | + if (!hasText(expression)) { | |
| 51 | + return null; | |
| 52 | + } | |
| 53 | + | |
| 54 | + Expression compiled = EXPRESSION_CACHE.get(expression); | |
| 55 | + | |
| 56 | + if (compiled == null) { | |
| 57 | + Expression parsed = PARSER.parseExpression(expression); | |
| 58 | + | |
| 59 | + Expression existing = EXPRESSION_CACHE.putIfAbsent(expression, parsed); | |
| 60 | + | |
| 61 | + compiled = existing != null | |
| 62 | + ? existing | |
| 63 | + : parsed; | |
| 64 | + } | |
| 65 | + | |
| 66 | + return compiled.getValue(context); | |
| 67 | + } | |
| 68 | + | |
| 69 | + public static boolean hasText(String value) { | |
| 70 | + return value != null && !value.trim().isEmpty(); | |
| 71 | + } | |
| 72 | +} |
+++ src/main/java/itn/com/utl/page/BasePageableVO.java
... | ... | @@ -0,0 +1,77 @@ |
| 1 | +package itn.com.utl.page; | |
| 2 | + | |
| 3 | +import lombok.Getter; | |
| 4 | +import lombok.Setter; | |
| 5 | + | |
| 6 | +@Getter | |
| 7 | +@Setter | |
| 8 | +public class BasePageableVO implements PageableVO { | |
| 9 | + | |
| 10 | + private int pageIndex = 1; | |
| 11 | + private int pageUnit = 10; | |
| 12 | + private int pageSize = 10; | |
| 13 | + | |
| 14 | + private int firstIndex; | |
| 15 | + private int lastIndex; | |
| 16 | + private int recordCountPerPage; | |
| 17 | + private String searchKeyword; | |
| 18 | + | |
| 19 | + | |
| 20 | + // searchVO 로 빼야함 -> BaseVO implements PageableVO, SearchVO | |
| 21 | + private String searchSortCnd; | |
| 22 | + private String searchSortOrd; | |
| 23 | + | |
| 24 | + private String searchCondition; | |
| 25 | + private String searchStartDate; | |
| 26 | + private String searchEndDate; | |
| 27 | + | |
| 28 | + @Override | |
| 29 | + public int getPageIndex() { | |
| 30 | + return pageIndex; | |
| 31 | + } | |
| 32 | + @Override | |
| 33 | + public int getPageUnit() { | |
| 34 | + return pageUnit; | |
| 35 | + } | |
| 36 | + | |
| 37 | + @Override | |
| 38 | + public int getPageSize() { | |
| 39 | + return pageSize; | |
| 40 | + } | |
| 41 | + | |
| 42 | + @Override | |
| 43 | + public String getSearchSortCnd() { | |
| 44 | + return searchSortCnd; | |
| 45 | + } | |
| 46 | + | |
| 47 | + @Override | |
| 48 | + public void setSearchSortCnd(String searchSortCnd) { | |
| 49 | + this.searchSortCnd = searchSortCnd; | |
| 50 | + } | |
| 51 | + | |
| 52 | + @Override | |
| 53 | + public String getSearchSortOrd() { | |
| 54 | + return searchSortOrd; | |
| 55 | + } | |
| 56 | + | |
| 57 | + @Override | |
| 58 | + public void setSearchSortOrd(String searchSortOrd) { | |
| 59 | + this.searchSortOrd = searchSortOrd; | |
| 60 | + } | |
| 61 | + | |
| 62 | + @Override | |
| 63 | + public void setFirstIndex(int firstIndex) { | |
| 64 | + this.firstIndex = firstIndex; | |
| 65 | + } | |
| 66 | + | |
| 67 | + @Override | |
| 68 | + public void setLastIndex(int lastIndex) { | |
| 69 | + this.lastIndex = lastIndex; | |
| 70 | + } | |
| 71 | + | |
| 72 | + @Override | |
| 73 | + public void setRecordCountPerPage(int recordCountPerPage) { | |
| 74 | + this.recordCountPerPage = recordCountPerPage; | |
| 75 | + } | |
| 76 | + | |
| 77 | +}(No newline at end of file) |
+++ src/main/java/itn/com/utl/page/PageableVO.java
... | ... | @@ -0,0 +1,16 @@ |
| 1 | +package itn.com.utl.page; | |
| 2 | + | |
| 3 | +public interface PageableVO { | |
| 4 | + int getPageIndex(); | |
| 5 | + int getPageUnit(); | |
| 6 | + int getPageSize(); | |
| 7 | + String getSearchSortCnd(); | |
| 8 | + String getSearchSortOrd(); | |
| 9 | + | |
| 10 | + void setFirstIndex(int firstIndex); | |
| 11 | + void setLastIndex(int lastIndex); | |
| 12 | + void setRecordCountPerPage(int recordCountPerPage); | |
| 13 | + void setSearchSortCnd(String defaultCnd); | |
| 14 | + void setSearchSortOrd(String defaultOrd); | |
| 15 | +} | |
| 16 | + |
+++ src/main/java/itn/com/utl/page/PaginationUtil.java
... | ... | @@ -0,0 +1,41 @@ |
| 1 | +package itn.com.utl.page; | |
| 2 | + | |
| 3 | +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; | |
| 4 | + | |
| 5 | + | |
| 6 | +public class PaginationUtil { | |
| 7 | + /** | |
| 8 | + * 작성자 : 조민수 | |
| 9 | + * 작성일자 : 2026/07/24 | |
| 10 | + * 공통 페이징 정보를 초기화한다. | |
| 11 | + * | |
| 12 | + * <p>사용 방법 및 적용 예시는 사내 Wiki의 | |
| 13 | + * 'https://wiki.iten.co.kr/40.프로젝트:2026_base_프로젝트:0.참고자료:공용함수정보:pagination-util' 문서를 참고한다.</p> | |
| 14 | + * | |
| 15 | + * @param <T vo> BasePaginationVO를 상속한 VO | |
| 16 | + * @return 초기화된 PaginationInfo | |
| 17 | + */ | |
| 18 | + public static <T extends PageableVO> PaginationInfo init(T vo) { | |
| 19 | + PaginationInfo paginationInfo = new PaginationInfo(); | |
| 20 | + paginationInfo.setCurrentPageNo(vo.getPageIndex()); | |
| 21 | + paginationInfo.setRecordCountPerPage(vo.getPageUnit()); | |
| 22 | + paginationInfo.setPageSize(vo.getPageSize()); | |
| 23 | + | |
| 24 | + vo.setFirstIndex(paginationInfo.getFirstRecordIndex()); | |
| 25 | + vo.setLastIndex(paginationInfo.getLastRecordIndex()); | |
| 26 | + vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); | |
| 27 | + return paginationInfo; | |
| 28 | + } | |
| 29 | + | |
| 30 | + public static <T extends PageableVO> PaginationInfo initWithSort(T vo, String defaultCnd, String defaultOrd) { | |
| 31 | + if(vo.getSearchSortCnd() == null || vo.getSearchSortCnd().isEmpty()) { | |
| 32 | + vo.setSearchSortCnd(defaultCnd); | |
| 33 | + } | |
| 34 | + if (vo.getSearchSortOrd() == null || vo.getSearchSortOrd().isEmpty()) { | |
| 35 | + vo.setSearchSortOrd(defaultOrd); // asc / desc | |
| 36 | + } | |
| 37 | + return init(vo); | |
| 38 | + } | |
| 39 | + | |
| 40 | + | |
| 41 | +} |
+++ src/main/java/itn/com/utl/response/ApiResponse.java
... | ... | @@ -0,0 +1,58 @@ |
| 1 | + | |
| 2 | + | |
| 3 | +package itn.com.utl.response; | |
| 4 | + | |
| 5 | +import lombok.Getter; | |
| 6 | +import lombok.Setter; | |
| 7 | + | |
| 8 | +@Setter | |
| 9 | +@Getter | |
| 10 | +public class ApiResponse<T> { | |
| 11 | + private boolean success; | |
| 12 | + private String message; | |
| 13 | + private T data; | |
| 14 | + | |
| 15 | + public static <T> ApiResponse<T> success() { | |
| 16 | + return new ApiResponse<>(true, null, null); | |
| 17 | + } | |
| 18 | + | |
| 19 | + public static <T> ApiResponse<T> success(T data) { | |
| 20 | + return new ApiResponse<>(true, null, data); | |
| 21 | + } | |
| 22 | + | |
| 23 | + public static <T> ApiResponse<T> success(T data, String message) { | |
| 24 | + return new ApiResponse<>(true, message, data); | |
| 25 | + } | |
| 26 | + | |
| 27 | + public static <T> ApiResponse<T> fail(String message) { | |
| 28 | + return new ApiResponse<>(false, message, null); | |
| 29 | + } | |
| 30 | + | |
| 31 | + public ApiResponse() { | |
| 32 | + } | |
| 33 | + | |
| 34 | + public ApiResponse(boolean success, String message, T data) { | |
| 35 | + this.success = success; | |
| 36 | + this.message = message; | |
| 37 | + this.data = data; | |
| 38 | + } | |
| 39 | + | |
| 40 | + public static <T> ApiResponse<T> successWithMessage(String message) { | |
| 41 | + ApiResponse<T> res = new ApiResponse<>(); | |
| 42 | + res.success = true; | |
| 43 | + res.message = message; | |
| 44 | + res.data = null; | |
| 45 | + return res; | |
| 46 | + } | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + public String toString() { | |
| 50 | + return "ApiResponse{" + | |
| 51 | + "success=" + success + | |
| 52 | + ", message='" + message + '\'' + | |
| 53 | + ", data=" + data + | |
| 54 | + '}'; | |
| 55 | + } | |
| 56 | +} | |
| 57 | + | |
| 58 | + |
--- src/main/java/itn/let/cert/phone/service/MberCertPhoneVO.java
+++ src/main/java/itn/let/cert/phone/service/MberCertPhoneVO.java
... | ... | @@ -33,6 +33,7 @@ |
| 33 | 33 |
private String certUseYn; |
| 34 | 34 |
|
| 35 | 35 |
private String checkNo; |
| 36 |
+ private String mberRegDate; |
|
| 36 | 37 |
|
| 37 | 38 |
|
| 38 | 39 |
|
... | ... | @@ -74,6 +75,12 @@ |
| 74 | 75 |
public void setCheckNo(String checkNo) {
|
| 75 | 76 |
this.checkNo = checkNo; |
| 76 | 77 |
} |
| 78 |
+ public String getMberRegDate() {
|
|
| 79 |
+ return mberRegDate; |
|
| 80 |
+ } |
|
| 81 |
+ public void setMberRegDate(String mberRegDate) {
|
|
| 82 |
+ this.mberRegDate = mberRegDate; |
|
| 83 |
+ } |
|
| 77 | 84 |
|
| 78 | 85 |
|
| 79 | 86 |
|
--- src/main/java/itn/let/cert/phone/web/CertPhoneController.java
+++ src/main/java/itn/let/cert/phone/web/CertPhoneController.java
... | ... | @@ -7,6 +7,8 @@ |
| 7 | 7 |
import javax.annotation.Resource; |
| 8 | 8 |
import javax.servlet.http.HttpServletRequest; |
| 9 | 9 |
|
| 10 |
+import itn.let.uss.umt.service.EgovMberManageService; |
|
| 11 |
+import itn.let.uss.umt.service.MberManageVO; |
|
| 10 | 12 |
import org.apache.commons.lang3.StringUtils; |
| 11 | 13 |
import org.springframework.http.HttpStatus; |
| 12 | 14 |
import org.springframework.http.ResponseEntity; |
... | ... | @@ -49,6 +51,10 @@ |
| 49 | 51 |
|
| 50 | 52 |
@Resource(name = "MjonMsgDataService") |
| 51 | 53 |
private MjonMsgDataService mjonMsgDataService; |
| 54 |
+ |
|
| 55 |
+ @Resource(name = "mberManageService") |
|
| 56 |
+ private EgovMberManageService mberManageService; |
|
| 57 |
+ |
|
| 52 | 58 |
|
| 53 | 59 |
|
| 54 | 60 |
|
... | ... | @@ -91,8 +97,7 @@ |
| 91 | 97 |
|
| 92 | 98 |
ModelAndView modelAndView = new ModelAndView(); |
| 93 | 99 |
modelAndView.setViewName("jsonView");
|
| 94 |
- |
|
| 95 |
- |
|
| 100 |
+ |
|
| 96 | 101 |
System.out.println(" :: insertCertPhone :: ");
|
| 97 | 102 |
|
| 98 | 103 |
//로그인 권한정보 불러오기 |
... | ... | @@ -103,10 +108,23 @@ |
| 103 | 108 |
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); |
| 104 | 109 |
} |
| 105 | 110 |
mberCertPhoneVO.setFrstRegisterId(userId); |
| 106 |
- mberCertPhoneVO.setMberId(userId); |
|
| 111 |
+ if(mberCertPhoneVO.getMberId() == null || mberCertPhoneVO.getMberId().equals("")){
|
|
| 112 |
+ mberCertPhoneVO.setMberId(userId); |
|
| 113 |
+ } |
|
| 107 | 114 |
|
| 115 |
+ StatusResponse statusResponse = certPhoneService.insertCertPhone(mberCertPhoneVO, mberCertPhoneVO.getMbtlnum()); |
|
| 116 |
+ |
|
| 117 |
+ if (statusResponse.getStatus().equals(HttpStatus.OK)) {
|
|
| 118 |
+ MberManageVO mberManageVO = new MberManageVO(); |
|
| 119 |
+ String memo = ""; |
|
| 120 |
+ memo = "보안로그인 번호 관리자 등록 :" + mberCertPhoneVO.getMbtlnum(); |
|
| 121 |
+ mberManageVO.setMberId(mberCertPhoneVO.getMberId()); |
|
| 122 |
+ mberManageVO.setMemoCn(memo); |
|
| 123 |
+ mberManageVO.setFrstRegisterId(userId); |
|
| 124 |
+ mberManageService.insertMberMemo(mberManageVO); |
|
| 125 |
+ } |
|
| 108 | 126 |
|
| 109 |
- return ResponseEntity.ok().body(certPhoneService.insertCertPhone(mberCertPhoneVO, loginVO.getMoblphonNo())); |
|
| 127 |
+ return ResponseEntity.ok().body(statusResponse); |
|
| 110 | 128 |
} |
| 111 | 129 |
|
| 112 | 130 |
@RequestMapping(value = {"/cert/phone/updateCertPhone.do"})
|
... | ... | @@ -149,12 +167,20 @@ |
| 149 | 167 |
if(StringUtils.isEmpty(mberCertPhoneVO.getMberId()) ) {
|
| 150 | 168 |
mberCertPhoneVO.setMberId(userId); |
| 151 | 169 |
} |
| 170 |
+ StatusResponse statusResponse = certPhoneService.deleteCertPhone(mberCertPhoneVO); |
|
| 171 |
+ |
|
| 172 |
+ if (statusResponse.getStatus().equals(HttpStatus.OK)) {
|
|
| 173 |
+ MberManageVO mberManageVO = new MberManageVO(); |
|
| 174 |
+ String memo = ""; |
|
| 175 |
+ memo = "보안로그인 번호 관리자 삭제 :" + mberCertPhoneVO.getMbtlnum(); |
|
| 176 |
+ mberManageVO.setMberId(mberCertPhoneVO.getMberId()); |
|
| 177 |
+ mberManageVO.setMemoCn(memo); |
|
| 178 |
+ mberManageVO.setFrstRegisterId(userId); |
|
| 179 |
+ mberManageService.insertMberMemo(mberManageVO); |
|
| 180 |
+ } |
|
| 152 | 181 |
|
| 153 |
- |
|
| 154 |
- return ResponseEntity.ok().body(certPhoneService.deleteCertPhone(mberCertPhoneVO)); |
|
| 155 |
- } |
|
| 156 |
- |
|
| 157 |
- |
|
| 182 |
+ return ResponseEntity.ok().body(statusResponse); |
|
| 183 |
+ } |
|
| 158 | 184 |
|
| 159 | 185 |
|
| 160 | 186 |
|
--- src/main/java/itn/let/cop/bbs/service/Board.java
+++ src/main/java/itn/let/cop/bbs/service/Board.java
... | ... | @@ -272,6 +272,8 @@ |
| 272 | 272 |
private String pubDetail; //사전정보공표 디테일 |
| 273 | 273 |
|
| 274 | 274 |
private List<FileVO> fileList = new ArrayList<FileVO>(); //리스트목록에서 파일들을 가져오기 위해 |
| 275 |
+ |
|
| 276 |
+ private String commenterNms; |
|
| 275 | 277 |
|
| 276 | 278 |
public String getSiteId() {
|
| 277 | 279 |
return siteId; |
... | ... | @@ -1094,5 +1096,14 @@ |
| 1094 | 1096 |
public void setPubDetail(String pubDetail) {
|
| 1095 | 1097 |
this.pubDetail = pubDetail; |
| 1096 | 1098 |
} |
| 1099 |
+ |
|
| 1100 |
+ public String getCommenterNms() {
|
|
| 1101 |
+ return commenterNms; |
|
| 1102 |
+ } |
|
| 1103 |
+ |
|
| 1104 |
+ public void setCommenterNms(String commenterNms) {
|
|
| 1105 |
+ this.commenterNms = commenterNms; |
|
| 1106 |
+ } |
|
| 1107 |
+ |
|
| 1097 | 1108 |
|
| 1098 | 1109 |
} |
--- src/main/java/itn/let/cop/bbs/service/BoardVO.java
+++ src/main/java/itn/let/cop/bbs/service/BoardVO.java
... | ... | @@ -171,6 +171,10 @@ |
| 171 | 171 |
private String ntcrId; |
| 172 | 172 |
|
| 173 | 173 |
private String ntcrNm; |
| 174 |
+ |
|
| 175 |
+ private String searchStartDate = ""; // 검색 시작일자 |
|
| 176 |
+ |
|
| 177 |
+ private String searchEndDate = ""; // 검색 종료일자 |
|
| 174 | 178 |
|
| 175 | 179 |
|
| 176 | 180 |
//--------------------------------- |
... | ... | @@ -804,5 +808,13 @@ |
| 804 | 808 |
public void setNiceNm(String niceNm) {
|
| 805 | 809 |
this.niceNm = niceNm; |
| 806 | 810 |
} |
| 811 |
+ |
|
| 812 |
+ public String getSearchStartDate() { return searchStartDate; }
|
|
| 813 |
+ |
|
| 814 |
+ public void setSearchStartDate(String searchStartDate) {this.searchStartDate = searchStartDate;}
|
|
| 815 |
+ |
|
| 816 |
+ public String getSearchEndDate() { return searchEndDate; }
|
|
| 817 |
+ |
|
| 818 |
+ public void setSearchEndDate(String searchEndDate) {this.searchEndDate = searchEndDate;}
|
|
| 807 | 819 |
|
| 808 | 820 |
}(No newline at end of file) |
--- src/main/java/itn/let/cop/bbs/service/EgovBBSManageService.java
+++ src/main/java/itn/let/cop/bbs/service/EgovBBSManageService.java
... | ... | @@ -215,6 +215,8 @@ |
| 215 | 215 |
|
| 216 | 216 |
public List<BoardVO> selectAdminMainBoard(BoardVO boardVO) throws Exception; |
| 217 | 217 |
|
| 218 |
+ public List<BoardVO> selectBbsContentsListExcelDownload(BoardVO boardVO) throws Exception; |
|
| 219 |
+ |
|
| 218 | 220 |
public List<BoardVO> selectAdminMainBoardByDash(BoardVO boardVO) throws Exception; |
| 219 | 221 |
|
| 220 | 222 |
public List<BoardVO> selectUserBbsWriteList(BoardVO boardVO) throws Exception; |
--- src/main/java/itn/let/cop/bbs/service/impl/BBSManageDAO.java
+++ src/main/java/itn/let/cop/bbs/service/impl/BBSManageDAO.java
... | ... | @@ -345,6 +345,10 @@ |
| 345 | 345 |
return (List<BoardVO>) list("BBSManageDAO.selectAdminMainBoard", boardVO);
|
| 346 | 346 |
} |
| 347 | 347 |
|
| 348 |
+ public List<BoardVO> selectBbsContentsListExcelDownload(BoardVO boardVO) throws Exception {
|
|
| 349 |
+ return (List<BoardVO>) list("BBSManageDAO.selectBbsContentsListExcelDownload", boardVO);
|
|
| 350 |
+ } |
|
| 351 |
+ |
|
| 348 | 352 |
@SuppressWarnings("unchecked")
|
| 349 | 353 |
public List<BoardVO> selectAdminMainBoardByDash(BoardVO boardVO) throws Exception {
|
| 350 | 354 |
return (List<BoardVO>) list("BBSManageDAO.selectAdminMainBoardByDash", boardVO);
|
--- src/main/java/itn/let/cop/bbs/service/impl/EgovBBSManageServiceImpl.java
+++ src/main/java/itn/let/cop/bbs/service/impl/EgovBBSManageServiceImpl.java
... | ... | @@ -328,6 +328,11 @@ |
| 328 | 328 |
} |
| 329 | 329 |
|
| 330 | 330 |
@Override |
| 331 |
+ public List<BoardVO> selectBbsContentsListExcelDownload(BoardVO boardVO) throws Exception {
|
|
| 332 |
+ return bbsMngDAO.selectBbsContentsListExcelDownload(boardVO); |
|
| 333 |
+ } |
|
| 334 |
+ |
|
| 335 |
+ @Override |
|
| 331 | 336 |
public List<BoardVO> selectAdminMainBoardByDash(BoardVO boardVO) throws Exception {
|
| 332 | 337 |
return bbsMngDAO.selectAdminMainBoardByDash(boardVO); |
| 333 | 338 |
} |
--- src/main/java/itn/let/cop/bbs/web/EgovBBSAttributeManageController.java
+++ src/main/java/itn/let/cop/bbs/web/EgovBBSAttributeManageController.java
... | ... | @@ -13,6 +13,7 @@ |
| 13 | 13 |
import javax.servlet.http.HttpServletResponse; |
| 14 | 14 |
import javax.servlet.http.HttpSession; |
| 15 | 15 |
|
| 16 |
+import itn.let.uat.uap.service.LoginPolicyVO; |
|
| 16 | 17 |
import org.apache.poi.ss.usermodel.Cell; |
| 17 | 18 |
import org.apache.poi.ss.usermodel.CellStyle; |
| 18 | 19 |
import org.apache.poi.ss.usermodel.Font; |
... | ... | @@ -29,6 +30,7 @@ |
| 29 | 30 |
import org.springframework.web.bind.support.SessionStatus; |
| 30 | 31 |
import org.springframework.web.servlet.ModelAndView; |
| 31 | 32 |
import org.springframework.web.servlet.mvc.support.RedirectAttributes; |
| 33 |
+import org.springframework.web.util.HtmlUtils; |
|
| 32 | 34 |
import org.springmodules.validation.commons.DefaultBeanValidator; |
| 33 | 35 |
|
| 34 | 36 |
import egovframework.rte.fdl.property.EgovPropertyService; |
... | ... | @@ -115,6 +117,17 @@ |
| 115 | 117 |
{"5", "사용여부" , "test@itn.co.kr", ""},
|
| 116 | 118 |
{"6", "생성일" , "02-123-4567", ""}
|
| 117 | 119 |
} ; |
| 120 |
+ |
|
| 121 |
+ //게시글 리스트 컬럼 정의 |
|
| 122 |
+ private String[][] bbsContentsExcelValue ={
|
|
| 123 |
+ {"0" ,"번호" , "1" , "" },
|
|
| 124 |
+ {"1", "제목" , "제목테스트" , ""},
|
|
| 125 |
+ {"2", "내용" , "내용테스트", ""},
|
|
| 126 |
+ {"3", "등록ID" , "testId", ""},
|
|
| 127 |
+ {"4", "등록자" , "사용자", ""},
|
|
| 128 |
+ {"5", "답변자" , "관리자", ""},
|
|
| 129 |
+ {"6", "등록일" , "2026-08-26", ""}
|
|
| 130 |
+ } ; |
|
| 118 | 131 |
|
| 119 | 132 |
|
| 120 | 133 |
/** |
... | ... | @@ -182,6 +195,99 @@ |
| 182 | 195 |
|
| 183 | 196 |
return "cop/bbs/EgovBoardContentsList"; |
| 184 | 197 |
} |
| 198 |
+ |
|
| 199 |
+ // 게시글 리스트 엑셀 다운로드 |
|
| 200 |
+ @RequestMapping(value="/cop/bbs/SelectBbsListExcelDownload.do") |
|
| 201 |
+ public void SelectBbsListExcelDownload(BoardVO boardVO, |
|
| 202 |
+ HttpServletRequest request, |
|
| 203 |
+ HttpServletResponse response , |
|
| 204 |
+ ModelMap model) throws Exception {
|
|
| 205 |
+ |
|
| 206 |
+ boardVO.setRecordCountPerPage(5000); |
|
| 207 |
+ boardVO.setFirstIndex(0); |
|
| 208 |
+ |
|
| 209 |
+ // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. |
|
| 210 |
+ SXSSFWorkbook wb = new SXSSFWorkbook(100); |
|
| 211 |
+ CellStyle style = wb.createCellStyle(); |
|
| 212 |
+ style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 |
|
| 213 |
+ style.setBorderLeft(CellStyle.BORDER_THIN); |
|
| 214 |
+ style.setBorderRight(CellStyle.BORDER_THIN); |
|
| 215 |
+ style.setBorderTop(CellStyle.BORDER_THIN); |
|
| 216 |
+ Font font = wb.createFont(); |
|
| 217 |
+ font.setBoldweight(Font.BOLDWEIGHT_BOLD); //글씨 bold |
|
| 218 |
+ Cell cell = null; |
|
| 219 |
+ Row row = null; |
|
| 220 |
+ String fileName ="게시글 리스트"; |
|
| 221 |
+ String sheetTitle = ""; |
|
| 222 |
+ |
|
| 223 |
+ try{
|
|
| 224 |
+ List<BoardVO> bbsContentsList = bbsMngService.selectBbsContentsListExcelDownload(boardVO); |
|
| 225 |
+ |
|
| 226 |
+ { //화면 리스트
|
|
| 227 |
+ sheetTitle = "게시글 리스트" ; //제목 |
|
| 228 |
+ Sheet sheet = wb.createSheet(sheetTitle); |
|
| 229 |
+ row = sheet.createRow(0); |
|
| 230 |
+ for(int i=0 ; i < bbsContentsExcelValue.length ; i++) {
|
|
| 231 |
+ cell = row.createCell(i); |
|
| 232 |
+ cell.setCellStyle(style); |
|
| 233 |
+ cell.setCellValue(bbsContentsExcelValue[i][1]); |
|
| 234 |
+ } |
|
| 235 |
+ |
|
| 236 |
+ for(int i=0; i < bbsContentsList.size(); i++){
|
|
| 237 |
+ row = sheet.createRow(i+1); |
|
| 238 |
+ for(int j=0 ; j < bbsContentsExcelValue.length ; j++) {
|
|
| 239 |
+ cell = row.createCell(j); |
|
| 240 |
+ cell.setCellStyle(style); |
|
| 241 |
+ if(j==0) cell.setCellValue(i+1); //번호 |
|
| 242 |
+ if(j==1) cell.setCellValue(bbsContentsList.get(i).getNttSj()); //제목 |
|
| 243 |
+ if (j == 2) {
|
|
| 244 |
+ String rawContent = bbsContentsList.get(i).getNttCn(); |
|
| 245 |
+ if (rawContent != null) {
|
|
| 246 |
+ String decodedContent = HtmlUtils.htmlUnescape(rawContent); |
|
| 247 |
+ String plainText = decodedContent.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?>", "");
|
|
| 248 |
+ plainText = plainText.replaceAll("[\r\n]+", " ").replaceAll("<br>", "\n").replaceAll("<br />", "\n").trim();
|
|
| 249 |
+ String safeContent = plainText.length() > 300 ? plainText.substring(0, 300) : plainText; |
|
| 250 |
+ cell.setCellValue(safeContent); |
|
| 251 |
+ } else {
|
|
| 252 |
+ cell.setCellValue("");
|
|
| 253 |
+ } |
|
| 254 |
+ } |
|
| 255 |
+ if(j==3) cell.setCellValue(bbsContentsList.get(i).getNtcrId()); //등록ID |
|
| 256 |
+ if(j==4) cell.setCellValue(bbsContentsList.get(i).getNtcrNm()); //등록자 |
|
| 257 |
+ if(j==5) cell.setCellValue(bbsContentsList.get(i).getCommenterNms()); //답변자 |
|
| 258 |
+ if(j==6) cell.setCellValue(bbsContentsList.get(i).getFrstRegisterPnttm()); //등록일 |
|
| 259 |
+ } |
|
| 260 |
+ } |
|
| 261 |
+ } |
|
| 262 |
+ response.setHeader("Set-Cookie", "fileDownload=true; path=/");
|
|
| 263 |
+ SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA ); |
|
| 264 |
+ Date currentTime = new Date (); |
|
| 265 |
+ String mTime = mSimpleDateFormat.format ( currentTime ); |
|
| 266 |
+ fileName = fileName+"("+mTime+")";
|
|
| 267 |
+ |
|
| 268 |
+ response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
|
|
| 269 |
+ wb.write(response.getOutputStream()); |
|
| 270 |
+ |
|
| 271 |
+ }catch(Exception e) {
|
|
| 272 |
+ response.setHeader("Set-Cookie", "fileDownload=false; path=/");
|
|
| 273 |
+ response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
|
| 274 |
+ response.setHeader("Content-Type","text/html; charset=utf-8");
|
|
| 275 |
+ OutputStream out = null; |
|
| 276 |
+ try {
|
|
| 277 |
+ out = response.getOutputStream(); |
|
| 278 |
+ byte[] data = new String("fail..").getBytes();
|
|
| 279 |
+ out.write(data, 0, data.length); |
|
| 280 |
+ } catch(Exception ignore) {
|
|
| 281 |
+ ignore.printStackTrace(); |
|
| 282 |
+ } finally {
|
|
| 283 |
+ if(out != null) try { out.close(); } catch(Exception ignore) {}
|
|
| 284 |
+ } |
|
| 285 |
+ }finally {
|
|
| 286 |
+ // 디스크 적었던 임시파일을 제거합니다. |
|
| 287 |
+ wb.dispose(); |
|
| 288 |
+ try { wb.close(); } catch(Exception ignore) {}
|
|
| 289 |
+ } |
|
| 290 |
+ } |
|
| 185 | 291 |
|
| 186 | 292 |
|
| 187 | 293 |
/** |
--- src/main/java/itn/let/fax/admin/web/FaxAdmController.java
+++ src/main/java/itn/let/fax/admin/web/FaxAdmController.java
... | ... | @@ -9,6 +9,7 @@ |
| 9 | 9 |
import javax.servlet.http.HttpServletRequest; |
| 10 | 10 |
import javax.servlet.http.HttpServletResponse; |
| 11 | 11 |
|
| 12 |
+import itn.com.annotation.PersonalLog; |
|
| 12 | 13 |
import org.apache.commons.lang3.StringUtils; |
| 13 | 14 |
import org.slf4j.Logger; |
| 14 | 15 |
import org.slf4j.LoggerFactory; |
... | ... | @@ -99,6 +100,7 @@ |
| 99 | 100 |
* @return |
| 100 | 101 |
* @throws Exception |
| 101 | 102 |
*/ |
| 103 |
+ @PersonalLog(action = "조회", description = "팩스 발송내역", search = "#resultList.size()") |
|
| 102 | 104 |
@RequestMapping(value= {"/uss/ion/fax/faxAdmSendList.do"})
|
| 103 | 105 |
public String faxAdmSendList(@ModelAttribute("searchVO") FaxGroupDataVO faxGroupDataVO
|
| 104 | 106 |
, ModelMap model) throws Exception{
|
... | ... | @@ -165,6 +167,7 @@ |
| 165 | 167 |
* @return |
| 166 | 168 |
* @throws Exception |
| 167 | 169 |
*/ |
| 170 |
+ @PersonalLog(action = "조회", description = "팩스 발송내역", search = "#resultList.size()") |
|
| 168 | 171 |
@RequestMapping(value= {"/uss/ion/fax/faxAdmSendDetailList.do"})
|
| 169 | 172 |
public String faxAdmSendDetailList(@ModelAttribute("searchVO") FaxGroupDataVO faxGroupDataVO
|
| 170 | 173 |
, ModelMap model) throws Exception{
|
--- src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java
... | ... | @@ -11,6 +11,7 @@ |
| 11 | 11 |
import javax.servlet.http.HttpServletRequest; |
| 12 | 12 |
import javax.servlet.http.HttpServletResponse; |
| 13 | 13 |
|
| 14 |
+import itn.com.annotation.PersonalLog; |
|
| 14 | 15 |
import org.apache.poi.ss.usermodel.Cell; |
| 15 | 16 |
import org.apache.poi.ss.usermodel.CellStyle; |
| 16 | 17 |
import org.apache.poi.ss.usermodel.Font; |
... | ... | @@ -97,6 +98,7 @@ |
| 97 | 98 |
* @return "/uss/ion/kakaoat/SendKakaoATList.do" |
| 98 | 99 |
* @throws Exception |
| 99 | 100 |
*/ |
| 101 |
+ @PersonalLog(action = "조회", description = "카카오 발송내역", search = "#resultList.size()") |
|
| 100 | 102 |
@RequestMapping(value= {"/uss/ion/kakaoat/SendKakaoATList.do"})
|
| 101 | 103 |
public String sendKakaoATList(@ModelAttribute("searchVO") KakaoVO kakaoVO,
|
| 102 | 104 |
HttpServletRequest request , |
... | ... | @@ -173,10 +175,10 @@ |
| 173 | 175 |
return "/uss/ion/kakaoat/SendKakaoATList"; |
| 174 | 176 |
|
| 175 | 177 |
} |
| 176 |
- |
|
| 177 | 178 |
|
| 178 |
- |
|
| 179 |
- //문자 전송 리스트(전체) 엑셀 다운로드 |
|
| 179 |
+ |
|
| 180 |
+ |
|
| 181 |
+ @PersonalLog(action = "다운로드", description = "카카오 엑셀 다운로드", search = "#resultList.size()") |
|
| 180 | 182 |
@RequestMapping(value= {"/uss/ion/kakaoat/SendMsgExcelDownload.do"})
|
| 181 | 183 |
public void sendMsgExcelDownload( KakaoVO kakaoVO, |
| 182 | 184 |
HttpServletRequest request, |
... | ... | @@ -207,6 +209,7 @@ |
| 207 | 209 |
String sheetTitle = ""; |
| 208 | 210 |
try{
|
| 209 | 211 |
List<KakaoVO> resultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserList_advc(kakaoVO); |
| 212 |
+ model.addAttribute("resultList", resultList);
|
|
| 210 | 213 |
{ //화면 리스트
|
| 211 | 214 |
sheetTitle = "문자 전송 리스트(전체)" ; //제목 |
| 212 | 215 |
Sheet sheet = wb.createSheet(sheetTitle); |
... | ... | @@ -312,6 +315,7 @@ |
| 312 | 315 |
* uss/ion/msg/SendMsgDetailList.do(개별 문자리스트) |
| 313 | 316 |
* @throws Exception |
| 314 | 317 |
*/ |
| 318 |
+ @PersonalLog(action = "조회", description = "카카오 발송내역", search = "#resultList.size()") |
|
| 315 | 319 |
@RequestMapping(value= { "/uss/ion/kakaoat/SendKakaoATDetailList.do"})
|
| 316 | 320 |
public String sendKakaoATDetailList(@ModelAttribute("searchVO") KakaoVO searchVO,
|
| 317 | 321 |
HttpServletRequest request , |
--- src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoSendResultController.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoSendResultController.java
... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 |
import javax.servlet.http.HttpServletRequest; |
| 11 | 11 |
import javax.servlet.http.HttpServletResponse; |
| 12 | 12 |
|
| 13 |
+import itn.com.annotation.PersonalLog; |
|
| 13 | 14 |
import org.apache.poi.ss.usermodel.Cell; |
| 14 | 15 |
import org.apache.poi.ss.usermodel.CellStyle; |
| 15 | 16 |
import org.apache.poi.ss.usermodel.Font; |
... | ... | @@ -54,6 +55,7 @@ |
| 54 | 55 |
* @return "/uss/ion/kakaoat/sendresult/selectKakaoSendResultList.do" |
| 55 | 56 |
* @throws Exception |
| 56 | 57 |
*/ |
| 58 |
+ @PersonalLog(action = "조회", description = "카카오 발송내역", search = "#resultList.size()") |
|
| 57 | 59 |
@RequestMapping(value= {"/uss/ion/kakaoat/sendresult/selectKakaoSendResultList.do"})
|
| 58 | 60 |
public String selectKakaoSendResultList(@ModelAttribute("searchVO") MjonMsgResultCodeVO searchVO,
|
| 59 | 61 |
HttpServletRequest request , |
--- src/main/java/itn/let/mjo/addragency/web/AddrAgencyController.java
+++ src/main/java/itn/let/mjo/addragency/web/AddrAgencyController.java
... | ... | @@ -6,6 +6,7 @@ |
| 6 | 6 |
import javax.annotation.Resource; |
| 7 | 7 |
import javax.servlet.http.HttpServletRequest; |
| 8 | 8 |
|
| 9 |
+import itn.com.annotation.PersonalLog; |
|
| 9 | 10 |
import org.slf4j.Logger; |
| 10 | 11 |
import org.slf4j.LoggerFactory; |
| 11 | 12 |
import org.springframework.stereotype.Controller; |
... | ... | @@ -188,7 +189,7 @@ |
| 188 | 189 |
* @return |
| 189 | 190 |
* @throws Exception |
| 190 | 191 |
*/ |
| 191 |
- |
|
| 192 |
+ |
|
| 192 | 193 |
@RequestMapping(value= {"/uss/ion/addragency/selectAddrAgencyList.do"})
|
| 193 | 194 |
public String selectAddrAgencyList( |
| 194 | 195 |
HttpServletRequest request |
... | ... | @@ -216,7 +217,7 @@ |
| 216 | 217 |
addrAgencyVO.setUrl(request.getRequestURI()); |
| 217 | 218 |
|
| 218 | 219 |
|
| 219 |
- return "/uss/ion/addragency/AddrAgencyList"; |
|
| 220 |
+ return "/uss/ion/addragency/AddrAgencyList"; |
|
| 220 | 221 |
|
| 221 | 222 |
} |
| 222 | 223 |
|
... | ... | @@ -227,7 +228,7 @@ |
| 227 | 228 |
* @return |
| 228 | 229 |
* @throws Exception |
| 229 | 230 |
*/ |
| 230 |
- |
|
| 231 |
+ @PersonalLog(action = "조회", description = "주소록 입력 대행", search = "#resultList.size()") |
|
| 231 | 232 |
@RequestMapping(value= {"/uss/ion/addragency/selectAddrAgencyListAjax.do"})
|
| 232 | 233 |
public String selectAddrAgencyListAjaxAdmin( |
| 233 | 234 |
HttpServletRequest request |
+++ src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryService.java
... | ... | @@ -0,0 +1,14 @@ |
| 1 | +package itn.let.mjo.dashboardapi.service; | |
| 2 | + | |
| 3 | +/** | |
| 4 | + * 대시보드 요약 API 집계 서비스. | |
| 5 | + * 기존 대시보드 서비스 메서드를 조합해 raw 숫자 요약을 만든다(신규 SQL 없음). | |
| 6 | + */ | |
| 7 | +public interface DashboardSummaryService { | |
| 8 | + | |
| 9 | + /** | |
| 10 | + * @param baseDate "yyyy-MM-dd" 또는 null(오늘) | |
| 11 | + * @return 매출/회원/문자 요약 | |
| 12 | + */ | |
| 13 | + DashboardSummaryVO getDashboardSummary(String baseDate) throws Exception; | |
| 14 | +} |
+++ src/main/java/itn/let/mjo/dashboardapi/service/DashboardSummaryVO.java
... | ... | @@ -0,0 +1,96 @@ |
| 1 | +package itn.let.mjo.dashboardapi.service; | |
| 2 | + | |
| 3 | +import java.io.Serializable; | |
| 4 | +import java.util.ArrayList; | |
| 5 | +import java.util.List; | |
| 6 | + | |
| 7 | +import com.fasterxml.jackson.annotation.JsonProperty; | |
| 8 | +import lombok.Getter; | |
| 9 | +import lombok.Setter; | |
| 10 | + | |
| 11 | +/** | |
| 12 | + * 대시보드 요약 API(n8n→Slack) 응답 DTO. | |
| 13 | + * 앱은 표현 포맷 없이 raw 숫자만 제공한다(콤마/원화는 n8n에서 처리). | |
| 14 | + */ | |
| 15 | +@Getter | |
| 16 | +@Setter | |
| 17 | +public class DashboardSummaryVO implements Serializable { | |
| 18 | + | |
| 19 | + private static final long serialVersionUID = 1L; | |
| 20 | + | |
| 21 | + // 필드명을 success로 두어 Lombok 게터 isSuccess()와 동일 프로퍼티로 묶이게 한다. | |
| 22 | + // (필드명을 isSuccess로 두면 Jackson이 isSuccess/success 두 키를 모두 출력하는 문제가 있음) | |
| 23 | + @JsonProperty("isSuccess") | |
| 24 | + private boolean success = true; | |
| 25 | + private String msg = ""; | |
| 26 | + private String baseDate; | |
| 27 | + | |
| 28 | + private Sales sales = new Sales(); | |
| 29 | + private Members members = new Members(); | |
| 30 | + private Sms sms = new Sms(); | |
| 31 | + | |
| 32 | + /** 매출(VAT 포함, 단위: 원) */ | |
| 33 | + @Getter | |
| 34 | + @Setter | |
| 35 | + public static class Sales implements Serializable { | |
| 36 | + private static final long serialVersionUID = 1L; | |
| 37 | + private long todayAmt; | |
| 38 | + private List<AmtPoint> dayChart = new ArrayList<AmtPoint>(); | |
| 39 | + private List<AmtPoint> monthChart = new ArrayList<AmtPoint>(); | |
| 40 | + private long yearAmtSum; | |
| 41 | + } | |
| 42 | + | |
| 43 | + /** 금액 시계열 한 점 (label = "MM-DD" 또는 "N월") */ | |
| 44 | + @Getter | |
| 45 | + @Setter | |
| 46 | + public static class AmtPoint implements Serializable { | |
| 47 | + private static final long serialVersionUID = 1L; | |
| 48 | + private String label; | |
| 49 | + private long amt; | |
| 50 | + | |
| 51 | + public AmtPoint() { | |
| 52 | + } | |
| 53 | + | |
| 54 | + public AmtPoint(String label, long amt) { | |
| 55 | + this.label = label; | |
| 56 | + this.amt = amt; | |
| 57 | + } | |
| 58 | + } | |
| 59 | + | |
| 60 | + /** 회원 현황 */ | |
| 61 | + @Getter | |
| 62 | + @Setter | |
| 63 | + public static class Members implements Serializable { | |
| 64 | + private static final long serialVersionUID = 1L; | |
| 65 | + private int userNorCnt; | |
| 66 | + private int userComCnt; | |
| 67 | + private int mberNorTot; | |
| 68 | + private int mberBlockTot; | |
| 69 | + private int mberSecessTot; | |
| 70 | + private int cmpApply; | |
| 71 | + private int cmpApprove; | |
| 72 | + private int cmpReject; | |
| 73 | + private int todayExpireCnt; | |
| 74 | + private int todayStopCnt; | |
| 75 | + } | |
| 76 | + | |
| 77 | + /** 문자 발송 현황 */ | |
| 78 | + @Getter | |
| 79 | + @Setter | |
| 80 | + public static class Sms implements Serializable { | |
| 81 | + private static final long serialVersionUID = 1L; | |
| 82 | + private List<AgentStat> agents = new ArrayList<AgentStat>(); | |
| 83 | + private int todaySignupCnt; | |
| 84 | + } | |
| 85 | + | |
| 86 | + /** 전송사별 발송 통계 */ | |
| 87 | + @Getter | |
| 88 | + @Setter | |
| 89 | + public static class AgentStat implements Serializable { | |
| 90 | + private static final long serialVersionUID = 1L; | |
| 91 | + private String agentCode; | |
| 92 | + private int succCnt; | |
| 93 | + private int failCnt; | |
| 94 | + private int succRate; | |
| 95 | + } | |
| 96 | +} |
+++ src/main/java/itn/let/mjo/dashboardapi/service/impl/DashboardSummaryServiceImpl.java
... | ... | @@ -0,0 +1,226 @@ |
| 1 | +package itn.let.mjo.dashboardapi.service.impl; | |
| 2 | + | |
| 3 | +import java.text.SimpleDateFormat; | |
| 4 | +import java.util.Date; | |
| 5 | +import java.util.List; | |
| 6 | + | |
| 7 | +import javax.annotation.Resource; | |
| 8 | + | |
| 9 | +import org.springframework.stereotype.Service; | |
| 10 | + | |
| 11 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryService; | |
| 12 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryVO; | |
| 13 | +import itn.let.mjo.msg.service.MjonMsgService; | |
| 14 | +import itn.let.mjo.msg.service.MjonMsgStatVO; | |
| 15 | +import itn.let.mjo.msg.service.MjonMsgVO; | |
| 16 | +import itn.let.mjo.pay.service.MjonPayService; | |
| 17 | +import itn.let.mjo.pay.service.MjonPayVO; | |
| 18 | +import itn.let.sts.cst.service.EgovConectStatsService; | |
| 19 | +import itn.let.uss.umt.service.MberManageVO; | |
| 20 | + | |
| 21 | +@Service("dashboardSummaryService") | |
| 22 | +public class DashboardSummaryServiceImpl implements DashboardSummaryService { | |
| 23 | + | |
| 24 | + @Resource(name = "mjonPayService") | |
| 25 | + private MjonPayService mjonPayService; | |
| 26 | + | |
| 27 | + @Resource(name = "conectStatsService") | |
| 28 | + private EgovConectStatsService conectStatsService; | |
| 29 | + | |
| 30 | + @Resource(name = "mjonMsgService") | |
| 31 | + private MjonMsgService mjonMsgService; | |
| 32 | + | |
| 33 | + @Override | |
| 34 | + public DashboardSummaryVO getDashboardSummary(String baseDate) throws Exception { | |
| 35 | + DashboardSummaryVO vo = new DashboardSummaryVO(); | |
| 36 | + | |
| 37 | + if (baseDate == null || baseDate.trim().isEmpty()) { | |
| 38 | + baseDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); | |
| 39 | + } | |
| 40 | + vo.setBaseDate(baseDate); | |
| 41 | + | |
| 42 | + // 지표 블록별 try/catch: 개별 실패가 전체 응답을 막지 않도록 한다. | |
| 43 | + try { | |
| 44 | + fillSales(vo.getSales()); | |
| 45 | + } catch (Exception e) { | |
| 46 | + vo.setSuccess(false); | |
| 47 | + vo.setMsg(appendMsg(vo.getMsg(), "sales:" + e.getMessage())); | |
| 48 | + } | |
| 49 | + try { | |
| 50 | + fillMembers(vo.getMembers()); | |
| 51 | + } catch (Exception e) { | |
| 52 | + vo.setSuccess(false); | |
| 53 | + vo.setMsg(appendMsg(vo.getMsg(), "members:" + e.getMessage())); | |
| 54 | + } | |
| 55 | + try { | |
| 56 | + fillSms(vo.getSms()); | |
| 57 | + } catch (Exception e) { | |
| 58 | + vo.setSuccess(false); | |
| 59 | + vo.setMsg(appendMsg(vo.getMsg(), "sms:" + e.getMessage())); | |
| 60 | + } | |
| 61 | + return vo; | |
| 62 | + } | |
| 63 | + | |
| 64 | + /** 매출(일/월/연) — selectPayDayChartDashboard, selectPayMonthChartDashboard, selectPayYearChart 재사용 */ | |
| 65 | + private void fillSales(DashboardSummaryVO.Sales sales) throws Exception { | |
| 66 | + // 일별(최근 4일, 최신순) | |
| 67 | + MjonPayVO dayReq = new MjonPayVO(); | |
| 68 | + dayReq.setFirstIndex(0); | |
| 69 | + dayReq.setRecordCountPerPage(4); | |
| 70 | + dayReq.setSearchSortCnd("regDate"); | |
| 71 | + dayReq.setSearchSortOrd("desc"); | |
| 72 | + List<MjonPayVO> dayList = mjonPayService.selectPayDayChartDashboard(dayReq); | |
| 73 | + if (dayList != null) { | |
| 74 | + for (MjonPayVO p : dayList) { | |
| 75 | + String label = p.getRegDate(); | |
| 76 | + if (label != null && label.length() >= 10) { | |
| 77 | + label = label.substring(5, 10); // MM-DD | |
| 78 | + } | |
| 79 | + sales.getDayChart().add(new DashboardSummaryVO.AmtPoint(label, toLong(p.getAmtTotSum()))); | |
| 80 | + } | |
| 81 | + if (!dayList.isEmpty()) { | |
| 82 | + sales.setTodayAmt(toLong(dayList.get(0).getAmtTotSum())); // 최신순 첫 행 = 당일 | |
| 83 | + } | |
| 84 | + } | |
| 85 | + | |
| 86 | + // 월별(최근 4개월, 최신순) | |
| 87 | + MjonPayVO monthReq = new MjonPayVO(); | |
| 88 | + monthReq.setFirstIndex(0); | |
| 89 | + monthReq.setRecordCountPerPage(4); | |
| 90 | + monthReq.setSearchSortCnd("regDate"); | |
| 91 | + monthReq.setSearchSortOrd("desc"); | |
| 92 | + List<MjonPayVO> monthList = mjonPayService.selectPayMonthChartDashboard(monthReq); | |
| 93 | + if (monthList != null) { | |
| 94 | + for (MjonPayVO p : monthList) { | |
| 95 | + String label = p.getRegDate(); | |
| 96 | + if (label != null && label.length() >= 7) { | |
| 97 | + label = Integer.parseInt(label.substring(5, 7)) + "월"; | |
| 98 | + } | |
| 99 | + sales.getMonthChart().add(new DashboardSummaryVO.AmtPoint(label, toLong(p.getAmtTotSum()))); | |
| 100 | + } | |
| 101 | + } | |
| 102 | + | |
| 103 | + // 연간 누적 | |
| 104 | + MjonPayVO yearInfo = mjonPayService.selectPayYearChart(new MjonPayVO()); | |
| 105 | + if (yearInfo != null) { | |
| 106 | + sales.setYearAmtSum(toLong(yearInfo.getAmtYearSum())); | |
| 107 | + } | |
| 108 | + } | |
| 109 | + | |
| 110 | + /** 회원 현황 — EgovMainController.selectMemberStatsAjax 로직 재현 */ | |
| 111 | + private void fillMembers(DashboardSummaryVO.Members m) throws Exception { | |
| 112 | + MberManageVO req = new MberManageVO(); | |
| 113 | + | |
| 114 | + req.setHstSttus("01"); | |
| 115 | + List<MberManageVO> apply = conectStatsService.selectMberCmpHstStatsDashboard(req); | |
| 116 | + req.setHstSttus("02"); | |
| 117 | + List<MberManageVO> approve = conectStatsService.selectMberCmpHstStatsDashboard(req); | |
| 118 | + req.setHstSttus("03"); | |
| 119 | + List<MberManageVO> reject = conectStatsService.selectMberCmpHstStatsDashboard(req); | |
| 120 | + m.setCmpApply((apply == null || apply.isEmpty()) ? 0 : apply.get(0).getTotCnt()); | |
| 121 | + m.setCmpApprove((approve == null || approve.isEmpty()) ? 0 : approve.get(0).getTotCnt()); | |
| 122 | + m.setCmpReject((reject == null || reject.isEmpty()) ? 0 : reject.get(0).getTotCnt()); | |
| 123 | + | |
| 124 | + MberManageVO totReq = new MberManageVO(); | |
| 125 | + totReq.setDept("P"); | |
| 126 | + List<MberManageVO> priv = conectStatsService.selectMberTotStats(totReq); | |
| 127 | + totReq.setDept("C"); | |
| 128 | + List<MberManageVO> comp = conectStatsService.selectMberTotStats(totReq); | |
| 129 | + | |
| 130 | + if (priv != null) { | |
| 131 | + for (MberManageVO v : priv) { | |
| 132 | + accumulateMember(m, v, true); | |
| 133 | + } | |
| 134 | + } | |
| 135 | + if (comp != null) { | |
| 136 | + for (MberManageVO v : comp) { | |
| 137 | + accumulateMember(m, v, false); | |
| 138 | + } | |
| 139 | + } | |
| 140 | + | |
| 141 | + String statStr = conectStatsService.selectTodaySttCountString(totReq); | |
| 142 | + if (statStr != null) { | |
| 143 | + String[] split = statStr.split("_"); | |
| 144 | + if (split.length == 3) { | |
| 145 | + m.setTodayExpireCnt(toInt(split[0])); | |
| 146 | + m.setTodayStopCnt(toInt(split[1])); | |
| 147 | + // split[2]=환불신청수는 1차 범위 제외 | |
| 148 | + } | |
| 149 | + } | |
| 150 | + } | |
| 151 | + | |
| 152 | + private void accumulateMember(DashboardSummaryVO.Members m, MberManageVO v, boolean isPrivate) { | |
| 153 | + String sttus = v.getMberSttus(); | |
| 154 | + int cnt = v.getTotCnt(); | |
| 155 | + if ("Y".equals(sttus)) { | |
| 156 | + if (isPrivate) { | |
| 157 | + m.setUserNorCnt(cnt); | |
| 158 | + } else { | |
| 159 | + m.setUserComCnt(cnt); | |
| 160 | + } | |
| 161 | + m.setMberNorTot(m.getMberNorTot() + cnt); | |
| 162 | + } else if ("B".equals(sttus)) { | |
| 163 | + m.setMberBlockTot(m.getMberBlockTot() + cnt); | |
| 164 | + } else if ("N".equals(sttus)) { | |
| 165 | + m.setMberSecessTot(m.getMberSecessTot() + cnt); | |
| 166 | + } | |
| 167 | + } | |
| 168 | + | |
| 169 | + /** 문자 발송 현황 — selectAgentSmsCountStatMainList, selectMemDayChartDashboard 재사용 */ | |
| 170 | + private void fillSms(DashboardSummaryVO.Sms s) throws Exception { | |
| 171 | + MjonMsgStatVO statReq = new MjonMsgStatVO(); | |
| 172 | + statReq.setFirstIndex(0); | |
| 173 | + statReq.setRecordCountPerPage(3); | |
| 174 | + List<MjonMsgStatVO> agents = mjonMsgService.selectAgentSmsCountStatMainList(statReq); | |
| 175 | + if (agents != null) { | |
| 176 | + for (MjonMsgStatVO a : agents) { | |
| 177 | + DashboardSummaryVO.AgentStat stat = new DashboardSummaryVO.AgentStat(); | |
| 178 | + stat.setAgentCode(a.getAgentCode()); | |
| 179 | + int succ = a.getSumSuccCnt(); | |
| 180 | + int fail = a.getSumFailCnt(); | |
| 181 | + stat.setSuccCnt(succ); | |
| 182 | + stat.setFailCnt(fail); | |
| 183 | + int total = succ + fail; | |
| 184 | + stat.setSuccRate(total == 0 ? 0 : (int) Math.round(succ * 100.0 / total)); | |
| 185 | + s.getAgents().add(stat); | |
| 186 | + } | |
| 187 | + } | |
| 188 | + | |
| 189 | + MjonMsgVO memReq = new MjonMsgVO(); | |
| 190 | + memReq.setFirstIndex(0); | |
| 191 | + memReq.setRecordCountPerPage(4); | |
| 192 | + memReq.setSearchSortCnd("regDate"); | |
| 193 | + memReq.setSearchSortOrd("desc"); | |
| 194 | + List<MjonMsgVO> memDay = mjonMsgService.selectMemDayChartDashboard(memReq); | |
| 195 | + if (memDay != null && !memDay.isEmpty()) { | |
| 196 | + s.setTodaySignupCnt(memDay.get(0).getRegCount()); | |
| 197 | + } | |
| 198 | + } | |
| 199 | + | |
| 200 | + /** "12345", "12,345", "12345.0", null → long(0) 안전 변환 */ | |
| 201 | + private long toLong(String s) { | |
| 202 | + if (s == null) { | |
| 203 | + return 0L; | |
| 204 | + } | |
| 205 | + String digits = s.replaceAll("[^0-9-]", ""); | |
| 206 | + if (digits.isEmpty() || "-".equals(digits)) { | |
| 207 | + return 0L; | |
| 208 | + } | |
| 209 | + try { | |
| 210 | + return Long.parseLong(digits); | |
| 211 | + } catch (NumberFormatException e) { | |
| 212 | + return 0L; | |
| 213 | + } | |
| 214 | + } | |
| 215 | + | |
| 216 | + private int toInt(String s) { | |
| 217 | + return (int) toLong(s); | |
| 218 | + } | |
| 219 | + | |
| 220 | + private String appendMsg(String base, String add) { | |
| 221 | + if (base == null || base.isEmpty()) { | |
| 222 | + return add; | |
| 223 | + } | |
| 224 | + return base + "; " + add; | |
| 225 | + } | |
| 226 | +} |
+++ src/main/java/itn/let/mjo/dashboardapi/web/DashboardApiController.java
... | ... | @@ -0,0 +1,29 @@ |
| 1 | +package itn.let.mjo.dashboardapi.web; | |
| 2 | + | |
| 3 | +import javax.annotation.Resource; | |
| 4 | + | |
| 5 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 6 | +import org.springframework.web.bind.annotation.RequestMethod; | |
| 7 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 8 | +import org.springframework.web.bind.annotation.RestController; | |
| 9 | + | |
| 10 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryService; | |
| 11 | +import itn.let.mjo.dashboardapi.service.DashboardSummaryVO; | |
| 12 | + | |
| 13 | +/** | |
| 14 | + * 대시보드 요약 JSON API(n8n→Slack 전용). | |
| 15 | + * 인증은 DashboardApiAuthInterceptor(토큰 헤더)가 담당한다. | |
| 16 | + * 메서드명은 select* 가 아니어서 관리자 로그 AOP 대상에서 제외된다. | |
| 17 | + */ | |
| 18 | +@RestController | |
| 19 | +public class DashboardApiController { | |
| 20 | + | |
| 21 | + @Resource(name = "dashboardSummaryService") | |
| 22 | + private DashboardSummaryService dashboardSummaryService; | |
| 23 | + | |
| 24 | + @RequestMapping(value = "/api/dashboard/summary.do", method = RequestMethod.GET) | |
| 25 | + public DashboardSummaryVO getDashboardSummary( | |
| 26 | + @RequestParam(value = "date", required = false) String date) throws Exception { | |
| 27 | + return dashboardSummaryService.getDashboardSummary(date); | |
| 28 | + } | |
| 29 | +} |
+++ src/main/java/itn/let/mjo/msg/service/EmployeeCertService.java
... | ... | @@ -0,0 +1,15 @@ |
| 1 | +package itn.let.mjo.msg.service; | |
| 2 | + | |
| 3 | +import java.util.List; | |
| 4 | + | |
| 5 | +public interface EmployeeCertService { | |
| 6 | + | |
| 7 | + List<EmployeeCertVO> selectEmployeeCertList(EmployeeCertVO searchVO) throws Exception; | |
| 8 | + int selectEmployeeCertListCnt(EmployeeCertVO searchVO) throws Exception; | |
| 9 | + | |
| 10 | + EmployeeCertVO selectEmployeeCertDetail(EmployeeCertVO searchVO) throws Exception; | |
| 11 | + | |
| 12 | + List<EmployeeCertVO> selectEmployeeCertHstryList(EmployeeCertVO searchVO) throws Exception; | |
| 13 | + | |
| 14 | + void processEmployeeCert(EmployeeCertVO employeeCertVO) throws Exception; | |
| 15 | +} |
+++ src/main/java/itn/let/mjo/msg/service/EmployeeCertVO.java
... | ... | @@ -0,0 +1,38 @@ |
| 1 | +package itn.let.mjo.msg.service; | |
| 2 | + | |
| 3 | +import itn.com.cmm.ComDefaultVO; | |
| 4 | +import itn.com.utl.page.PageableVO; | |
| 5 | +import lombok.Getter; | |
| 6 | +import lombok.Setter; | |
| 7 | + | |
| 8 | +@Setter | |
| 9 | +@Getter | |
| 10 | +public class EmployeeCertVO extends ComDefaultVO implements PageableVO { | |
| 11 | + | |
| 12 | + private static final long serialVersionUID = 1L; | |
| 13 | + | |
| 14 | + private String mberId; | |
| 15 | + private String mberNm; | |
| 16 | + private String bizNo; | |
| 17 | + private String managerNm; | |
| 18 | + private String employeeCertHstrySeq; | |
| 19 | + private Integer certCnt; | |
| 20 | + private Integer applyCnt; | |
| 21 | + private String authYnTxt; | |
| 22 | + private String agreeYn; | |
| 23 | + private String agreePnttm; | |
| 24 | + private String atchFileId; | |
| 25 | + private String dept; | |
| 26 | + private String rejectCode; | |
| 27 | + private String rejectCodeTxt; | |
| 28 | + private String rejectReason; | |
| 29 | + private String lastHstrySeq; | |
| 30 | + private String authHstrySeq; | |
| 31 | + private String frstRegistPnttm; | |
| 32 | + private String lastUpdusrId; | |
| 33 | + private String lastUpdusrNm; | |
| 34 | + private String lastUpdtPnttm; | |
| 35 | + private String authYn; | |
| 36 | + | |
| 37 | + private String searchCondition2; | |
| 38 | +} |
+++ src/main/java/itn/let/mjo/msg/service/impl/EmployeeCertDAO.java
... | ... | @@ -0,0 +1,43 @@ |
| 1 | +package itn.let.mjo.msg.service.impl; | |
| 2 | + | |
| 3 | +import java.util.List; | |
| 4 | + | |
| 5 | +import org.springframework.stereotype.Repository; | |
| 6 | + | |
| 7 | +import egovframework.rte.psl.dataaccess.EgovAbstractDAO; | |
| 8 | +import itn.let.mjo.msg.service.EmployeeCertVO; | |
| 9 | + | |
| 10 | +@Repository("employeeCertDAO") | |
| 11 | +public class EmployeeCertDAO extends EgovAbstractDAO { | |
| 12 | + | |
| 13 | + @SuppressWarnings("unchecked") | |
| 14 | + public List<EmployeeCertVO> selectEmployeeCertList(EmployeeCertVO searchVO) { | |
| 15 | + return (List<EmployeeCertVO>) list("employeeCertDAO.selectEmployeeCertList", searchVO); | |
| 16 | + } | |
| 17 | + | |
| 18 | + public int selectEmployeeCertListCnt(EmployeeCertVO searchVO) { | |
| 19 | + return (Integer) select("employeeCertDAO.selectEmployeeCertListCnt", searchVO); | |
| 20 | + } | |
| 21 | + | |
| 22 | + public EmployeeCertVO selectEmployeeCertDetail(EmployeeCertVO searchVO) { | |
| 23 | + return (EmployeeCertVO) select("employeeCertDAO.selectEmployeeCertDetail", searchVO); | |
| 24 | + } | |
| 25 | + | |
| 26 | + @SuppressWarnings("unchecked") | |
| 27 | + public List<EmployeeCertVO> selectEmployeeCertHstryList(EmployeeCertVO searchVO) { | |
| 28 | + return (List<EmployeeCertVO>) list("employeeCertDAO.selectEmployeeCertHstryList", searchVO); | |
| 29 | + } | |
| 30 | + | |
| 31 | + public EmployeeCertVO selectEmployeeCertForUpdate(EmployeeCertVO employeeCertVO) { | |
| 32 | + return (EmployeeCertVO) select("employeeCertDAO.selectEmployeeCertForUpdate", employeeCertVO); | |
| 33 | + } | |
| 34 | + | |
| 35 | + public int updateEmployeeCertHstryAuth(EmployeeCertVO employeeCertVO) { | |
| 36 | + return update("employeeCertDAO.updateEmployeeCertHstryAuth", employeeCertVO); | |
| 37 | + } | |
| 38 | + | |
| 39 | + public int refreshEmployeeCertApproval(EmployeeCertVO employeeCertVO) { | |
| 40 | + return update("employeeCertDAO.refreshEmployeeCertApproval", employeeCertVO); | |
| 41 | + } | |
| 42 | + | |
| 43 | +} |
+++ src/main/java/itn/let/mjo/msg/service/impl/EmployeeCertServiceImpl.java
... | ... | @@ -0,0 +1,99 @@ |
| 1 | +package itn.let.mjo.msg.service.impl; | |
| 2 | + | |
| 3 | +import java.util.List; | |
| 4 | + | |
| 5 | +import javax.annotation.Resource; | |
| 6 | + | |
| 7 | +import org.springframework.stereotype.Service; | |
| 8 | +import org.springframework.transaction.annotation.Transactional; | |
| 9 | + | |
| 10 | +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
| 11 | +import itn.let.mjo.msg.service.EmployeeCertService; | |
| 12 | +import itn.let.mjo.msg.service.EmployeeCertVO; | |
| 13 | + | |
| 14 | +import static itn.com.cmm.util.StringUtil2.isEmpty; | |
| 15 | +import static itn.com.cmm.util.StringUtil2.stringValue; | |
| 16 | + | |
| 17 | +@Service("employeeCertService") | |
| 18 | +public class EmployeeCertServiceImpl extends EgovAbstractServiceImpl implements EmployeeCertService { | |
| 19 | + | |
| 20 | + @Resource(name = "employeeCertDAO") | |
| 21 | + private EmployeeCertDAO employeeCertDAO; | |
| 22 | + | |
| 23 | + @Override | |
| 24 | + public List<EmployeeCertVO> selectEmployeeCertList(EmployeeCertVO searchVO) { | |
| 25 | + return employeeCertDAO.selectEmployeeCertList(searchVO); | |
| 26 | + } | |
| 27 | + | |
| 28 | + @Override | |
| 29 | + public int selectEmployeeCertListCnt(EmployeeCertVO searchVO) throws Exception { | |
| 30 | + return employeeCertDAO.selectEmployeeCertListCnt(searchVO); | |
| 31 | + } | |
| 32 | + | |
| 33 | + | |
| 34 | + @Override | |
| 35 | + public EmployeeCertVO selectEmployeeCertDetail(EmployeeCertVO searchVO) { | |
| 36 | + return employeeCertDAO.selectEmployeeCertDetail(searchVO); | |
| 37 | + } | |
| 38 | + | |
| 39 | + @Override | |
| 40 | + public List<EmployeeCertVO> selectEmployeeCertHstryList(EmployeeCertVO searchVO) { | |
| 41 | + return employeeCertDAO.selectEmployeeCertHstryList(searchVO); | |
| 42 | + } | |
| 43 | + | |
| 44 | + @Override | |
| 45 | + @Transactional(rollbackFor = Exception.class) | |
| 46 | + public void processEmployeeCert(EmployeeCertVO employeeCertVO) throws Exception { | |
| 47 | + validateProcessRequest(employeeCertVO); | |
| 48 | + | |
| 49 | + EmployeeCertVO current = employeeCertDAO.selectEmployeeCertForUpdate(employeeCertVO); | |
| 50 | + if (current == null) { | |
| 51 | + throw new IllegalStateException("종사자 수 인증 신청정보를 찾을 수 없습니다."); | |
| 52 | + } | |
| 53 | + | |
| 54 | + employeeCertVO.setMberId(current.getMberId()); | |
| 55 | + employeeCertVO.setApplyCnt(current.getApplyCnt()); | |
| 56 | + employeeCertVO.setCertCnt(current.getApplyCnt()); | |
| 57 | + | |
| 58 | + if (employeeCertDAO.updateEmployeeCertHstryAuth(employeeCertVO) != 1) { | |
| 59 | + throw new IllegalStateException("종사자 수 인증 상태 변경에 실패했습니다."); | |
| 60 | + } | |
| 61 | + if (employeeCertDAO.refreshEmployeeCertApproval(employeeCertVO) != 1) { | |
| 62 | + throw new IllegalStateException("인증 종사자 수 반영에 실패했습니다."); | |
| 63 | + } | |
| 64 | + } | |
| 65 | + | |
| 66 | + private void validateProcessRequest(EmployeeCertVO employeeCertVO) { | |
| 67 | + if (employeeCertVO == null || isEmpty(employeeCertVO.getEmployeeCertHstrySeq())) { | |
| 68 | + throw new IllegalArgumentException("종사자 수 인증 신청정보가 없습니다."); | |
| 69 | + } | |
| 70 | + | |
| 71 | + String authYn = stringValue(employeeCertVO.getAuthYn()); | |
| 72 | + if (!("Y".equals(authYn) || "C".equals(authYn))) { | |
| 73 | + throw new IllegalArgumentException("승인 또는 반려 상태를 선택해 주세요."); | |
| 74 | + } | |
| 75 | + if (isEmpty(employeeCertVO.getLastUpdusrId())) { | |
| 76 | + throw new IllegalArgumentException("관리자 정보를 확인할 수 없습니다."); | |
| 77 | + } | |
| 78 | + | |
| 79 | + if ("C".equals(authYn)) { | |
| 80 | + String rejectCode = stringValue(employeeCertVO.getRejectCode()); | |
| 81 | + if (rejectCode.isEmpty()) { | |
| 82 | + throw new IllegalArgumentException("반려 사유 유형을 선택해 주세요."); | |
| 83 | + } | |
| 84 | + String rejectReason = stringValue(employeeCertVO.getRejectReason()).trim(); | |
| 85 | + if (rejectReason.isEmpty()) { | |
| 86 | + throw new IllegalArgumentException("반려 사유를 입력해 주세요."); | |
| 87 | + } | |
| 88 | + employeeCertVO.setRejectReason(rejectReason); | |
| 89 | + } else { | |
| 90 | + employeeCertVO.setRejectCode(null); | |
| 91 | + employeeCertVO.setRejectReason(null); | |
| 92 | + } | |
| 93 | + | |
| 94 | + String rejectReason = stringValue(employeeCertVO.getRejectReason()); | |
| 95 | + if (rejectReason.length() > 1000) { | |
| 96 | + throw new IllegalArgumentException("반려 사유는 1,000자 이하로 입력해 주세요."); | |
| 97 | + } | |
| 98 | + } | |
| 99 | +} |
+++ src/main/java/itn/let/mjo/msg/web/EmployeeCertController.java
... | ... | @@ -0,0 +1,159 @@ |
| 1 | +package itn.let.mjo.msg.web; | |
| 2 | + | |
| 3 | +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; | |
| 4 | +import itn.com.annotation.PersonalLog; | |
| 5 | +import itn.com.cmm.ComDefaultCodeVO; | |
| 6 | +import itn.com.cmm.service.EgovCmmUseService; | |
| 7 | +import itn.com.cmm.service.EgovFileMngService; | |
| 8 | +import itn.com.cmm.service.FileVO; | |
| 9 | +import itn.com.cmm.util.PdfUtil; | |
| 10 | +import itn.com.cmm.util.StringUtil; | |
| 11 | +import itn.com.utl.page.PaginationUtil; | |
| 12 | +import itn.let.mjo.msg.service.EmployeeCertService; | |
| 13 | +import itn.let.mjo.msg.service.EmployeeCertVO; | |
| 14 | +import org.springframework.stereotype.Controller; | |
| 15 | +import org.springframework.ui.Model; | |
| 16 | +import org.springframework.web.bind.annotation.ModelAttribute; | |
| 17 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 18 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 19 | +import org.springframework.web.servlet.mvc.support.RedirectAttributes; | |
| 20 | + | |
| 21 | +import javax.annotation.Resource; | |
| 22 | +import java.util.ArrayList; | |
| 23 | +import java.util.Arrays; | |
| 24 | +import java.util.List; | |
| 25 | + | |
| 26 | +@Controller | |
| 27 | +public class EmployeeCertController { | |
| 28 | + | |
| 29 | + @Resource(name = "employeeCertService") | |
| 30 | + private EmployeeCertService employeeCertService; | |
| 31 | + | |
| 32 | + @Resource(name = "EgovFileMngService") | |
| 33 | + private EgovFileMngService fileMngService; | |
| 34 | + | |
| 35 | + @Resource(name = "EgovCmmUseService") | |
| 36 | + private EgovCmmUseService cmmUseService; | |
| 37 | + | |
| 38 | + @PersonalLog(action = "조회", description = "종사자 수 인증") | |
| 39 | + @RequestMapping("/uss/ion/msg/EmployeeCertList.do") | |
| 40 | + public String EmployeeCertList( | |
| 41 | + @ModelAttribute("searchVO") EmployeeCertVO searchVO, | |
| 42 | + Model model) throws Exception{ | |
| 43 | + PaginationInfo paginationInfo = PaginationUtil.init(searchVO); | |
| 44 | + List<EmployeeCertVO> result = employeeCertService.selectEmployeeCertList(searchVO); | |
| 45 | + int totCnt = employeeCertService.selectEmployeeCertListCnt(searchVO); | |
| 46 | + paginationInfo.setTotalRecordCount(totCnt); | |
| 47 | + | |
| 48 | + model.addAttribute("resultList", result); | |
| 49 | + model.addAttribute("paginationInfo", paginationInfo); | |
| 50 | + return "uss/ion/msg/EmployeeCertList"; | |
| 51 | + } | |
| 52 | + | |
| 53 | + @PersonalLog(action = "조회", description = "종사자 수 인증 상세") | |
| 54 | + @RequestMapping("/uss/ion/msg/EmployeeCertDetail.do") | |
| 55 | + public String EmployeeCertDetail( | |
| 56 | + @RequestParam("employeeCertHstrySeq") String employeeCertHstrySeq, | |
| 57 | + Model model, | |
| 58 | + RedirectAttributes redirectAttributes) throws Exception { | |
| 59 | + if (StringUtil.isEmpty(employeeCertHstrySeq)) { | |
| 60 | + redirectAttributes.addFlashAttribute("message", "종사자 수 인증 신청정보가 없습니다."); | |
| 61 | + return "redirect:/uss/ion/msg/EmployeeCertList.do"; | |
| 62 | + } | |
| 63 | + | |
| 64 | + EmployeeCertVO searchVO = new EmployeeCertVO(); | |
| 65 | + searchVO.setEmployeeCertHstrySeq(employeeCertHstrySeq); | |
| 66 | + EmployeeCertVO employeeCertVO = employeeCertService.selectEmployeeCertDetail(searchVO); | |
| 67 | + if (employeeCertVO == null) { | |
| 68 | + redirectAttributes.addFlashAttribute("message", "종사자 수 인증 신청정보를 찾을 수 없습니다."); | |
| 69 | + return "redirect:/uss/ion/msg/EmployeeCertList.do"; | |
| 70 | + } | |
| 71 | + | |
| 72 | + EmployeeCertVO historySearchVO = new EmployeeCertVO(); | |
| 73 | + historySearchVO.setMberId(employeeCertVO.getMberId()); | |
| 74 | + model.addAttribute("employeeCertVO", employeeCertVO); | |
| 75 | + model.addAttribute("historyList", employeeCertService.selectEmployeeCertHstryList(historySearchVO)); | |
| 76 | + | |
| 77 | + if (StringUtil.isNotEmpty(employeeCertVO.getAtchFileId())) { | |
| 78 | + FileVO fileVO = new FileVO(); | |
| 79 | + fileVO.setAtchFileId(employeeCertVO.getAtchFileId()); | |
| 80 | + model.addAttribute("fileList", fileMngService.selectFileInfs(fileVO)); | |
| 81 | + } | |
| 82 | + return "uss/ion/msg/EmployeeCertDetail"; | |
| 83 | + } | |
| 84 | + | |
| 85 | + @PersonalLog(action = "조회", description = "종사자 수 인증 반려 팝업") | |
| 86 | + @RequestMapping("/uss/ion/msg/EmployeeCertRejectPop.do") | |
| 87 | + public String employeeCertRejectPop( | |
| 88 | + @RequestParam("employeeCertHstrySeq") String employeeCertHstrySeq, | |
| 89 | + Model model) throws Exception { | |
| 90 | + if (StringUtil.isEmpty(employeeCertHstrySeq)) { | |
| 91 | + throw new IllegalArgumentException("종사자 수 인증 신청정보가 없습니다."); | |
| 92 | + } | |
| 93 | + | |
| 94 | + EmployeeCertVO searchVO = new EmployeeCertVO(); | |
| 95 | + searchVO.setEmployeeCertHstrySeq(employeeCertHstrySeq); | |
| 96 | + EmployeeCertVO employeeCertVO = employeeCertService.selectEmployeeCertDetail(searchVO); | |
| 97 | + if (employeeCertVO == null) { | |
| 98 | + throw new IllegalArgumentException("종사자 수 인증 신청정보를 찾을 수 없습니다."); | |
| 99 | + } | |
| 100 | + | |
| 101 | + ComDefaultCodeVO codeVO = new ComDefaultCodeVO(); | |
| 102 | + codeVO.setCodeId("EMP001"); | |
| 103 | + model.addAttribute("employeeCertVO", employeeCertVO); | |
| 104 | + model.addAttribute("rejectCodeList", cmmUseService.selectCmmCodeDetail(codeVO)); | |
| 105 | + return "uss/ion/msg/EmployeeCertRejectPop"; | |
| 106 | + } | |
| 107 | + | |
| 108 | + @PersonalLog(action = "조회", description = "종사자 수 인증 증빙서류 미리보기") | |
| 109 | + @RequestMapping("/uss/ion/msg/EmpPdfView.do") | |
| 110 | + public String empPdfView( | |
| 111 | + @ModelAttribute FileVO fileVO, | |
| 112 | + @RequestParam(value = "employeeCertHstrySeq", required = false) String employeeCertHstrySeq, | |
| 113 | + Model model) throws Exception { | |
| 114 | + List<FileVO> fileList = fileMngService.selectFileInfs(fileVO); | |
| 115 | + FileVO selectedFile = fileMngService.selectFileInf(fileVO); | |
| 116 | + if (selectedFile == null && !fileList.isEmpty()) { | |
| 117 | + selectedFile = fileList.get(0); | |
| 118 | + fileVO.setFileSn(selectedFile.getFileSn()); | |
| 119 | + } | |
| 120 | + String pdfPath = ""; | |
| 121 | + String fileType = ""; | |
| 122 | + | |
| 123 | + if (selectedFile != null && StringUtil.isNotEmpty(selectedFile.getFileExtsn())) { | |
| 124 | + String fileExtension = selectedFile.getFileExtsn().toLowerCase(); | |
| 125 | + List<String> imageExtensions = new ArrayList<>(Arrays.asList( | |
| 126 | + "bmp", "gif", "jpeg", "jpg", "png", "tif", "tiff", "psd", "rle")); | |
| 127 | + | |
| 128 | + if ("pdf".equals(fileExtension)) { | |
| 129 | + pdfPath = "/cmm/fms/pdfView.do?atchFileId=" + selectedFile.getAtchFileId() | |
| 130 | + + "&fileSn=" + selectedFile.getFileSn(); | |
| 131 | + fileType = "pdf"; | |
| 132 | + } else { | |
| 133 | + String storePath = selectedFile.getFileStreCours() + selectedFile.getStreFileNm(); | |
| 134 | + pdfPath = "/cmm/fms/FileDowntest.do?fileNm=" | |
| 135 | + + PdfUtil.makeImgPdf(storePath, selectedFile.getFileExtsn()); | |
| 136 | + fileType = imageExtensions.contains(fileExtension) ? "img" : "etc"; | |
| 137 | + } | |
| 138 | + } | |
| 139 | + | |
| 140 | + model.addAttribute("pdfPath", pdfPath); | |
| 141 | + model.addAttribute("fileType", fileType); | |
| 142 | + model.addAttribute("atchFileId", fileVO.getAtchFileId()); | |
| 143 | + model.addAttribute("fileSn", fileVO.getFileSn()); | |
| 144 | + model.addAttribute("selectedFile", selectedFile); | |
| 145 | + model.addAttribute("fileList", fileList); | |
| 146 | + model.addAttribute("employeeCertHstrySeq", employeeCertHstrySeq); | |
| 147 | + | |
| 148 | + if (StringUtil.isNotEmpty(employeeCertHstrySeq)) { | |
| 149 | + EmployeeCertVO searchVO = new EmployeeCertVO(); | |
| 150 | + searchVO.setEmployeeCertHstrySeq(employeeCertHstrySeq); | |
| 151 | + model.addAttribute("employeeCertVO", employeeCertService.selectEmployeeCertDetail(searchVO)); | |
| 152 | + | |
| 153 | + ComDefaultCodeVO codeVO = new ComDefaultCodeVO(); | |
| 154 | + codeVO.setCodeId("EMP001"); | |
| 155 | + model.addAttribute("rejectCodeList", cmmUseService.selectCmmCodeDetail(codeVO)); | |
| 156 | + } | |
| 157 | + return "uss/ion/msg/EmpPdfView"; | |
| 158 | + } | |
| 159 | +} |
+++ src/main/java/itn/let/mjo/msg/web/EmployeeCertRestController.java
... | ... | @@ -0,0 +1,109 @@ |
| 1 | +package itn.let.mjo.msg.web; | |
| 2 | + | |
| 3 | +import itn.com.utl.response.ApiResponse; | |
| 4 | +import itn.com.cmm.LoginVO; | |
| 5 | +import itn.let.mjo.mjocommon.MjonCommon; | |
| 6 | +import itn.let.mjo.msg.service.EmployeeCertService; | |
| 7 | +import itn.let.mjo.msg.service.EmployeeCertVO; | |
| 8 | +import itn.let.mjo.msg.service.MjonMsgService; | |
| 9 | +import itn.let.mjo.msg.service.MjonMsgVO; | |
| 10 | +import itn.let.mjo.msgdata.service.MjonMsgDataService; | |
| 11 | +import itn.let.uss.umt.service.EgovMberManageService; | |
| 12 | +import itn.let.uss.umt.service.MberManageVO; | |
| 13 | +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; | |
| 14 | +import org.slf4j.Logger; | |
| 15 | +import org.slf4j.LoggerFactory; | |
| 16 | +import org.springframework.web.bind.annotation.PostMapping; | |
| 17 | +import org.springframework.web.bind.annotation.RestController; | |
| 18 | + | |
| 19 | +import javax.annotation.Resource; | |
| 20 | + | |
| 21 | +@RestController | |
| 22 | +public class EmployeeCertRestController { | |
| 23 | + private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeCertRestController.class); | |
| 24 | + | |
| 25 | + @Resource(name = "employeeCertService") | |
| 26 | + private EmployeeCertService employeeCertService; | |
| 27 | + | |
| 28 | + @Resource(name = "mjonMsgService") | |
| 29 | + private MjonMsgService mjonMsgService; | |
| 30 | + | |
| 31 | + @Resource(name = "MjonMsgDataService") | |
| 32 | + private MjonMsgDataService mjonMsgDataService; | |
| 33 | + | |
| 34 | + @Resource(name = "mberManageService") | |
| 35 | + private EgovMberManageService mberManageService; | |
| 36 | + | |
| 37 | + @Resource(name = "MjonCommon") | |
| 38 | + private MjonCommon mjonCommon; | |
| 39 | + | |
| 40 | + @PostMapping("/uss/ion/msg/updateEmployeeAuth.do") | |
| 41 | + public ApiResponse<Void> updateEmployeeAuth(EmployeeCertVO employeeCertVO) { | |
| 42 | + try { | |
| 43 | + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated() ? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser() : null; | |
| 44 | + if (loginVO == null) { | |
| 45 | + throw new IllegalStateException("관리자 로그인 정보를 확인할 수 없습니다."); | |
| 46 | + } | |
| 47 | + employeeCertVO.setLastUpdusrId(loginVO.getId()); | |
| 48 | + employeeCertService.processEmployeeCert(employeeCertVO); | |
| 49 | + sendEmployeeCertResultSms(employeeCertVO); | |
| 50 | + return ApiResponse.successWithMessage("Y".equals(employeeCertVO.getAuthYn()) ? "종사자 수 인증을 완료했습니다." : "종사자 수 인증을 반려했습니다."); | |
| 51 | + } catch (Exception e) { | |
| 52 | + return ApiResponse.fail(e.getMessage()); | |
| 53 | + } | |
| 54 | + } | |
| 55 | + | |
| 56 | + private void sendEmployeeCertResultSms(EmployeeCertVO employeeCertVO) { | |
| 57 | + try { | |
| 58 | + String smsTxt; | |
| 59 | + if ("Y".equals(employeeCertVO.getAuthYn())) { | |
| 60 | + int wiredMaxCnt = employeeCertVO.getApplyCnt() == null | |
| 61 | + ? 1 : Math.max(1, employeeCertVO.getApplyCnt()); | |
| 62 | + smsTxt = "[문자온] 종사자 수 인증이 완료되었습니다. 유선 발신번호 최대 " | |
| 63 | + + wiredMaxCnt + "개 등록 신청 가능합니다."; | |
| 64 | + } else { | |
| 65 | + smsTxt = employeeCertVO.getRejectReason(); | |
| 66 | + } | |
| 67 | + | |
| 68 | + MberManageVO member = mberManageService.selectMber(employeeCertVO.getMberId()); | |
| 69 | + if (member == null || "B".equals(member.getMberSttus())) { | |
| 70 | + return; | |
| 71 | + } | |
| 72 | + | |
| 73 | + String callTo = member.getMoblphonNo(); | |
| 74 | + if (smsTxt == null || smsTxt.trim().isEmpty() | |
| 75 | + || callTo == null || callTo.trim().isEmpty()) { | |
| 76 | + return; | |
| 77 | + } | |
| 78 | + | |
| 79 | + MjonMsgVO mjonMsgVO = new MjonMsgVO(); | |
| 80 | + mjonMsgVO.setCallFrom("15518011"); | |
| 81 | + mjonMsgVO.setCallTo(callTo); | |
| 82 | + mjonMsgVO.setSmsTxt(smsTxt); | |
| 83 | + mjonMsgVO.setFileCnt("0"); | |
| 84 | + | |
| 85 | + int messageBytes = smsTxt.replace("\r\n", "\n").getBytes("euc-kr").length; | |
| 86 | + if (messageBytes > 90) { | |
| 87 | + mjonMsgVO.setMsgType("6"); | |
| 88 | + mjonMsgVO.setMsgDiv("L"); | |
| 89 | + } else { | |
| 90 | + mjonMsgVO.setMsgType("4"); | |
| 91 | + mjonMsgVO.setMsgDiv("S"); | |
| 92 | + } | |
| 93 | + | |
| 94 | + MjonMsgVO agentInfo = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO); | |
| 95 | + if (agentInfo == null || agentInfo.getAgentPrice() == null) { | |
| 96 | + throw new IllegalStateException("대표 문자 전송사 정보를 찾을 수 없습니다."); | |
| 97 | + } | |
| 98 | + mjonMsgVO.setAgentCode(agentInfo.getAgentCode()); | |
| 99 | + mjonMsgVO.setTotPrice(agentInfo.getAgentPrice().toString()); | |
| 100 | + mjonMsgVO.setEachPrice(agentInfo.getAgentPrice().toString()); | |
| 101 | + | |
| 102 | + MjonMsgVO sendMessage = mjonCommon.getAdminToMberPhoneSendMsgDataComm(mjonMsgVO); | |
| 103 | + mjonMsgDataService.insertAdmToMberMsgDataInfo(sendMessage); | |
| 104 | +// mjonCommon.sendSimpleSlackMsg(smsTxt); | |
| 105 | + } catch (Exception e) { | |
| 106 | + LOGGER.warn("종사자 수 인증 결과 안내문자 발송에 실패했습니다. mberId={}", employeeCertVO.getMberId(), e); | |
| 107 | + } | |
| 108 | + } | |
| 109 | +} |
--- src/main/java/itn/let/mjo/msg/web/MjonMsgController.java
+++ src/main/java/itn/let/mjo/msg/web/MjonMsgController.java
... | ... | @@ -19,6 +19,7 @@ |
| 19 | 19 |
import javax.servlet.http.HttpServletResponse; |
| 20 | 20 |
import javax.servlet.http.HttpSession; |
| 21 | 21 |
|
| 22 |
+import itn.com.annotation.PersonalLog; |
|
| 22 | 23 |
import org.apache.commons.lang3.StringUtils; |
| 23 | 24 |
import org.apache.poi.ss.usermodel.Cell; |
| 24 | 25 |
import org.apache.poi.ss.usermodel.CellStyle; |
... | ... | @@ -164,6 +165,7 @@ |
| 164 | 165 |
* @return "/uss/ion/msg/SendMsgList.do" |
| 165 | 166 |
* @throws Exception |
| 166 | 167 |
*/ |
| 168 |
+ @PersonalLog(action = "조회", description = "발생내역 목록", search = "#resultList.size()") |
|
| 167 | 169 |
@RequestMapping(value= {"/uss/ion/msg/SendMsgList.do"})
|
| 168 | 170 |
public String sendMsgList(@ModelAttribute("searchVO") MjonMsgVO searchVO,
|
| 169 | 171 |
HttpServletRequest request , |
... | ... | @@ -1076,6 +1078,7 @@ |
| 1076 | 1078 |
* @return uss/ion/msg/ReceiveNumberList.do(수신 문자리스트) |
| 1077 | 1079 |
* @throws Exception |
| 1078 | 1080 |
*/ |
| 1081 |
+ @PersonalLog(action = "조회", description = "수신번호 목록", search = "#resultList.size()") |
|
| 1079 | 1082 |
@RequestMapping(value= {"/uss/ion/msg/ReceiveNumberList.do"})
|
| 1080 | 1083 |
public String receiveNumberList(@ModelAttribute("searchVO") MjonMsgVO searchVO,
|
| 1081 | 1084 |
HttpServletRequest request , |
... | ... | @@ -1706,6 +1709,7 @@ |
| 1706 | 1709 |
* @return "/uss/ion/msg/SendNumberList" |
| 1707 | 1710 |
* @throws Exception |
| 1708 | 1711 |
*/ |
| 1712 |
+ @PersonalLog(action = "조회", description = "발신번호 목록", search = "#resultList.size()") |
|
| 1709 | 1713 |
@RequestMapping(value= {"/uss/ion/msg/SendNumberList.do","/uss/ion/msg/BlockNumberList.do"})
|
| 1710 | 1714 |
public String MjonNumberList(@ModelAttribute("searchVO") MjPhoneMemberVO searchVO,
|
| 1711 | 1715 |
HttpServletRequest request, |
... | ... | @@ -2481,6 +2485,7 @@ |
| 2481 | 2485 |
* @return "/uss/ion/msg/SendMsgList.do" |
| 2482 | 2486 |
* @throws Exception |
| 2483 | 2487 |
*/ |
| 2488 |
+ @PersonalLog(action = "조회", description = "실시간 발송", search = "#resultList.size()") |
|
| 2484 | 2489 |
@RequestMapping(value= {"/uss/ion/msg/RealTimeMsgList.do", "/uss/ion/msg/RealTimeMsgListAjax.do"})
|
| 2485 | 2490 |
public String RealTimeMsgList(@ModelAttribute("searchVO") MjonMsgVO searchVO,
|
| 2486 | 2491 |
HttpServletRequest request , |
... | ... | @@ -2843,6 +2848,7 @@ |
| 2843 | 2848 |
} |
| 2844 | 2849 |
|
| 2845 | 2850 |
//회원정보 팝업 문자 전송 리스트(전체) 엑셀 다운로드 |
| 2851 |
+ @PersonalLog(action = "다운로드", description = "팝업 문자 전송", search = "#resultList.size()") |
|
| 2846 | 2852 |
@RequestMapping(value= {"/uss/ion/msg/selectMberSendMsgExcelDownload.do"})
|
| 2847 | 2853 |
public void selectMberSendMsgExcelDownload( MjonMsgVO mjonMsgVO, |
| 2848 | 2854 |
@ModelAttribute MberManageVO reqMberManageVO, |
... | ... | @@ -2921,6 +2927,7 @@ |
| 2921 | 2927 |
|
| 2922 | 2928 |
mjonMsgVO.setMsgType("");
|
| 2923 | 2929 |
List<MjonMsgVO> resultList = mjonMsgService.selectUserMsgDataListByMbrId(mjonMsgVO); |
| 2930 |
+ model.addAttribute("resultList", resultList);
|
|
| 2924 | 2931 |
{ //화면 리스트
|
| 2925 | 2932 |
sheetTitle = "문자 전송 리스트(전체)" ; //제목 |
| 2926 | 2933 |
Sheet sheet = wb.createSheet(sheetTitle); |
... | ... | @@ -3030,6 +3037,7 @@ |
| 3030 | 3037 |
} |
| 3031 | 3038 |
|
| 3032 | 3039 |
//문자 전송 리스트(전체) 엑셀 다운로드 |
| 3040 |
+ @PersonalLog(action = "다운로드", description = "엑셀 다운로드", search = "#resultList.size()") |
|
| 3033 | 3041 |
@RequestMapping(value= {"/uss/ion/msg/SendMsgExcelDownload.do"})
|
| 3034 | 3042 |
public void sendMsgExcelDownload( MjonMsgVO mjonMsgVO, |
| 3035 | 3043 |
HttpServletRequest request, |
... | ... | @@ -3060,6 +3068,7 @@ |
| 3060 | 3068 |
String sheetTitle = ""; |
| 3061 | 3069 |
try{
|
| 3062 | 3070 |
List<MjonMsgVO> resultList = mjonMsgService.selectMjonMsgGroupList(mjonMsgVO); |
| 3071 |
+ model.addAttribute("resultList", resultList);
|
|
| 3063 | 3072 |
{ //화면 리스트
|
| 3064 | 3073 |
sheetTitle = "문자 전송 리스트(전체)" ; //제목 |
| 3065 | 3074 |
Sheet sheet = wb.createSheet(sheetTitle); |
... | ... | @@ -3119,6 +3128,7 @@ |
| 3119 | 3128 |
|
| 3120 | 3129 |
|
| 3121 | 3130 |
//문자 전송 리스트(전체) 엑셀 다운로드 |
| 3131 |
+ @PersonalLog(action = "다운로드", description = "엑셀 다운로드", search = "#resultList.size()") |
|
| 3122 | 3132 |
@RequestMapping(value="/uss/ion/msg/SendMsgDtlExcelDownload.do") |
| 3123 | 3133 |
public void sendMsgDtlExcelDownload( MjonMsgVO mjonMsgVO, |
| 3124 | 3134 |
HttpServletRequest request, |
... | ... | @@ -3149,6 +3159,7 @@ |
| 3149 | 3159 |
String sheetTitle = ""; |
| 3150 | 3160 |
try{
|
| 3151 | 3161 |
List<MjonMsgVO> resultList = mjonMsgService.selectMjonMsgGroupDtList(mjonMsgVO); |
| 3162 |
+ model.addAttribute("resultList", resultList);
|
|
| 3152 | 3163 |
{ //화면 리스트
|
| 3153 | 3164 |
sheetTitle = "문자 전송 리스트(상세)" ; //제목 |
| 3154 | 3165 |
Sheet sheet = wb.createSheet(sheetTitle); |
... | ... | @@ -4658,6 +4669,7 @@ |
| 4658 | 4669 |
* @return "/uss/ion/msg/admSystemSendMsgList.do" |
| 4659 | 4670 |
* @throws Exception |
| 4660 | 4671 |
*/ |
| 4672 |
+ @PersonalLog(action = "조회", description = "시스템 발생내역", search = "#resultList.size()") |
|
| 4661 | 4673 |
@RequestMapping(value= {"/uss/ion/msg/admSystemSendMsgList.do"})
|
| 4662 | 4674 |
public String admSystemSendMsgList(@ModelAttribute("searchVO") MjonMsgVO searchVO,
|
| 4663 | 4675 |
HttpServletRequest request , |
--- src/main/java/itn/let/mjo/pay/web/MjonPayController.java
+++ src/main/java/itn/let/mjo/pay/web/MjonPayController.java
... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 |
import javax.servlet.http.HttpServletRequest; |
| 25 | 25 |
import javax.servlet.http.HttpServletResponse; |
| 26 | 26 |
|
| 27 |
+import itn.com.annotation.PersonalLog; |
|
| 27 | 28 |
import org.apache.poi.ss.usermodel.Cell; |
| 28 | 29 |
import org.apache.poi.ss.usermodel.CellStyle; |
| 29 | 30 |
import org.apache.poi.ss.usermodel.Font; |
... | ... | @@ -91,6 +92,7 @@ |
| 91 | 92 |
* @return "/uss/ion/msg/SendNumberList" |
| 92 | 93 |
* @throws Exception |
| 93 | 94 |
*/ |
| 95 |
+ @PersonalLog(action = "조회", description = "캐시 내역", search = "#resultList.size()") |
|
| 94 | 96 |
@RequestMapping(value= {"/uss/ion/pay/CashList.do"})
|
| 95 | 97 |
public String selectCashList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO,
|
| 96 | 98 |
HttpServletRequest request, |
... | ... | @@ -150,7 +152,8 @@ |
| 150 | 152 |
* @return "/uss/ion/msg/SendNumberList" |
| 151 | 153 |
* @throws Exception |
| 152 | 154 |
*/ |
| 153 |
- @RequestMapping(value= {"/uss/ion/pay/CashRemainList.do"})
|
|
| 155 |
+ @PersonalLog(action = "조회", description = "캐시 내역", search = "#resultList.size()") |
|
| 156 |
+ @RequestMapping(value= {"/uss/ion/pay/CashRemainList.do"})
|
|
| 154 | 157 |
public String selectCashRemainList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO,
|
| 155 | 158 |
HttpServletRequest request, |
| 156 | 159 |
ModelMap model) throws Exception{
|
... | ... | @@ -416,6 +419,7 @@ |
| 416 | 419 |
* @return "/uss/ion/msg/SendNumberList" |
| 417 | 420 |
* @throws Exception |
| 418 | 421 |
*/ |
| 422 |
+ @PersonalLog(action = "조회", description = "결제 내역", search = "#resultList.size()") |
|
| 419 | 423 |
@RequestMapping(value= {"/uss/ion/pay/PayList.do"})
|
| 420 | 424 |
public String selectPayList(@ModelAttribute("searchVO") MjonPayVO mjonPayVO,
|
| 421 | 425 |
HttpServletRequest request, |
--- src/main/java/itn/let/schdlr/service/SchdlrManageService.java
+++ src/main/java/itn/let/schdlr/service/SchdlrManageService.java
... | ... | @@ -51,4 +51,6 @@ |
| 51 | 51 |
public void payBack(String type, int limitCout) throws Exception; |
| 52 | 52 |
|
| 53 | 53 |
public void payBack_advc(String p_type) throws Exception; |
| 54 |
+ |
|
| 55 |
+ public void sendNumberFailNoticeScheduler() throws Exception; |
|
| 54 | 56 |
} |
--- src/main/java/itn/let/schdlr/service/SchdlrVO.java
+++ src/main/java/itn/let/schdlr/service/SchdlrVO.java
... | ... | @@ -73,8 +73,7 @@ |
| 73 | 73 |
private String searchKeyword = ""; // 검색어 |
| 74 | 74 |
|
| 75 | 75 |
private int toCnt = 0; // 목록 조회 개수 |
| 76 |
- |
|
| 77 |
- |
|
| 76 |
+ |
|
| 78 | 77 |
|
| 79 | 78 |
private String emailAdres = ""; // 메일 주소 |
| 80 | 79 |
|
... | ... | @@ -170,8 +169,12 @@ |
| 170 | 169 |
|
| 171 | 170 |
private String[] cmplntIdNSn; // 목록 로우 처리 키값 (구분자: '|') |
| 172 | 171 |
private String updateStateCd; // 목록 일괄 처리상태값 |
| 173 |
- private String updateUseYn; // 목록 일괄 삭제 |
|
| 174 |
- |
|
| 172 |
+ private String updateUseYn; // 목록 일괄 삭제 |
|
| 173 |
+ |
|
| 174 |
+ private String callFrom; |
|
| 175 |
+ private String msgGroupId; |
|
| 176 |
+ private String regDate; |
|
| 177 |
+ private String userId; |
|
| 175 | 178 |
|
| 176 | 179 |
public String getSchdlrUserName() {
|
| 177 | 180 |
return schdlrUserName; |
... | ... | @@ -845,5 +848,28 @@ |
| 845 | 848 |
public void setOrgnAlarmDateTime(String orgnAlarmDateTime) {
|
| 846 | 849 |
this.orgnAlarmDateTime = orgnAlarmDateTime; |
| 847 | 850 |
} |
| 848 |
- |
|
| 851 |
+ |
|
| 852 |
+ public String getCallFrom() {return callFrom;}
|
|
| 853 |
+ public void setCallFrom(String callFrom) {
|
|
| 854 |
+ this.callFrom = callFrom; |
|
| 855 |
+ } |
|
| 856 |
+ public String getMsgGroupId() {
|
|
| 857 |
+ return msgGroupId; |
|
| 858 |
+ } |
|
| 859 |
+ public void setMsgGroupId(String msgGroupId) {
|
|
| 860 |
+ this.msgGroupId = msgGroupId; |
|
| 861 |
+ } |
|
| 862 |
+ public String getRegDate() {
|
|
| 863 |
+ return regDate; |
|
| 864 |
+ } |
|
| 865 |
+ public void setRegDate(String regDate) {
|
|
| 866 |
+ this.regDate = regDate; |
|
| 867 |
+ } |
|
| 868 |
+ public String getUserId() {
|
|
| 869 |
+ return userId; |
|
| 870 |
+ } |
|
| 871 |
+ public void setUserId(String userId) {
|
|
| 872 |
+ this.userId = userId; |
|
| 873 |
+ } |
|
| 874 |
+ |
|
| 849 | 875 |
} |
--- src/main/java/itn/let/schdlr/service/SchedulerUtil.java
+++ src/main/java/itn/let/schdlr/service/SchedulerUtil.java
... | ... | @@ -7,6 +7,9 @@ |
| 7 | 7 |
import javax.annotation.Resource; |
| 8 | 8 |
import javax.sql.DataSource; |
| 9 | 9 |
|
| 10 |
+import itn.let.mjo.pay.service.MjonPayService; |
|
| 11 |
+import org.slf4j.Logger; |
|
| 12 |
+import org.slf4j.LoggerFactory; |
|
| 10 | 13 |
import org.springframework.beans.factory.annotation.Value; |
| 11 | 14 |
import org.springframework.context.annotation.Bean; |
| 12 | 15 |
import org.springframework.context.annotation.Profile; |
... | ... | @@ -44,5 +47,22 @@ |
| 44 | 47 |
@EnableScheduling |
| 45 | 48 |
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") // Scheduler Lock 사용 가능 설정 (기본 30초동안 Lock) |
| 46 | 49 |
public class SchedulerUtil {
|
| 47 |
- |
|
| 50 |
+ |
|
| 51 |
+ private static final Logger LOGGER = LoggerFactory.getLogger(SchedulerUtil.class); |
|
| 52 |
+ |
|
| 53 |
+ @Resource(name = "SchdlrManageService") |
|
| 54 |
+ private SchdlrManageService schdlrManageService; |
|
| 55 |
+ |
|
| 56 |
+ @Scheduled(cron = "0 */5 * * * *") |
|
| 57 |
+ public void sendNumberFailNoticeScheduler() throws Exception {
|
|
| 58 |
+ try {
|
|
| 59 |
+ LOGGER.info(" ============= sendNumberFailNoticeScheduler START ============= ");
|
|
| 60 |
+ |
|
| 61 |
+ schdlrManageService.sendNumberFailNoticeScheduler(); |
|
| 62 |
+ |
|
| 63 |
+ LOGGER.info(" ============= sendNumberFailNoticeScheduler END ============= ");
|
|
| 64 |
+ }catch(Exception ex) {
|
|
| 65 |
+ ex.printStackTrace(); |
|
| 66 |
+ } |
|
| 67 |
+ } |
|
| 48 | 68 |
} |
--- src/main/java/itn/let/schdlr/service/impl/SchdlrManageDAO.java
+++ src/main/java/itn/let/schdlr/service/impl/SchdlrManageDAO.java
... | ... | @@ -208,6 +208,10 @@ |
| 208 | 208 |
public SchdlrVO selectCvlCmplntByPk(SchdlrVO schdlrVO) throws Exception{
|
| 209 | 209 |
return (SchdlrVO)select("schdlrManageDAO.selectCvlCmplntByPk", schdlrVO);
|
| 210 | 210 |
} |
| 211 |
+ |
|
| 212 |
+ public List<SchdlrVO> selectSendNumberFailList() throws Exception {
|
|
| 213 |
+ return (List<SchdlrVO>) list("schdlrManageDAO.selectSendNumberFailList");
|
|
| 214 |
+ } |
|
| 211 | 215 |
|
| 212 | 216 |
|
| 213 | 217 |
// 사업(계약)관리 임시저장 삭제 |
--- src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java
+++ src/main/java/itn/let/schdlr/service/impl/SchdlrManageServiceImpl.java
... | ... | @@ -2,12 +2,15 @@ |
| 2 | 2 |
|
| 3 | 3 |
import java.io.File; |
| 4 | 4 |
import java.util.ArrayList; |
| 5 |
+import java.util.Arrays; |
|
| 5 | 6 |
import java.util.Date; |
| 6 | 7 |
import java.util.List; |
| 7 | 8 |
import java.util.stream.Collectors; |
| 8 | 9 |
|
| 9 | 10 |
import javax.annotation.Resource; |
| 10 | 11 |
|
| 12 |
+import itn.let.mjo.msg.service.MjonMsgService; |
|
| 13 |
+import itn.let.mjo.msgdata.service.MjonMsgReturnVO; |
|
| 11 | 14 |
import org.jsoup.Jsoup; |
| 12 | 15 |
import org.slf4j.Logger; |
| 13 | 16 |
import org.slf4j.LoggerFactory; |
... | ... | @@ -102,6 +105,12 @@ |
| 102 | 105 |
|
| 103 | 106 |
@Resource(name = "faxDAO") |
| 104 | 107 |
public FaxDAO faxDao; |
| 108 |
+ |
|
| 109 |
+ @Resource(name = "mjonMsgService") |
|
| 110 |
+ private MjonMsgService mjonMsgService; |
|
| 111 |
+ |
|
| 112 |
+ private String agentCode; |
|
| 113 |
+ private String agentPrice; |
|
| 105 | 114 |
|
| 106 | 115 |
private static final Logger LOGGER = LoggerFactory.getLogger(SchdlrManageServiceImpl.class); |
| 107 | 116 |
|
... | ... | @@ -519,6 +528,93 @@ |
| 519 | 528 |
|
| 520 | 529 |
} |
| 521 | 530 |
|
| 531 |
+ @Override |
|
| 532 |
+ public void sendNumberFailNoticeScheduler() throws Exception {
|
|
| 533 |
+ |
|
| 534 |
+ try {
|
|
| 535 |
+ List<SchdlrVO> failUserList = schdlrManageDAO.selectSendNumberFailList(); |
|
| 536 |
+ |
|
| 537 |
+ if (failUserList == null || failUserList.isEmpty()) {
|
|
| 538 |
+ return; |
|
| 539 |
+ } |
|
| 540 |
+ |
|
| 541 |
+ String smsTxt = "[문자온] 문자발송 결과(실패) 안내\n" |
|
| 542 |
+ + "고객님은 현재 이동통신사의 \"번호도용 문자차단 서비스\"에 가입되어 있어 " |
|
| 543 |
+ + "인터넷 문자사이트를 통한 문자발송이 모두 차단되어 있습니다.\n" |
|
| 544 |
+ + "문자발송 서비스를 정상적으로 이용하기 위해서는 이용중인 이동통신사에 " |
|
| 545 |
+ + "문의하시어 상기 서비스를 해지하신 후 문자를 재발송해 주시길 바랍니다.\n" |
|
| 546 |
+ + "(서비스 해지 후 정상 발송까지 영업일 기준 2~3일 정도 소요될 수 있습니다.)\n" |
|
| 547 |
+ + "※번호도용 문자차단 서비스 : 웹에서 발송되는 스팸, 스미싱 문자에 " |
|
| 548 |
+ + "내 번호가 회신번호로 악용되는 것을 방지해주는 서비스"; |
|
| 549 |
+ |
|
| 550 |
+ MjonMsgVO mjonMsgVO = new MjonMsgVO(); |
|
| 551 |
+ mjonMsgVO.setMsgKind("S");
|
|
| 552 |
+ mjonMsgVO.setMsgType("6");
|
|
| 553 |
+ mjonMsgVO.setFileCnt("0");
|
|
| 554 |
+ mjonMsgVO.setMsgDiv("L");
|
|
| 555 |
+ mjonMsgVO.setCallFrom("15518011");
|
|
| 556 |
+ mjonMsgVO.setSmsTxt(smsTxt); |
|
| 557 |
+ |
|
| 558 |
+ if (agentCode == null || agentPrice == null) {
|
|
| 559 |
+ MjonMsgVO mjonMsgVO2 = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO); |
|
| 560 |
+ agentCode = mjonMsgVO2.getAgentCode(); |
|
| 561 |
+ agentPrice = mjonMsgVO2.getAgentPrice().toString(); |
|
| 562 |
+ } |
|
| 563 |
+ |
|
| 564 |
+ mjonMsgVO.setAgentCode(agentCode); |
|
| 565 |
+ mjonMsgVO.setTotPrice(agentPrice); |
|
| 566 |
+ mjonMsgVO.setEachPrice(agentPrice); |
|
| 567 |
+ |
|
| 568 |
+ mjonMsgVO.setBefPoint("0.0");
|
|
| 569 |
+ mjonMsgVO.setBefCash("0.0");
|
|
| 570 |
+ mjonMsgVO.setReserveYn("N");
|
|
| 571 |
+ mjonMsgVO.setUserId("system");
|
|
| 572 |
+ |
|
| 573 |
+ for (SchdlrVO failUserVo : failUserList) {
|
|
| 574 |
+ |
|
| 575 |
+ mjonMsgVO.setCallToList(new String[] { failUserVo.getCallFrom() });
|
|
| 576 |
+ //문자 발송 처리 |
|
| 577 |
+ MjonMsgReturnVO returnVO = mjonMsgDataService.insertAdmToMberMsgDataInfo(mjonMsgVO); |
|
| 578 |
+ |
|
| 579 |
+ if (returnVO != null |
|
| 580 |
+ && returnVO.getSendMsgCnt() != null |
|
| 581 |
+ && !returnVO.getSendMsgCnt().isEmpty()) {
|
|
| 582 |
+ try {
|
|
| 583 |
+ MjonMsgVO callbackVO = new MjonMsgVO(); |
|
| 584 |
+ |
|
| 585 |
+ callbackVO.setUserId(failUserVo.getUserId()); |
|
| 586 |
+ callbackVO.setMsgGroupId(failUserVo.getMsgGroupId()); |
|
| 587 |
+ |
|
| 588 |
+ mjonMsgService.updateMsgGroupDataCallBackAll(callbackVO); |
|
| 589 |
+ |
|
| 590 |
+ } catch (Exception e) {
|
|
| 591 |
+ |
|
| 592 |
+ LOGGER.error( |
|
| 593 |
+ "번호도용 문자차단 CALLBACK 처리 실패. " |
|
| 594 |
+ + "MSG_GROUP_ID={}, USER_ID={}, CALL_FROM={}",
|
|
| 595 |
+ failUserVo.getMsgGroupId(), |
|
| 596 |
+ failUserVo.getUserId(), |
|
| 597 |
+ failUserVo.getCallFrom(), |
|
| 598 |
+ e |
|
| 599 |
+ ); |
|
| 600 |
+ } |
|
| 601 |
+ } else {
|
|
| 602 |
+ LOGGER.error( |
|
| 603 |
+ "번호도용 문자차단 알림발송 실패 " |
|
| 604 |
+ + "MSG_GROUP_ID={}, USER_ID={}, CALL_FROM={}",
|
|
| 605 |
+ failUserVo.getMsgGroupId(), |
|
| 606 |
+ failUserVo.getUserId(), |
|
| 607 |
+ failUserVo.getCallFrom() |
|
| 608 |
+ ); |
|
| 609 |
+ } |
|
| 610 |
+ } |
|
| 611 |
+ |
|
| 612 |
+ } catch (Exception e) {
|
|
| 613 |
+ LOGGER.error("번호도용 문자차단 안내문자 스케줄러 오류", e);
|
|
| 614 |
+ } |
|
| 615 |
+ |
|
| 616 |
+ } |
|
| 617 |
+ |
|
| 522 | 618 |
/** |
| 523 | 619 |
* @methodName : getMsgFailList |
| 524 | 620 |
* @author : 이호영 |
... | ... | @@ -543,4 +639,6 @@ |
| 543 | 639 |
|
| 544 | 640 |
return msgFailList; |
| 545 | 641 |
} |
| 642 |
+ |
|
| 643 |
+ |
|
| 546 | 644 |
} |
+++ src/main/java/itn/let/sym/log/access/UserAccessLogService.java
... | ... | @@ -0,0 +1,8 @@ |
| 1 | +package itn.let.sym.log.access; | |
| 2 | + | |
| 3 | +import java.util.List; | |
| 4 | + | |
| 5 | +public interface UserAccessLogService { | |
| 6 | + List<UserAccessLogVO> selectUserAccessLogList(UserAccessLogVO logVO) throws Exception; | |
| 7 | + Integer selectUserAccessLogListTotCnt(UserAccessLogVO logVO) throws Exception; | |
| 8 | +} |
+++ src/main/java/itn/let/sym/log/access/UserAccessLogVO.java
... | ... | @@ -0,0 +1,19 @@ |
| 1 | +package itn.let.sym.log.access; | |
| 2 | + | |
| 3 | +import itn.com.utl.page.BasePageableVO; | |
| 4 | +import lombok.Getter; | |
| 5 | +import lombok.NoArgsConstructor; | |
| 6 | +import lombok.Setter; | |
| 7 | + | |
| 8 | +@Getter | |
| 9 | +@Setter | |
| 10 | +@NoArgsConstructor | |
| 11 | +public class UserAccessLogVO extends BasePageableVO { | |
| 12 | + private String logId; | |
| 13 | + private String userId; | |
| 14 | + private String accessIp; | |
| 15 | + private String menuNm; | |
| 16 | + private String uri; | |
| 17 | + private String result; | |
| 18 | + private String frstRegistPnttm; | |
| 19 | +} |
+++ src/main/java/itn/let/sym/log/access/service/UserAccessLogDAO.java
... | ... | @@ -0,0 +1,19 @@ |
| 1 | +package itn.let.sym.log.access.service; | |
| 2 | + | |
| 3 | +import itn.com.cmm.service.impl.EgovComAbstractDAO; | |
| 4 | +import itn.let.sym.log.access.UserAccessLogVO; | |
| 5 | +import org.springframework.stereotype.Repository; | |
| 6 | + | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +@Repository("userAccessLogDAO") | |
| 10 | +public class UserAccessLogDAO extends EgovComAbstractDAO { | |
| 11 | + @SuppressWarnings("unchecked") | |
| 12 | + public List<UserAccessLogVO> selectUserAccessLogList(UserAccessLogVO logVO) throws Exception { | |
| 13 | + return (List<UserAccessLogVO>) list("userAccessLogDAO.selectUserAccessLogList", logVO); | |
| 14 | + } | |
| 15 | + | |
| 16 | + public int selectUserAccessLogListTotCnt(UserAccessLogVO logVO) throws Exception { | |
| 17 | + return (Integer) select("userAccessLogDAO.selectUserAccessLogListTotCnt", logVO); | |
| 18 | + } | |
| 19 | +} |
+++ src/main/java/itn/let/sym/log/access/service/UserAccessLogServiceImpl.java
... | ... | @@ -0,0 +1,26 @@ |
| 1 | +package itn.let.sym.log.access.service; | |
| 2 | + | |
| 3 | +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
| 4 | +import itn.let.sym.log.access.UserAccessLogService; | |
| 5 | +import itn.let.sym.log.access.UserAccessLogVO; | |
| 6 | +import org.springframework.stereotype.Service; | |
| 7 | + | |
| 8 | +import javax.annotation.Resource; | |
| 9 | +import java.util.List; | |
| 10 | + | |
| 11 | +@Service(value = "userAccessLogService") | |
| 12 | +public class UserAccessLogServiceImpl extends EgovAbstractServiceImpl implements UserAccessLogService { | |
| 13 | + | |
| 14 | + @Resource(name = "userAccessLogDAO") | |
| 15 | + private UserAccessLogDAO userAccessLogDAO; | |
| 16 | + | |
| 17 | + @Override | |
| 18 | + public List<UserAccessLogVO> selectUserAccessLogList(UserAccessLogVO logVO) throws Exception { | |
| 19 | + return userAccessLogDAO.selectUserAccessLogList(logVO); | |
| 20 | + } | |
| 21 | + | |
| 22 | + @Override | |
| 23 | + public Integer selectUserAccessLogListTotCnt(UserAccessLogVO logVO) throws Exception { | |
| 24 | + return userAccessLogDAO.selectUserAccessLogListTotCnt(logVO); | |
| 25 | + } | |
| 26 | +} |
+++ src/main/java/itn/let/sym/log/access/web/UserAccessLogController.java
... | ... | @@ -0,0 +1,33 @@ |
| 1 | +package itn.let.sym.log.access.web; | |
| 2 | + | |
| 3 | +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; | |
| 4 | +import itn.com.annotation.PersonalLog; | |
| 5 | +import itn.com.utl.page.PaginationUtil; | |
| 6 | +import itn.let.sym.log.access.UserAccessLogService; | |
| 7 | +import itn.let.sym.log.access.UserAccessLogVO; | |
| 8 | +import org.springframework.stereotype.Controller; | |
| 9 | +import org.springframework.ui.Model; | |
| 10 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 11 | + | |
| 12 | +import javax.annotation.Resource; | |
| 13 | +import java.util.List; | |
| 14 | + | |
| 15 | +@Controller | |
| 16 | +public class UserAccessLogController { | |
| 17 | + @Resource(name = "userAccessLogService") | |
| 18 | + private UserAccessLogService userAccessLogService; | |
| 19 | + | |
| 20 | + @PersonalLog(action = "조회", description = "이용자 접속로그", search = "#resultList.size()") | |
| 21 | + @RequestMapping(value = "/uss/umt/user/UserAccessLog.do") | |
| 22 | + public String userAccessLog(UserAccessLogVO searchVO, Model model) throws Exception { | |
| 23 | + PaginationInfo paginationInfo = PaginationUtil.initWithSort(searchVO, "FRST_REGIST_PNTTM", "desc"); | |
| 24 | + List<UserAccessLogVO> result = userAccessLogService.selectUserAccessLogList(searchVO); | |
| 25 | + int totCnt = userAccessLogService.selectUserAccessLogListTotCnt(searchVO); | |
| 26 | + paginationInfo.setTotalRecordCount(totCnt); | |
| 27 | + | |
| 28 | + model.addAttribute("resultList", result); | |
| 29 | + model.addAttribute("paginationInfo", paginationInfo); | |
| 30 | + model.addAttribute("searchVO", searchVO); | |
| 31 | + return "sym/log/access/UserAccessLog"; | |
| 32 | + } | |
| 33 | +} |
--- src/main/java/itn/let/sym/log/clg/web/EgovLoginLogController.java
+++ src/main/java/itn/let/sym/log/clg/web/EgovLoginLogController.java
... | ... | @@ -16,6 +16,7 @@ |
| 16 | 16 |
import javax.servlet.http.HttpServletResponse; |
| 17 | 17 |
import javax.servlet.http.HttpSession; |
| 18 | 18 |
|
| 19 |
+import itn.com.annotation.PersonalLog; |
|
| 19 | 20 |
import org.apache.poi.ss.usermodel.Cell; |
| 20 | 21 |
import org.apache.poi.ss.usermodel.CellStyle; |
| 21 | 22 |
import org.apache.poi.ss.usermodel.Font; |
... | ... | @@ -206,6 +207,7 @@ |
| 206 | 207 |
} |
| 207 | 208 |
|
| 208 | 209 |
/* 엑셀 다운로드 */ |
| 210 |
+ @PersonalLog(action = "다운로드", description = "관리자 로그 엑셀", search = "#adminLogList.size()") |
|
| 209 | 211 |
@RequestMapping(value = "/sym/log/clg/SelectLoginLogListExcelDown.do") |
| 210 | 212 |
public void SelectLoginLogListExcelDown(@ModelAttribute("searchVO") LoginLog loginLog, @RequestParam Map<String, Object> commandMap ,ModelMap model, HttpServletResponse response) throws Exception {
|
| 211 | 213 |
PaginationInfo paginationInfo = new PaginationInfo(); |
... | ... | @@ -504,6 +506,7 @@ |
| 504 | 506 |
* @return sym/log/clg/SelectWebLogList.do |
| 505 | 507 |
* @throws Exception |
| 506 | 508 |
*/ |
| 509 |
+ @PersonalLog(action = "조회", description = "이용자 웹로그", search = "#resultList.size()") |
|
| 507 | 510 |
@RequestMapping(value = "/sym/log/clg/SelectWebLogList.do") |
| 508 | 511 |
public String selectWebLogList(@ModelAttribute("searchVO") LoginLog loginLog,
|
| 509 | 512 |
@RequestParam Map<String, Object> commandMap , |
... | ... | @@ -676,6 +679,7 @@ |
| 676 | 679 |
} |
| 677 | 680 |
|
| 678 | 681 |
//리스트 엑셀 다운로드 |
| 682 |
+ @PersonalLog(action = "다운로드", description = "이용자 웹로그", search = "#resultList.size()") |
|
| 679 | 683 |
@RequestMapping(value="/sym/log/clg/webLogListExcelDownload.do") |
| 680 | 684 |
public void webLogListExcelDownload(LoginLog loginLog, |
| 681 | 685 |
HttpServletRequest request, |
... | ... | @@ -704,7 +708,7 @@ |
| 704 | 708 |
try{
|
| 705 | 709 |
List<LoginLog> webMenuLogList = loginLogService.selectWebMenuLogList(loginLog); //사용자 매뉴 리스트 |
| 706 | 710 |
List<LoginLog> userMenuList = loginLogService.selectUserMenuList(loginLog); //사용자 매뉴(전체) |
| 707 |
- |
|
| 711 |
+ model.addAttribute("resultList", userMenuList);
|
|
| 708 | 712 |
for(LoginLog userMenuVO :userMenuList){
|
| 709 | 713 |
List<LoginLog> tempDataList = new ArrayList<LoginLog>(); |
| 710 | 714 |
for(LoginLog logVO : webMenuLogList) {
|
--- src/main/java/itn/let/sym/log/lgm/service/EgovSysLogAspect.java
+++ src/main/java/itn/let/sym/log/lgm/service/EgovSysLogAspect.java
... | ... | @@ -1,12 +1,27 @@ |
| 1 | 1 |
package itn.let.sym.log.lgm.service; |
| 2 | 2 |
|
| 3 |
+import java.lang.reflect.Method; |
|
| 4 |
+import java.util.Collection; |
|
| 3 | 5 |
import java.util.Enumeration; |
| 6 |
+import java.util.Map; |
|
| 4 | 7 |
|
| 5 | 8 |
import javax.annotation.Resource; |
| 6 | 9 |
import javax.servlet.http.HttpServletRequest; |
| 7 | 10 |
|
| 11 |
+import itn.com.annotation.PersonalLog; |
|
| 12 |
+import itn.com.cmm.util.IpUtil; |
|
| 13 |
+import itn.com.utl.aop.AopExpressionHelper; |
|
| 14 |
+import itn.let.sym.log.personal.PersonalInformationLogService; |
|
| 15 |
+import itn.let.sym.log.personal.PersonalInformationLogVO; |
|
| 8 | 16 |
import org.aspectj.lang.JoinPoint; |
| 9 | 17 |
import org.aspectj.lang.ProceedingJoinPoint; |
| 18 |
+import org.aspectj.lang.annotation.Around; |
|
| 19 |
+import org.aspectj.lang.reflect.MethodSignature; |
|
| 20 |
+import org.springframework.expression.EvaluationContext; |
|
| 21 |
+import org.springframework.expression.ExpressionParser; |
|
| 22 |
+import org.springframework.expression.spel.standard.SpelExpressionParser; |
|
| 23 |
+import org.springframework.expression.spel.support.StandardEvaluationContext; |
|
| 24 |
+import org.springframework.ui.ModelMap; |
|
| 10 | 25 |
import org.springframework.util.StopWatch; |
| 11 | 26 |
import org.springframework.web.context.request.RequestContextHolder; |
| 12 | 27 |
import org.springframework.web.context.request.ServletRequestAttributes; |
... | ... | @@ -17,466 +32,117 @@ |
| 17 | 32 |
|
| 18 | 33 |
/** |
| 19 | 34 |
* 시스템 로그 생성을 위한 ASPECT 클래스 |
| 20 |
- * @author 공통서비스개발팀 이삼섭 |
|
| 21 |
- * @since 2009.03.11 |
|
| 22 |
- * @version 1.0 |
|
| 23 |
- * @see |
|
| 24 | 35 |
* |
| 25 |
- * <pre> |
|
| 36 |
+ * @author 공통서비스개발팀 이삼섭 |
|
| 37 |
+ * @version 1.0 |
|
| 38 |
+ * @see <pre> |
|
| 26 | 39 |
* << 개정이력(Modification Information) >> |
| 27 |
- * |
|
| 40 |
+ * |
|
| 28 | 41 |
* 수정일 수정자 수정내용 |
| 29 | 42 |
* ------- -------- --------------------------- |
| 30 | 43 |
* 2009.03.11 이삼섭 최초 생성 |
| 31 | 44 |
* 2011.07.01 이기하 패키지 분리(sym.log -> sym.log.lgm) |
| 32 |
- * 2011.08.31 JJY 경량환경 템플릿 커스터마이징버전 생성 |
|
| 45 |
+ * 2011.08.31 JJY 경량환경 템플릿 커스터마이징버전 생성 |
|
| 33 | 46 |
* |
| 34 | 47 |
* </pre> |
| 48 |
+ * @since 2009.03.11 |
|
| 35 | 49 |
*/ |
| 36 | 50 |
public class EgovSysLogAspect {
|
| 37 | 51 |
|
| 38 |
- @Resource(name="EgovSysLogService") |
|
| 39 |
- private EgovSysLogService sysLogService; |
|
| 52 |
+ @Resource(name = "EgovSysLogService") |
|
| 53 |
+ private EgovSysLogService sysLogService; |
|
| 40 | 54 |
|
| 41 |
- @Resource(name="EgovLoginLogService") |
|
| 42 |
- private EgovLoginLogService loginLogService; |
|
| 43 |
- |
|
| 44 |
- /** |
|
| 45 |
- * 시스템 로그정보를 생성한다. |
|
| 46 |
- * sevice Class의 insert로 시작되는 Method |
|
| 47 |
- * |
|
| 48 |
- * @param ProceedingJoinPoint |
|
| 49 |
- * @return Object |
|
| 50 |
- * @throws Exception |
|
| 51 |
- */ |
|
| 52 |
- public Object logInsert(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 55 |
+ @Resource(name = "personalInformationLogService") |
|
| 56 |
+ private PersonalInformationLogService personalInformationLogService; |
|
| 53 | 57 |
|
| 54 |
- StopWatch stopWatch = new StopWatch(); |
|
| 58 |
+ public void personalInformationLog(JoinPoint joinPoint) {
|
|
| 59 |
+ try {
|
|
| 60 |
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); |
|
| 61 |
+ PersonalLog log = signature.getMethod().getAnnotation(PersonalLog.class); |
|
| 55 | 62 |
|
| 56 |
- try {
|
|
| 57 |
- stopWatch.start(); |
|
| 63 |
+ if (log == null) {
|
|
| 64 |
+ return; |
|
| 65 |
+ } |
|
| 58 | 66 |
|
| 59 |
- Object retValue = joinPoint.proceed(); |
|
| 60 |
- return retValue; |
|
| 61 |
- } catch (Throwable e) {
|
|
| 62 |
- throw e; |
|
| 63 |
- } finally {
|
|
| 64 |
- stopWatch.stop(); |
|
| 67 |
+ EvaluationContext context = AopExpressionHelper.createContext(joinPoint, signature); |
|
| 68 |
+ Object target = AopExpressionHelper.evaluate(context, log.target()); |
|
| 69 |
+ Object search = AopExpressionHelper.evaluate(context, log.search()); |
|
| 65 | 70 |
|
| 66 |
- SysLog sysLog = new SysLog(); |
|
| 67 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 68 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 69 |
- String processSeCode = "C"; |
|
| 70 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 71 |
- String uniqId = ""; |
|
| 72 |
- String ip = ""; |
|
| 71 |
+ String logTarget = ""; |
|
| 72 |
+ if (target != null) {
|
|
| 73 |
+ logTarget = target.toString(); |
|
| 74 |
+ } else if (search != null) {
|
|
| 75 |
+ logTarget = search.toString() + "건"; |
|
| 76 |
+ } |
|
| 73 | 77 |
|
| 74 |
- /* Authenticated */ |
|
| 75 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 76 |
- if(isAuthenticated.booleanValue()) {
|
|
| 77 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 78 |
- uniqId = user.getUniqId(); |
|
| 79 |
- //ip = user.getIp(); |
|
| 80 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 81 |
- ip = request.getRemoteAddr(); |
|
| 82 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 83 |
- } |
|
| 78 |
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 79 |
+ LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 84 | 80 |
|
| 85 |
- sysLog.setSrvcNm(className); |
|
| 86 |
- sysLog.setMethodNm(methodName); |
|
| 87 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 88 |
- sysLog.setProcessTime(processTime); |
|
| 89 |
- sysLog.setRqesterId(uniqId); |
|
| 90 |
- sysLog.setRqesterIp(ip); |
|
| 81 |
+ PersonalInformationLogVO vo = new PersonalInformationLogVO(); |
|
| 82 |
+ vo.setMenuNm(log.description()); |
|
| 83 |
+ vo.setAction(log.action()); |
|
| 84 |
+ vo.setTarget(logTarget); |
|
| 85 |
+ vo.setUserId(loginVO != null ? loginVO.getId() : "ANONYMOUS"); |
|
| 86 |
+ vo.setAccessIp(IpUtil.getClientIP(request)); |
|
| 87 |
+ vo.setUri(request.getRequestURI()); |
|
| 91 | 88 |
|
| 92 |
- sysLogService.logInsertSysLog(sysLog); |
|
| 93 |
- //sysLogService.logInsertAdminSysLog(sysLog); |
|
| 94 |
- } |
|
| 89 |
+ personalInformationLogService.insertPersonalInformationLog(vo); |
|
| 90 |
+ } catch (Exception e) {
|
|
| 91 |
+ System.out.println("개인정보 처리 로그 AOP 오류 : " + e.getMessage());
|
|
| 92 |
+ } |
|
| 93 |
+ } |
|
| 95 | 94 |
|
| 96 |
- } |
|
| 95 |
+ /** |
|
| 96 |
+ * 시스템 로그정보를 생성한다. |
|
| 97 |
+ * sevice Class의 select로 시작되는 Method |
|
| 98 |
+ * |
|
| 99 |
+ * @param ProceedingJoinPoint |
|
| 100 |
+ * @return Object |
|
| 101 |
+ * @throws Exception |
|
| 102 |
+ */ |
|
| 103 |
+ public void logAdminSelect(JoinPoint joinPoint) throws Throwable {
|
|
| 104 |
+ Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 105 |
+ if (isAuthenticated.booleanValue()) {
|
|
| 106 |
+ SysLog sysLog = new SysLog(); |
|
| 107 |
+ String className = joinPoint.getTarget().getClass().getName(); |
|
| 108 |
+ String methodName = joinPoint.getSignature().getName(); |
|
| 109 |
+ String processSeCode = ""; |
|
| 110 |
+ String uniqId = ""; |
|
| 111 |
+ String ip = ""; |
|
| 97 | 112 |
|
| 98 |
- /** |
|
| 99 |
- * 시스템 로그정보를 생성한다. |
|
| 100 |
- * sevice Class의 update로 시작되는 Method |
|
| 101 |
- * |
|
| 102 |
- * @param ProceedingJoinPoint |
|
| 103 |
- * @return Object |
|
| 104 |
- * @throws Exception |
|
| 105 |
- */ |
|
| 106 |
- public Object logUpdate(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 113 |
+ /* Authenticated */ |
|
| 107 | 114 |
|
| 108 |
- StopWatch stopWatch = new StopWatch(); |
|
| 115 |
+ LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 116 |
+ uniqId = user.getUniqId(); |
|
| 109 | 117 |
|
| 110 |
- try {
|
|
| 111 |
- stopWatch.start(); |
|
| 118 |
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 119 |
+ ip = request.getRemoteAddr(); |
|
| 120 |
+ sysLog.setUrl(request.getRequestURI()); |
|
| 112 | 121 |
|
| 113 |
- Object retValue = joinPoint.proceed(); |
|
| 114 |
- return retValue; |
|
| 115 |
- } catch (Throwable e) {
|
|
| 116 |
- throw e; |
|
| 117 |
- } finally {
|
|
| 118 |
- stopWatch.stop(); |
|
| 122 |
+ sysLog.setSrvcNm(className); |
|
| 123 |
+ sysLog.setMethodNm(methodName); |
|
| 124 |
+ sysLog.setParam(getParam(methodName, "logParam", request)); //모든 파라미터 검사한다. |
|
| 125 |
+ sysLog.setProcessSeCode(processSeCode); |
|
| 126 |
+ sysLog.setRqesterId(uniqId); |
|
| 127 |
+ sysLog.setRqesterIp(ip); |
|
| 119 | 128 |
|
| 120 |
- SysLog sysLog = new SysLog(); |
|
| 121 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 122 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 123 |
- String processSeCode = "U"; |
|
| 124 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 125 |
- String uniqId = ""; |
|
| 126 |
- String ip = ""; |
|
| 129 |
+ //sysLogService.logInsertSysLog(sysLog); |
|
| 130 |
+ sysLogService.logInsertAdminSysLog(sysLog); |
|
| 131 |
+ } |
|
| 132 |
+ } |
|
| 127 | 133 |
|
| 128 |
- /* Authenticated */ |
|
| 129 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 130 |
- if(isAuthenticated.booleanValue()) {
|
|
| 131 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 132 |
- uniqId = user.getUniqId(); |
|
| 133 |
- //ip = user.getIp(); |
|
| 134 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 135 |
- ip = request.getRemoteAddr(); |
|
| 136 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 137 |
- } |
|
| 138 |
- |
|
| 139 |
- sysLog.setSrvcNm(className); |
|
| 140 |
- sysLog.setMethodNm(methodName); |
|
| 141 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 142 |
- sysLog.setProcessTime(processTime); |
|
| 143 |
- sysLog.setRqesterId(uniqId); |
|
| 144 |
- sysLog.setRqesterIp(ip); |
|
| 145 |
- |
|
| 146 |
- sysLogService.logInsertSysLog(sysLog); |
|
| 147 |
- //sysLogService.logInsertAdminSysLog(sysLog); |
|
| 148 |
- |
|
| 149 |
- } |
|
| 150 |
- |
|
| 151 |
- } |
|
| 152 |
- |
|
| 153 |
- /** |
|
| 154 |
- * 시스템 로그정보를 생성한다. |
|
| 155 |
- * sevice Class의 delete로 시작되는 Method |
|
| 156 |
- * |
|
| 157 |
- * @param ProceedingJoinPoint |
|
| 158 |
- * @return Object |
|
| 159 |
- * @throws Exception |
|
| 160 |
- */ |
|
| 161 |
- public Object logDelete(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 162 |
- |
|
| 163 |
- StopWatch stopWatch = new StopWatch(); |
|
| 164 |
- |
|
| 165 |
- try {
|
|
| 166 |
- stopWatch.start(); |
|
| 167 |
- |
|
| 168 |
- Object retValue = joinPoint.proceed(); |
|
| 169 |
- return retValue; |
|
| 170 |
- } catch (Throwable e) {
|
|
| 171 |
- throw e; |
|
| 172 |
- } finally {
|
|
| 173 |
- stopWatch.stop(); |
|
| 174 |
- |
|
| 175 |
- SysLog sysLog = new SysLog(); |
|
| 176 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 177 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 178 |
- String processSeCode = "D"; |
|
| 179 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 180 |
- String uniqId = ""; |
|
| 181 |
- String ip = ""; |
|
| 182 |
- |
|
| 183 |
- /* Authenticated */ |
|
| 184 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 185 |
- if(isAuthenticated.booleanValue()) {
|
|
| 186 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 187 |
- uniqId = user.getUniqId(); |
|
| 188 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 189 |
- ip = request.getRemoteAddr(); |
|
| 190 |
- //ip = user.getIp(); |
|
| 191 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 192 |
- } |
|
| 193 |
- |
|
| 194 |
- sysLog.setSrvcNm(className); |
|
| 195 |
- sysLog.setMethodNm(methodName); |
|
| 196 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 197 |
- sysLog.setProcessTime(processTime); |
|
| 198 |
- sysLog.setRqesterId(uniqId); |
|
| 199 |
- sysLog.setRqesterIp(ip); |
|
| 200 |
- |
|
| 201 |
- sysLogService.logInsertSysLog(sysLog); |
|
| 202 |
- //sysLogService.logInsertAdminSysLog(sysLog); |
|
| 203 |
- |
|
| 204 |
- } |
|
| 205 |
- |
|
| 206 |
- } |
|
| 207 |
- |
|
| 208 |
- /** |
|
| 209 |
- * 시스템 로그정보를 생성한다. |
|
| 210 |
- * sevice Class의 select로 시작되는 Method |
|
| 211 |
- * |
|
| 212 |
- * @param ProceedingJoinPoint |
|
| 213 |
- * @return Object |
|
| 214 |
- * @throws Exception |
|
| 215 |
- */ |
|
| 216 |
- public Object logSelect(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 217 |
- |
|
| 218 |
- StopWatch stopWatch = new StopWatch(); |
|
| 219 |
- |
|
| 220 |
- try {
|
|
| 221 |
- stopWatch.start(); |
|
| 222 |
- |
|
| 223 |
- Object retValue = joinPoint.proceed(); |
|
| 224 |
- return retValue; |
|
| 225 |
- } catch (Throwable e) {
|
|
| 226 |
- throw e; |
|
| 227 |
- } finally {
|
|
| 228 |
- stopWatch.stop(); |
|
| 229 |
- |
|
| 230 |
- SysLog sysLog = new SysLog(); |
|
| 231 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 232 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 233 |
- String processSeCode = "R"; |
|
| 234 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 235 |
- String uniqId = ""; |
|
| 236 |
- String ip = ""; |
|
| 237 |
- |
|
| 238 |
- /* Authenticated */ |
|
| 239 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 240 |
- if(isAuthenticated.booleanValue()) {
|
|
| 241 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 242 |
- uniqId = user.getUniqId(); |
|
| 243 |
- //ip = user.getIp(); |
|
| 244 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 245 |
- ip = request.getRemoteAddr(); |
|
| 246 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 247 |
- } |
|
| 248 |
- |
|
| 249 |
- //String userIp = EgovClntInfo.getClntIP((HttpServletRequest) request); |
|
| 250 |
- sysLog.setSrvcNm(className); |
|
| 251 |
- sysLog.setMethodNm(methodName); |
|
| 252 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 253 |
- sysLog.setProcessTime(processTime); |
|
| 254 |
- sysLog.setRqesterId(uniqId); |
|
| 255 |
- sysLog.setRqesterIp(ip); |
|
| 256 |
- |
|
| 257 |
- sysLogService.logInsertSysLog(sysLog); |
|
| 258 |
- //sysLogService.logInsertAdminSysLog(sysLog); |
|
| 259 |
- |
|
| 260 |
- } |
|
| 261 |
- |
|
| 262 |
- } |
|
| 263 |
- |
|
| 264 |
- /** |
|
| 265 |
- * 시스템 로그정보를 생성한다. |
|
| 266 |
- * sevice Class의 insert로 시작되는 Method |
|
| 267 |
- * |
|
| 268 |
- * @param ProceedingJoinPoint |
|
| 269 |
- * @return Object |
|
| 270 |
- * @throws Exception |
|
| 271 |
- */ |
|
| 272 |
- public Object logAdminInsert(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 273 |
- |
|
| 274 |
- StopWatch stopWatch = new StopWatch(); |
|
| 275 |
- |
|
| 276 |
- try {
|
|
| 277 |
- stopWatch.start(); |
|
| 278 |
- |
|
| 279 |
- Object retValue = joinPoint.proceed(); |
|
| 280 |
- return retValue; |
|
| 281 |
- } catch (Throwable e) {
|
|
| 282 |
- throw e; |
|
| 283 |
- } finally {
|
|
| 284 |
- stopWatch.stop(); |
|
| 285 |
- |
|
| 286 |
- SysLog sysLog = new SysLog(); |
|
| 287 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 288 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 289 |
- String processSeCode = "C"; |
|
| 290 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 291 |
- String uniqId = ""; |
|
| 292 |
- String ip = ""; |
|
| 293 |
- |
|
| 294 |
- /* Authenticated */ |
|
| 295 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 296 |
- if(isAuthenticated.booleanValue()) {
|
|
| 297 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 298 |
- uniqId = user.getUniqId(); |
|
| 299 |
- //ip = user.getIp(); |
|
| 300 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 301 |
- ip = request.getRemoteAddr(); |
|
| 302 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 303 |
- } |
|
| 304 |
- |
|
| 305 |
- sysLog.setSrvcNm(className); |
|
| 306 |
- sysLog.setMethodNm(methodName); |
|
| 307 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 308 |
- sysLog.setProcessTime(processTime); |
|
| 309 |
- sysLog.setRqesterId(uniqId); |
|
| 310 |
- sysLog.setRqesterIp(ip); |
|
| 311 |
- |
|
| 312 |
- //sysLogService.logInsertSysLog(sysLog); |
|
| 313 |
- sysLogService.logInsertAdminSysLog(sysLog); |
|
| 314 |
- |
|
| 315 |
- } |
|
| 316 |
- |
|
| 317 |
- } |
|
| 318 |
- |
|
| 319 |
- /** |
|
| 320 |
- * 시스템 로그정보를 생성한다. |
|
| 321 |
- * sevice Class의 update로 시작되는 Method |
|
| 322 |
- * |
|
| 323 |
- * @param ProceedingJoinPoint |
|
| 324 |
- * @return Object |
|
| 325 |
- * @throws Exception |
|
| 326 |
- */ |
|
| 327 |
- public Object logAdminUpdate(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 328 |
- |
|
| 329 |
- StopWatch stopWatch = new StopWatch(); |
|
| 330 |
- |
|
| 331 |
- try {
|
|
| 332 |
- stopWatch.start(); |
|
| 333 |
- |
|
| 334 |
- Object retValue = joinPoint.proceed(); |
|
| 335 |
- return retValue; |
|
| 336 |
- } catch (Throwable e) {
|
|
| 337 |
- throw e; |
|
| 338 |
- } finally {
|
|
| 339 |
- stopWatch.stop(); |
|
| 340 |
- |
|
| 341 |
- SysLog sysLog = new SysLog(); |
|
| 342 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 343 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 344 |
- String processSeCode = "U"; |
|
| 345 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 346 |
- String uniqId = ""; |
|
| 347 |
- String ip = ""; |
|
| 348 |
- |
|
| 349 |
- /* Authenticated */ |
|
| 350 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 351 |
- if(isAuthenticated.booleanValue()) {
|
|
| 352 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 353 |
- uniqId = user.getUniqId(); |
|
| 354 |
- //ip = user.getIp(); |
|
| 355 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 356 |
- ip = request.getRemoteAddr(); |
|
| 357 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 358 |
- } |
|
| 359 |
- |
|
| 360 |
- sysLog.setSrvcNm(className); |
|
| 361 |
- sysLog.setMethodNm(methodName); |
|
| 362 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 363 |
- sysLog.setProcessTime(processTime); |
|
| 364 |
- sysLog.setRqesterId(uniqId); |
|
| 365 |
- sysLog.setRqesterIp(ip); |
|
| 366 |
- |
|
| 367 |
- //sysLogService.logInsertSysLog(sysLog); |
|
| 368 |
- sysLogService.logInsertAdminSysLog(sysLog); |
|
| 369 |
- |
|
| 370 |
- } |
|
| 371 |
- |
|
| 372 |
- } |
|
| 373 |
- |
|
| 374 |
- /** |
|
| 375 |
- * 시스템 로그정보를 생성한다. |
|
| 376 |
- * sevice Class의 delete로 시작되는 Method |
|
| 377 |
- * |
|
| 378 |
- * @param ProceedingJoinPoint |
|
| 379 |
- * @return Object |
|
| 380 |
- * @throws Exception |
|
| 381 |
- */ |
|
| 382 |
- public Object logAdminDelete(ProceedingJoinPoint joinPoint) throws Throwable {
|
|
| 383 |
- |
|
| 384 |
- StopWatch stopWatch = new StopWatch(); |
|
| 385 |
- |
|
| 386 |
- try {
|
|
| 387 |
- stopWatch.start(); |
|
| 388 |
- |
|
| 389 |
- Object retValue = joinPoint.proceed(); |
|
| 390 |
- return retValue; |
|
| 391 |
- } catch (Throwable e) {
|
|
| 392 |
- throw e; |
|
| 393 |
- } finally {
|
|
| 394 |
- stopWatch.stop(); |
|
| 395 |
- |
|
| 396 |
- SysLog sysLog = new SysLog(); |
|
| 397 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 398 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 399 |
- String processSeCode = "D"; |
|
| 400 |
- String processTime = Long.toString(stopWatch.getTotalTimeMillis()); |
|
| 401 |
- String uniqId = ""; |
|
| 402 |
- String ip = ""; |
|
| 403 |
- |
|
| 404 |
- /* Authenticated */ |
|
| 405 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 406 |
- if(isAuthenticated.booleanValue()) {
|
|
| 407 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 408 |
- uniqId = user.getUniqId(); |
|
| 409 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 410 |
- ip = request.getRemoteAddr(); |
|
| 411 |
- //ip = user.getIp(); |
|
| 412 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 413 |
- } |
|
| 414 |
- |
|
| 415 |
- sysLog.setSrvcNm(className); |
|
| 416 |
- sysLog.setMethodNm(methodName); |
|
| 417 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 418 |
- sysLog.setProcessTime(processTime); |
|
| 419 |
- sysLog.setRqesterId(uniqId); |
|
| 420 |
- sysLog.setRqesterIp(ip); |
|
| 421 |
- |
|
| 422 |
- //sysLogService.logInsertSysLog(sysLog); |
|
| 423 |
- sysLogService.logInsertAdminSysLog(sysLog); |
|
| 424 |
- |
|
| 425 |
- } |
|
| 426 |
- |
|
| 427 |
- } |
|
| 428 |
- |
|
| 429 |
- /** |
|
| 430 |
- * 시스템 로그정보를 생성한다. |
|
| 431 |
- * sevice Class의 select로 시작되는 Method |
|
| 432 |
- * |
|
| 433 |
- * @param ProceedingJoinPoint |
|
| 434 |
- * @return Object |
|
| 435 |
- * @throws Exception |
|
| 436 |
- */ |
|
| 437 |
- public void logAdminSelect(JoinPoint joinPoint) throws Throwable {
|
|
| 438 |
- Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
|
| 439 |
- if(isAuthenticated.booleanValue()) {
|
|
| 440 |
- SysLog sysLog = new SysLog(); |
|
| 441 |
- String className = joinPoint.getTarget().getClass().getName(); |
|
| 442 |
- String methodName = joinPoint.getSignature().getName(); |
|
| 443 |
- String processSeCode = ""; |
|
| 444 |
- String uniqId = ""; |
|
| 445 |
- String ip = ""; |
|
| 446 |
- |
|
| 447 |
- /* Authenticated */ |
|
| 448 |
- |
|
| 449 |
- LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
|
| 450 |
- uniqId = user.getUniqId(); |
|
| 451 |
- |
|
| 452 |
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
| 453 |
- ip = request.getRemoteAddr(); |
|
| 454 |
- sysLog.setUrl(request.getRequestURI()); |
|
| 455 |
- |
|
| 456 |
- sysLog.setSrvcNm(className); |
|
| 457 |
- sysLog.setMethodNm(methodName); |
|
| 458 |
- sysLog.setParam(getParam(methodName, "logParam" ,request)); //모든 파라미터 검사한다. |
|
| 459 |
- sysLog.setProcessSeCode(processSeCode); |
|
| 460 |
- sysLog.setRqesterId(uniqId); |
|
| 461 |
- sysLog.setRqesterIp(ip); |
|
| 462 |
- |
|
| 463 |
- //sysLogService.logInsertSysLog(sysLog); |
|
| 464 |
- sysLogService.logInsertAdminSysLog(sysLog); |
|
| 465 |
- } |
|
| 466 |
- } |
|
| 467 |
- |
|
| 468 |
- private String getParam(String methodName, String param , HttpServletRequest request) {
|
|
| 469 |
- Enumeration params = request.getParameterNames(); |
|
| 470 |
- String paramValue = ""; |
|
| 471 |
- String returnValue =""; |
|
| 472 |
- while (params.hasMoreElements()){
|
|
| 473 |
- paramValue = (String)params.nextElement(); |
|
| 474 |
- if(paramValue.equals(param)){
|
|
| 475 |
- //returnValue = param+"="+request.getParameter(paramValue) ; |
|
| 476 |
- returnValue = request.getParameter(paramValue) ; |
|
| 477 |
- break; |
|
| 478 |
- } |
|
| 479 |
- } |
|
| 480 |
- return returnValue; |
|
| 481 |
- } |
|
| 134 |
+ private String getParam(String methodName, String param, HttpServletRequest request) {
|
|
| 135 |
+ Enumeration params = request.getParameterNames(); |
|
| 136 |
+ String paramValue = ""; |
|
| 137 |
+ String returnValue = ""; |
|
| 138 |
+ while (params.hasMoreElements()) {
|
|
| 139 |
+ paramValue = (String) params.nextElement(); |
|
| 140 |
+ if (paramValue.equals(param)) {
|
|
| 141 |
+ //returnValue = param+"="+request.getParameter(paramValue) ; |
|
| 142 |
+ returnValue = request.getParameter(paramValue); |
|
| 143 |
+ break; |
|
| 144 |
+ } |
|
| 145 |
+ } |
|
| 146 |
+ return returnValue; |
|
| 147 |
+ } |
|
| 482 | 148 |
} |
+++ src/main/java/itn/let/sym/log/personal/PersonalInformationLogService.java
... | ... | @@ -0,0 +1,10 @@ |
| 1 | +package itn.let.sym.log.personal; | |
| 2 | + | |
| 3 | +import java.util.List; | |
| 4 | + | |
| 5 | +public interface PersonalInformationLogService { | |
| 6 | + List<PersonalInformationLogVO> selectPersonalInformationLogList(PersonalInformationLogVO logVO) throws Exception; | |
| 7 | + Integer selectPersonalInformationLogListTotCnt(PersonalInformationLogVO logVO) throws Exception; | |
| 8 | + void insertPersonalInformationLog(PersonalInformationLogVO logVO) throws Exception; | |
| 9 | +} | |
| 10 | + |
+++ src/main/java/itn/let/sym/log/personal/PersonalInformationLogVO.java
... | ... | @@ -0,0 +1,28 @@ |
| 1 | +package itn.let.sym.log.personal; | |
| 2 | + | |
| 3 | +import itn.com.utl.page.BasePageableVO; | |
| 4 | +import lombok.Getter; | |
| 5 | +import lombok.NoArgsConstructor; | |
| 6 | +import lombok.Setter; | |
| 7 | + | |
| 8 | +@Getter | |
| 9 | +@Setter | |
| 10 | +@NoArgsConstructor | |
| 11 | +public class PersonalInformationLogVO extends BasePageableVO { | |
| 12 | + private String logId; | |
| 13 | + // 행위자 | |
| 14 | + private String userId; | |
| 15 | + // IP | |
| 16 | + private String accessIp; | |
| 17 | + // 메뉴명 | |
| 18 | + private String menuNm; | |
| 19 | + // 요청 URI | |
| 20 | + private String uri; | |
| 21 | + // 행위 | |
| 22 | + private String action; | |
| 23 | + | |
| 24 | + private String target; | |
| 25 | + private String frstRegistPnttm; | |
| 26 | +} | |
| 27 | + | |
| 28 | + |
+++ src/main/java/itn/let/sym/log/personal/service/impl/PersonalInformationLogDAO.java
... | ... | @@ -0,0 +1,25 @@ |
| 1 | +package itn.let.sym.log.personal.service.impl; | |
| 2 | + | |
| 3 | +import itn.com.cmm.service.impl.EgovComAbstractDAO; | |
| 4 | +import itn.let.sym.log.personal.PersonalInformationLogVO; | |
| 5 | +import org.springframework.stereotype.Repository; | |
| 6 | + | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +@Repository("personalInformationLogDAO") | |
| 10 | +public class PersonalInformationLogDAO extends EgovComAbstractDAO { | |
| 11 | + @SuppressWarnings("unchecked") | |
| 12 | + public List<PersonalInformationLogVO> selectPersonalInformationLogList(PersonalInformationLogVO logVO) throws Exception{ | |
| 13 | + return (List<PersonalInformationLogVO>)select("personalInformationLogDAO.selectPersonalInformationLogList", logVO); | |
| 14 | + } | |
| 15 | + | |
| 16 | + | |
| 17 | + public Integer selectPersonalInformationLogListTotCnt(PersonalInformationLogVO logVO) throws Exception{ | |
| 18 | + return (Integer) select("personalInformationLogDAO.selectPersonalInformationLogListTotCnt", logVO); | |
| 19 | + } | |
| 20 | + | |
| 21 | + | |
| 22 | + public void insertPersonalInformationLog(PersonalInformationLogVO logVO) throws Exception { | |
| 23 | + insert("personalInformationLogDAO.insertPersonalInformationLog", logVO); | |
| 24 | + } | |
| 25 | +} |
+++ src/main/java/itn/let/sym/log/personal/service/impl/PersonalInformationLogServiceImpl.java
... | ... | @@ -0,0 +1,36 @@ |
| 1 | +package itn.let.sym.log.personal.service.impl; | |
| 2 | + | |
| 3 | +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
| 4 | +import egovframework.rte.fdl.idgnr.EgovIdGnrService; | |
| 5 | +import itn.let.sym.log.personal.PersonalInformationLogService; | |
| 6 | +import itn.let.sym.log.personal.PersonalInformationLogVO; | |
| 7 | +import org.springframework.stereotype.Service; | |
| 8 | + | |
| 9 | +import javax.annotation.Resource; | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +@Service(value = "personalInformationLogService") | |
| 13 | +public class PersonalInformationLogServiceImpl extends EgovAbstractServiceImpl implements PersonalInformationLogService { | |
| 14 | + | |
| 15 | + @Resource(name = "personalInformationLogDAO") | |
| 16 | + private PersonalInformationLogDAO personalInformationLogDAO; | |
| 17 | + | |
| 18 | + @Resource(name = "egovPersonalInformationLogIdgenService") | |
| 19 | + private EgovIdGnrService idGenService; | |
| 20 | + | |
| 21 | + @Override | |
| 22 | + public List<PersonalInformationLogVO> selectPersonalInformationLogList(PersonalInformationLogVO logVO) throws Exception { | |
| 23 | + return personalInformationLogDAO.selectPersonalInformationLogList(logVO); | |
| 24 | + } | |
| 25 | + | |
| 26 | + @Override | |
| 27 | + public Integer selectPersonalInformationLogListTotCnt(PersonalInformationLogVO logVO) throws Exception { | |
| 28 | + return personalInformationLogDAO.selectPersonalInformationLogListTotCnt(logVO); | |
| 29 | + } | |
| 30 | + | |
| 31 | + @Override | |
| 32 | + public void insertPersonalInformationLog(PersonalInformationLogVO logVO) throws Exception { | |
| 33 | + logVO.setLogId(idGenService.getNextStringId()); | |
| 34 | + personalInformationLogDAO.insertPersonalInformationLog(logVO); | |
| 35 | + } | |
| 36 | +} |
+++ src/main/java/itn/let/sym/log/personal/service/web/PersonalInformationLogController.java
... | ... | @@ -0,0 +1,28 @@ |
| 1 | +package itn.let.sym.log.personal.service.web; | |
| 2 | + | |
| 3 | +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; | |
| 4 | +import itn.com.utl.page.PaginationUtil; | |
| 5 | +import itn.let.sym.log.personal.PersonalInformationLogService; | |
| 6 | +import itn.let.sym.log.personal.PersonalInformationLogVO; | |
| 7 | +import org.springframework.stereotype.Controller; | |
| 8 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 9 | + | |
| 10 | +import javax.annotation.Resource; | |
| 11 | +import java.util.List; | |
| 12 | + | |
| 13 | +@Controller | |
| 14 | +public class PersonalInformationLogController { | |
| 15 | + | |
| 16 | + @Resource(name = "personalInformationLogService") | |
| 17 | + private PersonalInformationLogService personalInformationLogService; | |
| 18 | + | |
| 19 | +// @RequestMapping(value = "") | |
| 20 | +// public String personalInformationLog(PersonalInformationLogVO searchVO) throws Exception { | |
| 21 | +// PaginationInfo paginationInfo = PaginationUtil.initWithSort(searchVO, "FRST_REGIST_PNTTM", "desc"); | |
| 22 | +// List<PersonalInformationLogVO> result = personalInformationLogService.selectPersonalInformationLogList(searchVO); | |
| 23 | +// int totCnt = personalInformationLogService.selectPersonalInformationLogListTotCnt(searchVO); | |
| 24 | +// paginationInfo.setTotalRecordCount(totCnt); | |
| 25 | +// | |
| 26 | +// return ""; | |
| 27 | +// } | |
| 28 | +} |
--- src/main/java/itn/let/sym/mnu/mcm/web/EgovMenuCreateManageController.java
+++ src/main/java/itn/let/sym/mnu/mcm/web/EgovMenuCreateManageController.java
... | ... | @@ -81,7 +81,7 @@ |
| 81 | 81 |
/** EgovMenuManageService */ |
| 82 | 82 |
@Resource(name = "meunManageService") |
| 83 | 83 |
private EgovMenuManageService menuManageService; |
| 84 |
- |
|
| 84 |
+ |
|
| 85 | 85 |
/** cmmUseService */ |
| 86 | 86 |
@Resource(name = "EgovCmmUseService") |
| 87 | 87 |
private EgovCmmUseService cmmUseService; |
... | ... | @@ -89,23 +89,23 @@ |
| 89 | 89 |
|
| 90 | 90 |
@Resource(name = "menuCreateManageDAO") |
| 91 | 91 |
private MenuCreateManageDAO menuCreateManageDAO; |
| 92 |
- |
|
| 92 |
+ |
|
| 93 | 93 |
@Resource(name = "egovMenuIdGnrService") |
| 94 |
- private EgovIdGnrService idgenService; |
|
| 95 |
- |
|
| 94 |
+ private EgovIdGnrService idgenService; |
|
| 95 |
+ |
|
| 96 | 96 |
/** EgovProgrmManageService */ |
| 97 | 97 |
@Resource(name = "progrmManageService") |
| 98 | 98 |
private EgovProgrmManageService progrmManageService; |
| 99 |
- |
|
| 99 |
+ |
|
| 100 | 100 |
@Resource(name = "egovSiteManagerService") |
| 101 | 101 |
EgovSiteManagerService egovSiteManagerService; |
| 102 |
- |
|
| 102 |
+ |
|
| 103 | 103 |
@Resource(name = "EgovBBSAttributeManageService") |
| 104 | 104 |
private EgovBBSAttributeManageService bbsAttrbService; |
| 105 |
- |
|
| 105 |
+ |
|
| 106 | 106 |
@Resource(name = "egovCntManageService") |
| 107 | 107 |
private EgovCntManageService egovCntManageService; |
| 108 |
- |
|
| 108 |
+ |
|
| 109 | 109 |
/** |
| 110 | 110 |
* *메뉴생성목록을 조회한다. |
| 111 | 111 |
* |
... | ... | @@ -119,7 +119,7 @@ |
| 119 | 119 |
String resultMsg = ""; |
| 120 | 120 |
// 0. Spring Security 사용자권한 처리 |
| 121 | 121 |
if(searchVO.getPageUnit() != 10) {
|
| 122 |
- searchVO.setPageUnit(searchVO.getPageUnit()); |
|
| 122 |
+ searchVO.setPageUnit(searchVO.getPageUnit()); |
|
| 123 | 123 |
} |
| 124 | 124 |
|
| 125 | 125 |
/** pageing */ |
... | ... | @@ -141,7 +141,7 @@ |
| 141 | 141 |
searchVO.setSearchKeyword(vo.getAuthorCode()); |
| 142 | 142 |
} |
| 143 | 143 |
} |
| 144 |
- |
|
| 144 |
+ |
|
| 145 | 145 |
if("".equals(searchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
|
| 146 | 146 |
searchVO.setSearchSortCnd("tempSortNum");
|
| 147 | 147 |
searchVO.setSearchSortOrd("desc");
|
... | ... | @@ -179,7 +179,7 @@ |
| 179 | 179 |
/*if(null == menuCreatVO.getSiteId() || "".equals(menuCreatVO.getSiteId() ) ){
|
| 180 | 180 |
menuCreatVO.setSiteId("N");
|
| 181 | 181 |
}*/ |
| 182 |
- //관리자 매뉴만 보이게 |
|
| 182 |
+ //관리자 매뉴만 보이게 |
|
| 183 | 183 |
menuCreatVO.setUnderMenuNo("9"); //MENU_NO < 9900000
|
| 184 | 184 |
List<?> list_menulist = menuCreateManageService.selectMenuCreatList(menuCreatVO) ; |
| 185 | 185 |
model.addAttribute("list_menulist", list_menulist );
|
... | ... | @@ -199,7 +199,7 @@ |
| 199 | 199 |
*/ |
| 200 | 200 |
@RequestMapping("/sym/mnu/mcm/EgovMenuCreatInsert.do")
|
| 201 | 201 |
public String insertMenuCreatList(@RequestParam("checkedAuthorForInsert") String checkedAuthorForInsert, @RequestParam("checkedMenuNoForInsert") String checkedMenuNoForInsert,
|
| 202 |
- @ModelAttribute("menuCreatVO") MenuCreatVO menuCreatVO, ModelMap model) throws Exception {
|
|
| 202 |
+ @ModelAttribute("menuCreatVO") MenuCreatVO menuCreatVO, ModelMap model) throws Exception {
|
|
| 203 | 203 |
String resultMsg = ""; |
| 204 | 204 |
// 0. Spring Security 사용자권한 처리 |
| 205 | 205 |
Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
... | ... | @@ -216,14 +216,14 @@ |
| 216 | 216 |
}catch(Exception e){
|
| 217 | 217 |
resultMsg = egovMessageSource.getMessage("fail.common.insert");
|
| 218 | 218 |
} |
| 219 |
- |
|
| 219 |
+ |
|
| 220 | 220 |
resultMsg = egovMessageSource.getMessage("success.common.insert");
|
| 221 | 221 |
} |
| 222 | 222 |
model.addAttribute("message", resultMsg);
|
| 223 | 223 |
return "forward:/sym/mnu/mcm/EgovMenuCreatSelect.do"; |
| 224 | 224 |
} |
| 225 |
- |
|
| 226 |
- |
|
| 225 |
+ |
|
| 226 |
+ |
|
| 227 | 227 |
/* 메뉴생성 세부조회 */ |
| 228 | 228 |
/** |
| 229 | 229 |
* 메뉴생성 세부화면을 조회한다. |
... | ... | @@ -235,32 +235,32 @@ |
| 235 | 235 |
*/ |
| 236 | 236 |
@RequestMapping(value = "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do") |
| 237 | 237 |
public String selectEgovMenuCreatSelectJtree(@ModelAttribute("menuCreatVO") MenuCreatVO menuCreatVO, @ModelAttribute("searchVO") ComDefaultVO searchVO,
|
| 238 |
- ModelMap model, MenuManageVO menuManageVO , HttpSession session ) throws Exception {
|
|
| 238 |
+ ModelMap model, MenuManageVO menuManageVO , HttpSession session ) throws Exception {
|
|
| 239 | 239 |
// 0. Spring Security 사용자권한 처리 |
| 240 |
- |
|
| 240 |
+ |
|
| 241 | 241 |
if(menuCreatVO.getMenuUserType() == null){
|
| 242 | 242 |
menuCreatVO.setMenuUserType("A"); //사용자 디폴트
|
| 243 | 243 |
} |
| 244 |
- |
|
| 244 |
+ |
|
| 245 | 245 |
if(null == menuManageVO.getAuthorCode()) {
|
| 246 | 246 |
menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
|
| 247 | 247 |
} |
| 248 | 248 |
model.addAttribute("menuCreatVO", menuCreatVO);
|
| 249 | 249 |
return "sym/mnu/mpm/EgovMenuCreatSelectJtree"; |
| 250 | 250 |
} |
| 251 |
- |
|
| 252 |
- |
|
| 251 |
+ |
|
| 252 |
+ |
|
| 253 | 253 |
@RequestMapping(value = {"/sym/mnu/mcm/EgovMenuCreatSelectJtreeAjax.do", "/sym/mnu/mcm/EgovMenuQuickSelectJtreeAjax.do" } )
|
| 254 |
- public void EgovMenuCreatSelectJtreeAjax(@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model,
|
|
| 255 |
- HttpServletResponse response , HttpServletRequest request) throws Exception {
|
|
| 254 |
+ public void EgovMenuCreatSelectJtreeAjax(@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model,
|
|
| 255 |
+ HttpServletResponse response , HttpServletRequest request) throws Exception {
|
|
| 256 | 256 |
ObjectMapper mapper = new ObjectMapper(); |
| 257 | 257 |
response.setHeader("Content-Type", "text/html;charset=utf-8");
|
| 258 | 258 |
PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8")); |
| 259 |
- |
|
| 259 |
+ |
|
| 260 | 260 |
menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); |
| 261 |
- |
|
| 261 |
+ |
|
| 262 | 262 |
List<MenuManageJTreeVO> resultList = null ; |
| 263 |
- |
|
| 263 |
+ |
|
| 264 | 264 |
if(request.getServletPath().equals("/sym/mnu/mcm/EgovMenuQuickSelectJtreeAjax.do")) { //즐겨찾기
|
| 265 | 265 |
resultList = menuCreateManageService.selectQuickListJtree(menuManageVO) ; |
| 266 | 266 |
}else {
|
... | ... | @@ -270,16 +270,16 @@ |
| 270 | 270 |
menuManageTopVO.setUpperMenuId("#");
|
| 271 | 271 |
menuManageTopVO.setMenuNo("0");
|
| 272 | 272 |
menuManageTopVO.setMenuNm("사용자메뉴");
|
| 273 |
- |
|
| 273 |
+ |
|
| 274 | 274 |
if("ROLE_ADMIN".equals(menuManageVO.getAuthorCode())){
|
| 275 | 275 |
menuManageTopVO.setMenuNm("관리자메뉴");
|
| 276 | 276 |
} |
| 277 |
- |
|
| 277 |
+ |
|
| 278 | 278 |
resultList.add(0, menuManageTopVO); |
| 279 | 279 |
mapper.writeValue(out, resultList); |
| 280 | 280 |
out.flush(); |
| 281 | 281 |
} |
| 282 |
- |
|
| 282 |
+ |
|
| 283 | 283 |
/** |
| 284 | 284 |
* 매뉴 정보를 조회한다. |
| 285 | 285 |
* |
... | ... | @@ -289,16 +289,16 @@ |
| 289 | 289 |
* @throws Exception |
| 290 | 290 |
*/ |
| 291 | 291 |
@RequestMapping("/sym/mnu/mcm/EgovMenuInfoAjax.do")
|
| 292 |
- public ModelAndView EgovMenuInfoAjax(@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, @RequestParam("menuNo") String menuNo ,
|
|
| 293 |
- @ModelAttribute("searchVO") ComDefaultVO searchVO , ModelMap model) throws Exception {
|
|
| 292 |
+ public ModelAndView EgovMenuInfoAjax(@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, @RequestParam("menuNo") String menuNo ,
|
|
| 293 |
+ @ModelAttribute("searchVO") ComDefaultVO searchVO , ModelMap model) throws Exception {
|
|
| 294 | 294 |
ModelAndView modelAndView = new ModelAndView(); |
| 295 | 295 |
modelAndView.setViewName("jsonView");
|
| 296 |
- |
|
| 297 |
- |
|
| 296 |
+ |
|
| 297 |
+ |
|
| 298 | 298 |
MenuManageVO tempMenuManageVO = new MenuManageVO(); |
| 299 | 299 |
tempMenuManageVO.setSearchKeyword(menuNo); |
| 300 | 300 |
tempMenuManageVO.setAuthorCode(menuManageVO.getAuthorCode()); |
| 301 |
- |
|
| 301 |
+ |
|
| 302 | 302 |
MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO); |
| 303 | 303 |
if(resultVO.getProgrmFileNm() !=null){
|
| 304 | 304 |
searchVO.setSearchKeyword(resultVO.getProgrmFileNm()); |
... | ... | @@ -310,7 +310,7 @@ |
| 310 | 310 |
} |
| 311 | 311 |
} |
| 312 | 312 |
model.addAttribute("menuManageVO", resultVO);
|
| 313 |
- |
|
| 313 |
+ |
|
| 314 | 314 |
//메뉴 화면구분 |
| 315 | 315 |
ComDefaultCodeVO vo = new ComDefaultCodeVO(); |
| 316 | 316 |
vo.setCodeId("COM039");
|
... | ... | @@ -341,7 +341,7 @@ |
| 341 | 341 |
menuManageVO.setRelateImageNm("/"); //임시
|
| 342 | 342 |
menuManageVO.setProgrmFileNm("dir"); //임시
|
| 343 | 343 |
menuManageVO.setMenuUserType("U"); //임시
|
| 344 |
- |
|
| 344 |
+ |
|
| 345 | 345 |
{ //동급 레벨 번호 조회
|
| 346 | 346 |
String equiLevel = (menuManageVO.getUpperMenuId()+"").replaceFirst("0" , "%");
|
| 347 | 347 |
List<MenuManageVO> equiMenuManageList = menuManageService.selectEquiLevelList(equiLevel); |
... | ... | @@ -354,7 +354,7 @@ |
| 354 | 354 |
}else {
|
| 355 | 355 |
insertMenNo = (menuManageVO.getUpperMenuId()+"").replaceFirst("0" , i+"") ;
|
| 356 | 356 |
} |
| 357 |
- |
|
| 357 |
+ |
|
| 358 | 358 |
try{
|
| 359 | 359 |
existMenuManageVO.setMenuNo(Integer.parseInt(insertMenNo) ); |
| 360 | 360 |
}catch(Exception e){
|
... | ... | @@ -365,13 +365,13 @@ |
| 365 | 365 |
break ; |
| 366 | 366 |
} |
| 367 | 367 |
} |
| 368 |
- menuManageVO.setMenuNo(Integer.parseInt(insertMenNo) ); |
|
| 368 |
+ menuManageVO.setMenuNo(Integer.parseInt(insertMenNo) ); |
|
| 369 | 369 |
}else{
|
| 370 | 370 |
insertMenNo = (menuManageVO.getUpperMenuId()+"").replaceFirst("0" , "1");
|
| 371 |
- menuManageVO.setMenuNo( Integer.parseInt(insertMenNo)); |
|
| 371 |
+ menuManageVO.setMenuNo( Integer.parseInt(insertMenNo)); |
|
| 372 | 372 |
} |
| 373 | 373 |
} |
| 374 |
- |
|
| 374 |
+ |
|
| 375 | 375 |
/*{ //프로그램 리스트 테이블에 insert
|
| 376 | 376 |
String progrmFileNm = idgenService.getNextStringId(); |
| 377 | 377 |
progrmManageVO.setProgrmFileNm(progrmFileNm); |
... | ... | @@ -380,35 +380,35 @@ |
| 380 | 380 |
progrmManageVO.setProgrmDc(menuManageVO.getMenuNm()); |
| 381 | 381 |
progrmManageService.insertProgrm(progrmManageVO); |
| 382 | 382 |
}*/ |
| 383 |
- |
|
| 384 |
- //LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser() ; |
|
| 383 |
+ |
|
| 384 |
+ //LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser() ; |
|
| 385 | 385 |
/*if(null == user.getSiteId()){
|
| 386 | 386 |
menuManageVO.setSiteId("N");
|
| 387 | 387 |
}else{
|
| 388 | 388 |
menuManageVO.setSiteId(user.getSiteId()); |
| 389 | 389 |
}*/ |
| 390 |
- |
|
| 390 |
+ |
|
| 391 | 391 |
menuManageService.insertMenuManage(menuManageVO); |
| 392 | 392 |
//메뉴생성내역 테이블에 등록 |
| 393 | 393 |
menuCreateManageService.insertMenuCreat(menuManageVO); |
| 394 |
- modelAndView.addObject("menuManageResultVO", menuManageVO);
|
|
| 395 |
- modelAndView.addObject("status", "success");
|
|
| 394 |
+ modelAndView.addObject("menuManageResultVO", menuManageVO);
|
|
| 395 |
+ modelAndView.addObject("status", "success");
|
|
| 396 | 396 |
}catch (Exception e) {
|
| 397 | 397 |
MenuManageVO tempMenuManageVO = new MenuManageVO(); |
| 398 | 398 |
tempMenuManageVO.setSearchKeyword(menuManageVO.getMenuNo()+""); |
| 399 | 399 |
tempMenuManageVO.setAuthorCode(menuManageVO.getAuthorCode()); |
| 400 | 400 |
menuManageVO = menuManageService.selectMenuManage(tempMenuManageVO); |
| 401 | 401 |
if(menuManageVO != null){//현제 매뉴 조회
|
| 402 |
- modelAndView.addObject("status", "dupl");
|
|
| 402 |
+ modelAndView.addObject("status", "dupl");
|
|
| 403 | 403 |
modelAndView.addObject("menuManageResultVO", menuManageVO);
|
| 404 | 404 |
}else{ //하위 매뉴 조회
|
| 405 |
- modelAndView.addObject("status", "fail");
|
|
| 405 |
+ modelAndView.addObject("status", "fail");
|
|
| 406 | 406 |
} |
| 407 | 407 |
} |
| 408 | 408 |
return modelAndView; |
| 409 | 409 |
} |
| 410 |
- |
|
| 411 |
- |
|
| 410 |
+ |
|
| 411 |
+ |
|
| 412 | 412 |
/** |
| 413 | 413 |
* 매뉴 정보를 삭제한다.(트리구조에서) |
| 414 | 414 |
* |
... | ... | @@ -425,31 +425,31 @@ |
| 425 | 425 |
try{
|
| 426 | 426 |
List<MenuManageVO> menuManagePkList = new ArrayList<>(); //참조키 리스트 조회 |
| 427 | 427 |
menuManagePkList = menuManageService.selectUpperMenuNoByPkList(menuManageVO) ; |
| 428 |
- if(menuManagePkList.size() != 0){
|
|
| 428 |
+ if(menuManagePkList.size() != 0){
|
|
| 429 | 429 |
modelAndView.addObject("status", "duplPk");
|
| 430 | 430 |
MenuManageVO menuManageResultVO = new MenuManageVO(); |
| 431 | 431 |
StringBuffer pKmenuCours = null; |
| 432 | 432 |
for(MenuManageVO tempMenuManageVO : menuManagePkList){
|
| 433 |
- pKmenuCours.append(tempMenuManageVO.getMenuCours()+" "); |
|
| 433 |
+ pKmenuCours.append(tempMenuManageVO.getMenuCours()+" "); |
|
| 434 | 434 |
} |
| 435 | 435 |
menuManageResultVO.setMenuCours(pKmenuCours+""); |
| 436 | 436 |
modelAndView.addObject("menuManageResultVO", menuManageResultVO);
|
| 437 | 437 |
return modelAndView; |
| 438 | 438 |
} |
| 439 |
- |
|
| 440 |
- |
|
| 439 |
+ |
|
| 440 |
+ |
|
| 441 | 441 |
int usingOtherSiteCnt = menuCreateManageDAO.selectMenuCreatAuthCnt(menuCreatVO) ; //다른 사이트 아이디가 매뉴를 사용할시 매뉴 삭제안한다. |
| 442 | 442 |
if(usingOtherSiteCnt == 1){
|
| 443 | 443 |
menuManageService.deleteMenuManage(menuManageVO); |
| 444 | 444 |
} |
| 445 |
- |
|
| 445 |
+ |
|
| 446 | 446 |
/*LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); |
| 447 | 447 |
if(null == loginVO){
|
| 448 | 448 |
menuCreatVO.setSiteId("N");
|
| 449 | 449 |
}else{
|
| 450 | 450 |
menuCreatVO.setSiteId(loginVO.getSiteId()); |
| 451 | 451 |
}*/ |
| 452 |
- |
|
| 452 |
+ |
|
| 453 | 453 |
menuCreateManageDAO.deleteMenuCreatAuthNo(menuCreatVO); |
| 454 | 454 |
if(null != progrmManageVO.getProgrmFileNm() && !progrmManageVO.getProgrmFileNm().equals("dir")){ //프로그램만 지움
|
| 455 | 455 |
if(usingOtherSiteCnt == 1){ //다른 사이트 아이디가 매뉴를 사용할시 매뉴 삭제안한다.
|
... | ... | @@ -462,7 +462,7 @@ |
| 462 | 462 |
} |
| 463 | 463 |
return modelAndView; |
| 464 | 464 |
} |
| 465 |
- |
|
| 465 |
+ |
|
| 466 | 466 |
/** |
| 467 | 467 |
* 매뉴 정보를 수정한다. |
| 468 | 468 |
* |
... | ... | @@ -474,11 +474,11 @@ |
| 474 | 474 |
@SuppressWarnings("unused")
|
| 475 | 475 |
@Transactional(rollbackFor = Exception.class) |
| 476 | 476 |
@RequestMapping("/sym/mnu/mcm/EgovMenuInfoUpdateAjax.do")
|
| 477 |
- public ModelAndView updateEgovMenuInfoAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 478 |
- MenuCreatVO menuCreatVO , |
|
| 479 |
- ProgrmManageVO progrmManageVO , |
|
| 480 |
- @ModelAttribute("searchVO") ComDefaultVO searchVO ,
|
|
| 481 |
- ModelMap model) throws Exception {
|
|
| 477 |
+ public ModelAndView updateEgovMenuInfoAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 478 |
+ MenuCreatVO menuCreatVO , |
|
| 479 |
+ ProgrmManageVO progrmManageVO , |
|
| 480 |
+ @ModelAttribute("searchVO") ComDefaultVO searchVO ,
|
|
| 481 |
+ ModelMap model) throws Exception {
|
|
| 482 | 482 |
ModelAndView modelAndView = new ModelAndView(); |
| 483 | 483 |
modelAndView.setViewName("jsonView");
|
| 484 | 484 |
int cnt = 0; |
... | ... | @@ -491,9 +491,9 @@ |
| 491 | 491 |
return modelAndView; |
| 492 | 492 |
} |
| 493 | 493 |
} |
| 494 |
- |
|
| 494 |
+ |
|
| 495 | 495 |
LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); |
| 496 |
- |
|
| 496 |
+ |
|
| 497 | 497 |
//프로그램에 목록이 있는지 조회후 있으면 update/ 아닌경우 insert |
| 498 | 498 |
progrmManageVO.setProgrmStrePath("/web/");
|
| 499 | 499 |
progrmManageVO.setProgrmKoreanNm(menuManageVO.getMenuNm()); |
... | ... | @@ -504,14 +504,14 @@ |
| 504 | 504 |
}/*else if("B".equals(menuManageVO.getMenuType())){
|
| 505 | 505 |
progrmManageVO.setURL("/web/cop/bbsWeb/selectBoardList.do?bbsId="+progrmManageVO.getProgrmFileNm());
|
| 506 | 506 |
}*/ |
| 507 |
- |
|
| 507 |
+ |
|
| 508 | 508 |
boolean delFlag = false; |
| 509 | 509 |
if(!menuManageVO.getMenuType().equals("M") && menuManageVO.getTmp_Name().equals("dir")){ //디렉토리 폴더에서 프로그램으로 바꿀경우 프로그램 목록 insert
|
| 510 | 510 |
searchVO.setSearchKeyword(progrmManageVO.getProgrmFileNm()); |
| 511 | 511 |
if(progrmManageService.selectProgrm(searchVO) != null){ //중복 프로그램 이름 확인
|
| 512 | 512 |
modelAndView.addObject("status", "duplProNm");
|
| 513 | 513 |
return modelAndView; |
| 514 |
- }; |
|
| 514 |
+ }; |
|
| 515 | 515 |
menuManageVO.setProgrmFileNm(progrmManageVO.getProgrmFileNm()); |
| 516 | 516 |
progrmManageVO.setProgrmFileNm(progrmManageVO.getProgrmFileNm()); |
| 517 | 517 |
progrmManageService.insertProgrm(progrmManageVO); |
... | ... | @@ -520,8 +520,8 @@ |
| 520 | 520 |
menuManageVO.setProgrmFileNm(progrmManageVO.getProgrmFileNm()); |
| 521 | 521 |
progrmManageVO.setProgrmFileNm(menuManageVO.getProgrmFileNm()); |
| 522 | 522 |
progrmManageService.updateProgrm(progrmManageVO); |
| 523 |
- menuCreateManageDAO.updateMenuNo(menuCreatVO); |
|
| 524 |
- }else{ //중복프로그램 조회 > del > insert
|
|
| 523 |
+ menuCreateManageDAO.updateMenuNo(menuCreatVO); |
|
| 524 |
+ }else{ //중복프로그램 조회 > del > insert
|
|
| 525 | 525 |
if(menuManageVO.getMenuType().equals("M")){ //프로그램에서 매뉴로 바꿀시 lettnmenuinfo 만 업데이트 / lettnprogrmlist 삭제
|
| 526 | 526 |
menuManageService.updateMenuManageJtree(menuManageVO); |
| 527 | 527 |
ProgrmManageVO delProgrmManageVO = new ProgrmManageVO(); |
... | ... | @@ -530,37 +530,37 @@ |
| 530 | 530 |
modelAndView.addObject("status", "success");
|
| 531 | 531 |
return modelAndView; |
| 532 | 532 |
} |
| 533 |
- |
|
| 533 |
+ |
|
| 534 | 534 |
searchVO.setSearchKeyword(progrmManageVO.getProgrmFileNm()); |
| 535 | 535 |
if(progrmManageService.selectProgrm(searchVO) != null){ //중복 프로그램 이름 확인
|
| 536 | 536 |
modelAndView.addObject("status", "duplProNm");
|
| 537 | 537 |
return modelAndView; |
| 538 |
- }; |
|
| 539 |
- |
|
| 538 |
+ }; |
|
| 539 |
+ |
|
| 540 | 540 |
menuManageVO.setProgrmFileNm(progrmManageVO.getProgrmFileNm()); |
| 541 | 541 |
progrmManageVO.setProgrmFileNm(menuManageVO.getProgrmFileNm()); |
| 542 | 542 |
searchVO.setSearchKeyword(progrmManageVO.getProgrmFileNm()); |
| 543 |
- progrmManageService.insertProgrm(progrmManageVO); |
|
| 543 |
+ progrmManageService.insertProgrm(progrmManageVO); |
|
| 544 | 544 |
delFlag = true; //프로그램 등록 후 MENUINFO를 업데이트시킨다.(lettnprogrmlist` (`PROGRM_FILE_NM`) ON DELETE CASCADE) 이후 이전 삭제 |
| 545 | 545 |
} |
| 546 | 546 |
} |
| 547 |
- |
|
| 547 |
+ |
|
| 548 | 548 |
menuManageVO.setRelateImagePath("/");
|
| 549 | 549 |
menuManageVO.setRelateImageNm("/");
|
| 550 |
- |
|
| 550 |
+ |
|
| 551 | 551 |
MenuManageVO tempMenuManageVO = new MenuManageVO(); |
| 552 | 552 |
tempMenuManageVO.setSearchKeyword(menuManageVO.getTmp_Id()+""); |
| 553 | 553 |
tempMenuManageVO.setAuthorCode(menuManageVO.getAuthorCode()); |
| 554 |
- |
|
| 554 |
+ |
|
| 555 | 555 |
MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO); |
| 556 |
- |
|
| 557 |
- if(resultVO.getMenuOrdr() > menuManageVO.getMenuOrdr() ){ //이전 sortOrder > 바꾸려는 sortOrder
|
|
| 556 |
+ |
|
| 557 |
+ if(resultVO.getMenuOrdr() > menuManageVO.getMenuOrdr() ){ //이전 sortOrder > 바꾸려는 sortOrder
|
|
| 558 | 558 |
menuManageVO.setSortOver("D");
|
| 559 | 559 |
} |
| 560 |
- |
|
| 560 |
+ |
|
| 561 | 561 |
//매뉴업데이트시에는 항상 lettnmenucreatdtls 에 값이 있으면 메뉴번호가 변경안됨.(deleteMenuCreatByNo > updateMenuManageJtree > insertMenuCreat) |
| 562 | 562 |
menuCreatVO.setMenuNo(Integer.parseInt(menuManageVO.getTmp_Id())); |
| 563 |
- |
|
| 563 |
+ |
|
| 564 | 564 |
if(menuCreatVO.getExistChildNode().equals("Y")) { //하위노드가 있을경우 업데이트만
|
| 565 | 565 |
menuManageVO.setMenuNo(Integer.parseInt(menuManageVO.getTmp_Id())); |
| 566 | 566 |
cnt = menuManageService.updateMenuManageJtree(menuManageVO); |
... | ... | @@ -578,10 +578,10 @@ |
| 578 | 578 |
menuCreateManageDAO.deleteMenuCreatAuthNo(menuCreatVO); |
| 579 | 579 |
cnt = menuManageService.updateMenuManageJtree(menuManageVO); |
| 580 | 580 |
menuCreatVO.setMenuNo(menuManageVO.getMenuNo()); |
| 581 |
- menuCreateManageDAO.insertMenuCreat(menuCreatVO); |
|
| 581 |
+ menuCreateManageDAO.insertMenuCreat(menuCreatVO); |
|
| 582 | 582 |
} |
| 583 | 583 |
} |
| 584 |
- |
|
| 584 |
+ |
|
| 585 | 585 |
if(menuManageVO.getUpperMenuId()!=0){ //최상위는 제외
|
| 586 | 586 |
menuManageService.resortMenuManage(menuManageVO); |
| 587 | 587 |
} |
... | ... | @@ -590,15 +590,15 @@ |
| 590 | 590 |
delProgrmManageVO.setProgrmFileNm(menuManageVO.getTmp_Name()); |
| 591 | 591 |
progrmManageService.deleteProgrm(delProgrmManageVO); //삭제 |
| 592 | 592 |
} |
| 593 |
- |
|
| 593 |
+ |
|
| 594 | 594 |
//프로그램 파일명에 등록된 menuNO 게시판,컨텐츠 삭제 |
| 595 | 595 |
{
|
| 596 | 596 |
CntManageVO tempCntManageVO = new CntManageVO(); |
| 597 | 597 |
tempCntManageVO.setMenuNo(menuManageVO.getMenuNo()+""); |
| 598 | 598 |
egovCntManageService.deleteMenuNo(tempCntManageVO) ; |
| 599 |
- |
|
| 599 |
+ |
|
| 600 | 600 |
} |
| 601 |
- |
|
| 601 |
+ |
|
| 602 | 602 |
if("B".equals(menuManageVO.getMenuType())){ //단일 게시판 선택시에 마스터 테이블에 메뉴번호를 넣어준다. solr 검색을 위해.
|
| 603 | 603 |
BoardMasterVO boardMasterVO = new BoardMasterVO(); |
| 604 | 604 |
List<String> bbsIds = new ArrayList<String>(); |
... | ... | @@ -625,10 +625,10 @@ |
| 625 | 625 |
}catch (Exception e) {
|
| 626 | 626 |
modelAndView.addObject("status", "fail");
|
| 627 | 627 |
} |
| 628 |
- |
|
| 628 |
+ |
|
| 629 | 629 |
return modelAndView; |
| 630 | 630 |
} |
| 631 |
- |
|
| 631 |
+ |
|
| 632 | 632 |
/** |
| 633 | 633 |
* 매뉴 이름 변경한다. |
| 634 | 634 |
* |
... | ... | @@ -649,11 +649,11 @@ |
| 649 | 649 |
} |
| 650 | 650 |
return modelAndView; |
| 651 | 651 |
} |
| 652 |
- |
|
| 652 |
+ |
|
| 653 | 653 |
@Transactional(rollbackFor = Exception.class) |
| 654 | 654 |
@RequestMapping("/sym/mnu/mcm/EgovMenuInfoMoveAjax.do")
|
| 655 |
- public ModelAndView EgovMenuInfoMoveAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 656 |
- @ModelAttribute("searchVO") ComDefaultVO searchVO ,ModelMap model) throws Exception {
|
|
| 655 |
+ public ModelAndView EgovMenuInfoMoveAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 656 |
+ @ModelAttribute("searchVO") ComDefaultVO searchVO ,ModelMap model) throws Exception {
|
|
| 657 | 657 |
ModelAndView modelAndView = new ModelAndView(); |
| 658 | 658 |
modelAndView.setViewName("jsonView");
|
| 659 | 659 |
try{
|
... | ... | @@ -661,9 +661,9 @@ |
| 661 | 661 |
tempMenuManageVO.setSearchKeyword(menuManageVO.getMenuNo()+""); |
| 662 | 662 |
tempMenuManageVO.setAuthorCode(menuManageVO.getAuthorCode()); |
| 663 | 663 |
MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO); |
| 664 |
- |
|
| 664 |
+ |
|
| 665 | 665 |
if(resultVO.getUpperMenuId()==menuManageVO.getUpperMenuId()){ //같은 레벨이면
|
| 666 |
- if(resultVO.getMenuOrdr() > menuManageVO.getMenuOrdr() ){ //이전 sortOrder > 바꾸려는 sortOrder
|
|
| 666 |
+ if(resultVO.getMenuOrdr() > menuManageVO.getMenuOrdr() ){ //이전 sortOrder > 바꾸려는 sortOrder
|
|
| 667 | 667 |
menuManageVO.setSortOver("D");
|
| 668 | 668 |
} |
| 669 | 669 |
}else{//다른레벨
|
... | ... | @@ -672,13 +672,13 @@ |
| 672 | 672 |
menuManageService.updateMenuManageJtreeNo(menuManageVO); |
| 673 | 673 |
menuManageService.resortMenuManage(menuManageVO); |
| 674 | 674 |
modelAndView.addObject("status", "success");
|
| 675 |
- |
|
| 675 |
+ |
|
| 676 | 676 |
}catch (Exception e) {
|
| 677 | 677 |
modelAndView.addObject("status", "fail");
|
| 678 | 678 |
} |
| 679 | 679 |
return modelAndView; |
| 680 | 680 |
} |
| 681 |
- |
|
| 681 |
+ |
|
| 682 | 682 |
/* 즐겨찾기 세부조회 */ |
| 683 | 683 |
/** |
| 684 | 684 |
* 메뉴생성 세부화면을 조회한다. |
... | ... | @@ -690,16 +690,16 @@ |
| 690 | 690 |
*/ |
| 691 | 691 |
@RequestMapping(value = "/sym/mnu/mcm/QuickMenuMng.do") |
| 692 | 692 |
public String selectQuickMenuMngJtree(@ModelAttribute("menuCreatVO") MenuCreatVO menuCreatVO, @ModelAttribute("searchVO") ComDefaultVO searchVO,
|
| 693 |
- ModelMap model, MenuManageVO menuManageVO , HttpSession session ) throws Exception {
|
|
| 693 |
+ ModelMap model, MenuManageVO menuManageVO , HttpSession session ) throws Exception {
|
|
| 694 | 694 |
// 0. Spring Security 사용자권한 처리 |
| 695 | 695 |
Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
| 696 | 696 |
LoginVO loginVo = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser() ; |
| 697 | 697 |
model.addAttribute("siteId", loginVo.getSiteId());
|
| 698 |
- |
|
| 698 |
+ |
|
| 699 | 699 |
if(menuCreatVO.getMenuUserType() == null){
|
| 700 | 700 |
menuCreatVO.setMenuUserType("A"); //관리자 디폴트
|
| 701 | 701 |
} |
| 702 |
- |
|
| 702 |
+ |
|
| 703 | 703 |
if(null != loginVo && !"super".equals(loginVo.getSiteId())){
|
| 704 | 704 |
menuCreatVO.setSiteId(loginVo.getSiteId()); |
| 705 | 705 |
}else{ //수퍼관리자
|
... | ... | @@ -710,15 +710,15 @@ |
| 710 | 710 |
model.addAttribute("menuCreatVO", menuCreatVO);
|
| 711 | 711 |
return "sym/mnu/mpm/QuickMenuMng"; |
| 712 | 712 |
} |
| 713 |
- |
|
| 713 |
+ |
|
| 714 | 714 |
/** |
| 715 | 715 |
* 체크된 즐겨찾기 목록을 저장한다.. |
| 716 | 716 |
*/ |
| 717 | 717 |
@RequestMapping(value = "/sym/mnu/mcm/QuickMenuMngUpdateAjax.do") |
| 718 |
- public ModelAndView updateQuickMenuMngUpdateAjax(@RequestParam Map<?, ?> commandMap, |
|
| 719 |
- @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
|
|
| 720 |
- @ModelAttribute("searchVO") CmmnDetailCodeVO searchVO
|
|
| 721 |
- )throws Exception {
|
|
| 718 |
+ public ModelAndView updateQuickMenuMngUpdateAjax(@RequestParam Map<?, ?> commandMap, |
|
| 719 |
+ @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
|
|
| 720 |
+ @ModelAttribute("searchVO") CmmnDetailCodeVO searchVO
|
|
| 721 |
+ )throws Exception {
|
|
| 722 | 722 |
ModelAndView modelAndView = new ModelAndView(); |
| 723 | 723 |
modelAndView.setViewName("jsonView");
|
| 724 | 724 |
Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); |
... | ... | @@ -731,19 +731,19 @@ |
| 731 | 731 |
modelAndView.addObject("result", "success");
|
| 732 | 732 |
}catch (Exception e) {
|
| 733 | 733 |
modelAndView.addObject("result", "fail");
|
| 734 |
- } |
|
| 734 |
+ } |
|
| 735 | 735 |
return modelAndView; |
| 736 | 736 |
} |
| 737 |
- |
|
| 738 |
- |
|
| 737 |
+ |
|
| 738 |
+ |
|
| 739 | 739 |
/** |
| 740 | 740 |
* 매뉴의 게시판을 조회한다. |
| 741 | 741 |
*/ |
| 742 | 742 |
@RequestMapping("/sym/mnu/mcm/MenuBbsSelectAjax.do")
|
| 743 |
- public ModelAndView MenuAddBbsInsertAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 744 |
- BoardMasterVO boardMasterVO, |
|
| 745 |
- |
|
| 746 |
- ModelMap model) throws Exception {
|
|
| 743 |
+ public ModelAndView MenuAddBbsInsertAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 744 |
+ BoardMasterVO boardMasterVO, |
|
| 745 |
+ |
|
| 746 |
+ ModelMap model) throws Exception {
|
|
| 747 | 747 |
ModelAndView modelAndView = new ModelAndView(); |
| 748 | 748 |
modelAndView.setViewName("jsonView");
|
| 749 | 749 |
try{
|
... | ... | @@ -755,16 +755,16 @@ |
| 755 | 755 |
} |
| 756 | 756 |
return modelAndView; |
| 757 | 757 |
} |
| 758 |
- |
|
| 759 |
- |
|
| 758 |
+ |
|
| 759 |
+ |
|
| 760 | 760 |
/** |
| 761 | 761 |
* 매뉴의 게시판을 업데이트한다. |
| 762 | 762 |
*/ |
| 763 | 763 |
@RequestMapping("/sym/mnu/mcm/MenuBbsInsertAjax.do")
|
| 764 |
- public ModelAndView MenuBbsInsertAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 765 |
- BoardMasterVO boardMasterVO, |
|
| 766 |
- |
|
| 767 |
- ModelMap model) throws Exception {
|
|
| 764 |
+ public ModelAndView MenuBbsInsertAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 765 |
+ BoardMasterVO boardMasterVO, |
|
| 766 |
+ |
|
| 767 |
+ ModelMap model) throws Exception {
|
|
| 768 | 768 |
ModelAndView modelAndView = new ModelAndView(); |
| 769 | 769 |
modelAndView.setViewName("jsonView");
|
| 770 | 770 |
try{
|
... | ... | @@ -775,15 +775,15 @@ |
| 775 | 775 |
} |
| 776 | 776 |
return modelAndView; |
| 777 | 777 |
} |
| 778 |
- |
|
| 778 |
+ |
|
| 779 | 779 |
/** |
| 780 | 780 |
* 매뉴의 컨텐츠 확인링크 조회 |
| 781 |
- * |
|
| 781 |
+ * |
|
| 782 | 782 |
* */ |
| 783 | 783 |
@RequestMapping("/sym/mnu/mcm/HtmlComfirmAjax.do")
|
| 784 |
- public ModelAndView HtmlComfirmAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 785 |
- @ModelAttribute("cntManageVO") CntManageVO cntManageVO,
|
|
| 786 |
- ModelMap model) throws Exception {
|
|
| 784 |
+ public ModelAndView HtmlComfirmAjax(@ModelAttribute("menuManageVO") MenuManageVO menuManageVO,
|
|
| 785 |
+ @ModelAttribute("cntManageVO") CntManageVO cntManageVO,
|
|
| 786 |
+ ModelMap model) throws Exception {
|
|
| 787 | 787 |
ModelAndView modelAndView = new ModelAndView(); |
| 788 | 788 |
modelAndView.setViewName("jsonView");
|
| 789 | 789 |
try{
|
--- src/main/java/itn/let/sym/site/web/EgovSiteManagerController.java
+++ src/main/java/itn/let/sym/site/web/EgovSiteManagerController.java
... | ... | @@ -2577,4 +2577,42 @@ |
| 2577 | 2577 |
|
| 2578 | 2578 |
return modelAndView; |
| 2579 | 2579 |
} |
| 2580 |
+ |
|
| 2581 |
+ /** |
|
| 2582 |
+ * 추가인증 유효시간 관리 |
|
| 2583 |
+ * @param loginPolicyVO - 로그인정책 VO |
|
| 2584 |
+ * @return String - 리턴 Url |
|
| 2585 |
+ */ |
|
| 2586 |
+ @RequestMapping("/sym/site/authValidityTimeMng.do")
|
|
| 2587 |
+ public String selectAuthValidityTimeMng( @RequestParam Map<?, ?> commandMap |
|
| 2588 |
+ , @ModelAttribute("siteManagerVO") SiteManagerVO siteManagerVO
|
|
| 2589 |
+ , ModelMap model) throws Exception {
|
|
| 2590 |
+ |
|
| 2591 |
+ if(siteManagerVO.getPageUnit() != 10) {
|
|
| 2592 |
+ siteManagerVO.setPageUnit(siteManagerVO.getPageUnit()); |
|
| 2593 |
+ } |
|
| 2594 |
+ |
|
| 2595 |
+ /** paging */ |
|
| 2596 |
+ PaginationInfo paginationInfo = new PaginationInfo(); |
|
| 2597 |
+ paginationInfo.setCurrentPageNo(siteManagerVO.getPageIndex()); |
|
| 2598 |
+ paginationInfo.setRecordCountPerPage(siteManagerVO.getPageUnit()); |
|
| 2599 |
+ paginationInfo.setPageSize(siteManagerVO.getPageSize()); |
|
| 2600 |
+ |
|
| 2601 |
+ siteManagerVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); |
|
| 2602 |
+ siteManagerVO.setLastIndex(paginationInfo.getLastRecordIndex()); |
|
| 2603 |
+ siteManagerVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); |
|
| 2604 |
+ |
|
| 2605 |
+ List<SiteManagerVO> sessionTimeList = new ArrayList<SiteManagerVO>(); |
|
| 2606 |
+ if("".equals(siteManagerVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
|
|
| 2607 |
+ siteManagerVO.setSearchSortCnd("frstRegistPnttm");
|
|
| 2608 |
+ siteManagerVO.setSearchSortOrd("desc");
|
|
| 2609 |
+ } |
|
| 2610 |
+ sessionTimeList = egovSiteManagerService.selectSiteManagerList(siteManagerVO); |
|
| 2611 |
+ model.addAttribute("sessionTimeList", sessionTimeList);
|
|
| 2612 |
+ |
|
| 2613 |
+ ComDefaultCodeVO vo = new ComDefaultCodeVO(); //관리자로그기간설정 |
|
| 2614 |
+ vo.setCodeId("ITN059");
|
|
| 2615 |
+ model.addAttribute("sessionTimeCdList", cmmUseService.selectCmmCodeDetail(vo));
|
|
| 2616 |
+ return "/sym/site/authValidityTimeMng"; |
|
| 2617 |
+ } |
|
| 2580 | 2618 |
} |
+++ src/main/java/itn/let/uat/uia/service/SecondAuthLogService.java
... | ... | @@ -0,0 +1,15 @@ |
| 1 | +package itn.let.uat.uia.service; | |
| 2 | + | |
| 3 | +import java.util.List; | |
| 4 | + | |
| 5 | +public interface SecondAuthLogService { | |
| 6 | + public void insertSecondAuthLog(SecondAuthLogVO logVO) throws Exception; | |
| 7 | + | |
| 8 | + public void deleteSecondAuthLog(SecondAuthLogVO logVO) throws Exception; | |
| 9 | + | |
| 10 | + public void selectSecondAuthLog(SecondAuthLogVO logVO) throws Exception; | |
| 11 | + | |
| 12 | + public int selectSecondAuthLogCnt(SecondAuthLogVO logVO) throws Exception; | |
| 13 | + | |
| 14 | + public List<SecondAuthLogVO> selectSecondAuthLogList(SecondAuthLogVO logVO) throws Exception; | |
| 15 | +} |
+++ src/main/java/itn/let/uat/uia/service/SecondAuthLogVO.java
... | ... | @@ -0,0 +1,33 @@ |
| 1 | +package itn.let.uat.uia.service; | |
| 2 | + | |
| 3 | +import itn.com.utl.page.BasePageableVO; | |
| 4 | +import lombok.Getter; | |
| 5 | +import lombok.NoArgsConstructor; | |
| 6 | +import lombok.Setter; | |
| 7 | + | |
| 8 | +@Getter | |
| 9 | +@Setter | |
| 10 | +@NoArgsConstructor | |
| 11 | +public class SecondAuthLogVO extends BasePageableVO { | |
| 12 | + // log PK | |
| 13 | + private String logId; | |
| 14 | + // SUCCESS, FAIL | |
| 15 | + private String loginResult; | |
| 16 | + // 1차, 2차 | |
| 17 | + private String authStep; | |
| 18 | + // TRY Login ID | |
| 19 | + private String tryLoginId; | |
| 20 | + private String reason; | |
| 21 | + // IP, UserAgent | |
| 22 | + private String accessIp; | |
| 23 | + private String userAgent; | |
| 24 | + | |
| 25 | + // 2차 인증 | |
| 26 | + private String msgId; | |
| 27 | + // 입력한 2차 인증번호 | |
| 28 | + private String resultCode; | |
| 29 | + // 전화번호 | |
| 30 | + private String receive; | |
| 31 | + | |
| 32 | + private String frstRegistPnttm; | |
| 33 | +} |
+++ src/main/java/itn/let/uat/uia/service/impl/SecondAuthLogDAO.java
... | ... | @@ -0,0 +1,29 @@ |
| 1 | +package itn.let.uat.uia.service.impl; | |
| 2 | + | |
| 3 | +import itn.com.cmm.service.impl.EgovComAbstractDAO; | |
| 4 | +import itn.let.uat.uia.service.SecondAuthLogVO; | |
| 5 | +import org.springframework.stereotype.Repository; | |
| 6 | + | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +@Repository("secondAuthLogDAO") | |
| 10 | +public class SecondAuthLogDAO extends EgovComAbstractDAO { | |
| 11 | + public void insertSecondAuthLog(SecondAuthLogVO logVO) { | |
| 12 | + insert("secondAuthLogDAO.insertSecondAuthLog", logVO); | |
| 13 | + } | |
| 14 | + | |
| 15 | + public void deleteSecondAuthLog(SecondAuthLogVO logVO) { | |
| 16 | + } | |
| 17 | + | |
| 18 | + public SecondAuthLogVO selectSecondAuthLog(SecondAuthLogVO logVO) { | |
| 19 | + return (SecondAuthLogVO) select("secondAuthLogDAO.selectSecondAuthLog", logVO); | |
| 20 | + } | |
| 21 | + | |
| 22 | + public int selectSecondAuthLogCnt(SecondAuthLogVO logVO) { | |
| 23 | + return (Integer) select("secondAuthLogDAO.selectSecondAuthLogCnt", logVO); | |
| 24 | + } | |
| 25 | + @SuppressWarnings("unchecked") | |
| 26 | + public List<SecondAuthLogVO> selectSecondAuthLogList(SecondAuthLogVO logVO) { | |
| 27 | + return (List<SecondAuthLogVO>) list("secondAuthLogDAO.selectSecondAuthLogList", logVO); | |
| 28 | + } | |
| 29 | +} |
+++ src/main/java/itn/let/uat/uia/service/impl/SecondAuthLogServiceImpl.java
... | ... | @@ -0,0 +1,40 @@ |
| 1 | +package itn.let.uat.uia.service.impl; | |
| 2 | + | |
| 3 | +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
| 4 | +import egovframework.rte.fdl.idgnr.EgovIdGnrService; | |
| 5 | +import itn.let.uat.uia.service.SecondAuthLogService; | |
| 6 | +import itn.let.uat.uia.service.SecondAuthLogVO; | |
| 7 | +import org.springframework.stereotype.Service; | |
| 8 | + | |
| 9 | +import javax.annotation.Resource; | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +@Service("secondAuthLogService") | |
| 13 | +public class SecondAuthLogServiceImpl extends EgovAbstractServiceImpl implements SecondAuthLogService { | |
| 14 | + @Resource(name = "secondAuthLogDAO") | |
| 15 | + private SecondAuthLogDAO dao; | |
| 16 | + | |
| 17 | + @Resource(name = "egovSecondAuthLogIdGnrService") | |
| 18 | + private EgovIdGnrService idGenService; | |
| 19 | + | |
| 20 | + public void insertSecondAuthLog(SecondAuthLogVO logVO) throws Exception{ | |
| 21 | + logVO.setLogId(idGenService.getNextStringId()); | |
| 22 | + dao.insertSecondAuthLog(logVO); | |
| 23 | + } | |
| 24 | + | |
| 25 | + public void deleteSecondAuthLog(SecondAuthLogVO logVO) throws Exception{ | |
| 26 | + dao.deleteSecondAuthLog(logVO); | |
| 27 | + } | |
| 28 | + | |
| 29 | + public void selectSecondAuthLog(SecondAuthLogVO logVO) throws Exception{ | |
| 30 | + dao.selectSecondAuthLog(logVO); | |
| 31 | + } | |
| 32 | + | |
| 33 | + public int selectSecondAuthLogCnt(SecondAuthLogVO logVO) throws Exception{ | |
| 34 | + return dao.selectSecondAuthLogCnt(logVO); | |
| 35 | + } | |
| 36 | + | |
| 37 | + public List<SecondAuthLogVO> selectSecondAuthLogList(SecondAuthLogVO logVO) throws Exception{ | |
| 38 | + return dao.selectSecondAuthLogList(logVO); | |
| 39 | + } | |
| 40 | +} |
+++ src/main/java/itn/let/uat/uia/web/SecondAuthLogController.java
... | ... | @@ -0,0 +1,33 @@ |
| 1 | +package itn.let.uat.uia.web; | |
| 2 | + | |
| 3 | +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; | |
| 4 | +import itn.com.annotation.PersonalLog; | |
| 5 | +import itn.com.utl.page.PaginationUtil; | |
| 6 | +import itn.let.uat.uia.service.SecondAuthLogService; | |
| 7 | +import itn.let.uat.uia.service.SecondAuthLogVO; | |
| 8 | +import org.springframework.stereotype.Controller; | |
| 9 | +import org.springframework.ui.Model; | |
| 10 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 11 | + | |
| 12 | +import javax.annotation.Resource; | |
| 13 | +import java.util.List; | |
| 14 | + | |
| 15 | +@Controller | |
| 16 | +public class SecondAuthLogController { | |
| 17 | + @Resource(name = "secondAuthLogService") | |
| 18 | + private SecondAuthLogService secondAuthLogService; | |
| 19 | + | |
| 20 | + @PersonalLog(action = "조회", description = "2차 인증 로그", search = "#resultList.size()") | |
| 21 | + @RequestMapping(value = "/uss/umt/user/SecondAuthLog.do") | |
| 22 | + public String secondAuthLog(SecondAuthLogVO searchVO, Model model) throws Exception { | |
| 23 | + PaginationInfo paginationInfo = PaginationUtil.initWithSort(searchVO, "FRST_REGIST_PNTTM", "desc"); | |
| 24 | + List<SecondAuthLogVO> result = secondAuthLogService.selectSecondAuthLogList(searchVO); | |
| 25 | + int totCnt = secondAuthLogService.selectSecondAuthLogCnt(searchVO); | |
| 26 | + paginationInfo.setTotalRecordCount(totCnt); | |
| 27 | + | |
| 28 | + model.addAttribute("resultList", result); | |
| 29 | + model.addAttribute("paginationInfo", paginationInfo); | |
| 30 | + model.addAttribute("searchVO", searchVO); | |
| 31 | + return "sym/log/second/SecondAuthLog"; | |
| 32 | + } | |
| 33 | +} |
--- src/main/java/itn/let/uss/umt/service/UserManageVO.java
+++ src/main/java/itn/let/uss/umt/service/UserManageVO.java
... | ... | @@ -219,8 +219,15 @@ |
| 219 | 219 |
private float paymentCash; //이전달에 실제 사용한 캐시 정보 |
| 220 | 220 |
|
| 221 | 221 |
private String exceptSpamYn; //금지어 예외여부 온(on) - Y, 오프(off) - N |
| 222 |
- |
|
| 223 |
- |
|
| 222 |
+ |
|
| 223 |
+ /** 전송자격인증제 3.2 : 등록자(계정을 등록한 관리자 로그인ID) */ |
|
| 224 |
+ private String registerId; |
|
| 225 |
+ /** 전송자격인증제 3.2 : 등록자명(표시용, 조회 시 조인) */ |
|
| 226 |
+ private String registerNm; |
|
| 227 |
+ /** 전송자격인증제 3.2 : 등록사유(권한 부여 사유) */ |
|
| 228 |
+ private String registResn; |
|
| 229 |
+ |
|
| 230 |
+ |
|
| 224 | 231 |
|
| 225 | 232 |
public UserManageVO(String userId) {
|
| 226 | 233 |
this.mberId = userId; |
--- src/main/java/itn/let/uss/umt/web/EgovMberCmpHstController.java
+++ src/main/java/itn/let/uss/umt/web/EgovMberCmpHstController.java
... | ... | @@ -5,6 +5,7 @@ |
| 5 | 5 |
import javax.annotation.Resource; |
| 6 | 6 |
import javax.servlet.http.HttpServletRequest; |
| 7 | 7 |
|
| 8 |
+import itn.com.annotation.PersonalLog; |
|
| 8 | 9 |
import org.springframework.stereotype.Controller; |
| 9 | 10 |
import org.springframework.ui.Model; |
| 10 | 11 |
import org.springframework.ui.ModelMap; |
... | ... | @@ -474,11 +475,12 @@ |
| 474 | 475 |
* @return |
| 475 | 476 |
* @throws Exception |
| 476 | 477 |
*/ |
| 478 |
+ @PersonalLog(action = "삭제", description = "기업회원 상세정보", target = "#mberCmpHstVO.mberId") |
|
| 477 | 479 |
@RequestMapping("/uss/umt/user/mberCmpHstStatusDeleteAjax.do")
|
| 478 | 480 |
public ModelAndView mberCmpHstStatusDeleteAjax( |
| 479 | 481 |
@ModelAttribute("searchVO") MberCmpHstVO mberCmpHstVO
|
| 480 | 482 |
) throws Exception{
|
| 481 |
- |
|
| 483 |
+ |
|
| 482 | 484 |
ModelAndView modelAndView = new ModelAndView(); |
| 483 | 485 |
modelAndView.setViewName("jsonView");
|
| 484 | 486 |
|
... | ... | @@ -506,12 +508,8 @@ |
| 506 | 508 |
} |
| 507 | 509 |
catch(Exception e) {
|
| 508 | 510 |
isSuccess = false; |
| 509 |
- msg = "오류 : " + e.getMessage(); |
|
| 510 |
- } |
|
| 511 |
- |
|
| 512 |
- |
|
| 513 |
- mberCmpHstVO.setMberId(""); //업데이트 처리 후 mberId 초기화 - 리스트 select 조건절에 mberId때문에 승인, 반려 처리 후 그 ID 목록만 조회되는 것 방지
|
|
| 514 |
- |
|
| 511 |
+ msg = "오류 : " + e.getMessage(); |
|
| 512 |
+ } |
|
| 515 | 513 |
modelAndView.addObject("isSuccess", isSuccess);
|
| 516 | 514 |
modelAndView.addObject("msg", msg);
|
| 517 | 515 |
|
--- src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
+++ src/main/java/itn/let/uss/umt/web/EgovUserManageController.java
| This diff is too big to display. |
--- src/main/resources/egovframework/egovProps/globals.properties
+++ src/main/resources/egovframework/egovProps/globals.properties
... | ... | @@ -1,25 +1,25 @@ |
| 1 | 1 |
#----------------------------------------------------------------------- |
| 2 | 2 |
# |
| 3 |
-# globals.properties : \uc2dc\uc2a4\ud15c |
|
| 3 |
+# globals.properties : \uC2DC\uC2A4\uD15C |
|
| 4 | 4 |
# |
| 5 | 5 |
#----------------------------------------------------------------------- |
| 6 |
-# 1. key = value \uad6c\uc870\uc785\ub2c8\ub2e4. |
|
| 7 |
-# 2. key\uac12\uc740 \uacf5\ubc31\ubb38\uc790\ub97c \ud3ec\ud568\ubd88\uac00, value\uac12\uc740 \uacf5\ubc31\ubb38\uc790\ub97c \uac00\ub2a5 |
|
| 8 |
-# 3. key\uac12\uc73c\ub85c \ud55c\uae00\uc744 \uc0ac\uc6a9\ubd88\uac00, value\uac12\uc740 \ud55c\uae00\uc0ac\uc6a9\uc774 \uac00\ub2a5 |
|
| 9 |
-# 4. \uc904\uc744 \ubc14\uafc0 \ud544\uc694\uac00 \uc788\uc73c\uba74 '\'\ub97c \ub77c\uc778\uc758 \ub05d\uc5d0 \ucd94\uac00(\ub9cc\uc57d '\'\ubb38\uc790\ub97c \uc0ac\uc6a9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0\ub294 '\\'\ub97c \uc0ac\uc6a9) |
|
| 10 |
-# 5. Windows\uc5d0\uc11c\uc758 \ub514\ub809\ud1a0\ub9ac \ud45c\uc2dc : '\\' or '/' ('\' \uc0ac\uc6a9\ud558\uba74 \uc548\ub428)
|
|
| 11 |
-# 6. Unix\uc5d0\uc11c\uc758 \ub514\ub809\ud1a0\ub9ac \ud45c\uc2dc : '/' |
|
| 12 |
-# 7. \uc8fc\uc11d\ubb38 \ucc98\ub9ac\ub294 #\uc0ac\uc6a9 |
|
| 13 |
-# 8. value\uac12 \ub4a4\uc5d0 \uc2a4\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0 \uc11c\ube14\ub9bf\uc5d0\uc11c \ucc38\uc870\ud560\ub54c\ub294 \uc5d0\ub7ec\ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c trim()\ud558\uac70\ub098 \ub9c8\uc9c0\ub9c9 \uacf5\ubc31\uc5c6\uc774 properties \uac12\uc744 \uc124\uc815\ud560\uac83 |
|
| 6 |
+# 1. key = value \uAD6C\uC870\uC785\uB2C8\uB2E4. |
|
| 7 |
+# 2. key\uAC12\uC740 \uACF5\uBC31\uBB38\uC790\uB97C \uD3EC\uD568\uBD88\uAC00, value\uAC12\uC740 \uACF5\uBC31\uBB38\uC790\uB97C \uAC00\uB2A5 |
|
| 8 |
+# 3. key\uAC12\uC73C\uB85C \uD55C\uAE00\uC744 \uC0AC\uC6A9\uBD88\uAC00, value\uAC12\uC740 \uD55C\uAE00\uC0AC\uC6A9\uC774 \uAC00\uB2A5 |
|
| 9 |
+# 4. \uC904\uC744 \uBC14\uAFC0 \uD544\uC694\uAC00 \uC788\uC73C\uBA74 '\'\uB97C \uB77C\uC778\uC758 \uB05D\uC5D0 \uCD94\uAC00(\uB9CC\uC57D '\'\uBB38\uC790\uB97C \uC0AC\uC6A9\uD574\uC57C \uD558\uB294 \uACBD\uC6B0\uB294 '\\'\uB97C \uC0AC\uC6A9) |
|
| 10 |
+# 5. Windows\uC5D0\uC11C\uC758 \uB514\uB809\uD1A0\uB9AC \uD45C\uC2DC : '\\' or '/' ('\' \uC0AC\uC6A9\uD558\uBA74 \uC548\uB428)
|
|
| 11 |
+# 6. Unix\uC5D0\uC11C\uC758 \uB514\uB809\uD1A0\uB9AC \uD45C\uC2DC : '/' |
|
| 12 |
+# 7. \uC8FC\uC11D\uBB38 \uCC98\uB9AC\uB294 #\uC0AC\uC6A9 |
|
| 13 |
+# 8. value\uAC12 \uB4A4\uC5D0 \uC2A4\uD398\uC774\uC2A4\uAC00 \uC874\uC7AC\uD558\uB294 \uACBD\uC6B0 \uC11C\uBE14\uB9BF\uC5D0\uC11C \uCC38\uC870\uD560\uB54C\uB294 \uC5D0\uB7EC\uBC1C\uC0DD\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C trim()\uD558\uAC70\uB098 \uB9C8\uC9C0\uB9C9 \uACF5\uBC31\uC5C6\uC774 properties \uAC12\uC744 \uC124\uC815\uD560\uAC83 |
|
| 14 | 14 |
#----------------------------------------------------------------------- |
| 15 | 15 |
|
| 16 |
-# \uc6b4\uc601\uc11c\ubc84 \ud0c0\uc785(WINDOWS, UNIX) |
|
| 16 |
+# \uC6B4\uC601\uC11C\uBC84 \uD0C0\uC785(WINDOWS, UNIX) |
|
| 17 | 17 |
Globals.OsType = WINDOWS |
| 18 | 18 |
|
| 19 |
-# G4C \uc5f0\uacb0\uc6a9 IP (localhost) |
|
| 19 |
+# G4C \uC5F0\uACB0\uC6A9 IP (localhost) |
|
| 20 | 20 |
Globals.LocalIp = 127.0.0.1 |
| 21 | 21 |
|
| 22 |
-# DB\uc11c\ubc84 \ud0c0\uc785(mysql,oracle,altibase,tibero) - datasource \ubc0f sqlMap \ud30c\uc77c \uc9c0\uc815\uc5d0 \uc0ac\uc6a9\ub428 |
|
| 22 |
+# DB\uC11C\uBC84 \uD0C0\uC785(mysql,oracle,altibase,tibero) - datasource \uBC0F sqlMap \uD30C\uC77C \uC9C0\uC815\uC5D0 \uC0AC\uC6A9\uB428 |
|
| 23 | 23 |
Globals.DbType = mysql |
| 24 | 24 |
|
| 25 | 25 |
|
... | ... | @@ -54,7 +54,7 @@ |
| 54 | 54 |
|
| 55 | 55 |
# MainPage Setting(admin) |
| 56 | 56 |
Globals.MainPage = /cmm/main/mainPage.do |
| 57 |
-#\ucee8\ud150\uce20 \ud30c\uc77c\uc704\uce58 |
|
| 57 |
+#\uCEE8\uD150\uCE20 \uD30C\uC77C\uC704\uCE58 |
|
| 58 | 58 |
#Globals.ckeditorUploadDir=/home/file/ckeditor/ |
| 59 | 59 |
Globals.ckeditorUploadDir=/usr/local/tomcat/file/ckeditor/ |
| 60 | 60 |
#TEST SERVER |
... | ... | @@ -65,18 +65,18 @@ |
| 65 | 65 |
Globals.file.saveDir=/usr/local/tomcat |
| 66 | 66 |
|
| 67 | 67 |
|
| 68 |
-#SNS \ub85c\uadf8\uc778 KEY \uac12 |
|
| 69 |
-#ITN \ub124\uc774\ubc84 |
|
| 68 |
+#SNS \uB85C\uADF8\uC778 KEY \uAC12 |
|
| 69 |
+#ITN \uB124\uC774\uBC84 |
|
| 70 | 70 |
Globals.itn.naver.clentId=d9Ohvhty_RVsfrq9p_2J |
| 71 | 71 |
Globals.itn.naver.clientSecret=kwiEmpkLg5 |
| 72 | 72 |
Globals.itn.naver.returnUrl=http://localhost:80/snsLogin/naverOauth.do |
| 73 |
-#ITN \uce74\uce74\uc624 |
|
| 73 |
+#ITN \uCE74\uCE74\uC624 |
|
| 74 | 74 |
Globals.itn.kakao.restApiKey=10b66ad0c44b68b659855ddd64db2c44 |
| 75 | 75 |
Globals.itn.kakao.returnUrl=http://localhost:80/snsLogin/kakaoOauth.do |
| 76 | 76 |
|
| 77 |
-#\uc0ac\uc774\ud2b8 \uc544\uc774\ub514 \uc81c\uac70\ub85c JSP\uc5d0\uc11c siteId/siteNm \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 |
|
| 78 |
-Globals.homepage.siteId=mjon |
|
| 79 |
-Globals.homepage.siteNm=\ubb38\uc790ON |
|
| 77 |
+#\uC0AC\uC774\uD2B8 \uC544\uC774\uB514 \uC81C\uAC70\uB85C JSP\uC5D0\uC11C siteId/siteNm \uBCF4\uC5EC\uC8FC\uAE30 \uC704\uD574 |
|
| 78 |
+Globals.homepage.siteId=mjgo |
|
| 79 |
+Globals.homepage.siteNm=\uBB38\uC790GO |
|
| 80 | 80 |
|
| 81 | 81 |
|
| 82 | 82 |
|
... | ... | @@ -88,7 +88,7 @@ |
| 88 | 88 |
Globals.fax.file.permit.ext=hwp,hwpml,doc,xls,ppt,pdf,txt,docx,xlsx,pptx,tif,htm,html,jpg,jpeg,gif,bmp,gul |
| 89 | 89 |
|
| 90 | 90 |
|
| 91 |
-#KG \ubaa8\ube4c\ub9ac\uc5b8\uc2a4 \uc124\uc815 |
|
| 91 |
+#KG \uBAA8\uBE4C\uB9AC\uC5B8\uC2A4 \uC124\uC815 |
|
| 92 | 92 |
#CARD |
| 93 | 93 |
Globals.pay.kgm.card.cnSvcid=191017078687 |
| 94 | 94 |
Globals.pay.kgm.card.payMode=10 |
... | ... | @@ -98,3 +98,6 @@ |
| 98 | 98 |
#MOBILE |
| 99 | 99 |
Globals.pay.kgm.mobile.mcSvcid=170622040674 |
| 100 | 100 |
Globals.pay.kgm.mobile.payMode=00 |
| 101 |
+ |
|
| 102 |
+# \uB300\uC2DC\uBCF4\uB4DC \uC694\uC57D API(n8n\u2192Slack) \uACF5\uC720 \uD1A0\uD070 |
|
| 103 |
+Globals.dashboard.api.token=mjon_783439232074797a6fd5a8d6d32ce5d201e4b9a1ef6159e1 |
--- src/main/resources/egovframework/egovProps/globals_dev.properties
+++ src/main/resources/egovframework/egovProps/globals_dev.properties
... | ... | @@ -1,25 +1,25 @@ |
| 1 | 1 |
#----------------------------------------------------------------------- |
| 2 | 2 |
# |
| 3 |
-# globals.properties : \uc2dc\uc2a4\ud15c |
|
| 3 |
+# globals.properties : \uC2DC\uC2A4\uD15C |
|
| 4 | 4 |
# |
| 5 | 5 |
#----------------------------------------------------------------------- |
| 6 |
-# 1. key = value \uad6c\uc870\uc785\ub2c8\ub2e4. |
|
| 7 |
-# 2. key\uac12\uc740 \uacf5\ubc31\ubb38\uc790\ub97c \ud3ec\ud568\ubd88\uac00, value\uac12\uc740 \uacf5\ubc31\ubb38\uc790\ub97c \uac00\ub2a5 |
|
| 8 |
-# 3. key\uac12\uc73c\ub85c \ud55c\uae00\uc744 \uc0ac\uc6a9\ubd88\uac00, value\uac12\uc740 \ud55c\uae00\uc0ac\uc6a9\uc774 \uac00\ub2a5 |
|
| 9 |
-# 4. \uc904\uc744 \ubc14\uafc0 \ud544\uc694\uac00 \uc788\uc73c\uba74 '\'\ub97c \ub77c\uc778\uc758 \ub05d\uc5d0 \ucd94\uac00(\ub9cc\uc57d '\'\ubb38\uc790\ub97c \uc0ac\uc6a9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0\ub294 '\\'\ub97c \uc0ac\uc6a9) |
|
| 10 |
-# 5. Windows\uc5d0\uc11c\uc758 \ub514\ub809\ud1a0\ub9ac \ud45c\uc2dc : '\\' or '/' ('\' \uc0ac\uc6a9\ud558\uba74 \uc548\ub428)
|
|
| 11 |
-# 6. Unix\uc5d0\uc11c\uc758 \ub514\ub809\ud1a0\ub9ac \ud45c\uc2dc : '/' |
|
| 12 |
-# 7. \uc8fc\uc11d\ubb38 \ucc98\ub9ac\ub294 #\uc0ac\uc6a9 |
|
| 13 |
-# 8. value\uac12 \ub4a4\uc5d0 \uc2a4\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0 \uc11c\ube14\ub9bf\uc5d0\uc11c \ucc38\uc870\ud560\ub54c\ub294 \uc5d0\ub7ec\ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c trim()\ud558\uac70\ub098 \ub9c8\uc9c0\ub9c9 \uacf5\ubc31\uc5c6\uc774 properties \uac12\uc744 \uc124\uc815\ud560\uac83 |
|
| 6 |
+# 1. key = value \uAD6C\uC870\uC785\uB2C8\uB2E4. |
|
| 7 |
+# 2. key\uAC12\uC740 \uACF5\uBC31\uBB38\uC790\uB97C \uD3EC\uD568\uBD88\uAC00, value\uAC12\uC740 \uACF5\uBC31\uBB38\uC790\uB97C \uAC00\uB2A5 |
|
| 8 |
+# 3. key\uAC12\uC73C\uB85C \uD55C\uAE00\uC744 \uC0AC\uC6A9\uBD88\uAC00, value\uAC12\uC740 \uD55C\uAE00\uC0AC\uC6A9\uC774 \uAC00\uB2A5 |
|
| 9 |
+# 4. \uC904\uC744 \uBC14\uAFC0 \uD544\uC694\uAC00 \uC788\uC73C\uBA74 '\'\uB97C \uB77C\uC778\uC758 \uB05D\uC5D0 \uCD94\uAC00(\uB9CC\uC57D '\'\uBB38\uC790\uB97C \uC0AC\uC6A9\uD574\uC57C \uD558\uB294 \uACBD\uC6B0\uB294 '\\'\uB97C \uC0AC\uC6A9) |
|
| 10 |
+# 5. Windows\uC5D0\uC11C\uC758 \uB514\uB809\uD1A0\uB9AC \uD45C\uC2DC : '\\' or '/' ('\' \uC0AC\uC6A9\uD558\uBA74 \uC548\uB428)
|
|
| 11 |
+# 6. Unix\uC5D0\uC11C\uC758 \uB514\uB809\uD1A0\uB9AC \uD45C\uC2DC : '/' |
|
| 12 |
+# 7. \uC8FC\uC11D\uBB38 \uCC98\uB9AC\uB294 #\uC0AC\uC6A9 |
|
| 13 |
+# 8. value\uAC12 \uB4A4\uC5D0 \uC2A4\uD398\uC774\uC2A4\uAC00 \uC874\uC7AC\uD558\uB294 \uACBD\uC6B0 \uC11C\uBE14\uB9BF\uC5D0\uC11C \uCC38\uC870\uD560\uB54C\uB294 \uC5D0\uB7EC\uBC1C\uC0DD\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C trim()\uD558\uAC70\uB098 \uB9C8\uC9C0\uB9C9 \uACF5\uBC31\uC5C6\uC774 properties \uAC12\uC744 \uC124\uC815\uD560\uAC83 |
|
| 14 | 14 |
#----------------------------------------------------------------------- |
| 15 | 15 |
|
| 16 |
-# \uc6b4\uc601\uc11c\ubc84 \ud0c0\uc785(WINDOWS, UNIX) |
|
| 16 |
+# \uC6B4\uC601\uC11C\uBC84 \uD0C0\uC785(WINDOWS, UNIX) |
|
| 17 | 17 |
Globals.OsType = WINDOWS |
| 18 | 18 |
|
| 19 |
-# G4C \uc5f0\uacb0\uc6a9 IP (localhost) |
|
| 19 |
+# G4C \uC5F0\uACB0\uC6A9 IP (localhost) |
|
| 20 | 20 |
Globals.LocalIp = 127.0.0.1 |
| 21 | 21 |
|
| 22 |
-# DB\uc11c\ubc84 \ud0c0\uc785(mysql,oracle,altibase,tibero) - datasource \ubc0f sqlMap \ud30c\uc77c \uc9c0\uc815\uc5d0 \uc0ac\uc6a9\ub428 |
|
| 22 |
+# DB\uC11C\uBC84 \uD0C0\uC785(mysql,oracle,altibase,tibero) - datasource \uBC0F sqlMap \uD30C\uC77C \uC9C0\uC815\uC5D0 \uC0AC\uC6A9\uB428 |
|
| 23 | 23 |
Globals.DbType = mysql |
| 24 | 24 |
|
| 25 | 25 |
|
... | ... | @@ -29,9 +29,9 @@ |
| 29 | 29 |
# mysql |
| 30 | 30 |
Globals.DriverClassName=com.mysql.jdbc.Driver |
| 31 | 31 |
#Globals.Url=jdbc:mysql://139.150.73.12:3306/mjon |
| 32 |
-Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc |
|
| 33 |
-Globals.UserName= mjonUr |
|
| 34 |
-Globals.Password= mjon!@#$ |
|
| 32 |
+Globals.Url=jdbc:mysql://192.168.0.60:3309/mjgo |
|
| 33 |
+Globals.UserName= mjgoUr |
|
| 34 |
+Globals.Password= itntest123 |
|
| 35 | 35 |
#Globals.Url=jdbc:mysql://192.168.0.125:3306/mjon |
| 36 | 36 |
|
| 37 | 37 |
#Globals.DriverClassName=com.mysql.jdbc.Driver |
... | ... | @@ -47,7 +47,7 @@ |
| 47 | 47 |
|
| 48 | 48 |
# MainPage Setting(admin) |
| 49 | 49 |
Globals.MainPage = /cmm/main/mainPage.do |
| 50 |
-#\ucee8\ud150\uce20 \ud30c\uc77c\uc704\uce58 |
|
| 50 |
+#\uCEE8\uD150\uCE20 \uD30C\uC77C\uC704\uCE58 |
|
| 51 | 51 |
#Globals.ckeditorUploadDir=/home/file/ckeditor/ |
| 52 | 52 |
Globals.ckeditorUploadDir=/usr/local/tomcat/file/ckeditor/ |
| 53 | 53 |
#TEST SERVER |
... | ... | @@ -57,46 +57,46 @@ |
| 57 | 57 |
#Globals.file.saveDir=D:/dv/eGovFrameDev-3.9.0-64bit/workspace/mjon/ |
| 58 | 58 |
Globals.file.saveDir=/usr/local/tomcat/ |
| 59 | 59 |
|
| 60 |
-#whois openApi \uc544\uc774\ud53c \uccb4\ud06c |
|
| 60 |
+#whois openApi \uC544\uC774\uD53C \uCCB4\uD06C |
|
| 61 | 61 |
whois.api.key = 8nrytiochRBf3uEZ8GuIaTWdSTZP6Gw+9x9PIhAOjOt6+9fhyvOrpgVmlThdNL2kz1Eh/6jLVv7O+YnwE4bs7g== |
| 62 | 62 |
whois.api.url = http://apis.data.go.kr/B551505/whois/ipas_country_code |
| 63 | 63 |
|
| 64 | 64 |
|
| 65 | 65 |
|
| 66 |
-#SNS \ub85c\uadf8\uc778 KEY \uac12 |
|
| 67 |
-#ITN \ub124\uc774\ubc84 |
|
| 66 |
+#SNS \uB85C\uADF8\uC778 KEY \uAC12 |
|
| 67 |
+#ITN \uB124\uC774\uBC84 |
|
| 68 | 68 |
Globals.itn.naver.clentId=d9Ohvhty_RVsfrq9p_2J |
| 69 | 69 |
Globals.itn.naver.clientSecret=kwiEmpkLg5 |
| 70 | 70 |
Globals.itn.naver.returnUrl=http://localhost:80/snsLogin/naverOauth.do |
| 71 |
-#ITN \uce74\uce74\uc624 |
|
| 71 |
+#ITN \uCE74\uCE74\uC624 |
|
| 72 | 72 |
Globals.itn.kakao.restApiKey=10b66ad0c44b68b659855ddd64db2c44 |
| 73 | 73 |
Globals.itn.kakao.returnUrl=http://localhost:80/snsLogin/kakaoOauth.do |
| 74 | 74 |
|
| 75 |
-#\uc0ac\uc774\ud2b8 \uc544\uc774\ub514 \uc81c\uac70\ub85c JSP\uc5d0\uc11c siteId/siteNm \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 |
|
| 75 |
+#\uC0AC\uC774\uD2B8 \uC544\uC774\uB514 \uC81C\uAC70\uB85C JSP\uC5D0\uC11C siteId/siteNm \uBCF4\uC5EC\uC8FC\uAE30 \uC704\uD574 |
|
| 76 | 76 |
Globals.homepage.siteId=mjon |
| 77 |
-Globals.homepage.siteNm=\ubb38\uc790ON |
|
| 77 |
+Globals.homepage.siteNm=\uBB38\uC790ON |
|
| 78 | 78 |
|
| 79 |
-#\ub098\uc774\uc2a4\ud398\uc774 \ud604\uae08\uc601\uc218\uc99d \ubc1c\ud589\uc744 \uc704\ud55c \ub098\uc774\uc2a4\ud398\uc774 ID |
|
| 79 |
+#\uB098\uC774\uC2A4\uD398\uC774 \uD604\uAE08\uC601\uC218\uC99D \uBC1C\uD589\uC744 \uC704\uD55C \uB098\uC774\uC2A4\uD398\uC774 ID |
|
| 80 | 80 |
Globals.Nicepay.Id = itn180208 |
| 81 |
-#\ub098\uc774\uc2a4\ud398\uc774 \ud604\uae08\uc601\uc218\uc99d \ubc1c\ud589\uc744 \uc704\ud55c \ud68c\uc0ac \uc0ac\uc5c5\uc790\ubc88\ud638 |
|
| 81 |
+#\uB098\uC774\uC2A4\uD398\uC774 \uD604\uAE08\uC601\uC218\uC99D \uBC1C\uD589\uC744 \uC704\uD55C \uD68C\uC0AC \uC0AC\uC5C5\uC790\uBC88\uD638 |
|
| 82 | 82 |
Globals.Business.number = 6538700858 |
| 83 | 83 |
|
| 84 | 84 |
|
| 85 |
-#itn \ucc44\uc6a9\uacf5\uace0\ub97c \uc704\ud55c \uc124\uc815 |
|
| 85 |
+#itn \uCC44\uC6A9\uACF5\uACE0\uB97C \uC704\uD55C \uC124\uC815 |
|
| 86 | 86 |
|
| 87 |
-#\ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc \uacbd\ub85c |
|
| 87 |
+#\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uACBD\uB85C |
|
| 88 | 88 |
Globals.itn.file.saveDir=D:/fileTesttset/ |
| 89 |
-#\uba54\uc77c \ucc44\uc6a9 \ud15c\ud50c\ub9bf URL |
|
| 89 |
+#\uBA54\uC77C \uCC44\uC6A9 \uD15C\uD50C\uB9BF URL |
|
| 90 | 90 |
Globals.itn.recruit.template.url=http://localhost:8080/publish/email_form_itn_recruit.html |
| 91 |
-#\uba54\uc77c \ubb38\uc758\ud558\uae30 \ud15c\ud50c\ub9bf URL |
|
| 91 |
+#\uBA54\uC77C \uBB38\uC758\uD558\uAE30 \uD15C\uD50C\uB9BF URL |
|
| 92 | 92 |
Globals.itn.contact.us.template.url=http://localhost:8080/publish/email_form_itn_contact_us.html |
| 93 |
-#\uba54\uc77c \uc218\uc2e0\uc790 \uc8fc\uc18c #TODO : \ucd94\ud6c4\uc5d0 \ubcc0\uacbd\ud574\uc57c\ud568 |
|
| 93 |
+#\uBA54\uC77C \uC218\uC2E0\uC790 \uC8FC\uC18C #TODO : \uCD94\uD6C4\uC5D0 \uBCC0\uACBD\uD574\uC57C\uD568 |
|
| 94 | 94 |
Globals.itn.mail.to.address=rlaqhal6613@duam.net |
| 95 | 95 |
|
| 96 | 96 |
|
| 97 |
-#\ube44\uc988\ubfcc\ub9ac\uc624 \uc124\uc815 |
|
| 97 |
+#\uBE44\uC988\uBFCC\uB9AC\uC624 \uC124\uC815 |
|
| 98 | 98 |
Globals.mjon.kakao.dir=/usr/local/tomcat/file/kakao |
| 99 |
-#\ubb38\uc790\uc628 \uce74\uce74\uc624 \uc11c\ube44\uc2a4 \uc815\ubcf4 (\uc804\uc1a1\uc0ac : \ube44\uc988\ubfcc\ub9ac\uc624) |
|
| 99 |
+#\uBB38\uC790\uC628 \uCE74\uCE74\uC624 \uC11C\uBE44\uC2A4 \uC815\uBCF4 (\uC804\uC1A1\uC0AC : \uBE44\uC988\uBFCC\uB9AC\uC624) |
|
| 100 | 100 |
Globals.mjon.biz.url=https://kapi.ppurio.com |
| 101 | 101 |
Globals.mjon.biz.id=itn0202 |
| 102 | 102 |
Globals.mjon.biz.kakao.apiKey=dheBWCONP6J5 |
... | ... | @@ -110,7 +110,7 @@ |
| 110 | 110 |
Globals.fax.file.ori.path=/usr/local/tomcat/file/sht/fax |
| 111 | 111 |
Globals.fax.file.permit.ext=hwp,hwpml,doc,xls,ppt,pdf,txt,docx,xlsx,pptx,tif,jpg,jpeg,gif,bmp,gul |
| 112 | 112 |
|
| 113 |
-#KG \ubaa8\ube4c\ub9ac\uc5b8\uc2a4 \uc124\uc815 |
|
| 113 |
+#KG \uBAA8\uBE4C\uB9AC\uC5B8\uC2A4 \uC124\uC815 |
|
| 114 | 114 |
#CARD |
| 115 | 115 |
Globals.pay.kgm.card.cnSvcid=191017078687 |
| 116 | 116 |
Globals.pay.kgm.card.payMode=10 |
... | ... | @@ -122,8 +122,11 @@ |
| 122 | 122 |
Globals.pay.kgm.mobile.payMode=00 |
| 123 | 123 |
|
| 124 | 124 |
#Slack |
| 125 |
-Globals.slack.hooks.url=https://hooks.slack.com/services/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 |
|
| 126 |
-Globals.slack.channel.name=\ud14c\uc2a4\ud2b8_mjon\uba54\uc2dc\uc9c0 |
|
| 125 |
+Globals.slack.hooks.url=https://hooks.slack.com/services/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 |
|
| 126 |
+Globals.slack.channel.name=\uD14C\uC2A4\uD2B8-\uBB38\uC790\uACE0-message |
|
| 127 | 127 |
|
| 128 | 128 |
#API |
| 129 | 129 |
Globals.api.ip=http://119.193.215.98:8087 |
| 130 |
+ |
|
| 131 |
+# \uB300\uC2DC\uBCF4\uB4DC \uC694\uC57D API(n8n\u2192Slack) \uACF5\uC720 \uD1A0\uD070 |
|
| 132 |
+Globals.dashboard.api.token=mjon_783439232074797a6fd5a8d6d32ce5d201e4b9a1ef6159e1 |
--- src/main/resources/egovframework/spring/com/context-idgen.xml
+++ src/main/resources/egovframework/spring/com/context-idgen.xml
... | ... | @@ -1092,6 +1092,45 @@ |
| 1092 | 1092 |
<property name="cipers" value="10" /> |
| 1093 | 1093 |
<property name="fillChar" value="0" /> |
| 1094 | 1094 |
</bean> |
| 1095 |
- |
|
| 1096 |
- |
|
| 1095 |
+ |
|
| 1096 |
+ <!-- 사용자 접근 로그 ID Generation Strategy Config --> |
|
| 1097 |
+ <bean name="egovSecondAuthLogIdGnrService" |
|
| 1098 |
+ class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl" |
|
| 1099 |
+ destroy-method="destroy"> |
|
| 1100 |
+ |
|
| 1101 |
+ <property name="dataSource" ref="dataSource" /> |
|
| 1102 |
+ <property name="strategy" ref="secondAuthLogStrategy" /> |
|
| 1103 |
+ |
|
| 1104 |
+ <property name="blockSize" value="12" /> |
|
| 1105 |
+ <property name="table" value="IDS" /> |
|
| 1106 |
+ <property name="tableName" value="SECOND_AUTH_LOG_ID" /> |
|
| 1107 |
+ </bean> |
|
| 1108 |
+ |
|
| 1109 |
+ <bean name="secondAuthLogStrategy" |
|
| 1110 |
+ class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl"> |
|
| 1111 |
+ |
|
| 1112 |
+ <property name="prefix" value="UAL_" /> |
|
| 1113 |
+ <property name="cipers" value="12" /> |
|
| 1114 |
+ <property name="fillChar" value="0" /> |
|
| 1115 |
+ </bean> |
|
| 1116 |
+ |
|
| 1117 |
+ <bean name="egovPersonalInformationLogIdgenService" |
|
| 1118 |
+ class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl" |
|
| 1119 |
+ destroy-method="destroy"> |
|
| 1120 |
+ |
|
| 1121 |
+ <property name="dataSource" ref="dataSource" /> |
|
| 1122 |
+ <property name="strategy" ref="personalInformationLogStrategy" /> |
|
| 1123 |
+ |
|
| 1124 |
+ <property name="blockSize" value="12" /> |
|
| 1125 |
+ <property name="table" value="IDS" /> |
|
| 1126 |
+ <property name="tableName" value="PERS_INFO_LOG" /> |
|
| 1127 |
+ </bean> |
|
| 1128 |
+ |
|
| 1129 |
+ <bean name="personalInformationLogStrategy" |
|
| 1130 |
+ class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl"> |
|
| 1131 |
+ |
|
| 1132 |
+ <property name="prefix" value="PIL_" /> |
|
| 1133 |
+ <property name="cipers" value="12" /> |
|
| 1134 |
+ <property name="fillChar" value="0" /> |
|
| 1135 |
+ </bean> |
|
| 1097 | 1136 |
</beans> |
--- src/main/resources/egovframework/spring/com/context-security.xml
+++ src/main/resources/egovframework/spring/com/context-security.xml
... | ... | @@ -13,7 +13,8 @@ |
| 13 | 13 |
<security:http pattern="/resource/**" security="none"/> |
| 14 | 14 |
<security:http pattern="/pb/**" security="none"/> |
| 15 | 15 |
<security:http pattern="\A/WEB-INF/jsp/.*\Z" request-matcher="regex" security="none"/> |
| 16 |
- |
|
| 16 |
+ <security:http pattern="/api/dashboard/**" security="none"/> |
|
| 17 |
+ |
|
| 17 | 18 |
<egov-security:config id="securityConfig" |
| 18 | 19 |
loginUrl="/uat/uia/actionMain.do" |
| 19 | 20 |
logoutSuccessUrl="/uat/uia/actionMain.do" |
--- src/main/resources/egovframework/sqlmap/com/uss/olh/hpc/EgovHpcm_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/com/uss/olh/hpc/EgovHpcm_SQL_mysql.xml
... | ... | @@ -8,6 +8,7 @@ |
| 8 | 8 |
<sqlMap namespace="Hpcm"> |
| 9 | 9 |
<typeAlias alias="HpcmVO" type="itn.com.uss.olh.hpc.service.HpcmVO"/> |
| 10 | 10 |
<typeAlias alias="hackIpVO" type="itn.com.uss.olh.hpc.service.HackIpVO"/> |
| 11 |
+ <typeAlias alias="blockLogVO" type="itn.com.uss.olh.hpc.service.GeoIpBlockLogVO"/> |
|
| 11 | 12 |
|
| 12 | 13 |
<select id="Hpcm.selectHpcmDetail" parameterClass="HpcmVO" resultClass="HpcmVO"> |
| 13 | 14 |
SELECT A.HPCM_ID AS hpcmId, |
... | ... | @@ -490,5 +491,43 @@ |
| 490 | 491 |
</isNotEmpty> |
| 491 | 492 |
LIMIT #recordCountPerPage# OFFSET #firstIndex# |
| 492 | 493 |
</select> |
| 493 |
- |
|
| 494 |
+ |
|
| 495 |
+ <select id="hackIpDAO.selecForeignAccessBlockList" parameterClass="blockLogVO" resultClass="blockLogVO"> |
|
| 496 |
+ select |
|
| 497 |
+ COUNT(BLOCK_LOG_ID) OVER() as totCnt, |
|
| 498 |
+ BLOCK_LOG_ID as blockLogId, |
|
| 499 |
+ BLOCK_DT as blockDt, |
|
| 500 |
+ ACCESS_IP as accessIp, |
|
| 501 |
+ COUNTRY_CODE as countryCode, |
|
| 502 |
+ COUNTRY_NAME as countryName, |
|
| 503 |
+ BLOCK_YN as blockYn |
|
| 504 |
+ from MJ_ACCESS_BLOCK_LOG |
|
| 505 |
+ where 1 = 1 |
|
| 506 |
+ <isNotEmpty property="searchKeyword"> |
|
| 507 |
+ <isEqual property="searchCondition" compareValue="1"> |
|
| 508 |
+ AND ACCESS_IP LIKE CONCAT('%', #searchKeyword#, '%')
|
|
| 509 |
+ </isEqual> |
|
| 510 |
+ </isNotEmpty> |
|
| 511 |
+ <isNotEmpty prepend="AND" property="searchStartDate"> |
|
| 512 |
+ <![CDATA[ |
|
| 513 |
+ BLOCK_DT >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d') |
|
| 514 |
+ ]]> |
|
| 515 |
+ </isNotEmpty> |
|
| 516 |
+ <isNotEmpty prepend="AND" property="searchEndDate"> |
|
| 517 |
+ <![CDATA[ |
|
| 518 |
+ BLOCK_DT < DATE_FORMAT(DATE_ADD(#searchEndDate#, INTERVAL 1 DAY), '%Y-%m-%d') |
|
| 519 |
+ ]]> |
|
| 520 |
+ </isNotEmpty> |
|
| 521 |
+ ORDER BY BLOCK_LOG_ID desc |
|
| 522 |
+ LIMIT #recordCountPerPage# OFFSET #firstIndex# |
|
| 523 |
+ </select> |
|
| 524 |
+ |
|
| 525 |
+ <update id="hackIpDAO.updateAccessBlockYn" parameterClass="blockLogVO"> |
|
| 526 |
+ update SITEMANAGER set ACCESS_IP_BLOCK_YN = #blockYn# |
|
| 527 |
+ </update> |
|
| 528 |
+ |
|
| 529 |
+ <select id="hackIpDAO.selectAccessBlockYn" resultClass="String"> |
|
| 530 |
+ select ACCESS_IP_BLOCK_YN from SITEMANAGER |
|
| 531 |
+ </select> |
|
| 532 |
+ |
|
| 494 | 533 |
</sqlMap>(No newline at end of file) |
--- src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-msg.xml
+++ src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-msg.xml
... | ... | @@ -4,6 +4,7 @@ |
| 4 | 4 |
<sqlMapConfig> |
| 5 | 5 |
<settings cacheModelsEnabled="true" useStatementNamespaces="true" /> |
| 6 | 6 |
<sqlMap resource="egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml"/> <!-- 문자메세지 --> |
| 7 |
+ <sqlMap resource="egovframework/sqlmap/let/msg/MjonEmployeeCert_SQL_mysql.xml"/><!-- 종사자 수 인증 --> |
|
| 7 | 8 |
<sqlMap resource="egovframework/sqlmap/let/msg/MjonMsgCampainData_SQL_mysql.xml"/> <!-- 선거문자메세지 --> |
| 8 | 9 |
<sqlMap resource="egovframework/sqlmap/let/msg/MjonMsgCustom_SQL_mysql.xml"/><!-- 문자 커스텀 --> |
| 9 | 10 |
<sqlMap resource="egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml"/><!-- 문자 발송관리 --> |
+++ src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-sym-log-access.xml
... | ... | @@ -0,0 +1,7 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" | |
| 3 | + "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> | |
| 4 | + | |
| 5 | +<sqlMapConfig> | |
| 6 | + <sqlMap resource="egovframework/sqlmap/let/sym/log/access/UserAccessLog_SQL_Mysql.xml"/> | |
| 7 | +</sqlMapConfig> |
+++ src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-sym-log-personal.xml
... | ... | @@ -0,0 +1,7 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" | |
| 3 | + "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> | |
| 4 | + | |
| 5 | +<sqlMapConfig> | |
| 6 | + <sqlMap resource="egovframework/sqlmap/let/sym/log/personal/PersonalInformationLog_SQL_Mysql.xml"/> | |
| 7 | +</sqlMapConfig> |
--- src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-uat.xml
+++ src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-uat.xml
... | ... | @@ -3,4 +3,5 @@ |
| 3 | 3 |
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> |
| 4 | 4 |
<sqlMapConfig> |
| 5 | 5 |
<sqlMap resource="egovframework/sqlmap/let/uat/uia/EgovLoginUsr_SQL_Mysql.xml"/> |
| 6 |
+ <sqlMap resource="egovframework/sqlmap/let/uat/uia/SecondAuthLog_SQL_Mysql.xml"/> |
|
| 6 | 7 |
</sqlMapConfig> |
--- src/main/resources/egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml
... | ... | @@ -15,6 +15,7 @@ |
| 15 | 15 |
, '-' AS certMemo |
| 16 | 16 |
, '대표번호' AS certAlias |
| 17 | 17 |
, '-' AS frstRegistPnttm |
| 18 |
+ , sbscrb_de AS mberRegDate |
|
| 18 | 19 |
FROM |
| 19 | 20 |
lettngnrlmber |
| 20 | 21 |
WHERE MBER_ID = #userId# |
... | ... | @@ -24,6 +25,7 @@ |
| 24 | 25 |
, CERT_MEMO AS certMemo |
| 25 | 26 |
, CERT_ALIAS AS certAlias |
| 26 | 27 |
, FRST_REGIST_PNTTM AS frstRegistPnttm |
| 28 |
+ , FRST_REGIST_PNTTM AS mberRegDate |
|
| 27 | 29 |
FROM |
| 28 | 30 |
lettngnrlmber_cert_phone |
| 29 | 31 |
WHERE MBER_ID = #userId# |
--- src/main/resources/egovframework/sqlmap/let/cop/bbs/EgovBoard_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/cop/bbs/EgovBoard_SQL_Mysql.xml
... | ... | @@ -1714,7 +1714,6 @@ |
| 1714 | 1714 |
, a.NTT_ID AS nttId |
| 1715 | 1715 |
, a.NTCR_ID AS ntcrId |
| 1716 | 1716 |
, a.NTCR_NM AS ntcrNm |
| 1717 |
- /*, (select EMPLYR_ID from lettnemplyrinfo c where a.FRST_REGISTER_ID = c.ESNTL_ID) AS frstRegisterId*/ |
|
| 1718 | 1717 |
, a.NTCR_NM AS frstRegisterId |
| 1719 | 1718 |
, a.FRST_REGIST_PNTTM AS frstRegisterPnttm |
| 1720 | 1719 |
FROM |
... | ... | @@ -1723,11 +1722,39 @@ |
| 1723 | 1722 |
ON a.BBS_ID = b.BBS_ID |
| 1724 | 1723 |
WHERE 1=1 |
| 1725 | 1724 |
AND a.USE_AT = 'Y' |
| 1725 |
+ <isNotEmpty prepend="AND" property="searchStartDate"> |
|
| 1726 |
+ <![CDATA[ |
|
| 1727 |
+ DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d') |
|
| 1728 |
+ ]]> |
|
| 1729 |
+ </isNotEmpty> |
|
| 1730 |
+ <isNotEmpty prepend="AND" property="searchEndDate"> |
|
| 1731 |
+ <![CDATA[ |
|
| 1732 |
+ DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') <= DATE_FORMAT(#searchEndDate#, '%Y-%m-%d') |
|
| 1733 |
+ ]]> |
|
| 1734 |
+ </isNotEmpty> |
|
| 1726 | 1735 |
<isEqual prepend="AND" property="searchCnd" compareValue="1"> |
| 1727 | 1736 |
<isNotEmpty property="searchWrd"> |
| 1728 | 1737 |
<![CDATA[ ( a.NTT_SJ LIKE CONCAT ('%', #searchWrd#,'%') OR a.NTT_CN LIKE CONCAT ('%', #searchWrd#,'%') ) ]]>
|
| 1729 | 1738 |
</isNotEmpty> |
| 1730 | 1739 |
</isEqual> |
| 1740 |
+ <isEqual prepend="AND" property="searchCnd" compareValue="2"> |
|
| 1741 |
+ <isNotEmpty property="searchWrd"> |
|
| 1742 |
+ a.NTCR_ID LIKE CONCAT('%', #searchWrd#, '%')
|
|
| 1743 |
+ </isNotEmpty> |
|
| 1744 |
+ </isEqual> |
|
| 1745 |
+ <isEqual prepend="AND" property="searchCnd" compareValue="3"> |
|
| 1746 |
+ <isNotEmpty property="searchWrd"> |
|
| 1747 |
+ EXISTS ( |
|
| 1748 |
+ SELECT 1 |
|
| 1749 |
+ FROM lettncomment c |
|
| 1750 |
+ WHERE |
|
| 1751 |
+ c.USE_AT = 'Y' |
|
| 1752 |
+ AND c.BBS_ID = a.BBS_ID |
|
| 1753 |
+ AND c.NTT_ID = a.NTT_ID |
|
| 1754 |
+ AND c.WRTER_NM LIKE CONCAT('%', #searchWrd#, '%')
|
|
| 1755 |
+ ) |
|
| 1756 |
+ </isNotEmpty> |
|
| 1757 |
+ </isEqual> |
|
| 1731 | 1758 |
ORDER BY 1=1 |
| 1732 | 1759 |
<isNotEmpty property="searchSortCnd"> |
| 1733 | 1760 |
,$searchSortCnd$ |
... | ... | @@ -1737,6 +1764,73 @@ |
| 1737 | 1764 |
</isNotEmpty> |
| 1738 | 1765 |
LIMIT #recordCountPerPage# OFFSET #firstIndex# |
| 1739 | 1766 |
</select> |
| 1767 |
+ |
|
| 1768 |
+ <select id="BBSManageDAO.selectBbsContentsListExcelDownload" parameterClass="BoardVO" resultClass="BoardVO" > |
|
| 1769 |
+ SELECT |
|
| 1770 |
+ COUNT(1) OVER() AS totCnt, |
|
| 1771 |
+ b.BBS_NM AS bbsNm, |
|
| 1772 |
+ a.NTT_SJ AS nttSj, |
|
| 1773 |
+ a.NTT_CN AS nttCn, |
|
| 1774 |
+ a.NTCR_ID AS ntcrId, |
|
| 1775 |
+ a.NTCR_NM as ntcrNm, |
|
| 1776 |
+ COALESCE(c.commenterNms, '') AS commenterNms, |
|
| 1777 |
+ DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d %T') AS frstRegisterPnttm |
|
| 1778 |
+ FROM |
|
| 1779 |
+ lettnbbs a |
|
| 1780 |
+ INNER JOIN lettnbbsmaster b |
|
| 1781 |
+ ON a.BBS_ID = b.BBS_ID |
|
| 1782 |
+ LEFT JOIN ( |
|
| 1783 |
+ SELECT |
|
| 1784 |
+ BBS_ID, |
|
| 1785 |
+ NTT_ID, |
|
| 1786 |
+ GROUP_CONCAT( |
|
| 1787 |
+ DISTINCT WRTER_NM |
|
| 1788 |
+ ORDER BY ANSWER_NO |
|
| 1789 |
+ SEPARATOR ', ' |
|
| 1790 |
+ ) AS commenterNms |
|
| 1791 |
+ FROM lettncomment |
|
| 1792 |
+ WHERE USE_AT = 'Y' |
|
| 1793 |
+ GROUP BY BBS_ID, NTT_ID |
|
| 1794 |
+ ) c |
|
| 1795 |
+ ON a.BBS_ID = c.BBS_ID |
|
| 1796 |
+ AND a.NTT_ID = c.NTT_ID |
|
| 1797 |
+ WHERE 1=1 |
|
| 1798 |
+ AND a.USE_AT = 'Y' |
|
| 1799 |
+ <isNotEmpty prepend="AND" property="searchStartDate"> |
|
| 1800 |
+ <![CDATA[ |
|
| 1801 |
+ DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d') |
|
| 1802 |
+ ]]> |
|
| 1803 |
+ </isNotEmpty> |
|
| 1804 |
+ <isNotEmpty prepend="AND" property="searchEndDate"> |
|
| 1805 |
+ <![CDATA[ |
|
| 1806 |
+ DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') <= DATE_FORMAT(#searchEndDate#, '%Y-%m-%d') |
|
| 1807 |
+ ]]> |
|
| 1808 |
+ </isNotEmpty> |
|
| 1809 |
+ <isEqual prepend="AND" property="searchCnd" compareValue="1"> |
|
| 1810 |
+ <isNotEmpty property="searchWrd"> |
|
| 1811 |
+ <![CDATA[ ( a.NTT_SJ LIKE CONCAT ('%', #searchWrd#,'%') OR a.NTT_CN LIKE CONCAT ('%', #searchWrd#,'%') ) ]]>
|
|
| 1812 |
+ </isNotEmpty> |
|
| 1813 |
+ </isEqual> |
|
| 1814 |
+ <isEqual prepend="AND" property="searchCnd" compareValue="2"> |
|
| 1815 |
+ <isNotEmpty property="searchWrd"> |
|
| 1816 |
+ a.NTCR_ID LIKE CONCAT('%', #searchWrd#, '%')
|
|
| 1817 |
+ </isNotEmpty> |
|
| 1818 |
+ </isEqual> |
|
| 1819 |
+ <isEqual prepend="AND" property="searchCnd" compareValue="3"> |
|
| 1820 |
+ <isNotEmpty property="searchWrd"> |
|
| 1821 |
+ EXISTS ( |
|
| 1822 |
+ SELECT 1 |
|
| 1823 |
+ FROM lettncomment c |
|
| 1824 |
+ WHERE |
|
| 1825 |
+ c.USE_AT = 'Y' |
|
| 1826 |
+ AND c.BBS_ID = a.BBS_ID |
|
| 1827 |
+ AND c.NTT_ID = a.NTT_ID |
|
| 1828 |
+ AND c.WRTER_NM LIKE CONCAT('%', #searchWrd#, '%')
|
|
| 1829 |
+ ) |
|
| 1830 |
+ </isNotEmpty> |
|
| 1831 |
+ </isEqual> |
|
| 1832 |
+ ORDER BY a.FRST_REGIST_PNTTM desc |
|
| 1833 |
+ </select> |
|
| 1740 | 1834 |
|
| 1741 | 1835 |
<select id="BBSManageDAO.selectAdminMainBoardByDash" parameterClass="BoardVO" resultClass="BoardVO" > |
| 1742 | 1836 |
SELECT |
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonEmployeeCert_SQL_mysql.xml
... | ... | @@ -0,0 +1,232 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> | |
| 3 | +<sqlMap namespace="EmployeeCert"> | |
| 4 | + <typeAlias alias="employeeCertVO" type="itn.let.mjo.msg.service.EmployeeCertVO"/> | |
| 5 | + | |
| 6 | + <select id="employeeCertDAO.selectEmployeeCertList" parameterClass="employeeCertVO" resultClass="employeeCertVO"> | |
| 7 | + /* employeeCertDAO.selectEmployeeCertList */ | |
| 8 | + SELECT | |
| 9 | + EH.EMPLOYEE_CERT_HSTRY_SEQ AS employeeCertHstrySeq | |
| 10 | + , EH.MBER_ID AS mberId | |
| 11 | + , LM.DEPT AS dept | |
| 12 | + , LM.MBER_NM AS mberNm | |
| 13 | + , LM.biz_no AS bizNo | |
| 14 | + , LM.CEO_NM AS managerNm | |
| 15 | + , EC.CERT_CNT AS certCnt | |
| 16 | + , EH.APPLY_CNT AS applyCnt | |
| 17 | + , EH.AUTH_YN AS authYn | |
| 18 | + , AC.CODE_NM AS authYnTxt | |
| 19 | + , EH.REJECT_CODE AS rejectCode | |
| 20 | + , RC.CODE_NM AS rejectCodeTxt | |
| 21 | + , EH.REJECT_REASON AS rejectReason | |
| 22 | + , EH.ATCH_FILE_ID AS atchFileId | |
| 23 | + , EH.AGREE_YN AS agreeYn | |
| 24 | + , DATE_FORMAT(EH.FRST_REGIST_PNTTM, '%Y-%m-%d %H:%i') AS frstRegistPnttm | |
| 25 | + , EH.FRST_REGISTER_ID AS frstRegisterId | |
| 26 | + , DATE_FORMAT(EH.LAST_UPDT_PNTTM, '%Y-%m-%d %H:%i') AS lastUpdtPnttm | |
| 27 | + , EH.LAST_UPDUSR_ID AS lastUpdusrId | |
| 28 | + , EI.USER_NM AS lastUpdusrNm | |
| 29 | + FROM MJ_EMPLOYEE_CERT EC | |
| 30 | + INNER JOIN MJ_EMPLOYEE_CERT_HSTRY EH | |
| 31 | + ON EC.MBER_ID = EH.MBER_ID | |
| 32 | + AND EC.LAST_HSTRY_SEQ = EH.EMPLOYEE_CERT_HSTRY_SEQ | |
| 33 | + INNER JOIN LETTNGNRLMBER LM | |
| 34 | + ON EH.MBER_ID = LM.MBER_ID | |
| 35 | + | |
| 36 | + LEFT JOIN LETTNEMPLYRINFO EI | |
| 37 | + ON EH.LAST_UPDUSR_ID = EI.EMPLYR_ID | |
| 38 | + LEFT JOIN LETTCCMMNDETAILCODE AC | |
| 39 | + ON AC.CODE_ID = 'ITN028' AND AC.USE_AT = 'Y' AND EH.AUTH_YN = AC.CODE | |
| 40 | + LEFT JOIN LETTCCMMNDETAILCODE RC | |
| 41 | + ON RC.CODE_ID = 'EMP001' AND RC.USE_AT = 'Y' AND EH.REJECT_CODE = RC.CODE | |
| 42 | + WHERE 1 = 1 | |
| 43 | + <isNotEmpty property="searchStartDate"> | |
| 44 | + AND EH.FRST_REGIST_PNTTM >= CONCAT(#searchStartDate#, ' 00:00:00') | |
| 45 | + </isNotEmpty> | |
| 46 | + <isNotEmpty property="searchEndDate"> | |
| 47 | + AND EH.FRST_REGIST_PNTTM < DATE_ADD(#searchEndDate#, INTERVAL 1 DAY) | |
| 48 | + </isNotEmpty> | |
| 49 | + <isNotEmpty property="searchCondition2"> | |
| 50 | + <isEqual property="searchCondition2" compareValue="N"> | |
| 51 | + AND EH.AUTH_YN IN ('N', 'H') | |
| 52 | + </isEqual> | |
| 53 | + <isNotEqual property="searchCondition2" compareValue="N"> | |
| 54 | + AND EH.AUTH_YN = #searchCondition2# | |
| 55 | + </isNotEqual> | |
| 56 | + </isNotEmpty> | |
| 57 | + <isNotEmpty property="searchKeyword"> | |
| 58 | + <isEqual property="searchCondition" compareValue="1"> | |
| 59 | + AND EH.MBER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 60 | + </isEqual> | |
| 61 | + <isEqual property="searchCondition" compareValue="2"> | |
| 62 | + AND LM.MBER_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 63 | + </isEqual> | |
| 64 | + <isEqual property="searchCondition" compareValue="3"> | |
| 65 | + AND LM.BIZ_NO LIKE CONCAT('%', #searchKeyword#, '%') | |
| 66 | + </isEqual> | |
| 67 | + <isEmpty property="searchCondition"> | |
| 68 | + AND (EH.MBER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 69 | + OR LM.MBER_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 70 | + OR LM.BIZ_NO LIKE CONCAT('%', #searchKeyword#, '%')) | |
| 71 | + </isEmpty> | |
| 72 | + </isNotEmpty> | |
| 73 | + ORDER BY EH.FRST_REGIST_PNTTM DESC | |
| 74 | + <isNotNull property="recordCountPerPage"> | |
| 75 | + LIMIT #recordCountPerPage# OFFSET #firstIndex# | |
| 76 | + </isNotNull> | |
| 77 | + </select> | |
| 78 | + | |
| 79 | + <select id="employeeCertDAO.selectEmployeeCertListCnt" parameterClass="employeeCertVO" resultClass="java.lang.Integer"> | |
| 80 | + /* employeeCertDAO.selectEmployeeCertListCnt */ | |
| 81 | + SELECT COUNT(EH.EMPLOYEE_CERT_HSTRY_SEQ) | |
| 82 | + FROM MJ_EMPLOYEE_CERT EC | |
| 83 | + INNER JOIN MJ_EMPLOYEE_CERT_HSTRY EH | |
| 84 | + ON EC.MBER_ID = EH.MBER_ID | |
| 85 | + AND EC.LAST_HSTRY_SEQ = EH.EMPLOYEE_CERT_HSTRY_SEQ | |
| 86 | + INNER JOIN LETTNGNRLMBER LM ON EH.MBER_ID = LM.MBER_ID | |
| 87 | + WHERE 1 = 1 | |
| 88 | + <isNotEmpty property="searchStartDate"> | |
| 89 | + AND EH.FRST_REGIST_PNTTM >= CONCAT(#searchStartDate#, ' 00:00:00') | |
| 90 | + </isNotEmpty> | |
| 91 | + <isNotEmpty property="searchEndDate"> | |
| 92 | + AND EH.FRST_REGIST_PNTTM < DATE_ADD(#searchEndDate#, INTERVAL 1 DAY) | |
| 93 | + </isNotEmpty> | |
| 94 | + <isNotEmpty property="searchCondition2"> | |
| 95 | + <isEqual property="searchCondition2" compareValue="N"> | |
| 96 | + AND EH.AUTH_YN IN ('N', 'H') | |
| 97 | + </isEqual> | |
| 98 | + <isNotEqual property="searchCondition2" compareValue="N"> | |
| 99 | + AND EH.AUTH_YN = #searchCondition2# | |
| 100 | + </isNotEqual> | |
| 101 | + </isNotEmpty> | |
| 102 | + <isNotEmpty property="searchKeyword"> | |
| 103 | + <isEqual property="searchCondition" compareValue="1"> | |
| 104 | + AND EH.MBER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 105 | + </isEqual> | |
| 106 | + <isEqual property="searchCondition" compareValue="2"> | |
| 107 | + AND LM.MBER_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 108 | + </isEqual> | |
| 109 | + <isEqual property="searchCondition" compareValue="3"> | |
| 110 | + AND LM.BIZ_NO LIKE CONCAT('%', #searchKeyword#, '%') | |
| 111 | + </isEqual> | |
| 112 | + <isEmpty property="searchCondition"> | |
| 113 | + AND (EH.MBER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 114 | + OR LM.MBER_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 115 | + OR LM.BIZ_NO LIKE CONCAT('%', #searchKeyword#, '%')) | |
| 116 | + </isEmpty> | |
| 117 | + </isNotEmpty> | |
| 118 | + </select> | |
| 119 | + | |
| 120 | + <select id="employeeCertDAO.selectEmployeeCertDetail" parameterClass="employeeCertVO" resultClass="employeeCertVO"> | |
| 121 | + /* employeeCertDAO.selectEmployeeCertDetail */ | |
| 122 | + SELECT | |
| 123 | + EH.EMPLOYEE_CERT_HSTRY_SEQ AS employeeCertHstrySeq | |
| 124 | + , EH.MBER_ID AS mberId | |
| 125 | + , LM.DEPT AS dept | |
| 126 | + , LM.MBER_NM AS mberNm | |
| 127 | + , LM.BIZ_NO AS bizNo | |
| 128 | + , LM.MBTLNUM AS mbtlNum | |
| 129 | + , LM.CEO_NM AS managerNm | |
| 130 | + , EC.CERT_CNT AS certCnt | |
| 131 | + , EH.APPLY_CNT AS applyCnt | |
| 132 | + , EH.AUTH_YN AS authYn | |
| 133 | + , AC.CODE_NM AS authYnTxt | |
| 134 | + , EH.REJECT_CODE AS rejectCode | |
| 135 | + , RC.CODE_NM AS rejectCodeTxt | |
| 136 | + , EH.REJECT_REASON AS rejectReason | |
| 137 | + , EH.ATCH_FILE_ID AS atchFileId | |
| 138 | + , EH.AGREE_YN AS agreeYn | |
| 139 | + , DATE_FORMAT(EH.AGREE_PNTTM, '%Y-%m-%d %H:%i') AS agreePnttm | |
| 140 | + , DATE_FORMAT(EH.FRST_REGIST_PNTTM, '%Y-%m-%d %H:%i') AS frstRegistPnttm | |
| 141 | + , EH.FRST_REGISTER_ID AS frstRegisterId | |
| 142 | + , DATE_FORMAT(EH.LAST_UPDT_PNTTM, '%Y-%m-%d %H:%i') AS lastUpdtPnttm | |
| 143 | + , EH.LAST_UPDUSR_ID AS lastUpdusrId | |
| 144 | + , EI.USER_NM AS lastUpdusrNm | |
| 145 | + FROM MJ_EMPLOYEE_CERT_HSTRY EH | |
| 146 | + LEFT JOIN MJ_EMPLOYEE_CERT EC ON EH.MBER_ID = EC.MBER_ID | |
| 147 | + INNER JOIN LETTNGNRLMBER LM ON EH.MBER_ID = LM.MBER_ID | |
| 148 | + LEFT JOIN LETTNEMPLYRINFO EI ON EH.LAST_UPDUSR_ID = EI.EMPLYR_ID | |
| 149 | + LEFT JOIN LETTCCMMNDETAILCODE AC | |
| 150 | + ON AC.CODE_ID = 'ITN028' AND AC.USE_AT = 'Y' AND EH.AUTH_YN = AC.CODE | |
| 151 | + LEFT JOIN LETTCCMMNDETAILCODE RC | |
| 152 | + ON RC.CODE_ID = 'EMP001' AND RC.USE_AT = 'Y' AND EH.REJECT_CODE = RC.CODE | |
| 153 | + WHERE EH.EMPLOYEE_CERT_HSTRY_SEQ = #employeeCertHstrySeq# | |
| 154 | + </select> | |
| 155 | + | |
| 156 | + <select id="employeeCertDAO.selectEmployeeCertHstryList" parameterClass="employeeCertVO" resultClass="employeeCertVO"> | |
| 157 | + /* employeeCertDAO.selectEmployeeCertHstryList */ | |
| 158 | + SELECT | |
| 159 | + EH.EMPLOYEE_CERT_HSTRY_SEQ AS employeeCertHstrySeq | |
| 160 | + , EH.MBER_ID AS mberId | |
| 161 | + , EH.APPLY_CNT AS applyCnt | |
| 162 | + , EH.AUTH_YN AS authYn | |
| 163 | + , AC.CODE_NM AS authYnTxt | |
| 164 | + , EH.REJECT_CODE AS rejectCode | |
| 165 | + , RC.CODE_NM AS rejectCodeTxt | |
| 166 | + , EH.REJECT_REASON AS rejectReason | |
| 167 | + , EH.ATCH_FILE_ID AS atchFileId | |
| 168 | + , DATE_FORMAT(EH.FRST_REGIST_PNTTM, '%Y-%m-%d %H:%i') AS frstRegistPnttm | |
| 169 | + , DATE_FORMAT(EH.LAST_UPDT_PNTTM, '%Y-%m-%d %H:%i') AS lastUpdtPnttm | |
| 170 | + , EH.LAST_UPDUSR_ID AS lastUpdusrId | |
| 171 | + , EI.USER_NM AS lastUpdusrNm | |
| 172 | + FROM MJ_EMPLOYEE_CERT_HSTRY EH | |
| 173 | + LEFT JOIN LETTNEMPLYRINFO EI ON EH.LAST_UPDUSR_ID = EI.EMPLYR_ID | |
| 174 | + LEFT JOIN LETTCCMMNDETAILCODE AC | |
| 175 | + ON AC.CODE_ID = 'ITN028' AND AC.USE_AT = 'Y' AND EH.AUTH_YN = AC.CODE | |
| 176 | + LEFT JOIN LETTCCMMNDETAILCODE RC | |
| 177 | + ON RC.CODE_ID = 'EMP001' AND RC.USE_AT = 'Y' AND EH.REJECT_CODE = RC.CODE | |
| 178 | + WHERE EH.MBER_ID = #mberId# | |
| 179 | + ORDER BY EH.FRST_REGIST_PNTTM DESC | |
| 180 | + </select> | |
| 181 | + | |
| 182 | + <select id="employeeCertDAO.selectEmployeeCertForUpdate" parameterClass="employeeCertVO" resultClass="employeeCertVO"> | |
| 183 | + /* employeeCertDAO.selectEmployeeCertForUpdate */ | |
| 184 | + SELECT | |
| 185 | + EH.EMPLOYEE_CERT_HSTRY_SEQ AS employeeCertHstrySeq | |
| 186 | + , EH.MBER_ID AS mberId | |
| 187 | + , EH.APPLY_CNT AS applyCnt | |
| 188 | + , EH.AUTH_YN AS authYn | |
| 189 | + FROM MJ_EMPLOYEE_CERT_HSTRY EH | |
| 190 | + WHERE EH.EMPLOYEE_CERT_HSTRY_SEQ = #employeeCertHstrySeq# | |
| 191 | + FOR UPDATE | |
| 192 | + </select> | |
| 193 | + | |
| 194 | + <update id="employeeCertDAO.updateEmployeeCertHstryAuth" parameterClass="employeeCertVO"> | |
| 195 | + /* employeeCertDAO.updateEmployeeCertHstryAuth */ | |
| 196 | + UPDATE MJ_EMPLOYEE_CERT_HSTRY | |
| 197 | + SET AUTH_YN = #authYn# | |
| 198 | + , REJECT_CODE = #rejectCode# | |
| 199 | + , REJECT_REASON = #rejectReason# | |
| 200 | + , LAST_UPDT_PNTTM = NOW() | |
| 201 | + , LAST_UPDUSR_ID = #lastUpdusrId# | |
| 202 | + WHERE EMPLOYEE_CERT_HSTRY_SEQ = #employeeCertHstrySeq# | |
| 203 | + AND MBER_ID = #mberId# | |
| 204 | + </update> | |
| 205 | + | |
| 206 | + <update id="employeeCertDAO.refreshEmployeeCertApproval" parameterClass="employeeCertVO"> | |
| 207 | + /* employeeCertDAO.refreshEmployeeCertApproval */ | |
| 208 | + UPDATE MJ_EMPLOYEE_CERT | |
| 209 | + SET CERT_CNT = ( | |
| 210 | + SELECT H.APPLY_CNT | |
| 211 | + FROM MJ_EMPLOYEE_CERT_HSTRY H | |
| 212 | + WHERE H.MBER_ID = #mberId# AND H.AUTH_YN = 'Y' | |
| 213 | + ORDER BY H.LAST_UPDT_PNTTM DESC LIMIT 1 | |
| 214 | + ) | |
| 215 | + , AUTH_HSTRY_SEQ = ( | |
| 216 | + SELECT H.EMPLOYEE_CERT_HSTRY_SEQ | |
| 217 | + FROM MJ_EMPLOYEE_CERT_HSTRY H | |
| 218 | + WHERE H.MBER_ID = #mberId# AND H.AUTH_YN = 'Y' | |
| 219 | + ORDER BY H.LAST_UPDT_PNTTM DESC LIMIT 1 | |
| 220 | + ) | |
| 221 | + , LAST_AUTH_PNTTM = ( | |
| 222 | + SELECT H.LAST_UPDT_PNTTM | |
| 223 | + FROM MJ_EMPLOYEE_CERT_HSTRY H | |
| 224 | + WHERE H.MBER_ID = #mberId# AND H.AUTH_YN = 'Y' | |
| 225 | + ORDER BY H.LAST_UPDT_PNTTM DESC LIMIT 1 | |
| 226 | + ) | |
| 227 | + , LAST_UPDT_PNTTM = NOW() | |
| 228 | + , LAST_UPDUSR_ID = #lastUpdusrId# | |
| 229 | + WHERE MBER_ID = #mberId# | |
| 230 | + AND LAST_HSTRY_SEQ = #employeeCertHstrySeq# | |
| 231 | + </update> | |
| 232 | +</sqlMap> |
+++ src/main/resources/egovframework/sqlmap/let/sym/log/access/UserAccessLog_SQL_Mysql.xml
... | ... | @@ -0,0 +1,101 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> | |
| 3 | + | |
| 4 | +<sqlMap namespace="userAccessLogVO"> | |
| 5 | + | |
| 6 | + <typeAlias alias="userAccessLogVO" type="itn.let.sym.log.access.UserAccessLogVO"/> | |
| 7 | + <resultMap id="userAccessLogResult" class="userAccessLogVO"> | |
| 8 | + <result property="logId" column="LOG_ID"/> | |
| 9 | + <result property="userId" column="USER_ID"/> | |
| 10 | + <result property="accessIp" column="ACCESS_IP"/> | |
| 11 | + <result property="uri" column="URI"/> | |
| 12 | + <result property="menuNm" column="MENU_NM"/> | |
| 13 | + <result property="result" column="RESULT"/> | |
| 14 | + <result property="frstRegistPnttm" column="FRST_REGIST_PNTTM"/> | |
| 15 | + </resultMap> | |
| 16 | + | |
| 17 | + <select id="userAccessLogDAO.selectUserAccessLogListTotCnt" parameterClass="userAccessLogVO" resultClass="java.lang.Integer"> | |
| 18 | + | |
| 19 | + SELECT COUNT(*) | |
| 20 | + FROM USER_ACCESS_LOG A | |
| 21 | + WHERE 1 = 1 | |
| 22 | + | |
| 23 | + <isNotEmpty property="result"> | |
| 24 | + AND A.RESULT = #result# | |
| 25 | + </isNotEmpty> | |
| 26 | + | |
| 27 | + <isNotEmpty property="searchStartDate"> | |
| 28 | + AND A.FRST_REGIST_PNTTM | |
| 29 | + <![CDATA[ >= ]]> | |
| 30 | + CONCAT(#searchStartDate#, ' 00:00:00') | |
| 31 | + </isNotEmpty> | |
| 32 | + | |
| 33 | + <isNotEmpty property="searchEndDate"> | |
| 34 | + AND A.FRST_REGIST_PNTTM | |
| 35 | + <![CDATA[ < ]]> | |
| 36 | + DATE_ADD( | |
| 37 | + CONCAT(#searchEndDate#, ' 00:00:00'), | |
| 38 | + INTERVAL 1 DAY | |
| 39 | + ) | |
| 40 | + </isNotEmpty> | |
| 41 | + | |
| 42 | + <isNotEmpty property="searchKeyword"> | |
| 43 | + | |
| 44 | + <isEqual property="searchCondition" compareValue="userId"> | |
| 45 | + AND A.USER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 46 | + </isEqual> | |
| 47 | + | |
| 48 | + <isEqual property="searchCondition" compareValue="accessIp"> | |
| 49 | + AND A.ACCESS_IP LIKE CONCAT('%', #searchKeyword#, '%') | |
| 50 | + </isEqual> | |
| 51 | + | |
| 52 | + <isEqual property="searchCondition" compareValue="menuNm"> | |
| 53 | + AND A.MENU_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 54 | + </isEqual> | |
| 55 | + | |
| 56 | + </isNotEmpty> | |
| 57 | + | |
| 58 | + </select> | |
| 59 | + | |
| 60 | + <select id="userAccessLogDAO.selectUserAccessLogList" parameterClass="userAccessLogVO" resultMap="userAccessLogResult"> | |
| 61 | + SELECT | |
| 62 | + A.LOG_ID, | |
| 63 | + A.USER_ID, | |
| 64 | + A.ACCESS_IP, | |
| 65 | + A.MENU_NM, | |
| 66 | + A.URI, | |
| 67 | + A.RESULT, | |
| 68 | + DATE_FORMAT(A.FRST_REGIST_PNTTM, '%Y-%m-%d %H:%i:%s') AS FRST_REGIST_PNTTM | |
| 69 | + FROM USER_ACCESS_LOG A | |
| 70 | + WHERE 1 = 1 | |
| 71 | + <isNotEmpty property="result"> | |
| 72 | + AND A.RESULT = #result# | |
| 73 | + </isNotEmpty> | |
| 74 | + <isNotEmpty property="searchStartDate"> | |
| 75 | + AND A.FRST_REGIST_PNTTM <![CDATA[ >= ]]> CONCAT(#searchStartDate#, ' 00:00:00') | |
| 76 | + </isNotEmpty> | |
| 77 | + <isNotEmpty property="searchEndDate"> | |
| 78 | + AND A.FRST_REGIST_PNTTM <![CDATA[ < ]]> DATE_ADD(CONCAT(#searchEndDate#, ' 00:00:00'), INTERVAL 1 DAY) | |
| 79 | + </isNotEmpty> | |
| 80 | + <isNotEmpty property="searchKeyword"> | |
| 81 | + <isEqual property="searchCondition" compareValue="userId"> | |
| 82 | + AND USER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 83 | + </isEqual> | |
| 84 | + <isEqual property="searchCondition" compareValue="accessIp"> | |
| 85 | + AND ACCESS_IP LIKE CONCAT('%', #searchKeyword#, '%') | |
| 86 | + </isEqual> | |
| 87 | + <isEqual property="searchCondition" compareValue="menuNm"> | |
| 88 | + AND MENU_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 89 | + </isEqual> | |
| 90 | + </isNotEmpty> | |
| 91 | + <isNotEmpty property="searchSortCnd"> | |
| 92 | + ORDER BY $searchSortCnd$ | |
| 93 | + <isNotEmpty property="searchSortOrd"> | |
| 94 | + $searchSortOrd$ | |
| 95 | + </isNotEmpty> | |
| 96 | + </isNotEmpty> | |
| 97 | + | |
| 98 | + LIMIT #firstIndex#, #recordCountPerPage# | |
| 99 | + </select> | |
| 100 | + | |
| 101 | +</sqlMap>(No newline at end of file) |
+++ src/main/resources/egovframework/sqlmap/let/sym/log/personal/PersonalInformationLog_SQL_Mysql.xml
... | ... | @@ -0,0 +1,165 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" | |
| 3 | + "http://ibatis.apache.org/dtd/sql-map-2.dtd"> | |
| 4 | + | |
| 5 | +<sqlMap namespace="personalInformationLogVO"> | |
| 6 | + | |
| 7 | + <typeAlias | |
| 8 | + alias="personalInformationLogVO" | |
| 9 | + type="itn.let.sym.log.personal.PersonalInformationLogVO"/> | |
| 10 | + | |
| 11 | + <resultMap id="personalInformationLogResult" | |
| 12 | + class="personalInformationLogVO"> | |
| 13 | + <result property="logId" column="LOG_ID"/> | |
| 14 | + <result property="userId" column="USER_ID"/> | |
| 15 | + <result property="accessIp" column="ACCESS_IP"/> | |
| 16 | + <result property="uri" column="URI"/> | |
| 17 | + <result property="menuNm" column="MENU_NM"/> | |
| 18 | + <result property="action" column="ACTION"/> | |
| 19 | + <result property="target" column="TARGET"/> | |
| 20 | + <result property="frstRegistPnttm" column="FRST_REGIST_PNTTM"/> | |
| 21 | + </resultMap> | |
| 22 | + | |
| 23 | + | |
| 24 | + <insert id="personalInformationLogDAO.insertPersonalInformationLog" | |
| 25 | + parameterClass="personalInformationLogVO"> | |
| 26 | + | |
| 27 | + INSERT INTO PERSONAL_INFORMATION_LOG ( | |
| 28 | + LOG_ID, | |
| 29 | + USER_ID, | |
| 30 | + ACCESS_IP, | |
| 31 | + URI, | |
| 32 | + MENU_NM, | |
| 33 | + ACTION, | |
| 34 | + TARGET, | |
| 35 | + FRST_REGIST_PNTTM | |
| 36 | + ) VALUES ( | |
| 37 | + #logId#, | |
| 38 | + #userId#, | |
| 39 | + #accessIp#, | |
| 40 | + #uri#, | |
| 41 | + #menuNm#, | |
| 42 | + #action#, | |
| 43 | + #target#, | |
| 44 | + CURRENT_TIMESTAMP | |
| 45 | + ) | |
| 46 | + | |
| 47 | + </insert> | |
| 48 | + | |
| 49 | + | |
| 50 | + <select id="personalInformationLogDAO.selectPersonalInformationLogListTotCnt" | |
| 51 | + parameterClass="personalInformationLogVO" | |
| 52 | + resultClass="java.lang.Integer"> | |
| 53 | + | |
| 54 | + SELECT COUNT(*) | |
| 55 | + FROM PERSONAL_INFORMATION_LOG A | |
| 56 | + WHERE 1 = 1 | |
| 57 | + | |
| 58 | + <isNotEmpty property="action"> | |
| 59 | + AND A.ACTION = #action# | |
| 60 | + </isNotEmpty> | |
| 61 | + | |
| 62 | + <isNotEmpty property="searchStartDate"> | |
| 63 | + AND A.FRST_REGIST_PNTTM <![CDATA[ >= ]]> | |
| 64 | + CONCAT(#searchStartDate#, ' 00:00:00') | |
| 65 | + </isNotEmpty> | |
| 66 | + | |
| 67 | + <isNotEmpty property="searchEndDate"> | |
| 68 | + AND A.FRST_REGIST_PNTTM <![CDATA[ < ]]> | |
| 69 | + DATE_ADD( | |
| 70 | + CONCAT(#searchEndDate#, ' 00:00:00'), | |
| 71 | + INTERVAL 1 DAY | |
| 72 | + ) | |
| 73 | + </isNotEmpty> | |
| 74 | + | |
| 75 | + <isNotEmpty property="searchKeyword"> | |
| 76 | + | |
| 77 | + <isEqual property="searchCondition" compareValue="userId"> | |
| 78 | + AND A.USER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 79 | + </isEqual> | |
| 80 | + | |
| 81 | + <isEqual property="searchCondition" compareValue="accessIp"> | |
| 82 | + AND A.ACCESS_IP LIKE CONCAT('%', #searchKeyword#, '%') | |
| 83 | + </isEqual> | |
| 84 | + | |
| 85 | + <isEqual property="searchCondition" compareValue="menuNm"> | |
| 86 | + AND A.MENU_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 87 | + </isEqual> | |
| 88 | + | |
| 89 | + <isEqual property="searchCondition" compareValue="target"> | |
| 90 | + AND A.TARGET LIKE CONCAT('%', #searchKeyword#, '%') | |
| 91 | + </isEqual> | |
| 92 | + | |
| 93 | + </isNotEmpty> | |
| 94 | + | |
| 95 | + </select> | |
| 96 | + | |
| 97 | + | |
| 98 | + <select id="personalInformationLogDAO.selectPersonalInformationLogList" | |
| 99 | + parameterClass="personalInformationLogVO" | |
| 100 | + resultMap="personalInformationLogResult"> | |
| 101 | + | |
| 102 | + SELECT | |
| 103 | + A.LOG_ID, | |
| 104 | + A.USER_ID, | |
| 105 | + A.ACCESS_IP, | |
| 106 | + A.URI, | |
| 107 | + A.MENU_NM, | |
| 108 | + A.ACTION, | |
| 109 | + A.TARGET, | |
| 110 | + DATE_FORMAT( | |
| 111 | + A.FRST_REGIST_PNTTM, | |
| 112 | + '%Y-%m-%d %H:%i:%s' | |
| 113 | + ) AS FRST_REGIST_PNTTM | |
| 114 | + FROM PERSONAL_INFORMATION_LOG A | |
| 115 | + WHERE 1 = 1 | |
| 116 | + | |
| 117 | + <isNotEmpty property="action"> | |
| 118 | + AND A.ACTION = #action# | |
| 119 | + </isNotEmpty> | |
| 120 | + | |
| 121 | + <isNotEmpty property="searchStartDate"> | |
| 122 | + AND A.FRST_REGIST_PNTTM <![CDATA[ >= ]]> | |
| 123 | + CONCAT(#searchStartDate#, ' 00:00:00') | |
| 124 | + </isNotEmpty> | |
| 125 | + | |
| 126 | + <isNotEmpty property="searchEndDate"> | |
| 127 | + AND A.FRST_REGIST_PNTTM <![CDATA[ < ]]> | |
| 128 | + DATE_ADD( | |
| 129 | + CONCAT(#searchEndDate#, ' 00:00:00'), | |
| 130 | + INTERVAL 1 DAY | |
| 131 | + ) | |
| 132 | + </isNotEmpty> | |
| 133 | + | |
| 134 | + <isNotEmpty property="searchKeyword"> | |
| 135 | + | |
| 136 | + <isEqual property="searchCondition" compareValue="userId"> | |
| 137 | + AND A.USER_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 138 | + </isEqual> | |
| 139 | + | |
| 140 | + <isEqual property="searchCondition" compareValue="accessIp"> | |
| 141 | + AND A.ACCESS_IP LIKE CONCAT('%', #searchKeyword#, '%') | |
| 142 | + </isEqual> | |
| 143 | + | |
| 144 | + <isEqual property="searchCondition" compareValue="menuNm"> | |
| 145 | + AND A.MENU_NM LIKE CONCAT('%', #searchKeyword#, '%') | |
| 146 | + </isEqual> | |
| 147 | + | |
| 148 | + <isEqual property="searchCondition" compareValue="target"> | |
| 149 | + AND A.TARGET LIKE CONCAT('%', #searchKeyword#, '%') | |
| 150 | + </isEqual> | |
| 151 | + | |
| 152 | + </isNotEmpty> | |
| 153 | + | |
| 154 | + <isNotEmpty property="searchSortCnd"> | |
| 155 | + ORDER BY $searchSortCnd$ | |
| 156 | + <isNotEmpty property="searchSortOrd"> | |
| 157 | + $searchSortOrd$ | |
| 158 | + </isNotEmpty> | |
| 159 | + </isNotEmpty> | |
| 160 | + | |
| 161 | + LIMIT #firstIndex#, #recordCountPerPage# | |
| 162 | + | |
| 163 | + </select> | |
| 164 | + | |
| 165 | +</sqlMap>(No newline at end of file) |
--- src/main/resources/egovframework/sqlmap/let/sym/site/EgovSiteManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/sym/site/EgovSiteManage_SQL_Mysql.xml
... | ... | @@ -57,7 +57,7 @@ |
| 57 | 57 |
SELECT CODE_NM , CODE , CODE_DC |
| 58 | 58 |
FROM LETTCCMMNDETAILCODE |
| 59 | 59 |
WHERE USE_AT = 'Y' |
| 60 |
- AND CODE_ID = 'ITN014' |
|
| 60 |
+ AND CODE_ID = 'ITN014' |
|
| 61 | 61 |
) C ON A.SESSION_TIME_CD = C.CODE |
| 62 | 62 |
LEFT JOIN( |
| 63 | 63 |
SELECT CODE_NM ,CODE ,CODE_DC |
... | ... | @@ -159,7 +159,7 @@ |
| 159 | 159 |
SELECT CODE_NM , CODE |
| 160 | 160 |
FROM LETTCCMMNDETAILCODE |
| 161 | 161 |
WHERE USE_AT = 'Y' |
| 162 |
- AND CODE_ID = 'ITN014' |
|
| 162 |
+ AND CODE_ID = 'ITN014' |
|
| 163 | 163 |
) H ON A.SESSION_TIME_CD = H.CODE |
| 164 | 164 |
LEFT JOIN ( |
| 165 | 165 |
SELECT CODE_NM , CODE |
+++ src/main/resources/egovframework/sqlmap/let/uat/uia/SecondAuthLog_SQL_Mysql.xml
... | ... | @@ -0,0 +1,158 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> | |
| 3 | + | |
| 4 | +<sqlMap namespace="secondAuthLogDAO"> | |
| 5 | + | |
| 6 | + <typeAlias alias="secondAuthLogVO" type="itn.let.uat.uia.service.SecondAuthLogVO"/> | |
| 7 | + | |
| 8 | + <resultMap id="secondAuthLogResult" class="secondAuthLogVO"> | |
| 9 | + <result property="logId" column="LOG_ID"/> | |
| 10 | + <result property="loginResult" column="LOGIN_RESULT"/> | |
| 11 | + <result property="authStep" column="AUTH_STEP"/> | |
| 12 | + <result property="tryLoginId" column="TRY_LOGIN_ID"/> | |
| 13 | + <result property="reason" column="REASON"/> | |
| 14 | + <result property="accessIp" column="ACCESS_IP"/> | |
| 15 | + <result property="userAgent" column="USER_AGENT"/> | |
| 16 | + <result property="msgId" column="MSG_ID"/> | |
| 17 | + <result property="resultCode" column="RESULT_CODE"/> | |
| 18 | + <result property="frstRegistPnttm" column="FRST_REGIST_PNTTM"/> | |
| 19 | + <result property="receive" column="RECEIVE"/> | |
| 20 | + </resultMap> | |
| 21 | + | |
| 22 | + <insert id="secondAuthLogDAO.insertSecondAuthLog" parameterClass="secondAuthLogVO"> | |
| 23 | + | |
| 24 | + INSERT INTO SECOND_AUTH_LOG (LOG_ID, | |
| 25 | + LOGIN_RESULT, | |
| 26 | + AUTH_STEP, | |
| 27 | + TRY_LOGIN_ID, | |
| 28 | + REASON, | |
| 29 | + ACCESS_IP, | |
| 30 | + USER_AGENT, | |
| 31 | + MSG_ID, | |
| 32 | + RESULT_CODE, | |
| 33 | + FRST_REGIST_PNTTM) | |
| 34 | + VALUES (#logId#, | |
| 35 | + #loginResult#, | |
| 36 | + #authStep#, | |
| 37 | + #tryLoginId#, | |
| 38 | + #reason#, | |
| 39 | + #accessIp#, | |
| 40 | + #userAgent#, | |
| 41 | + #msgId#, | |
| 42 | + #resultCode#, | |
| 43 | + CURRENT_TIMESTAMP) | |
| 44 | + | |
| 45 | + </insert> | |
| 46 | + | |
| 47 | + <delete id="secondAuthLogDAO.deleteSecondAuthLog" parameterClass="secondAuthLogVO"> | |
| 48 | + DELETE | |
| 49 | + FROM SECOND_AUTH_LOG | |
| 50 | + WHERE LOG_ID = #logId# | |
| 51 | + </delete> | |
| 52 | + | |
| 53 | + <select id="secondAuthLogDAO.selectSecondAuthLog" parameterClass="secondAuthLogVO" resultMap="secondAuthLogResult"> | |
| 54 | + SELECT LOG_ID, | |
| 55 | + LOGIN_RESULT, | |
| 56 | + AUTH_STEP, | |
| 57 | + TRY_LOGIN_ID, | |
| 58 | + REASON, | |
| 59 | + ACCESS_IP, | |
| 60 | + USER_AGENT, | |
| 61 | + MSG_ID, | |
| 62 | + RESULT_CODE, | |
| 63 | + FRST_REGIST_PNTTM | |
| 64 | + FROM SECOND_AUTH_LOG | |
| 65 | + WHERE LOG_ID = #logId# | |
| 66 | + | |
| 67 | + </select> | |
| 68 | + | |
| 69 | + <select id="secondAuthLogDAO.selectSecondAuthLogCnt" parameterClass="secondAuthLogVO" | |
| 70 | + resultClass="java.lang.Integer"> | |
| 71 | + | |
| 72 | + SELECT COUNT(*) | |
| 73 | + FROM SECOND_AUTH_LOG | |
| 74 | + WHERE 1 = 1 | |
| 75 | + | |
| 76 | + <isNotEmpty property="logId"> | |
| 77 | + AND LOG_ID = #logId# | |
| 78 | + </isNotEmpty> | |
| 79 | + | |
| 80 | + <isNotEmpty property="loginResult"> | |
| 81 | + AND LOGIN_RESULT = #loginResult# | |
| 82 | + </isNotEmpty> | |
| 83 | + | |
| 84 | + <isNotEmpty property="authStep"> | |
| 85 | + AND AUTH_STEP = #authStep# | |
| 86 | + </isNotEmpty> | |
| 87 | + | |
| 88 | + <isNotEmpty property="tryLoginId"> | |
| 89 | + AND TRY_LOGIN_ID = #tryLoginId# | |
| 90 | + </isNotEmpty> | |
| 91 | + | |
| 92 | + <isNotEmpty property="reason"> | |
| 93 | + AND REASON = #reason# | |
| 94 | + </isNotEmpty> | |
| 95 | + | |
| 96 | + <isNotEmpty property="accessIp"> | |
| 97 | + AND ACCESS_IP = #accessIp# | |
| 98 | + </isNotEmpty> | |
| 99 | + | |
| 100 | + <isNotEmpty property="msgId"> | |
| 101 | + AND MSG_ID = #msgId# | |
| 102 | + </isNotEmpty> | |
| 103 | + | |
| 104 | + <isNotEmpty property="resultCode"> | |
| 105 | + AND RESULT_CODE = #resultCode# | |
| 106 | + </isNotEmpty> | |
| 107 | + | |
| 108 | + </select> | |
| 109 | + | |
| 110 | + <select id="secondAuthLogDAO.selectSecondAuthLogList" parameterClass="secondAuthLogVO" resultMap="secondAuthLogResult"> | |
| 111 | + SELECT | |
| 112 | + A.LOG_ID, | |
| 113 | + A.LOGIN_RESULT, | |
| 114 | + A.AUTH_STEP, | |
| 115 | + A.TRY_LOGIN_ID, | |
| 116 | + A.REASON, | |
| 117 | + A.ACCESS_IP, | |
| 118 | + A.USER_AGENT, | |
| 119 | + A.MSG_ID, | |
| 120 | + A.RESULT_CODE, | |
| 121 | + S.RECEIVE AS RECEIVE, | |
| 122 | + DATE_FORMAT(A.FRST_REGIST_PNTTM, '%Y-%m-%d %H:%i:%s') AS FRST_REGIST_PNTTM | |
| 123 | + FROM SECOND_AUTH_LOG A | |
| 124 | + LEFT JOIN MJ_SYSTEM_SEND S | |
| 125 | + ON S.SEND_ID = A.MSG_ID | |
| 126 | + WHERE 1 = 1 | |
| 127 | + <isNotEmpty property="loginResult"> | |
| 128 | + AND A.LOGIN_RESULT = #loginResult# | |
| 129 | + </isNotEmpty> | |
| 130 | + <isNotEmpty property="searchStartDate"> | |
| 131 | + AND A.FRST_REGIST_PNTTM <![CDATA[ >= ]]> CONCAT(#searchStartDate#, ' 00:00:00') | |
| 132 | + </isNotEmpty> | |
| 133 | + <isNotEmpty property="searchEndDate"> | |
| 134 | + AND A.FRST_REGIST_PNTTM <![CDATA[ < ]]> DATE_ADD(CONCAT(#searchEndDate#, ' 00:00:00'), INTERVAL 1 DAY) | |
| 135 | + </isNotEmpty> | |
| 136 | + <isNotEmpty property="searchKeyword"> | |
| 137 | + <isEqual property="searchCondition" compareValue="tryLoginId"> | |
| 138 | + AND TRY_LOGIN_ID LIKE CONCAT('%', #searchKeyword#, '%') | |
| 139 | + </isEqual> | |
| 140 | + <isEqual property="searchCondition" compareValue="accessIp"> | |
| 141 | + AND ACCESS_IP LIKE CONCAT('%', #searchKeyword#, '%') | |
| 142 | + </isEqual> | |
| 143 | + <isEqual property="searchCondition" compareValue="receive"> | |
| 144 | + AND REPLACE(S.RECEIVE, '-', '') | |
| 145 | + LIKE CONCAT('%', REPLACE(#searchKeyword#, '-', ''), '%') | |
| 146 | + </isEqual> | |
| 147 | + </isNotEmpty> | |
| 148 | + <isNotEmpty property="searchSortCnd"> | |
| 149 | + ORDER BY $searchSortCnd$ | |
| 150 | + <isNotEmpty property="searchSortOrd"> | |
| 151 | + $searchSortOrd$ | |
| 152 | + </isNotEmpty> | |
| 153 | + </isNotEmpty> | |
| 154 | + | |
| 155 | + LIMIT #firstIndex#, #recordCountPerPage# | |
| 156 | + </select> | |
| 157 | + | |
| 158 | +</sqlMap>(No newline at end of file) |
--- src/main/resources/egovframework/sqlmap/let/uss/itsm/SchdlrManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/itsm/SchdlrManage_SQL_Mysql.xml
... | ... | @@ -446,8 +446,39 @@ |
| 446 | 446 |
GROUP BY a.schdlrId |
| 447 | 447 |
ORDER BY a.schdlrBgnDatetime DESC |
| 448 | 448 |
LIMIT 10 |
| 449 |
- </select> |
|
| 450 |
- |
|
| 449 |
+ </select> |
|
| 450 |
+ |
|
| 451 |
+ <select id="schdlrManageDAO.selectSendNumberFailList" resultClass="schdlrVO"> |
|
| 452 |
+ SELECT DISTINCT |
|
| 453 |
+ A.MSG_GROUP_ID AS msgGroupId, |
|
| 454 |
+ A.USER_ID AS userId, |
|
| 455 |
+ A.CALL_FROM AS callFrom, |
|
| 456 |
+ DATE_FORMAT(A.REQ_DATE, '%Y-%m-%d %H:%i') as regDate |
|
| 457 |
+ FROM MJ_MSG_GROUP_DATA A |
|
| 458 |
+ INNER JOIN LETTNGNRLMBER LMB |
|
| 459 |
+ ON LMB.MBER_ID = A.USER_ID |
|
| 460 |
+ INNER JOIN MJ_MSG_DATA B |
|
| 461 |
+ ON B.MSG_GROUP_ID = A.MSG_GROUP_ID |
|
| 462 |
+ AND B.RESERVE_C_YN = 'N' |
|
| 463 |
+ WHERE |
|
| 464 |
+ A.MSG_TYPE IN (4, 6) |
|
| 465 |
+ AND A.RESERVE_C_YN = 'N' |
|
| 466 |
+ AND A.CALLBACK_YN = 'N' |
|
| 467 |
+ AND LMB.CALLBACK_YN = 'N' |
|
| 468 |
+ AND A.REQ_DATE <![CDATA[>=]]> DATE_SUB(NOW(), INTERVAL 5 MINUTE) |
|
| 469 |
+ AND A.REQ_DATE <![CDATA[<=]]> NOW() |
|
| 470 |
+ AND ( |
|
| 471 |
+ (B.AGENT_CODE = '04' |
|
| 472 |
+ AND B.RSLT_CODE IN ('4432', '4433', '6628', '6629'))
|
|
| 473 |
+ OR (B.AGENT_CODE = '05' |
|
| 474 |
+ AND B.RSLT_CODE IN ('2404', '3404', '6404'))
|
|
| 475 |
+ OR (B.AGENT_CODE = '07' |
|
| 476 |
+ AND B.RSLT_CODE = '9013') |
|
| 477 |
+ ) |
|
| 478 |
+ ORDER BY |
|
| 479 |
+ A.REQ_DATE DESC |
|
| 480 |
+ </select> |
|
| 481 |
+ |
|
| 451 | 482 |
|
| 452 | 483 |
|
| 453 | 484 |
|
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
... | ... | @@ -200,6 +200,8 @@ |
| 200 | 200 |
|
| 201 | 201 |
EMPLYR_STTUS_CODE , |
| 202 | 202 |
SBSCRB_DE , |
| 203 |
+ REGISTER_ID , |
|
| 204 |
+ REGIST_RESN , |
|
| 203 | 205 |
<isNotEmpty property="partIdx"> |
| 204 | 206 |
PART_IDX , |
| 205 | 207 |
</isNotEmpty> |
... | ... | @@ -248,6 +250,8 @@ |
| 248 | 250 |
#insttCode# , |
| 249 | 251 |
#emplyrSttusCode# , |
| 250 | 252 |
sysdate() , |
| 253 |
+ #registerId# , |
|
| 254 |
+ #registResn# , |
|
| 251 | 255 |
<isNotEmpty property="partIdx"> |
| 252 | 256 |
#partIdx# , |
| 253 | 257 |
</isNotEmpty> |
... | ... | @@ -298,17 +302,20 @@ |
| 298 | 302 |
GROUP_ID groupId , |
| 299 | 303 |
ORGNZT_ID orgnztId , |
| 300 | 304 |
PSTINST_CODE insttCode , |
| 301 |
- EMPLYR_STTUS_CODE emplyrSttusCode , |
|
| 305 |
+ EMPLYR_STTUS_CODE emplyrSttusCode , |
|
| 302 | 306 |
SBSCRB_DE sbscrbDe , |
| 303 | 307 |
CRTFC_DN_VALUE subDn , |
| 304 | 308 |
PART_IDX partIdx , |
| 305 | 309 |
AUTHOR_CODE authorCode , |
| 310 |
+ A.REGISTER_ID registerId , |
|
| 311 |
+ A.REGIST_RESN registResn , |
|
| 312 |
+ (SELECT D.USER_NM FROM LETTNEMPLYRINFO D WHERE D.EMPLYR_ID = A.REGISTER_ID) registerNm , |
|
| 306 | 313 |
C.CODE_NM as emplyrSttusCodeTxt, |
| 307 | 314 |
USER_WORK AS userWork, |
| 308 | 315 |
OUTER_CERT_YN AS outerCertYn |
| 309 | 316 |
FROM LETTNEMPLYRINFO A LEFT JOIN |
| 310 | 317 |
LETTNEMPLYRSCRTYESTBS B ON A.ESNTL_ID = B.SCRTY_DTRMN_TRGET_ID |
| 311 |
- LEFT JOIN |
|
| 318 |
+ LEFT JOIN |
|
| 312 | 319 |
( SELECT CODE_NM , CODE FROM LETTCCMMNDETAILCODE WHERE USE_AT = 'Y' |
| 313 | 320 |
AND CODE_ID = 'COM013' |
| 314 | 321 |
) C ON A.EMPLYR_STTUS_CODE = C.CODE |
... | ... | @@ -400,7 +407,10 @@ |
| 400 | 407 |
<isNotNull property="outerCertYn"> |
| 401 | 408 |
OUTER_CERT_YN = #outerCertYn# , |
| 402 | 409 |
</isNotNull> |
| 403 |
- USER_NM = #emplyrNm# |
|
| 410 |
+ <isNotNull property="registResn"> |
|
| 411 |
+ REGIST_RESN = #registResn# , |
|
| 412 |
+ </isNotNull> |
|
| 413 |
+ USER_NM = #emplyrNm# |
|
| 404 | 414 |
WHERE ESNTL_ID = #uniqId# |
| 405 | 415 |
|
| 406 | 416 |
</update> |
--- src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml
+++ src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml
... | ... | @@ -60,5 +60,11 @@ |
| 60 | 60 |
execution(public * itn..*Controller.selectMainMenuLeft(..)) || |
| 61 | 61 |
execution(public * itn..*Controller.*Web(..)) )" method="logAdminSelect" /> |
| 62 | 62 |
</aop:aspect> |
| 63 |
+ <!-- 개인정보 로그--> |
|
| 64 |
+ <aop:aspect id="personalInformationLogAspect" ref="syslog"> |
|
| 65 |
+ <aop:after |
|
| 66 |
+ pointcut="@annotation(itn.com.annotation.PersonalLog)" |
|
| 67 |
+ method="personalInformationLog"/> |
|
| 68 |
+ </aop:aspect> |
|
| 63 | 69 |
</aop:config> |
| 64 | 70 |
</beans>(No newline at end of file) |
--- src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml
+++ src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml
... | ... | @@ -8,6 +8,12 @@ |
| 8 | 8 |
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> |
| 9 | 9 |
|
| 10 | 10 |
<interceptors> |
| 11 |
+ <!-- 대시보드 요약 API 토큰 인증 --> |
|
| 12 |
+ <interceptor> |
|
| 13 |
+ <mapping path="/api/dashboard/**"/> |
|
| 14 |
+ <beans:bean class="itn.com.cmm.interceptor.DashboardApiAuthInterceptor"/> |
|
| 15 |
+ </interceptor> |
|
| 16 |
+ |
|
| 11 | 17 |
<interceptor> |
| 12 | 18 |
<mapping path="/web/**"/> |
| 13 | 19 |
<exclude-mapping path="/web/main/mainPage.do"/> |
--- src/main/webapp/WEB-INF/decorators.xml
+++ src/main/webapp/WEB-INF/decorators.xml
... | ... | @@ -150,6 +150,7 @@ |
| 150 | 150 |
<pattern>/naver94c82af5badbae52b1e46e77b88410c9.html</pattern><!-- 게시판템플릿 팝업 --> |
| 151 | 151 |
<pattern>/let/mjo/msgagent/insertMjonMsgAgentStsDataAjax.do</pattern><!-- 게시판템플릿 팝업 --> |
| 152 | 152 |
<pattern>/uss/ion/msg/sendNumberReturnPop.do</pattern> <!-- 발신번호 신청 반려팝업 --> |
| 153 |
+ <pattern>/uss/ion/msg/EmployeeCertRejectPop.do</pattern> <!-- 발신번호 신청 반려팝업 --> |
|
| 153 | 154 |
<pattern>/uss/ion/pay/PgStatusPop.do</pattern> <!-- 후불제 고객 결제완료 변경 팝업 --> |
| 154 | 155 |
<pattern>/uss/ion/kakaoat/KakaoATChannelIDListPop.do</pattern><!-- 채널아이디 채널 팝업 --> |
| 155 | 156 |
<pattern>/sym/site/termsMastEffectPopup.do</pattern><!-- 약관관리 시행 팝업 --> |
... | ... | @@ -161,6 +162,7 @@ |
| 161 | 162 |
<pattern>/uss/ion/msg/weekendCsWork2.do</pattern> |
| 162 | 163 |
<pattern>/uss/ion/msg/pdfView.do</pattern> |
| 163 | 164 |
<pattern>/uss/ion/msg/pdfViewPhone.do</pattern> |
| 165 |
+ <pattern>/uss/ion/msg/EmpPdfView.do</pattern> |
|
| 164 | 166 |
</decorator> |
| 165 | 167 |
|
| 166 | 168 |
<!-- 관리자 게시글 작성, 템플릿 미리보기(헤더풋터 없음) --> |
... | ... | @@ -199,4 +201,4 @@ |
| 199 | 201 |
<decorator name="weblayout" page="/WEB-INF/jsp/layout/siteCheck.jsp"> |
| 200 | 202 |
<pattern>*</pattern> |
| 201 | 203 |
</decorator> |
| 202 |
-</decorators>(No newline at end of file) |
|
| 204 |
+</decorators> |
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
... | ... | @@ -2,13 +2,13 @@ |
| 2 | 2 |
Class Name : EgovGnrlUserSelectUpdt.jsp |
| 3 | 3 |
Description : 사용자상세 팝업 JSP |
| 4 | 4 |
Modification Information |
| 5 |
- |
|
| 5 |
+ |
|
| 6 | 6 |
수정일 수정자 수정내용 |
| 7 | 7 |
------- -------- --------------------------- |
| 8 | 8 |
2009.03.03 JJY 최초 생성 |
| 9 | 9 |
2011.08.31 JJY 경량환경 버전 생성 |
| 10 | 10 |
2011.08.31 우영두 팝업 화면 개발 |
| 11 |
- |
|
| 11 |
+ |
|
| 12 | 12 |
author : 공통서비스 개발팀 JJY |
| 13 | 13 |
since : 2009.03.03 |
| 14 | 14 |
--%> |
... | ... | @@ -449,7 +449,7 @@ |
| 449 | 449 |
} |
| 450 | 450 |
|
| 451 | 451 |
function passMissReset(){
|
| 452 |
- if(!confirm("로그인실패 카운트를 초기화 시키겠습니까?")){
|
|
| 452 |
+ if(!confirm("1차 로그인 잠금을 해제하시겠습니까?")){
|
|
| 453 | 453 |
return false; |
| 454 | 454 |
} |
| 455 | 455 |
$.ajax({
|
... | ... | @@ -464,6 +464,7 @@ |
| 464 | 464 |
if(status == "success") {
|
| 465 | 465 |
alert("로그인 실패 카운터가 초기화 되었습니다.");
|
| 466 | 466 |
}else{ alert("ERROR!");return;}
|
| 467 |
+ fnMemoRefresh(); |
|
| 467 | 468 |
}, |
| 468 | 469 |
error:function(request , status, error){
|
| 469 | 470 |
alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
|
... | ... | @@ -2041,12 +2042,25 @@ |
| 2041 | 2042 |
alert("등록할 인증번호를 입력해주세요.");
|
| 2042 | 2043 |
return false; |
| 2043 | 2044 |
} |
| 2045 |
+ if (!/^010\d{8}$/.test(mbtlnum)) {
|
|
| 2046 |
+ alert('010으로 시작하는 숫자 11자리만 입력 가능합니다.');
|
|
| 2047 |
+ $('#pop_mbtlnum').focus();
|
|
| 2048 |
+ return false; |
|
| 2049 |
+ } |
|
| 2050 |
+ |
|
| 2051 |
+ if("${mberManageVO.dept}" == "p" && Number('${fn:length(mberCertPhoneList)}') >= 3){
|
|
| 2052 |
+ alert(" 인증 휴대폰번호는 최대 3개까지 등록할 수 있습니다.");
|
|
| 2053 |
+ return false; |
|
| 2054 |
+ }else if("${mberManageVO.dept}" == "c" && Number('${fn:length(mberCertPhoneList)}') >= 4){
|
|
| 2055 |
+ alert(" 인증 휴대폰번호는 최대 4개까지 등록할 수 있습니다.");
|
|
| 2056 |
+ return false; |
|
| 2057 |
+ } |
|
| 2044 | 2058 |
|
| 2045 | 2059 |
var params = {
|
| 2046 | 2060 |
"mberId" : mberId |
| 2047 | 2061 |
, "mbtlnum" : mbtlnum |
| 2048 | 2062 |
, "certAlias" : $('#pop_certAlias').val()
|
| 2049 |
- , "certMemo" : $('#pop_certMemo').val()
|
|
| 2063 |
+ //, "certMemo" : $('#pop_certMemo').val()
|
|
| 2050 | 2064 |
} |
| 2051 | 2065 |
console.log('params : ', params);
|
| 2052 | 2066 |
|
... | ... | @@ -2085,7 +2099,7 @@ |
| 2085 | 2099 |
"mberId" : mberId |
| 2086 | 2100 |
, "mbtlnum" : mbtlnum |
| 2087 | 2101 |
, "certAlias" : $('#pop_udt_certAlias').val()
|
| 2088 |
- , "certMemo" : $('#pop_udt_certMemo').val()
|
|
| 2102 |
+ //, "certMemo" : $('#pop_udt_certMemo').val()
|
|
| 2089 | 2103 |
} |
| 2090 | 2104 |
console.log('params : ', params);
|
| 2091 | 2105 |
|
... | ... | @@ -2134,7 +2148,7 @@ |
| 2134 | 2148 |
console.log('returnData.object.mbtlnum : ', returnData.object.mbtlnum);
|
| 2135 | 2149 |
$('#pop_udt_mbtlnum').val(returnData.object.mbtlnum);
|
| 2136 | 2150 |
$('#pop_udt_certAlias').val(returnData.object.certAlias);
|
| 2137 |
- $('#pop_udt_certMemo').val(returnData.object.certMemo);
|
|
| 2151 |
+ //$('#pop_udt_certMemo').val(returnData.object.certMemo);
|
|
| 2138 | 2152 |
|
| 2139 | 2153 |
layerPopOpen('certPhoneUdt');
|
| 2140 | 2154 |
}else{
|
... | ... | @@ -2162,7 +2176,8 @@ |
| 2162 | 2176 |
} |
| 2163 | 2177 |
console.log('params : ', params);
|
| 2164 | 2178 |
|
| 2165 |
- if(!confirm(mbtlnum+" 번호를 정말 삭제하시겠습니까?")){
|
|
| 2179 |
+ //if(!confirm(mbtlnum+" 번호를 정말 삭제하시겠습니까?")){
|
|
| 2180 |
+ if(!confirm("해당 인증 휴대폰번호를 삭제하시겠습니까?")){
|
|
| 2166 | 2181 |
return false; |
| 2167 | 2182 |
} |
| 2168 | 2183 |
|
... | ... | @@ -3261,7 +3276,7 @@ |
| 3261 | 3276 |
</c:otherwise> |
| 3262 | 3277 |
</c:choose> |
| 3263 | 3278 |
<div class="button_box"> |
| 3264 |
- <button type="button" class="fill" style="width: 200px;" onclick="passMissReset(); return false;">비밀번호 5회실패 초기화</button> |
|
| 3279 |
+ <button type="button" class="fill" style="width: 200px;" onclick="passMissReset(); return false;">1차 로그인 잠금 해제</button> |
|
| 3265 | 3280 |
</div> |
| 3266 | 3281 |
</td> |
| 3267 | 3282 |
</tr> |
... | ... | @@ -3647,7 +3662,7 @@ |
| 3647 | 3662 |
</c:otherwise> |
| 3648 | 3663 |
</c:choose> |
| 3649 | 3664 |
<div class="button_box"> |
| 3650 |
- <button type="button" class="fill" style="width: 200px;" onclick="passMissReset(); return false;">비밀번호 5회실패 초기화</button> |
|
| 3665 |
+ <button type="button" class="fill" style="width: 200px;" onclick="passMissReset(); return false;">1차 로그인 잠금 해제</button> |
|
| 3651 | 3666 |
</div> |
| 3652 | 3667 |
</td> |
| 3653 | 3668 |
</tr> |
... | ... | @@ -5181,28 +5196,56 @@ |
| 5181 | 5196 |
</tbody> |
| 5182 | 5197 |
</table> |
| 5183 | 5198 |
<!-- //발신번호 리스트 --> |
| 5184 |
- <!-- 인증 번호 리스트 --> |
|
| 5199 |
+ <!-- 보안로그인 인증 휴대폰번호 --> |
|
| 5185 | 5200 |
<div class="title_box"> |
| 5186 |
- <p>인증 번호 리스트</p> |
|
| 5187 |
- <span style="float: right;"> |
|
| 5201 |
+ <p>보안로그인 인증 휴대폰번호</p> |
|
| 5202 |
+ <%--<span style="float: right;"> |
|
| 5188 | 5203 |
<span style="letter-spacing: 0em !important; margin-left: 5px;"> |
| 5189 | 5204 |
<button type="button" onclick="layerPopOpen('certPhoneReg');" class="fill">등록</button>
|
| 5190 | 5205 |
</span> |
| 5206 |
+ </span>--%> |
|
| 5207 |
+ </div> |
|
| 5208 |
+ <div class="title_box" |
|
| 5209 |
+ style="height:42px; min-height:42px; margin:0; padding:0 10px; |
|
| 5210 |
+ background:#fff; border-bottom:1px solid #ddd; box-sizing:border-box;"> |
|
| 5211 |
+ <p style="margin:0; padding-top:3px; line-height:30px; font-size:15px; font-weight:400;"> |
|
| 5212 |
+ 등록 개수 : 총 |
|
| 5213 |
+ <strong style="color:#2f73d9;"> |
|
| 5214 |
+ <c:out value="${fn:length(mberCertPhoneList)}"/>
|
|
| 5215 |
+ </strong>건 / |
|
| 5216 |
+ 최대 <strong style="color:#2f73d9;">${fn:toLowerCase(mberManageVO.dept) eq 'c' ? 4 : 3}</strong>건
|
|
| 5217 |
+ </p> |
|
| 5218 |
+ <span style="float:right; padding-bottom:12px;"> |
|
| 5219 |
+ <c:set var="maxCertPhoneCount" |
|
| 5220 |
+ value="${fn:toLowerCase(mberManageVO.dept) eq 'c' ? 4 : 3}" />
|
|
| 5221 |
+ <c:set var="certPhoneLimitReached" |
|
| 5222 |
+ value="${fn:length(mberCertPhoneList) ge maxCertPhoneCount}" />
|
|
| 5223 |
+ |
|
| 5224 |
+ <button type="button" |
|
| 5225 |
+ onclick="layerPopOpen('certPhoneReg');"
|
|
| 5226 |
+ class="fill" |
|
| 5227 |
+ <c:if test="${certPhoneLimitReached}">disabled="disabled"</c:if>
|
|
| 5228 |
+ style="${certPhoneLimitReached ? 'opacity:0.45; cursor:not-allowed;' : ''}">
|
|
| 5229 |
+ 번호 등록 |
|
| 5230 |
+ </button> |
|
| 5231 |
+ <%--<button type="button" onclick="layerPopOpen('certPhoneReg');" class="fill"
|
|
| 5232 |
+ ${fn:length(mberCertPhoneList) ge (fn:toLowerCase(mberManageVO.dept) eq 'c' ? 4 : 3) ? 'disabled="disabled"' : ''}>번호 등록</button>--%>
|
|
| 5191 | 5233 |
</span> |
| 5192 | 5234 |
</div> |
| 5235 |
+ |
|
| 5193 | 5236 |
<table class="user_table_col"> |
| 5194 | 5237 |
<colgroup> |
| 5238 |
+ <col style="width:calc(25%);"> |
|
| 5239 |
+ <col style="width:calc(30%);"> |
|
| 5195 | 5240 |
<col style="width:calc(20%);"> |
| 5196 | 5241 |
<col style="width:calc(20%);"> |
| 5197 |
- <col style="width:calc(45%);"> |
|
| 5198 |
- <col style="width:calc(15%);"> |
|
| 5199 | 5242 |
</colgroup> |
| 5200 | 5243 |
<thead> |
| 5201 | 5244 |
<tr> |
| 5202 |
- <th>인증번호</th> |
|
| 5245 |
+ <th>인증 휴대폰번호</th> |
|
| 5203 | 5246 |
<th>별칭</th> |
| 5204 |
- <th>메모</th> |
|
| 5205 |
- <th>삭제</th> |
|
| 5247 |
+ <th>등록일</th> |
|
| 5248 |
+ <th>관리</th> |
|
| 5206 | 5249 |
</tr> |
| 5207 | 5250 |
</thead> |
| 5208 | 5251 |
<tbody> |
... | ... | @@ -5228,12 +5271,14 @@ |
| 5228 | 5271 |
<c:out value="${list.certAlias}"/>
|
| 5229 | 5272 |
</td> |
| 5230 | 5273 |
<td> |
| 5231 |
- <c:out value="${list.certMemo}"/>
|
|
| 5274 |
+ <fmt:parseDate value="${list.mberRegDate}" var="mberRegDate" pattern="yyyy-MM-dd"/>
|
|
| 5275 |
+ <fmt:formatDate value="${mberRegDate}" pattern="yyyy-MM-dd"/>
|
|
| 5276 |
+ <%--<c:out value="${list.certMemo}"/>--%>
|
|
| 5232 | 5277 |
</td> |
| 5233 | 5278 |
<td> |
| 5234 | 5279 |
<c:choose> |
| 5235 | 5280 |
<c:when test="${list.frstRegistPnttm eq '-'}">
|
| 5236 |
- 대표번호 |
|
| 5281 |
+ 기본번호 |
|
| 5237 | 5282 |
</c:when> |
| 5238 | 5283 |
<c:otherwise> |
| 5239 | 5284 |
<div class="button_box"> |
... | ... | @@ -6436,7 +6481,12 @@ |
| 6436 | 6481 |
|
| 6437 | 6482 |
<!-- 인증번호 수정 --> |
| 6438 | 6483 |
<div class="layer_popup layer_certPhoneUdt"> |
| 6439 |
- <div class="title_box">인증번호 등록<button type="button" class="close_btn" onclick="layerPopClose(this);"></button></div> |
|
| 6484 |
+ <div class="title_box">인증 휴대폰번호 등록<button type="button" class="close_btn" onclick="layerPopClose(this);"></button></div> |
|
| 6485 |
+ <div style="padding:10px 12px; border:1px solid #ffcaca; |
|
| 6486 |
+ border-radius:6px; background:#fff0f0; color:#e35b5b; |
|
| 6487 |
+ font-size:13px; line-height:18px; box-sizing:border-box;"> |
|
| 6488 |
+ ※ 사용자가 직접 등록할 수 없는 예외 상황에 한하여 유선으로 본인확인 후 관리자 등록 진행 |
|
| 6489 |
+ </div> |
|
| 6440 | 6490 |
<div class="layer_content"> |
| 6441 | 6491 |
<table> |
| 6442 | 6492 |
<colgroup> |
... | ... | @@ -6453,25 +6503,30 @@ |
| 6453 | 6503 |
<tr> |
| 6454 | 6504 |
<th>별칭</th> |
| 6455 | 6505 |
<td> |
| 6456 |
- <input type="text" id="pop_udt_certAlias" title="별칭" maxlength="50"/> |
|
| 6506 |
+ <input type="text" id="pop_udt_certAlias" title="별칭" maxlength="50" /> |
|
| 6457 | 6507 |
</td> |
| 6458 | 6508 |
</tr> |
| 6459 |
- <tr> |
|
| 6509 |
+ <%--<tr> |
|
| 6460 | 6510 |
<th>메모</th> |
| 6461 | 6511 |
<td> |
| 6462 | 6512 |
<input type="text" id="pop_udt_certMemo" title="메모" maxlength="100"/> |
| 6463 | 6513 |
</td> |
| 6464 |
- </tr> |
|
| 6514 |
+ </tr>--%> |
|
| 6465 | 6515 |
</tbody> |
| 6466 | 6516 |
</table> |
| 6467 | 6517 |
<div class="button_box"> |
| 6468 |
- <button type="button" onclick="fn_certPhoneUdt(); return false;">인증번호 수정</button> |
|
| 6518 |
+ <button type="button" onclick="fn_certPhoneUdt(); return false;">수정</button> |
|
| 6469 | 6519 |
</div> |
| 6470 | 6520 |
</div> |
| 6471 | 6521 |
</div> |
| 6472 | 6522 |
<!-- 인증번호 등록 --> |
| 6473 | 6523 |
<div class="layer_popup layer_certPhoneReg"> |
| 6474 |
- <div class="title_box">인증번호 등록<button type="button" class="close_btn" onclick="layerPopClose(this);"></button></div> |
|
| 6524 |
+ <div class="title_box">인증 휴대폰번호 등록<button type="button" class="close_btn" onclick="layerPopClose(this);"></button></div> |
|
| 6525 |
+ <div style="padding:10px 12px; border:1px solid #ffcaca; |
|
| 6526 |
+ border-radius:6px; background:#fff0f0; color:#e35b5b; |
|
| 6527 |
+ font-size:13px; line-height:18px; box-sizing:border-box;"> |
|
| 6528 |
+ ※ 사용자가 직접 등록할 수 없는 예외 상황에 한하여 유선으로 본인확인 후 관리자 등록 진행 |
|
| 6529 |
+ </div> |
|
| 6475 | 6530 |
<div class="layer_content"> |
| 6476 | 6531 |
<table> |
| 6477 | 6532 |
<colgroup> |
... | ... | @@ -6482,25 +6537,25 @@ |
| 6482 | 6537 |
<tr> |
| 6483 | 6538 |
<th>인증번호</th> |
| 6484 | 6539 |
<td> |
| 6485 |
- <input type="text" id="pop_mbtlnum" title="인증번호" maxlength="20" oninput="this.value=this.value.replace(/[^0-9]/g,'')"/> |
|
| 6540 |
+ <input type="text" id="pop_mbtlnum" title="인증번호" maxlength="20" oninput="this.value=this.value.replace(/[^0-9]/g, '').slice(0, 11);"/> |
|
| 6486 | 6541 |
</td> |
| 6487 | 6542 |
</tr> |
| 6488 | 6543 |
<tr> |
| 6489 | 6544 |
<th>별칭</th> |
| 6490 | 6545 |
<td> |
| 6491 |
- <input type="text" id="pop_certAlias" title="별칭" maxlength="50"/> |
|
| 6546 |
+ <input type="text" id="pop_certAlias" title="별칭" maxlength="50" value="관리자 등록"/> |
|
| 6492 | 6547 |
</td> |
| 6493 | 6548 |
</tr> |
| 6494 |
- <tr> |
|
| 6549 |
+ <%--<tr> |
|
| 6495 | 6550 |
<th>메모</th> |
| 6496 | 6551 |
<td> |
| 6497 | 6552 |
<input type="text" id="pop_certMemo" title="메모" maxlength="100"/> |
| 6498 | 6553 |
</td> |
| 6499 |
- </tr> |
|
| 6554 |
+ </tr>--%> |
|
| 6500 | 6555 |
</tbody> |
| 6501 | 6556 |
</table> |
| 6502 | 6557 |
<div class="button_box"> |
| 6503 |
- <button type="button" onclick="fn_certPhoneReg(); return false;">인증번호 등록</button> |
|
| 6558 |
+ <button type="button" onclick="fn_certPhoneReg(); return false;">등록</button> |
|
| 6504 | 6559 |
</div> |
| 6505 | 6560 |
</div> |
| 6506 | 6561 |
</div> |
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserInsert.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserInsert.jsp
... | ... | @@ -23,6 +23,13 @@ |
| 23 | 23 |
<html> |
| 24 | 24 |
<head> |
| 25 | 25 |
<meta http-equiv="Content-Language" content="ko" > |
| 26 |
+<style type="text/css"> |
|
| 27 |
+ /* 등록사유 placeholder 흐리게 표시 (전송자격인증제 3.2) */ |
|
| 28 |
+ #registResn::-webkit-input-placeholder { color: #bbbbbb; }
|
|
| 29 |
+ #registResn::-moz-placeholder { color: #bbbbbb; opacity: 1; }
|
|
| 30 |
+ #registResn:-ms-input-placeholder { color: #bbbbbb; }
|
|
| 31 |
+ #registResn::placeholder { color: #bbbbbb; }
|
|
| 32 |
+</style> |
|
| 26 | 33 |
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script> |
| 27 | 34 |
<validator:javascript formName="userManageVO" staticJavascript="false" xhtml="true" cdata="false"/> |
| 28 | 35 |
<script src="/direct/js/jquery.nice-select.min.js"></script> |
... | ... | @@ -102,6 +109,13 @@ |
| 102 | 109 |
} |
| 103 | 110 |
if(!validatePassword(document.userManageVO.password.value)){
|
| 104 | 111 |
alert("비밀번호 최소 하나의 문자 + 하나의 숫자 + 하나의 특수 문자 포함, 최소 8자리, 최대 20자리입니다.");
|
| 112 |
+ return; |
|
| 113 |
+ } |
|
| 114 |
+ // 등록사유 필수 체크 (전송자격인증제 3.2) |
|
| 115 |
+ var registResn = document.getElementById("registResn").value;
|
|
| 116 |
+ if(registResn == null || registResn.replace(/(^\s*)|(\s*$)/g, "") == ""){
|
|
| 117 |
+ alert("등록사유를 입력해주세요.");
|
|
| 118 |
+ document.getElementById("registResn").focus();
|
|
| 105 | 119 |
return; |
| 106 | 120 |
} |
| 107 | 121 |
document.userManageVO.submit(); |
... | ... | @@ -385,7 +399,14 @@ |
| 385 | 399 |
<form:errors path="userWork" cssClass="error" /> |
| 386 | 400 |
</td> |
| 387 | 401 |
</tr> |
| 388 |
- </tbody> |
|
| 402 |
+ <tr> |
|
| 403 |
+ <th><span class="reqArea">등록사유</span></th> |
|
| 404 |
+ <td colspan="3"> |
|
| 405 |
+ <form:input path="registResn" id="registResn" cssClass="txaIpt" size="80" maxlength="500" placeholder="관리자 계정 등록/권한 부여 사유를 입력하세요. (전송자격인증제 3.2)" /> |
|
| 406 |
+ <form:errors path="registResn" cssClass="error" /> |
|
| 407 |
+ </td> |
|
| 408 |
+ </tr> |
|
| 409 |
+ </tbody> |
|
| 389 | 410 |
</table> |
| 390 | 411 |
<div class="btnWrap right"> |
| 391 | 412 |
<input type="button" class="btnType1" value="저 장" onclick="fnInsert(); return false;"> |
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserSelectUpdt.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserSelectUpdt.jsp
... | ... | @@ -24,6 +24,13 @@ |
| 24 | 24 |
<head> |
| 25 | 25 |
<meta http-equiv="Content-Language" content="ko" > |
| 26 | 26 |
<title>관리자 수정</title> |
| 27 |
+<style type="text/css"> |
|
| 28 |
+ /* 등록사유 placeholder 흐리게 표시 (전송자격인증제 3.2) */ |
|
| 29 |
+ #registResn::-webkit-input-placeholder { color: #bbbbbb; }
|
|
| 30 |
+ #registResn::-moz-placeholder { color: #bbbbbb; opacity: 1; }
|
|
| 31 |
+ #registResn:-ms-input-placeholder { color: #bbbbbb; }
|
|
| 32 |
+ #registResn::placeholder { color: #bbbbbb; }
|
|
| 33 |
+</style> |
|
| 27 | 34 |
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script> |
| 28 | 35 |
<validator:javascript formName="userManageVO" staticJavascript="false" xhtml="true" cdata="false"/> |
| 29 | 36 |
<script type="text/javascript" src="<c:url value='/js/EgovCmmUtl.js'/>" ></script> |
... | ... | @@ -408,6 +415,23 @@ |
| 408 | 415 |
<form:errors path="userWork" cssClass="error" /> |
| 409 | 416 |
</td> |
| 410 | 417 |
</tr> |
| 418 |
+ <c:if test="${!empty isAdmin}">
|
|
| 419 |
+ <tr> |
|
| 420 |
+ <th>등록자</th> |
|
| 421 |
+ <td colspan="3"> |
|
| 422 |
+ <c:out value="${userManageVO.registerNm}"/>
|
|
| 423 |
+ <c:if test="${!empty userManageVO.registerId}">(<c:out value="${userManageVO.registerId}"/>)</c:if>
|
|
| 424 |
+ <c:if test="${empty userManageVO.registerId}">-</c:if>
|
|
| 425 |
+ </td> |
|
| 426 |
+ </tr> |
|
| 427 |
+ <tr> |
|
| 428 |
+ <th>등록사유</th> |
|
| 429 |
+ <td colspan="3"> |
|
| 430 |
+ <form:input path="registResn" id="registResn" cssClass="txaIpt" size="80" maxlength="500" placeholder="관리자 계정 등록/권한 부여 사유 (전송자격인증제 3.2)" /> |
|
| 431 |
+ <form:errors path="registResn" cssClass="error" /> |
|
| 432 |
+ </td> |
|
| 433 |
+ </tr> |
|
| 434 |
+ </c:if> |
|
| 411 | 435 |
<c:if test="${empty isAdmin and empty isMember}">
|
| 412 | 436 |
<tr> |
| 413 | 437 |
<th>비밀번호확인</th> |
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/kakao/EgovGnrlUserSelectKakaoDataDetailListPop.jsp
... | ... | @@ -0,0 +1,299 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> | |
| 5 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 6 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> | |
| 7 | +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> | |
| 8 | +<% pageContext.setAttribute("newLineChar", "\r\n"); %> | |
| 9 | +<% pageContext.setAttribute("newLineChar2", "\n"); %> | |
| 10 | +<% | |
| 11 | + response.setHeader("Cache-Control","no-store"); | |
| 12 | + response.setHeader("Pragma","no-cache"); | |
| 13 | + response.setDateHeader("Expires",0); | |
| 14 | + if (request.getProtocol().equals("HTTP/1.1")) response.setHeader("Cache-Control", "no-cache"); | |
| 15 | +%> | |
| 16 | +<!DOCTYPE html> | |
| 17 | +<html lang="ko"> | |
| 18 | +<head> | |
| 19 | +<title>사용자 문자전송 관리</title> | |
| 20 | +<meta http-equiv="content-type" content="text/html; charset=utf-8"> | |
| 21 | +<link rel="stylesheet" href="/pb/css/reset.css"> | |
| 22 | +<link rel="stylesheet" href="/pb/css/common.css"> | |
| 23 | +<link rel="stylesheet" href="/pb/css/content.css"> | |
| 24 | +<link rel="stylesheet" href="/pb/css/popup.css"> | |
| 25 | + | |
| 26 | +<style> | |
| 27 | +.pageCont .tbType1 tbody tr td.sms_detail {overflow:inherit;text-overflow:inherit;position:relative;} | |
| 28 | +.pageCont .tbType1 tbody tr td.sms_detail p {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} | |
| 29 | +.pageCont .tbType1 tbody tr td.sms_detail .sms_detail_hover {overflow:hidden;text-overflow:ellipsis;display:none;word-wrap:break-word;-webkit-line-clamp:20;-webkit-box-orient:vertical;position:absolute;left:-5px;top:45px;width:calc(100% + 150px);padding:15px;line-height:20px;white-space:normal;border:1px solid #e5e5e5;background:#fff;border-radius:5px;box-sizing:border-box;box-shadow:0px 3px 10px 0px rgb(0 0 0 / 0.2);z-index:1;font-size:14px;text-align:left;} | |
| 30 | +.pageCont .tbType1 tbody tr td.sms_detail .sms_detail_hover:after {content:'';position:absolute;left:0;bottom:0;width:100%;height:10px;background:#fff;border-radius:0 0 5px 5px;} | |
| 31 | +.pageCont .tbType1 tbody tr td.sms_detail:hover .sms_detail_hover {display:-webkit-box;} | |
| 32 | +</style> | |
| 33 | + | |
| 34 | +<script type="text/javascript" src="/pb/js/jquery-3.5.0.js"></script> | |
| 35 | +<script type="text/javascript" src="/pb/js/common.js"></script> | |
| 36 | +<script type="text/javascript" src="<c:url value='/js/EgovMultiFile.js'/>"></script> | |
| 37 | +<script type="text/javascript" src="<c:url value='/js/EgovCalPopup.js'/>"></script> | |
| 38 | +<script type="text/javascript" src="<c:url value='/js/ncms_common.js' />"></script> | |
| 39 | +<script type="text/javaScript" language="javascript"> | |
| 40 | + | |
| 41 | + function fn_search(){ | |
| 42 | + var searchKeyword = $('input[name=searchKeyword]').val(); | |
| 43 | + $('input[name=searchKeyword]').val(searchKeyword.replace(/(\s*)/g, "")); | |
| 44 | + linkPage(1); | |
| 45 | + } | |
| 46 | + | |
| 47 | + function linkPage(pageNo){ | |
| 48 | + var listForm = document.listForm ; | |
| 49 | + listForm.pageIndex.value = pageNo ; | |
| 50 | + listForm.submit(); | |
| 51 | + } | |
| 52 | + | |
| 53 | + function fn_detailView(userData){ | |
| 54 | + var frm = document.modiForm ; | |
| 55 | + frm.userData.value = userData ; | |
| 56 | + frm.action = "<c:url value='/uss/umt/user/kakaoat/EgovGnrlselectedUserKakaoDataDetailAjax.do'/>"; | |
| 57 | + frm.submit(); | |
| 58 | + } | |
| 59 | + | |
| 60 | + function goList() { | |
| 61 | + var form = document.modiForm; | |
| 62 | + form.action ='/uss/umt/user/kakaoat/EgovGnrlselectedUserKakaoDataListAjax.do'; | |
| 63 | + form.submit(); | |
| 64 | + } | |
| 65 | + | |
| 66 | + function fnSelectMber(mberId) { | |
| 67 | + document.modiForm.mberId.value = mberId; | |
| 68 | + window.open("about:blank", 'popupSelectMber', 'width=900, height=1800, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbar=no'); | |
| 69 | + document.modiForm.action = "<c:url value='/uss/umt/user/EgovGnrlselectedUserView.do'/>"; | |
| 70 | + document.modiForm.target = "popupSelectMber"; | |
| 71 | + document.modiForm.submit(); | |
| 72 | + } | |
| 73 | + | |
| 74 | +</script> | |
| 75 | +<style> | |
| 76 | +.calBtn{ | |
| 77 | + border: none; | |
| 78 | + background-color: transparent !important; | |
| 79 | + background-image: url(/pb/img/common/calendarIcon.png); | |
| 80 | + background-repeat: no-repeat; | |
| 81 | + width: 25px; | |
| 82 | + height: 25px !important; | |
| 83 | + vertical-align: middle; | |
| 84 | + margin-left: -38px !important; | |
| 85 | + margin-top: -2px !important; | |
| 86 | + cursor: pointer; | |
| 87 | +} | |
| 88 | +.pageCont {width:100%;padding:50px 30px;box-sizing:border-box;} | |
| 89 | +.tableWrapTotal {margin:0 0 20px;} | |
| 90 | +.tableWrapTotal .tbType1 thead tr:first-child {border-width:1px;} | |
| 91 | +.tableWrapTotal .tbType1 thead tr th {border-left:1px solid #e6e6e6;} | |
| 92 | +.tableWrapTotal .tbType1 thead tr th:first-child {border-left:0 none;} | |
| 93 | +.tableWrapTotal .tbType1 thead tr.content th {font-size:14px;} | |
| 94 | +.tableWrapTotal .tbType1 tbody tr td {border-left:1px solid #e6e6e6;} | |
| 95 | +.tableWrapTotal .tbType1 tbody tr td:first-child {border-left:0 none;} | |
| 96 | +.listSerch .select {height:42px;vertical-align:top;} | |
| 97 | +.pageCont .tbType1 tbody tr td.msg_detail {overflow:inherit;} | |
| 98 | +.pageCont .tbType1 tbody tr td.msg_detail a {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;} | |
| 99 | +/* .layer_msg_wrap {position:relative;} */ | |
| 100 | +.layer_msg_wrap .layer_msg_detail {overflow:hidden;display:none;position:absolute;left:50%;top:600px;width:400px;max-height:600px;background:#eee;transform:translateX(-50%);z-index:1;} | |
| 101 | +.layer_msg_wrap .layer_msg_detail button {position:absolute;right:0;top:0;width:35px;height:35px;} | |
| 102 | +.layer_msg_wrap .layer_msg_detail button:before {content:'';position:absolute;left:50%;top:50%;width:1px;height:14px;margin:-7px 0 0;background:#fff;transform:rotate(-45deg);} | |
| 103 | +.layer_msg_wrap .layer_msg_detail button:after {content:'';position:absolute;left:50%;top:50%;width:1px;height:14px;margin:-7px 0 0;background:#fff;transform:rotate(45deg);} | |
| 104 | +.layer_msg_wrap .layer_msg_detail .title {height:35px;padding:0 15px;font-size:16px;line-height:35px;text-align:left;color:#fff;background:#456ded;border-radius:5px 5px 0 0;} | |
| 105 | +.layer_msg_wrap .layer_msg_detail .content {overflow-y:auto;max-height:535px;margin:15px;padding:10px 15px;line-height:20px;white-space:normal;background:#fff;} | |
| 106 | +.layer_msg_wrap .layer_msg_detail .content .rev_cont {text-align:left;} | |
| 107 | +@media screen and (max-width:916px){ | |
| 108 | + .pageCont .tableWrap table thead tr th {padding:15px 0;} | |
| 109 | +} | |
| 110 | + | |
| 111 | +</style> | |
| 112 | +</head> | |
| 113 | +<body> | |
| 114 | +<div class="loading_layer"> | |
| 115 | + <div class="loading_container"> | |
| 116 | + <div class="bar"></div> | |
| 117 | + <div class="text">Loading</div> | |
| 118 | + </div> | |
| 119 | +</div> | |
| 120 | +<form name="listForm" action="<c:url value='/uss/umt/user/kakaoat/EgovGnrlselectedUserKakaoDataDetailListAjax.do'/>" method="post"> | |
| 121 | + <input name="pageIndex" type="hidden" value="<c:out value='${searchVO.pageIndex}'/>"/> | |
| 122 | + <input type="hidden" name="userId" value="<c:out value='${searchVO.userId}'/>"/> | |
| 123 | + <input type="hidden" name="delFlag" value="Y" /> | |
| 124 | + <input type="hidden" name="selectedId" /> | |
| 125 | + <input type="hidden" name="msgGroupId" value="<c:out value='${searchVO.msgGroupId}'/>"/> | |
| 126 | + <input type="hidden" name="pageType" /> | |
| 127 | + <input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" /> | |
| 128 | + <input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" /> | |
| 129 | + <input type="hidden" name="detailType" value="<c:out value="${searchVO.detailType}" />" /> | |
| 130 | + <input type="hidden" name="ntceBgnde" id="ntceBgnde" value=""> | |
| 131 | + <input type="hidden" name="ntceEndde" id="ntceEndde" value=""> | |
| 132 | + | |
| 133 | + <div class="contWrap" style="position:relative;left:inherit;top:inherit;min-height:auto;padding:40px;"> | |
| 134 | + <div class="pageTitle"> | |
| 135 | + <h2 class="titType1 c_222222 fwBold">'<c:out value="${searchVO.userId}"/>'의 카카오톡 전송 리스트</h2> | |
| 136 | + </div> | |
| 137 | + <div class="pageCont"> | |
| 138 | + | |
| 139 | + <div class="listSerch"> | |
| 140 | + <select name="searchCondition" class="select" title="검색조건 선택"> | |
| 141 | + <option value="" <c:if test="${searchVO.searchCondition == ''}">selected="selected"</c:if>>ID/내용/발신번호(전체)</option> | |
| 142 | + <option value="1" <c:if test="${searchVO.searchCondition == '1'}">selected="selected"</c:if>>사용자ID</option> | |
| 143 | + <option value="2" <c:if test="${searchVO.searchCondition == '2'}">selected="selected"</c:if>>채널ID</option> | |
| 144 | + <option value="3" <c:if test="${searchVO.searchCondition == '3'}">selected="selected"</c:if>>전송내용</option> | |
| 145 | + </select> | |
| 146 | + | |
| 147 | + <input id="searchKeyword" name="searchKeyword" class="recentSearch" type="text" value="<c:out value='${searchVO.searchKeyword}'/>" size="25" title="검색" maxlength="100" /> | |
| 148 | + <input type="button" class="btnType1" value="검색" onclick="fn_search(); return false;"> | |
| 149 | + </div> | |
| 150 | + | |
| 151 | + <div class="listTop"> | |
| 152 | + <p class="tType5">총 <span class="tType4 c_456ded fwBold"><fmt:formatNumber value="${paginationInfo.totalRecordCount}" pattern="#,###" /></span>건</p> | |
| 153 | + <div class="rightWrap"> | |
| 154 | + <select name="pageUnit" id="pageUnit" class="select" title="검색조건선택" onchange="linkPage(1);"> | |
| 155 | + <option value='10' <c:if test="${searchVO.pageUnit == '10' or searchVO.pageUnit == ''}">selected</c:if>>10줄</option> | |
| 156 | + <option value='20' <c:if test="${searchVO.pageUnit == '20'}">selected</c:if>>20줄</option> | |
| 157 | + <option value='30' <c:if test="${searchVO.pageUnit == '30'}">selected</c:if>>30줄</option> | |
| 158 | + </select> | |
| 159 | + </div> | |
| 160 | + </div> | |
| 161 | + <div class="tableWrap"> | |
| 162 | + <table class="tbType1"> | |
| 163 | + <colgroup> | |
| 164 | + <col style="width: 4%"> | |
| 165 | + <col style="width: 7%"> | |
| 166 | + <col style="width: 10%"> | |
| 167 | + <col style="width: 9%"> | |
| 168 | + <col style="width: 9%"> | |
| 169 | + <col style="width: *%"> | |
| 170 | + <col style="width: 6%"> | |
| 171 | + <col style="width: 3%"> | |
| 172 | + <col style="width: 6%"> | |
| 173 | + <%-- <col style="width: 6%"> --%> | |
| 174 | + <col style="width: 8%"> | |
| 175 | + </colgroup> | |
| 176 | + <thead> | |
| 177 | + <tr> | |
| 178 | + <th>번호<input type="button" class="sort sortBtn" id="sort_userData"></th> | |
| 179 | + <th>아이디<input type="button" class="sort sortBtn" id="sort_userId"></th> | |
| 180 | + <th>채널ID<input type="button" class="sort sortBtn" id="sort_yellowId"></th> | |
| 181 | + <th>수신번호<input type="button" class="sort sortBtn" id="sort_callTo"></th> | |
| 182 | + <th>전송시간<input type="button" class="sort sortBtn" id="sort_sentDateTxt"></th> | |
| 183 | + <th>내용<input type="button" class="sort sortBtn" id="sort_smsTxt"></th> | |
| 184 | + <th>상태<input type="button" class="sort sortBtn" id="sort_curStateTxt"></th> | |
| 185 | + <th>결과<input type="button" class="sort sortBtn" id="sort_rsltCode"></th> | |
| 186 | + <th>타입<input type="button" class="sort sortBtn" id="sort_msgType"></th> | |
| 187 | + | |
| 188 | + <!-- <th>기기<input type="button" class="sort sortBtn" id="sort_conectMthdTxt"></th> --> | |
| 189 | + <th>대체문자<input type="button" class="sort sortBtn" id="sort_agentCode"></th> | |
| 190 | + </tr> | |
| 191 | + </thead> | |
| 192 | + <tbody> | |
| 193 | + <c:forEach var="result" items="${resultList}" varStatus="status"> | |
| 194 | + <tr> | |
| 195 | + <td> | |
| 196 | + <c:if test="${searchVO.searchSortOrd eq 'desc' }"> | |
| 197 | + <c:out value="${ ( paginationInfo.totalRecordCount - ((paginationInfo.currentPageNo -1)*paginationInfo.recordCountPerPage) ) - status.index }"/> | |
| 198 | + </c:if> | |
| 199 | + <c:if test="${searchVO.searchSortOrd eq 'asc' }"> | |
| 200 | + <c:out value="${(paginationInfo.currentPageNo - 1) * paginationInfo.recordCountPerPage + status.count}"/> | |
| 201 | + </c:if> | |
| 202 | + </td> | |
| 203 | + | |
| 204 | + <td><a href="#" onclick="javascript:fnSelectMber('<c:out value="${result.userId}"/>'); return false;"><c:out value="${result.userId}"/></a></td> | |
| 205 | + <td><a href="#" onclick="fn_detailView('${result.userData}'); return false;"><c:out value="${result.yellowId}"/></a></td> | |
| 206 | + | |
| 207 | + <td><a href="#" onclick="fn_detailView('${result.userData}'); return false;"><c:out value="${result.callTo}"/></a></td> | |
| 208 | + <td title="<c:out value="${result.reqDate}"/>"> | |
| 209 | + <fmt:parseDate value="${result.reqDate}" var="sentDateValue" pattern="yyyy-MM-dd HH:mm"/> | |
| 210 | + <fmt:formatDate value="${sentDateValue}" pattern="MM-dd HH:mm"/> | |
| 211 | + </td> | |
| 212 | + | |
| 213 | + <c:choose> | |
| 214 | + <c:when test="${empty result.smsTxt}"> | |
| 215 | + <td title="그림문자"> | |
| 216 | + </c:when> | |
| 217 | + <c:otherwise> | |
| 218 | + <td title="<c:out value="${result.smsTxt}"/>"> | |
| 219 | + </c:otherwise> | |
| 220 | + </c:choose> | |
| 221 | + <a href="#" onclick="fn_detailView('${result.userData}'); return false;"> | |
| 222 | + <c:choose> | |
| 223 | + <c:when test="${empty result.smsTxt}"> | |
| 224 | + 그림문자 | |
| 225 | + </c:when> | |
| 226 | + <c:otherwise> | |
| 227 | + <c:out value="${result.smsTxt}"/> | |
| 228 | + </c:otherwise> | |
| 229 | + </c:choose> | |
| 230 | + </a> | |
| 231 | + </td> | |
| 232 | + <td onclick="fn_detailView('${result.userData}'); return false;" style="cursor:pointer;"> | |
| 233 | + <c:choose> | |
| 234 | + <c:when test="${result.reserveCYn == 'Y'}"> | |
| 235 | + 예약 취소 | |
| 236 | + </c:when> | |
| 237 | + <c:otherwise> | |
| 238 | + <c:out value="${result.curStateTxt}"/> | |
| 239 | + </c:otherwise> | |
| 240 | + </c:choose> | |
| 241 | + </td> | |
| 242 | + | |
| 243 | + <td onclick="fn_detailView('${result.userData}'); return false;" style="cursor:pointer;"> | |
| 244 | + <c:choose> | |
| 245 | + <c:when test="${result.resultCodeTxt == 'S'}"> | |
| 246 | + 성공 | |
| 247 | + </c:when> | |
| 248 | + <c:when test="${result.resultCodeTxt == 'W'}"> | |
| 249 | + 대기 | |
| 250 | + </c:when> | |
| 251 | + <c:otherwise> | |
| 252 | + 실패 | |
| 253 | + </c:otherwise> | |
| 254 | + </c:choose> | |
| 255 | + </td> | |
| 256 | + <td onclick="fn_detailView('${result.userData}'); return false;" style="cursor:pointer;"> | |
| 257 | + <c:out value="${result.msgTypeName}"/> | |
| 258 | + </td> | |
| 259 | + | |
| 260 | + <td onclick="fn_detailView('${result.userData}'); return false;" style="cursor:pointer;"> | |
| 261 | + <c:out value="${result.subMsgSendYn}"/> | |
| 262 | + <c:if test="${result.subMsgSendYn eq '발송'}"> | |
| 263 | + (<c:out value="${result.subMsgType}"/>) | |
| 264 | + </c:if> | |
| 265 | + </td> | |
| 266 | + </tr> | |
| 267 | + </c:forEach> | |
| 268 | + <c:if test="${empty resultList}"> | |
| 269 | + <tr><td colspan="10"><spring:message code="common.nodata.msg" /></td></tr> | |
| 270 | + </c:if> | |
| 271 | + </tbody> | |
| 272 | + </table> | |
| 273 | + </div> | |
| 274 | + <div class="btnWrap"> | |
| 275 | + <input type="button" class="btnType1" value="목록" onclick="goList(); return false;" value="목록" > | |
| 276 | + </div> | |
| 277 | + <!-- 페이지 네비게이션 시작 --> | |
| 278 | + <c:if test="${!empty resultList}"> | |
| 279 | + <div class="page"> | |
| 280 | + <ul class="inline"> | |
| 281 | + <ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="linkPage" /> | |
| 282 | + </ul> | |
| 283 | + </div> | |
| 284 | + </c:if> | |
| 285 | + <!-- //페이지 네비게이션 끝 --> | |
| 286 | + </div> | |
| 287 | + </div> | |
| 288 | +</form> | |
| 289 | +<form name="modiForm" method="get" action="<c:url value='/uss/umt/user/kakaoat/EgovGnrlselectedUserKakaoDataListAjax.do'/>" > | |
| 290 | + <input type="hidden" name="msgGroupId" value="<c:out value='${searchVO.msgGroupId}'/>"/> | |
| 291 | + <input type="hidden" name="msgId" value=""/> | |
| 292 | + <input type="hidden" name="mberId" value="<c:out value='${searchVO.userId}'/>"/> | |
| 293 | + <input type="hidden" name="userId" value="<c:out value='${searchVO.userId}'/>"/> | |
| 294 | + <input type="hidden" name="reserveType" id="reserveType" value="${searchVO.reserveType}"> | |
| 295 | + <input type="hidden" name="detailType" value="<c:out value='${searchVO.detailType}'/>"/> | |
| 296 | + <input type="hidden" name="userData" /> | |
| 297 | +</form> | |
| 298 | +</body> | |
| 299 | +</html> |
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/kakao/EgovGnrlUserSelectKakaoDataDetailPop.jsp
... | ... | @@ -0,0 +1,341 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> | |
| 5 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 6 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> | |
| 7 | +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> | |
| 8 | +<% pageContext.setAttribute("newLineChar", "\r\n"); %> | |
| 9 | +<% pageContext.setAttribute("newLineChar2", "\n"); %> | |
| 10 | +<% | |
| 11 | + response.setHeader("Cache-Control","no-store"); | |
| 12 | + response.setHeader("Pragma","no-cache"); | |
| 13 | + response.setDateHeader("Expires",0); | |
| 14 | + if (request.getProtocol().equals("HTTP/1.1")) response.setHeader("Cache-Control", "no-cache"); | |
| 15 | +%> | |
| 16 | +<!DOCTYPE html> | |
| 17 | +<html lang="ko"> | |
| 18 | +<head> | |
| 19 | + <title>사용자 문자전송 관리</title> | |
| 20 | + <meta http-equiv="content-type" content="text/html; charset=utf-8"> | |
| 21 | + <link rel="stylesheet" href="/pb/css/reset.css"> | |
| 22 | + <link rel="stylesheet" href="/pb/css/common.css"> | |
| 23 | + <link rel="stylesheet" href="/pb/css/content.css"> | |
| 24 | + <link rel="stylesheet" href="/pb/css/popup.css"> | |
| 25 | + | |
| 26 | + <style> | |
| 27 | + .pageCont .tbType1 tbody tr td.sms_detail {overflow:inherit;text-overflow:inherit;position:relative;} | |
| 28 | + .pageCont .tbType1 tbody tr td.sms_detail p {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} | |
| 29 | + .pageCont .tbType1 tbody tr td.sms_detail .sms_detail_hover {overflow:hidden;text-overflow:ellipsis;display:none;word-wrap:break-word;-webkit-line-clamp:20;-webkit-box-orient:vertical;position:absolute;left:-5px;top:45px;width:calc(100% + 150px);padding:15px;line-height:20px;white-space:normal;border:1px solid #e5e5e5;background:#fff;border-radius:5px;box-sizing:border-box;box-shadow:0px 3px 10px 0px rgb(0 0 0 / 0.2);z-index:1;font-size:14px;text-align:left;} | |
| 30 | + .pageCont .tbType1 tbody tr td.sms_detail .sms_detail_hover:after {content:'';position:absolute;left:0;bottom:0;width:100%;height:10px;background:#fff;border-radius:0 0 5px 5px;} | |
| 31 | + .pageCont .tbType1 tbody tr td.sms_detail:hover .sms_detail_hover {display:-webkit-box;} | |
| 32 | + </style> | |
| 33 | + | |
| 34 | + <script type="text/javascript" src="/pb/js/jquery-3.5.0.js"></script> | |
| 35 | + <script type="text/javascript" src="/pb/js/common.js"></script> | |
| 36 | + <script type="text/javascript" src="<c:url value='/js/EgovMultiFile.js'/>"></script> | |
| 37 | + <script type="text/javascript" src="<c:url value='/js/EgovCalPopup.js'/>"></script> | |
| 38 | + <script type="text/javascript" src="<c:url value='/js/ncms_common.js' />"></script> | |
| 39 | + <script type="text/javaScript" language="javascript"> | |
| 40 | + | |
| 41 | + function goList(){ | |
| 42 | + var frm = document.listForm; | |
| 43 | + frm.submit(); | |
| 44 | + } | |
| 45 | + | |
| 46 | + function fnTemplateDetail(templateCode){ | |
| 47 | + | |
| 48 | + if(templateCode != ''){ //알림톡 상세보기 | |
| 49 | + var form = document.templateForm; | |
| 50 | + | |
| 51 | + form.templateCode.value = templateCode; | |
| 52 | + | |
| 53 | + window.open("about:blank", 'popupTemplateDetail', 'width=1240, height=1080, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbar=no'); | |
| 54 | + form.action = "<c:url value='/uss/ion/kakaoat/KakaoATChannelIDTemplateDetailPopupAjax.do'/>"; | |
| 55 | + form.target = "popupTemplateDetail"; | |
| 56 | + form.submit(); | |
| 57 | + }else{ //친구톡 상세보기 | |
| 58 | + var form = document.fTTemplateForm; | |
| 59 | + | |
| 60 | + window.open("about:blank", 'popupTemplateDetail', 'width=450, height=900, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbar=no'); | |
| 61 | + form.action = "<c:url value='/uss/ion/kakaoft/KakaoFTTemplateDetailPopupAjax.do'/>"; | |
| 62 | + form.target = "popupTemplateDetail"; | |
| 63 | + form.submit(); | |
| 64 | + } | |
| 65 | + | |
| 66 | + } | |
| 67 | + | |
| 68 | + </script> | |
| 69 | + <style> | |
| 70 | + .pageCont {padding:50px 30px;box-sizing:border-box;} | |
| 71 | + .tableWrapTotal {margin:0 0 20px;} | |
| 72 | + .tableWrapTotal .tbType1 thead tr:first-child {border-width:1px;} | |
| 73 | + .tableWrapTotal .tbType1 thead tr th {border-left:1px solid #e6e6e6;} | |
| 74 | + .tableWrapTotal .tbType1 thead tr th:first-child {border-left:0 none;} | |
| 75 | + .tableWrapTotal .tbType1 thead tr.content th {font-size:14px;} | |
| 76 | + .tableWrapTotal .tbType1 tbody tr td {border-left:1px solid #e6e6e6;} | |
| 77 | + .tableWrapTotal .tbType1 tbody tr td:first-child {border-left:0 none;} | |
| 78 | + .listSerch .select {height:42px;vertical-align:top;} | |
| 79 | + .pageCont .tbType1 tbody tr td.msg_detail {overflow:inherit;} | |
| 80 | + .pageCont .tbType1 tbody tr td.msg_detail a {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;} | |
| 81 | + /* .layer_msg_wrap {position:relative;} */ | |
| 82 | + .layer_msg_wrap .layer_msg_detail {overflow:hidden;display:none;position:absolute;left:50%;top:600px;width:400px;max-height:600px;background:#eee;transform:translateX(-50%);z-index:1;} | |
| 83 | + .layer_msg_wrap .layer_msg_detail button {position:absolute;right:0;top:0;width:35px;height:35px;} | |
| 84 | + .layer_msg_wrap .layer_msg_detail button:before {content:'';position:absolute;left:50%;top:50%;width:1px;height:14px;margin:-7px 0 0;background:#fff;transform:rotate(-45deg);} | |
| 85 | + .layer_msg_wrap .layer_msg_detail button:after {content:'';position:absolute;left:50%;top:50%;width:1px;height:14px;margin:-7px 0 0;background:#fff;transform:rotate(45deg);} | |
| 86 | + .layer_msg_wrap .layer_msg_detail .title {height:35px;padding:0 15px;font-size:16px;line-height:35px;text-align:left;color:#fff;background:#456ded;border-radius:5px 5px 0 0;} | |
| 87 | + .layer_msg_wrap .layer_msg_detail .content {overflow-y:auto;max-height:535px;margin:15px;padding:10px 15px;line-height:20px;white-space:normal;background:#fff;} | |
| 88 | + .layer_msg_wrap .layer_msg_detail .content .rev_cont {text-align:left;} | |
| 89 | + @media screen and (max-width:916px){ | |
| 90 | + .pageCont .tableWrap table thead tr th {padding:15px 0;} | |
| 91 | + } | |
| 92 | + | |
| 93 | + </style> | |
| 94 | +</head> | |
| 95 | +<body> | |
| 96 | +<div class="loading_layer"> | |
| 97 | + <div class="loading_container"> | |
| 98 | + <div class="bar"></div> | |
| 99 | + <div class="text">Loading</div> | |
| 100 | + </div> | |
| 101 | +</div> | |
| 102 | +<form name="listForm" action="<c:url value='/uss/umt/user/kakaoat/EgovGnrlselectedUserKakaoDataDetailListAjax.do'/>" method="post"> | |
| 103 | + <input type="hidden" name="detailType" value="${searchVO.detailType}" /> | |
| 104 | + <input type="hidden" name="msgGroupId" value="${searchVO.msgGroupId}" /> | |
| 105 | + <input type="hidden" name="userId" id="userId" value="<c:out value='${searchVO.userId}'/>" /> | |
| 106 | + | |
| 107 | + <div class="contWrap" style="width:100%;position:relative;left:inherit;top:inherit;min-height:auto;padding:40px;"> | |
| 108 | + <div class="pageTitle"> | |
| 109 | + <h2 class="titType1 c_222222 fwBold">카톡 전송내역 상세</h2> | |
| 110 | + </div> | |
| 111 | + <div class="pageCont"> | |
| 112 | + <table class="tbType2"> | |
| 113 | + <colgroup> | |
| 114 | + <col style="width: 20%"> | |
| 115 | + <col style="width: 80%"> | |
| 116 | + </colgroup> | |
| 117 | + <tbody> | |
| 118 | + <tr class="no_modi"> | |
| 119 | + <th><span class="reqArea">아이디</span></th> | |
| 120 | + <td colspan="3"> | |
| 121 | + <c:out value="${mjonKakaoATDetailVO.userId}"/> | |
| 122 | + </td> | |
| 123 | + </tr> | |
| 124 | + | |
| 125 | + <tr> | |
| 126 | + <th><span class="reqArea">전송사구분</span></th> | |
| 127 | + <td colspan="3"> | |
| 128 | + <ec:code codeId="ITN019" code="${mjonKakaoATDetailVO.agentCode}" /> | |
| 129 | + </td> | |
| 130 | + </tr> | |
| 131 | + <tr> | |
| 132 | + <th><span class="reqArea">채널ID</span></th> | |
| 133 | + <td colspan="3"> | |
| 134 | + <a href="/uss/ion/kakaoat/KakaoATChannelIDList.do" ><c:out value="${mjonKakaoATDetailVO.yellowId}"/></a> | |
| 135 | + </td> | |
| 136 | + </tr> | |
| 137 | + <tr> | |
| 138 | + <th><span class="reqArea">템플릿명</span></th> | |
| 139 | + <td colspan="3"> | |
| 140 | + <div class="btnWrap"> | |
| 141 | + <input type="button" class="btnType2" style="padding:5px 10px" onclick="fnTemplateDetail('<c:out value="${mjonKakaoATDetailVO.msgNoticetalkTmpKey}"/>'); return false;" value="템플릿 상세보기"> | |
| 142 | + </div> | |
| 143 | + </td> | |
| 144 | + </tr> | |
| 145 | + <tr> | |
| 146 | + <th><span class="reqArea">수신번호</span></th> | |
| 147 | + <td colspan="3"> | |
| 148 | + <c:out value="${mjonKakaoATDetailVO.callTo}" /> | |
| 149 | + </td> | |
| 150 | + </tr> | |
| 151 | + <tr> | |
| 152 | + <th><span class="reqArea">메세지타입</span></th> | |
| 153 | + <td colspan="3"> | |
| 154 | + <c:out value="${mjonKakaoATDetailVO.msgTypeName}"/> | |
| 155 | + </td> | |
| 156 | + </tr> | |
| 157 | + <tr> | |
| 158 | + <th><span class="reqArea">내용</span></th> | |
| 159 | + <td colspan="3"> | |
| 160 | + <c:out value="${fn:replace(fn:replace(mjonKakaoATDetailVO.smsTxt, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/> | |
| 161 | + <br><br> | |
| 162 | + </td> | |
| 163 | + </tr> | |
| 164 | + <tr> | |
| 165 | + <th><span class="reqArea">전송 요청 시간</span></th> | |
| 166 | + <td colspan="3"> | |
| 167 | + <c:out value="${mjonKakaoATDetailVO.reqDate}"/> | |
| 168 | + </td> | |
| 169 | + </tr> | |
| 170 | + <tr> | |
| 171 | + <th><span class="reqArea">전송 완료 시간</span></th> | |
| 172 | + <td colspan="3"> | |
| 173 | + <c:out value="${mjonKakaoATDetailVO.rsltDate}"/> | |
| 174 | + </td> | |
| 175 | + </tr> | |
| 176 | + <tr> | |
| 177 | + <th><span class="reqArea">현재상태</span></th> | |
| 178 | + <td colspan="3"> | |
| 179 | + <c:choose> | |
| 180 | + <c:when test="${mjonKakaoATDetailVO.reserveCYn == 'Y'}"> | |
| 181 | + 예약 취소(<c:out value="${mjonKakaoATDetailVO.cancelDate}"/>) | |
| 182 | + </c:when> | |
| 183 | + <c:otherwise> | |
| 184 | + <c:out value="${mjonKakaoATDetailVO.curStateTxt}"/> | |
| 185 | + </c:otherwise> | |
| 186 | + </c:choose> | |
| 187 | + </td> | |
| 188 | + </tr> | |
| 189 | + <tr> | |
| 190 | + <th><span class="reqArea">알림톡 처리결과</span></th> | |
| 191 | + <td colspan="3"> | |
| 192 | + ( | |
| 193 | + <c:if test="${not empty mjonKakaoATDetailVO.rsltCode}"> | |
| 194 | + <c:out value="${mjonKakaoATDetailVO.rsltCode}"/> | |
| 195 | + </c:if> | |
| 196 | + ) | |
| 197 | + <c:choose> | |
| 198 | + <c:when test="${mjonKakaoATDetailVO.resultCodeTxt eq 'S'}"> | |
| 199 | + 발송 성공 | |
| 200 | + </c:when> | |
| 201 | + <c:when test="${mjonKakaoATDetailVO.resultCodeTxt eq 'W'}"> | |
| 202 | + 발송 대기 | |
| 203 | + </c:when> | |
| 204 | + <c:otherwise> | |
| 205 | + 발송 실패 | |
| 206 | + </c:otherwise> | |
| 207 | + </c:choose> | |
| 208 | + </td> | |
| 209 | + </tr> | |
| 210 | + <c:if test="${mjonKakaoATDetailVO.resultCodeTxt eq 'F'}"> | |
| 211 | + <tr> | |
| 212 | + <th><span class="reqArea">발송실패 사유</span></th> | |
| 213 | + <td colspan="3"> | |
| 214 | + <c:out value="${mjonKakaoATDetailVO.agentCodeTxt}"/> | |
| 215 | + </td> | |
| 216 | + </tr> | |
| 217 | + </c:if> | |
| 218 | + <c:choose> | |
| 219 | + <c:when test="${mjonKakaoATDetailVO.resultCodeTxt eq 'F'}"> | |
| 220 | + <tr> | |
| 221 | + <th><span class="reqArea">알림톡 환불결과(전송실패시)</span></th> | |
| 222 | + <td colspan="3"> | |
| 223 | + <c:choose> | |
| 224 | + <c:when test="${mjonKakaoATDetailVO.refundYn == 'N'}"> | |
| 225 | + 미환불 | |
| 226 | + </c:when> | |
| 227 | + <c:otherwise> | |
| 228 | + 환불 완료 | |
| 229 | + </c:otherwise> | |
| 230 | + </c:choose> | |
| 231 | + </td> | |
| 232 | + </tr> | |
| 233 | + </c:when> | |
| 234 | + <c:otherwise> | |
| 235 | + </c:otherwise> | |
| 236 | + </c:choose> | |
| 237 | + <tr> | |
| 238 | + <th><span class="reqArea">대체문자 사용여부</span></th> | |
| 239 | + <td colspan="3"> | |
| 240 | + <c:out value="${mjonKakaoATDetailVO.subMsgSendYn}"/>(<c:out value="${mjonKakaoATDetailVO.subMsgType}"/>) | |
| 241 | + </td> | |
| 242 | + </tr> | |
| 243 | + <!-- 대체문자 발송으로 선택한 경우에만 표시됨 --> | |
| 244 | + <c:if test="${mjonKakaoATDetailVO.subMsgSendYn eq '대체문자 발송'}"> | |
| 245 | + <tr> | |
| 246 | + <th><span class="reqArea">대체문자 내용</span></th> | |
| 247 | + <td colspan="3"> | |
| 248 | + <c:out value="${fn:replace(fn:replace(mjonKakaoATDetailVO.subMsgTxt, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/> | |
| 249 | + </td> | |
| 250 | + </tr> | |
| 251 | + <tr> | |
| 252 | + <th><span class="reqArea">대체문자 성공여부</span></th> | |
| 253 | + <td colspan="3"> | |
| 254 | + <c:choose> | |
| 255 | + <c:when test="${mjonKakaoATDetailVO.resultCodeTxt eq 'F'}"> | |
| 256 | + <c:choose> | |
| 257 | + <c:when test="${mjonKakaoATDetailVO.bizLogCallStatusCode eq 'S'}"> | |
| 258 | + 대체문자 발송 성공 | |
| 259 | + </c:when> | |
| 260 | + <c:when test="${mjonKakaoATDetailVO.bizLogCallStatusCode eq 'W'}"> | |
| 261 | + 대체문자 발송 대기 | |
| 262 | + </c:when> | |
| 263 | + <c:otherwise> | |
| 264 | + 대체문자 발송 실패 | |
| 265 | + </c:otherwise> | |
| 266 | + </c:choose> | |
| 267 | + </c:when> | |
| 268 | + <c:otherwise> | |
| 269 | + 대체문자 미발송 | |
| 270 | + </c:otherwise> | |
| 271 | + </c:choose> | |
| 272 | + <c:if test="${not empty mjonKakaoATDetailVO.bizLogCallStatus}"> | |
| 273 | + (<c:out value="${mjonKakaoATDetailVO.bizLogCallStatus}"/>) | |
| 274 | + </c:if> | |
| 275 | + </td> | |
| 276 | + </tr> | |
| 277 | + <c:if test="${mjonKakaoATDetailVO.bizLogCallStatusCode eq 'F'}"> | |
| 278 | + <tr> | |
| 279 | + <th><span class="reqArea">대체문자 발송실패 사유</span></th> | |
| 280 | + <td colspan="3"> | |
| 281 | + <c:choose> | |
| 282 | + <c:when test="${not empty mjonKakaoATDetailVO.bizLogCallStatusTxt}"> | |
| 283 | + <c:out value="${mjonKakaoATDetailVO.bizLogCallStatusTxt}"/> | |
| 284 | + </c:when> | |
| 285 | + <c:otherwise> | |
| 286 | + - | |
| 287 | + </c:otherwise> | |
| 288 | + </c:choose> | |
| 289 | + </td> | |
| 290 | + </tr> | |
| 291 | + </c:if> | |
| 292 | + </c:if> | |
| 293 | + <tr> | |
| 294 | + <th><span class="reqArea">접속기기</span></th> | |
| 295 | + <td colspan="3"> | |
| 296 | + <c:out value="${mjonKakaoATDetailVO.conectMthdTxt}"/> | |
| 297 | + </td> | |
| 298 | + </tr> | |
| 299 | + <tr> | |
| 300 | + <th><span class="reqArea">전송사</span></th> | |
| 301 | + <td colspan="3"> | |
| 302 | + <ec:code codeId="ITN019" code="${mjonKakaoATDetailVO.agentCode}" /> | |
| 303 | + </td> | |
| 304 | + </tr> | |
| 305 | + | |
| 306 | + <tr> | |
| 307 | + <th><span class="reqArea">통신사</span></th> | |
| 308 | + <td colspan="3"> | |
| 309 | + <c:out value="${mjonKakaoATDetailVO.rsltNet}"/> | |
| 310 | + </td> | |
| 311 | + </tr> | |
| 312 | + | |
| 313 | + <tr> | |
| 314 | + <th><span class="reqArea">삭제여부</span></th> | |
| 315 | + <td colspan="3"> | |
| 316 | + ${mjonKakaoATDetailVO.delFlag} | |
| 317 | + </td> | |
| 318 | + </tr> | |
| 319 | + </tbody> | |
| 320 | + </table> | |
| 321 | + <div class="btnWrap"> | |
| 322 | + <input type="button" class="btnType1" value="목록" onclick="goList(); return false;" > | |
| 323 | + </div> | |
| 324 | + </div> | |
| 325 | + </div> | |
| 326 | +</form> | |
| 327 | + | |
| 328 | +<form id="templateForm" name="templateForm" method="post"> | |
| 329 | + <input type="hidden" name="SenderKey" value="<c:out value="${mjonKakaoATDetailVO.msgNoticetalkSenderKey }"/>"> | |
| 330 | + <input type="hidden" id="templateCode" name="templateCode" value=""> | |
| 331 | + <input type="hidden" id="userId" name="userId" value="<c:out value="${mjonKakaoATDetailVO.userId}"/>"> | |
| 332 | +</form> | |
| 333 | +<form id="fTTemplateForm" name="fTTemplateForm" method="post"> | |
| 334 | + <input type="hidden" id="msgGroupId" name="msgGroupId" value="<c:out value="${mjonKakaoATDetailVO.msgGroupId}"/>"> | |
| 335 | + <input type="hidden" id="userId" name="userId" value="<c:out value="${mjonKakaoATDetailVO.userId}"/>"> | |
| 336 | + <input type="hidden" name="senderKey" value="<c:out value="${mjonKakaoATDetailVO.msgNoticetalkSenderKey }"/>"> | |
| 337 | + <input type="hidden" name="yellowId" value="<c:out value="${mjonKakaoATDetailVO.yellowId }"/>"> | |
| 338 | +</form> | |
| 339 | + | |
| 340 | +</body> | |
| 341 | +</html> |
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/kakao/EgovGnrlUserSelectKakaoDataListPop.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/kakao/EgovGnrlUserSelectKakaoDataListPop.jsp
... | ... | @@ -122,6 +122,13 @@ |
| 122 | 122 |
$('#ntceEndde').val('');
|
| 123 | 123 |
} |
| 124 | 124 |
|
| 125 |
+function fn_detailList(msgGroupId, userId){
|
|
| 126 |
+ var form = document.modiForm; |
|
| 127 |
+ form.msgGroupId.value = msgGroupId; |
|
| 128 |
+ form.userId.value = userId; |
|
| 129 |
+ form.action="/uss/umt/user/kakaoat/EgovGnrlselectedUserKakaoDataDetailListAjax.do"; |
|
| 130 |
+ form.submit(); |
|
| 131 |
+} |
|
| 125 | 132 |
|
| 126 | 133 |
//엑셀 다운로드 |
| 127 | 134 |
function sendMsgExcelDownload(){
|
... | ... | @@ -504,7 +511,7 @@ |
| 504 | 511 |
</c:otherwise> |
| 505 | 512 |
</c:choose> |
| 506 | 513 |
</td> |
| 507 |
- <td class="sms_detail left"> |
|
| 514 |
+ <td class="sms_detail left" onclick="fn_detailList('<c:out value="${result.msgGroupId}"/>', '<c:out value="${result.userId}"/>'); return false;" style="cursor:pointer;" <c:if test="${result.atSmishingYn eq 'Y'}">class="smishing"</c:if>>
|
|
| 508 | 515 |
<p><c:out value="${result.smsTxt}"/></p>
|
| 509 | 516 |
<div class="sms_detail_hover"> |
| 510 | 517 |
<c:out value="${fn:replace(fn:replace(result.smsTxt, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
|
... | ... | @@ -540,6 +547,7 @@ |
| 540 | 547 |
<input name="userId" type="hidden" value="<c:out value='${searchVO.userId}'/>"/>
|
| 541 | 548 |
<input name="msgGroupId" type="hidden" /> |
| 542 | 549 |
<input name="detailType" type="hidden" value="sendMsgList" /> |
| 550 |
+ <input type="hidden" name="reserveType" id="reserveType" value="${searchVO.reserveType}">
|
|
| 543 | 551 |
</form> |
| 544 | 552 |
</body> |
| 545 | 553 |
</html> |
--- src/main/webapp/WEB-INF/jsp/cop/bbs/EgovBoardContentsList.jsp
+++ src/main/webapp/WEB-INF/jsp/cop/bbs/EgovBoardContentsList.jsp
... | ... | @@ -57,15 +57,61 @@ |
| 57 | 57 |
document.modiForm.submit(); |
| 58 | 58 |
} |
| 59 | 59 |
|
| 60 |
+function sendBbsListExcelDownload(){
|
|
| 61 |
+ var $excelDownForm = $("#excelDownForm");
|
|
| 62 |
+ |
|
| 63 |
+ $excelDownForm.empty(); |
|
| 64 |
+ |
|
| 65 |
+ var searchStartDate = $("#searchStartDate").val();
|
|
| 66 |
+ var searchEndDate = $("#searchEndDate").val();
|
|
| 67 |
+ var searchCnd = $("#searchCnd").val();
|
|
| 68 |
+ var searchWrd = $("#searchWrd").val();
|
|
| 69 |
+ |
|
| 70 |
+ if(searchStartDate) {
|
|
| 71 |
+ $excelDownForm.append($('<input>', {type: 'hidden', name: 'searchStartDate', value: searchStartDate}));
|
|
| 72 |
+ } |
|
| 73 |
+ if(searchEndDate) {
|
|
| 74 |
+ $excelDownForm.append($('<input>', {type: 'hidden', name: 'searchEndDate', value: searchEndDate}));
|
|
| 75 |
+ } |
|
| 76 |
+ if(searchCnd) {
|
|
| 77 |
+ $excelDownForm.append($('<input>', {type: 'hidden', name: 'searchCnd', value: searchCnd}));
|
|
| 78 |
+ } |
|
| 79 |
+ if(searchWrd) {
|
|
| 80 |
+ $excelDownForm.append($('<input>', {type: 'hidden', name: 'searchWrd', value: searchWrd}));
|
|
| 81 |
+ } |
|
| 82 |
+ |
|
| 83 |
+ $excelDownForm.attr("method", "post");
|
|
| 84 |
+ $excelDownForm.attr("action", "<c:url value='/cop/bbs/SelectBbsListExcelDownload.do'/>");
|
|
| 85 |
+ $excelDownForm.submit(); |
|
| 86 |
+} |
|
| 87 |
+ |
|
| 88 |
+//기간선택 select |
|
| 89 |
+function fnSetCalMonth(val) {
|
|
| 90 |
+ var form = document.listForm; |
|
| 91 |
+ var today = new Date(); |
|
| 92 |
+ |
|
| 93 |
+ var year = today.getFullYear(); |
|
| 94 |
+ var month = ("0" + (today.getMonth() + 1)).slice(-2);
|
|
| 95 |
+ var date = ("0" + today.getDate()).slice(-2);
|
|
| 96 |
+ |
|
| 97 |
+ var sDate = new Date(today.setMonth(today.getMonth() - val)); |
|
| 98 |
+ |
|
| 99 |
+ var sYear = sDate.getFullYear(); |
|
| 100 |
+ var sMonth = ("0" + (sDate.getMonth() + 1)).slice(-2);
|
|
| 101 |
+ var sDate = ("0" + sDate.getDate()).slice(-2);
|
|
| 102 |
+ |
|
| 103 |
+ form.searchStartDate.value = sYear + "-" + sMonth + "-" + sDate; |
|
| 104 |
+ form.searchEndDate.value = year + "-" + month + "-" + date; |
|
| 105 |
+} |
|
| 106 |
+ |
|
| 107 |
+ |
|
| 60 | 108 |
</script> |
| 61 | 109 |
|
| 62 | 110 |
|
| 63 | 111 |
</head> |
| 64 | 112 |
<body> |
| 65 |
-<form name="listForm" action="<c:url value='/cop/bbs/SelectBbsContentsList.do'/>" method="post"> |
|
| 113 |
+<form name="listForm" id="listForm" action="<c:url value='/cop/bbs/SelectBbsContentsList.do'/>" method="post"> |
|
| 66 | 114 |
<input name="pageIndex" type="hidden" /> |
| 67 |
- <input name="searchSortCnd" id="searchSortCnd" type="hidden" value="<c:out value="${searchVO.searchSortCnd}" />" />
|
|
| 68 |
- <input name="searchSortOrd" id="searchSortOrd" type="hidden" value="<c:out value="${searchVO.searchSortOrd}" />" />
|
|
| 69 | 115 |
|
| 70 | 116 |
<div class="contWrap"> |
| 71 | 117 |
<div class="pageTitle"> |
... | ... | @@ -75,19 +121,42 @@ |
| 75 | 121 |
</div> |
| 76 | 122 |
<div class="pageCont"> |
| 77 | 123 |
<div class="listSerch"> |
| 124 |
+ <div class="calendar_wrap"> |
|
| 125 |
+ <select name="setCalMonth" onchange="fnSetCalMonth(this.value)"> |
|
| 126 |
+ <option value="0">전체</option> |
|
| 127 |
+ <option value="1">1개월</option> |
|
| 128 |
+ <option value="3">3개월</option> |
|
| 129 |
+ <option value="6">6개월</option> |
|
| 130 |
+ </select> |
|
| 131 |
+ <input type="hidden" name="cal_url" id="cal_url" value="/sym/cmm/EgovNormalCalPopup.do"> |
|
| 132 |
+ <div class="calendar_box" onclick="javascript:fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchStartDate);"> |
|
| 133 |
+ <input style="width:auto;min-width: 83px;" type="text" class="date_format" name="searchStartDate" id="searchStartDate" size="4" maxlength="4" readonly="" value="<c:out value='${searchVO.searchStartDate}'/>">
|
|
| 134 |
+ <input type="button" class="calBtn"> |
|
| 135 |
+ </div> |
|
| 136 |
+ <span class="line">~</span> |
|
| 137 |
+ <div class="calendar_box" onclick="javascript:fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchEndDate);"> |
|
| 138 |
+ <input style="width:auto;min-width: 83px;" type="text" class="date_format" name="searchEndDate" id="searchEndDate" size="4" maxlength="4" readonly="" value="<c:out value='${searchVO.searchEndDate}'/>">
|
|
| 139 |
+ <input type="button" class="calBtn"> |
|
| 140 |
+ </div> |
|
| 141 |
+ </div> |
|
| 78 | 142 |
<select name="searchCnd" id="searchCnd" title="검색조건2-검색어구분"> |
| 79 | 143 |
<option value="1" <c:if test="${searchVO.searchCnd == '1'}">selected="selected"</c:if> >제목+내용</option>
|
| 144 |
+ <option value="2" <c:if test="${searchVO.searchCnd == '2'}">selected="selected"</c:if> >등록ID</option>
|
|
| 145 |
+ <option value="3" <c:if test="${searchVO.searchCnd == '3'}">selected="selected"</c:if> >댓글 작성자</option>
|
|
| 80 | 146 |
</select> |
| 81 | 147 |
<input type="text" name="searchWrd" id="searchWrd" class="recentSearch" title="검색어" type="text" value="<c:out value="${searchVO.searchWrd}"/>" maxlength="300" size="40"/>
|
| 82 | 148 |
<input type="button" class="btnType1" onclick="fn_search(); return false;" value="검색"> |
| 149 |
+ |
|
| 83 | 150 |
</div> |
| 84 | 151 |
<div class="listTop"> |
| 85 | 152 |
<p class="tType5">총 <span class="tType4 c_456ded fwBold"> <fmt:formatNumber value="${paginationInfo.totalRecordCount}" pattern="#,###" /></span>건</p>
|
| 86 | 153 |
<p class="rightWrap"> |
| 154 |
+ <input type="button" class="excelBtn" onclick="sendBbsListExcelDownload();"> |
|
| 87 | 155 |
<select name="pageUnit" id="pageUnit" class="select" title="검색조건선택" onchange="linkPage(1);"> |
| 88 | 156 |
<option value='10' <c:if test="${searchVO.pageUnit == '10' or searchVO.pageUnit == ''}">selected</c:if>>10줄</option>
|
| 89 | 157 |
<option value='20' <c:if test="${searchVO.pageUnit == '20'}">selected</c:if>>20줄</option>
|
| 90 | 158 |
<option value='30' <c:if test="${searchVO.pageUnit == '30'}">selected</c:if>>30줄</option>
|
| 159 |
+ <option value='100' <c:if test="${searchVO.pageUnit == '100'}">selected</c:if>>100줄</option>
|
|
| 91 | 160 |
</select> |
| 92 | 161 |
</p> |
| 93 | 162 |
</div> |
... | ... | @@ -100,7 +169,8 @@ |
| 100 | 169 |
<col style="width: 11%"> |
| 101 | 170 |
<col style="width: 11%"> |
| 102 | 171 |
<col style="width: 11%"> |
| 103 |
- <col style="width: 15%"> |
|
| 172 |
+ <col style="width: 10%"> |
|
| 173 |
+ <col style="width: 10%"> |
|
| 104 | 174 |
</colgroup> |
| 105 | 175 |
<thead> |
| 106 | 176 |
<tr> |
... | ... | @@ -109,6 +179,7 @@ |
| 109 | 179 |
<th>처리상태</th> |
| 110 | 180 |
<th>등록ID</th> |
| 111 | 181 |
<th>등록자</th> |
| 182 |
+ <th>댓글 작성 관리자</th> |
|
| 112 | 183 |
<th>등록일<input type="button" class="sort sortBtn" id="sort_frstRegistPnttm"></th> |
| 113 | 184 |
</tr> |
| 114 | 185 |
</thead> |
... | ... | @@ -131,9 +202,11 @@ |
| 131 | 202 |
</td> |
| 132 | 203 |
<td> |
| 133 | 204 |
<c:set var="commentChk" value="false"/> |
| 205 |
+ <c:set var="commentAdminUser" value=""/> |
|
| 134 | 206 |
<c:forEach var="comment" items="${commentList}" varStatus="status">
|
| 135 | 207 |
<c:if test="${comment.nttId == result.nttId}">
|
| 136 | 208 |
<c:set var="commentChk" value="true"/> |
| 209 |
+ <c:set var="commentAdminUser" value="${comment.frstRegisterNm}"/>
|
|
| 137 | 210 |
</c:if> |
| 138 | 211 |
</c:forEach> |
| 139 | 212 |
<c:if test="${!not commentChk}">
|
... | ... | @@ -145,6 +218,7 @@ |
| 145 | 218 |
</td> |
| 146 | 219 |
<td><a href="#" onclick="javascript:fnSelectMber('<c:out value="${result.ntcrId}"/>'); return false;"><c:out value="${result.ntcrId}"/></a></td>
|
| 147 | 220 |
<td><c:out value="${result.ntcrNm}"/></td>
|
| 221 |
+ <td><c:out value="${commentAdminUser}"/></td>
|
|
| 148 | 222 |
<td title="<c:out value="${result.frstRegisterPnttm}"/>">
|
| 149 | 223 |
<fmt:parseDate value="${result.frstRegisterPnttm}" var="frstRegisterPnttmValue" pattern="yyyy-MM-dd HH:mm"/>
|
| 150 | 224 |
<fmt:formatDate value="${frstRegisterPnttmValue}" pattern="MM-dd HH:mm"/>
|
... | ... | @@ -153,7 +227,7 @@ |
| 153 | 227 |
</c:forEach> |
| 154 | 228 |
</tbody> |
| 155 | 229 |
<c:if test="${empty adminBoardList}">
|
| 156 |
- <tr><td colspan="3"><spring:message code="common.nodata.msg" /></td></tr> |
|
| 230 |
+ <tr><td colspan="7"><spring:message code="common.nodata.msg" /></td></tr> |
|
| 157 | 231 |
</c:if> |
| 158 | 232 |
</table> |
| 159 | 233 |
</div> |
... | ... | @@ -172,12 +246,15 @@ |
| 172 | 246 |
<!-- //페이지 네비게이션 끝 --> |
| 173 | 247 |
|
| 174 | 248 |
</div> |
| 175 |
- </div> |
|
| 249 |
+ </div> |
|
| 176 | 250 |
</form> |
| 177 | 251 |
|
| 178 | 252 |
<form name="modiForm" id="modiForm" method="post"> |
| 179 | 253 |
<input name="mberId" type="hidden" /> |
| 180 | 254 |
</form> |
| 181 | 255 |
|
| 256 |
+<form name="excelDownForm" id="excelDownForm" method="post"> |
|
| 257 |
+</form> |
|
| 258 |
+ |
|
| 182 | 259 |
</body> |
| 183 | 260 |
</html>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/access/UserAccessLog.jsp
... | ... | @@ -0,0 +1,32 @@ |
| 1 | +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> | |
| 5 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> | |
| 6 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 7 | +<!DOCTYPE html> | |
| 8 | +<html> | |
| 9 | +<body> | |
| 10 | +<%@include file="include/_context.jspf"%> | |
| 11 | +<form name="listForm" id="listForm" action ="<c:url value='/uss/umt/user/UserAccessLog.do'/>" method="post"> | |
| 12 | + <input name="pageIndex" type="hidden" value="<c:out value='${searchVO.pageIndex}'/>"/> | |
| 13 | + <input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" /> | |
| 14 | + <input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" /> | |
| 15 | + <div class="contWrap"> | |
| 16 | + <div class="pageTitle"> | |
| 17 | + <div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> | |
| 18 | + <h2 class="titType1 c_222222 fwBold">회원 접속 기록 로그 정보</h2> | |
| 19 | + <p class="tType6 c_999999">사용자 메뉴 접속 및 페이지 이동 로그 리스트입니다.</p> | |
| 20 | + </div> | |
| 21 | + <div class="pageCont"> | |
| 22 | + <%@include file="include/_search.jspf"%> | |
| 23 | + <%@include file="include/_table.jspf"%> | |
| 24 | + <%@include file="include/_paging.jspf"%> | |
| 25 | + </div> | |
| 26 | + </div> | |
| 27 | +</form> | |
| 28 | +<form name="modiForm" id="modiForm" method="post"> | |
| 29 | + <input name="mberId" type="hidden" /> | |
| 30 | +</form> | |
| 31 | +</body> | |
| 32 | +</html>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/access/include/_context.jspf
... | ... | @@ -0,0 +1,8 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<script> | |
| 3 | + function linkPage(pageNo){ | |
| 4 | + var listForm = document.listForm ; | |
| 5 | + listForm.pageIndex.value = pageNo ; | |
| 6 | + listForm.submit(); | |
| 7 | + } | |
| 8 | +</script> |
+++ src/main/webapp/WEB-INF/jsp/sym/log/access/include/_paging.jspf
... | ... | @@ -0,0 +1,9 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="btnWrap"></div> | |
| 3 | +<c:if test="${!empty resultList}"> | |
| 4 | + <div class="page"> | |
| 5 | + <ul class="inline"> | |
| 6 | + <ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="linkPage" /> | |
| 7 | + </ul> | |
| 8 | + </div> | |
| 9 | +</c:if>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/access/include/_search.jspf
... | ... | @@ -0,0 +1,78 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="listSerch"> | |
| 3 | + | |
| 4 | + <div class="calendar_wrap"> | |
| 5 | + <input type="hidden" name="cal_url" id="cal_url" value="/sym/cmm/EgovNormalCalPopup.do"> | |
| 6 | + | |
| 7 | + <div class="calendar_box" onclick="fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchStartDate);"> | |
| 8 | + <input type="text" | |
| 9 | + class="date_format" | |
| 10 | + name="searchStartDate" | |
| 11 | + id="searchStartDate" | |
| 12 | + size="10" | |
| 13 | + maxlength="10" | |
| 14 | + readonly | |
| 15 | + value="<c:out value='${searchVO.searchStartDate}'/>"/> | |
| 16 | + <input type="button" class="calBtn"> | |
| 17 | + </div> | |
| 18 | + | |
| 19 | + <span class="line">~</span> | |
| 20 | + | |
| 21 | + <div class="calendar_box" | |
| 22 | + onclick="fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchEndDate);"> | |
| 23 | + <input type="text" | |
| 24 | + class="date_format" | |
| 25 | + name="searchEndDate" | |
| 26 | + id="searchEndDate" | |
| 27 | + size="10" | |
| 28 | + maxlength="10" | |
| 29 | + readonly | |
| 30 | + value="<c:out value='${searchVO.searchEndDate}'/>"> | |
| 31 | + <input type="button" class="calBtn"> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + | |
| 35 | + <!-- 상태 필터 --> | |
| 36 | + <select name="result" id="result" class="select" title="상태 선택"> | |
| 37 | + <option value="">상태 전체</option> | |
| 38 | + <option value="SUCCESS" | |
| 39 | + <c:if test="${searchVO.result == 'SUCCESS'}">selected</c:if>> | |
| 40 | + 성공 | |
| 41 | + </option> | |
| 42 | + <option value="FAIL" | |
| 43 | + <c:if test="${searchVO.result == 'FAIL'}">selected</c:if>> | |
| 44 | + 실패 | |
| 45 | + </option> | |
| 46 | + </select> | |
| 47 | + | |
| 48 | + <!-- 접속 ID/IP 검색 --> | |
| 49 | + <select name="searchCondition" | |
| 50 | + id="searchCondition" | |
| 51 | + class="select" | |
| 52 | + title="검색조건 선택"> | |
| 53 | + | |
| 54 | + <option value="" <c:if test="${empty searchVO.searchCondition}">selected</c:if>>전체</option> | |
| 55 | + <option value="userId" <c:if test="${searchVO.searchCondition == 'userId'}">selected</c:if>>접속 ID</option> | |
| 56 | + <option value="accessIp" <c:if test="${searchVO.searchCondition == 'accessIp'}">selected</c:if>>접속 IP</option> | |
| 57 | + <option value="menuNm" <c:if test="${searchVO.searchCondition == 'uri'}">selected</c:if>>메뉴</option> | |
| 58 | + </select> | |
| 59 | + | |
| 60 | + <input id="searchKeyword" | |
| 61 | + name="searchKeyword" | |
| 62 | + class="recentSearch" | |
| 63 | + type="text" | |
| 64 | + value="<c:out value='${searchVO.searchKeyword}'/>" | |
| 65 | + size="25" | |
| 66 | + title="검색" | |
| 67 | + maxlength="50"> | |
| 68 | + | |
| 69 | + <input type="button" | |
| 70 | + class="btnType1" | |
| 71 | + onclick="fn_search(); return false;" | |
| 72 | + value="검색"> | |
| 73 | + | |
| 74 | + <input type="button" | |
| 75 | + class="btnType1" | |
| 76 | + onclick="fn_searchReset(); return false;" | |
| 77 | + value="초기화"> | |
| 78 | +</div>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/access/include/_table.jspf
... | ... | @@ -0,0 +1,116 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | + | |
| 3 | +<div class="tableWrap"> | |
| 4 | + <table class="tbType1"> | |
| 5 | + <colgroup> | |
| 6 | + <col style="width: 7%"> | |
| 7 | + <col style="width: 12%"> | |
| 8 | + <col style="width: 8%"> | |
| 9 | + <col style="width: 12%"> | |
| 10 | + <col style="width: 12%"> | |
| 11 | + <col style="width: auto"> | |
| 12 | + <col style="width: 15%"> | |
| 13 | + </colgroup> | |
| 14 | + | |
| 15 | + <thead> | |
| 16 | + <tr> | |
| 17 | + <th> | |
| 18 | + 번호 | |
| 19 | + <input type="button" class="sortBtn sort" id="sort_LOG_ID"/> | |
| 20 | + </th> | |
| 21 | + <th> | |
| 22 | + 메뉴 | |
| 23 | + <input type="button" class="sortBtn sort" id="sort_MENU_NM"/> | |
| 24 | + </th> | |
| 25 | + <th> | |
| 26 | + 상태 | |
| 27 | + <input type="button" class="sortBtn sort" id="sort_RESULT"/> | |
| 28 | + </th> | |
| 29 | + <th> | |
| 30 | + 시도한 아이디 | |
| 31 | + <input type="button" class="sortBtn sort" id="sort_USER_ID"/> | |
| 32 | + </th> | |
| 33 | + <th> | |
| 34 | + 시도한 IP | |
| 35 | + <input type="button" class="sortBtn sort" id="sort_ACCESS_IP"/> | |
| 36 | + </th> | |
| 37 | + <th> | |
| 38 | + URI | |
| 39 | + <input type="button" class="sortBtn sort" id="sort_URI"/> | |
| 40 | + </th> | |
| 41 | + <th> | |
| 42 | + 생성날짜 | |
| 43 | + <input type="button" class="sortBtn sort" id="sort_FRST_REGIST_PNTTM"/> | |
| 44 | + </th> | |
| 45 | + </tr> | |
| 46 | + </thead> | |
| 47 | + | |
| 48 | + <tbody> | |
| 49 | + <c:forEach var="vo" items="${resultList}" varStatus="status"> | |
| 50 | + <tr> | |
| 51 | + <td> | |
| 52 | + <c:choose> | |
| 53 | + <c:when test="${searchVO.searchSortOrd eq 'asc'}"> | |
| 54 | + <c:out value="${ | |
| 55 | + paginationInfo.totalRecordCount | |
| 56 | + - ((paginationInfo.currentPageNo - 1) | |
| 57 | + * paginationInfo.recordCountPerPage) | |
| 58 | + - status.index | |
| 59 | + }"/> | |
| 60 | + </c:when> | |
| 61 | + <c:otherwise> | |
| 62 | + <c:out value="${ | |
| 63 | + (paginationInfo.currentPageNo - 1) | |
| 64 | + * paginationInfo.recordCountPerPage | |
| 65 | + + status.count | |
| 66 | + }"/> | |
| 67 | + </c:otherwise> | |
| 68 | + </c:choose> | |
| 69 | + </td> | |
| 70 | + | |
| 71 | + <td> | |
| 72 | + <c:out value="${vo.menuNm}"/> | |
| 73 | + </td> | |
| 74 | + | |
| 75 | + <td> | |
| 76 | + <c:choose> | |
| 77 | + <c:when test="${vo.result eq 'SUCCESS'}"> | |
| 78 | + 성공 | |
| 79 | + </c:when> | |
| 80 | + <c:when test="${vo.result eq 'FAIL'}"> | |
| 81 | + 실패 | |
| 82 | + </c:when> | |
| 83 | + <c:otherwise> | |
| 84 | + <c:out value="${vo.result}"/> | |
| 85 | + </c:otherwise> | |
| 86 | + </c:choose> | |
| 87 | + </td> | |
| 88 | + | |
| 89 | + <td> | |
| 90 | + <c:out value="${vo.userId}"/> | |
| 91 | + </td> | |
| 92 | + | |
| 93 | + <td> | |
| 94 | + <c:out value="${vo.accessIp}"/> | |
| 95 | + </td> | |
| 96 | + | |
| 97 | + <td title="<c:out value='${vo.uri}'/>"> | |
| 98 | + <c:out value="${vo.uri}"/> | |
| 99 | + </td> | |
| 100 | + | |
| 101 | + <td> | |
| 102 | + <c:out value="${vo.frstRegistPnttm}"/> | |
| 103 | + </td> | |
| 104 | + </tr> | |
| 105 | + </c:forEach> | |
| 106 | + | |
| 107 | + <c:if test="${empty resultList}"> | |
| 108 | + <tr> | |
| 109 | + <td colspan="7"> | |
| 110 | + <spring:message code="common.nodata.msg"/> | |
| 111 | + </td> | |
| 112 | + </tr> | |
| 113 | + </c:if> | |
| 114 | + </tbody> | |
| 115 | + </table> | |
| 116 | +</div>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/second/SecondAuthLog.jsp
... | ... | @@ -0,0 +1,32 @@ |
| 1 | +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> | |
| 5 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> | |
| 6 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 7 | +<!DOCTYPE html> | |
| 8 | +<html> | |
| 9 | +<body> | |
| 10 | +<%@include file="include/_context.jspf"%> | |
| 11 | +<form name="listForm" id="listForm" action ="<c:url value='/uss/umt/user/SecondAuthLog.do'/>" method="post"> | |
| 12 | + <input name="pageIndex" type="hidden" value="<c:out value='${searchVO.pageIndex}'/>"/> | |
| 13 | + <input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" /> | |
| 14 | + <input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" /> | |
| 15 | + <div class="contWrap"> | |
| 16 | + <div class="pageTitle"> | |
| 17 | + <div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> | |
| 18 | + <h2 class="titType1 c_222222 fwBold">회원 2차 인증 정보</h2> | |
| 19 | + <p class="tType6 c_999999">사용자 2차 로그인 시도 관련 로그 리스트입니다.</p> | |
| 20 | + </div> | |
| 21 | + <div class="pageCont"> | |
| 22 | + <%@include file="include/_search.jspf"%> | |
| 23 | + <%@include file="include/_table.jspf"%> | |
| 24 | + <%@include file="include/_paging.jspf"%> | |
| 25 | + </div> | |
| 26 | + </div> | |
| 27 | +</form> | |
| 28 | +<form name="modiForm" id="modiForm" method="post"> | |
| 29 | + <input name="mberId" type="hidden" /> | |
| 30 | +</form> | |
| 31 | +</body> | |
| 32 | +</html>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/second/include/_context.jspf
... | ... | @@ -0,0 +1,55 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<script> | |
| 3 | + $().ready(() => { | |
| 4 | + document.querySelectorAll(".user-agent").forEach(element => { | |
| 5 | + const userAgent = element.dataset.userAgent; | |
| 6 | + console.log(userAgent); | |
| 7 | + element.textContent = parseUserAgent(userAgent); | |
| 8 | + }); | |
| 9 | + }) | |
| 10 | + | |
| 11 | + function linkPage(pageNo){ | |
| 12 | + var listForm = document.listForm ; | |
| 13 | + listForm.pageIndex.value = pageNo ; | |
| 14 | + listForm.submit(); | |
| 15 | + } | |
| 16 | + | |
| 17 | + function parseUserAgent(userAgent) { | |
| 18 | + if (!userAgent) { | |
| 19 | + return "-"; | |
| 20 | + } | |
| 21 | + | |
| 22 | + let os = "Unknown"; | |
| 23 | + let browser = "Unknown"; | |
| 24 | + | |
| 25 | + // OS | |
| 26 | + if (/Windows/i.test(userAgent)) { | |
| 27 | + os = "Windows"; | |
| 28 | + } else if (/Android/i.test(userAgent)) { | |
| 29 | + os = "Android"; | |
| 30 | + } else if (/iPhone|iPad|iPod/i.test(userAgent)) { | |
| 31 | + os = "iOS"; | |
| 32 | + } else if (/Macintosh|Mac OS X/i.test(userAgent)) { | |
| 33 | + os = "macOS"; | |
| 34 | + } else if (/Linux/i.test(userAgent)) { | |
| 35 | + os = "Linux"; | |
| 36 | + } | |
| 37 | + | |
| 38 | + // 브라우저: 순서 중요 | |
| 39 | + if (/Edg\//i.test(userAgent)) { | |
| 40 | + browser = "Edge"; | |
| 41 | + } else if (/SamsungBrowser\//i.test(userAgent)) { | |
| 42 | + browser = "Samsung Internet"; | |
| 43 | + } else if (/OPR\/|Opera/i.test(userAgent)) { | |
| 44 | + browser = "Opera"; | |
| 45 | + } else if (/Chrome\/|CriOS\//i.test(userAgent)) { | |
| 46 | + browser = "Chrome"; | |
| 47 | + } else if (/Firefox\/|FxiOS\//i.test(userAgent)) { | |
| 48 | + browser = "Firefox"; | |
| 49 | + } else if (/Safari\//i.test(userAgent)) { | |
| 50 | + browser = "Safari"; | |
| 51 | + } | |
| 52 | + | |
| 53 | + return os + "(" + browser + ")"; | |
| 54 | + } | |
| 55 | +</script> |
+++ src/main/webapp/WEB-INF/jsp/sym/log/second/include/_paging.jspf
... | ... | @@ -0,0 +1,11 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="btnWrap"></div> | |
| 3 | +<c:if test="${!empty resultList}"> | |
| 4 | + <div class="page"> | |
| 5 | + <!-- 페이지 네비게이션 시작 --> | |
| 6 | + <ul class="inline"> | |
| 7 | + <ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="linkPage" /> | |
| 8 | + </ul> | |
| 9 | + <!-- //페이지 네비게이션 끝 --> | |
| 10 | + </div> | |
| 11 | +</c:if>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/second/include/_search.jspf
... | ... | @@ -0,0 +1,78 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="listSerch"> | |
| 3 | + | |
| 4 | + <div class="calendar_wrap"> | |
| 5 | + <input type="hidden" name="cal_url" id="cal_url" value="/sym/cmm/EgovNormalCalPopup.do"> | |
| 6 | + | |
| 7 | + <div class="calendar_box" onclick="fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchStartDate);"> | |
| 8 | + <input type="text" | |
| 9 | + class="date_format" | |
| 10 | + name="searchStartDate" | |
| 11 | + id="searchStartDate" | |
| 12 | + size="10" | |
| 13 | + maxlength="10" | |
| 14 | + readonly | |
| 15 | + value="<c:out value='${searchVO.searchStartDate}'/>"/> | |
| 16 | + <input type="button" class="calBtn"> | |
| 17 | + </div> | |
| 18 | + | |
| 19 | + <span class="line">~</span> | |
| 20 | + | |
| 21 | + <div class="calendar_box" | |
| 22 | + onclick="fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchEndDate);"> | |
| 23 | + <input type="text" | |
| 24 | + class="date_format" | |
| 25 | + name="searchEndDate" | |
| 26 | + id="searchEndDate" | |
| 27 | + size="10" | |
| 28 | + maxlength="10" | |
| 29 | + readonly | |
| 30 | + value="<c:out value='${searchVO.searchEndDate}'/>"> | |
| 31 | + <input type="button" class="calBtn"> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + | |
| 35 | + <!-- 상태 필터 --> | |
| 36 | + <select name="loginResult" id="loginResult" class="select" title="상태 선택"> | |
| 37 | + <option value="">상태 전체</option> | |
| 38 | + <option value="SUCCESS" | |
| 39 | + <c:if test="${searchVO.loginResult == 'SUCCESS'}">selected</c:if>> | |
| 40 | + 성공 | |
| 41 | + </option> | |
| 42 | + <option value="FAIL" | |
| 43 | + <c:if test="${searchVO.loginResult == 'FAIL'}">selected</c:if>> | |
| 44 | + 실패 | |
| 45 | + </option> | |
| 46 | + </select> | |
| 47 | + | |
| 48 | + <!-- 접속 ID/IP 검색 --> | |
| 49 | + <select name="searchCondition" | |
| 50 | + id="searchCondition" | |
| 51 | + class="select" | |
| 52 | + title="검색조건 선택"> | |
| 53 | + | |
| 54 | + <option value="" <c:if test="${empty searchVO.searchCondition}">selected</c:if>>전체</option> | |
| 55 | + <option value="tryLoginId" <c:if test="${searchVO.searchCondition == 'tryLoginId'}">selected</c:if>>접속 ID</option> | |
| 56 | + <option value="accessIp" <c:if test="${searchVO.searchCondition == 'accessIp'}">selected</c:if>>접속 IP</option> | |
| 57 | + <option value="receive" <c:if test="${searchVO.searchCondition == 'receive'}">selected</c:if>>전화번호</option> | |
| 58 | + </select> | |
| 59 | + | |
| 60 | + <input id="searchKeyword" | |
| 61 | + name="searchKeyword" | |
| 62 | + class="recentSearch" | |
| 63 | + type="text" | |
| 64 | + value="<c:out value='${searchVO.searchKeyword}'/>" | |
| 65 | + size="25" | |
| 66 | + title="검색" | |
| 67 | + maxlength="50"> | |
| 68 | + | |
| 69 | + <input type="button" | |
| 70 | + class="btnType1" | |
| 71 | + onclick="fn_search(); return false;" | |
| 72 | + value="검색"> | |
| 73 | + | |
| 74 | + <input type="button" | |
| 75 | + class="btnType1" | |
| 76 | + onclick="fn_searchReset(); return false;" | |
| 77 | + value="초기화"> | |
| 78 | +</div>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/log/second/include/_table.jspf
... | ... | @@ -0,0 +1,67 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | + | |
| 3 | +<div class="tableWrap"> | |
| 4 | + <table class="tbType1"> | |
| 5 | + <colgroup> | |
| 6 | + <col style="width: 8%"> | |
| 7 | + <col style="width: 8%"> | |
| 8 | + <col style="width: 8%"> | |
| 9 | + <col style="width: auto"> | |
| 10 | + </colgroup> | |
| 11 | + <thead> | |
| 12 | + <tr> | |
| 13 | + <th>번호 <input type="button" class="sortBtn sort" id="sort_LOG_ID"></th> | |
| 14 | + <th>상태 <input type="button" class="sortBtn sort" id="sort_LOGIN_RESULT"></th> | |
| 15 | + <th>시도한 아이디 <input type="button" class="sortBtn sort" id="sort_TRY_LOGIN_ID"></th> | |
| 16 | + <th>전화번호 <input type="button" class="sortBtn sort" id="sort_RECEIVE"></th> | |
| 17 | + <th>성공/실패 사유 <input type="button" class="sortBtn sort" id="sort_REASON"></th> | |
| 18 | + <th>시도한 IP <input type="button" class="sortBtn sort" id="sort_ACCESS_IP"></th> | |
| 19 | + <th>시도한 기기 <input type="button" class="sortBtn sort" id="sort_USER_AGENT"></th> | |
| 20 | + <th>사용자 입력번호 <input type="button" class="sortBtn sort" id="sort_RESULT_CODE"></th> | |
| 21 | + <th>생성날짜 <input type="button" class="sortBtn sort" id="sort_FRST_REGIST_PNTTM"></th> | |
| 22 | + </tr> | |
| 23 | + </thead> | |
| 24 | + <tbody> | |
| 25 | + <c:forEach var="result" items="${resultList}" varStatus="status"> | |
| 26 | + <tr> | |
| 27 | + <td> | |
| 28 | + <c:choose> | |
| 29 | + <c:when test="${searchVO.searchSortOrd eq 'asc'}"> | |
| 30 | + <c:out value="${paginationInfo.totalRecordCount - ((paginationInfo.currentPageNo - 1)* paginationInfo.recordCountPerPage)- status.index}"/> | |
| 31 | + </c:when> | |
| 32 | + | |
| 33 | + <c:otherwise> | |
| 34 | + <c:out value="${(paginationInfo.currentPageNo - 1) * paginationInfo.recordCountPerPage + status.count}"/> | |
| 35 | + </c:otherwise> | |
| 36 | + </c:choose> | |
| 37 | + </td> | |
| 38 | + <td> | |
| 39 | + <c:choose> | |
| 40 | + <c:when test="${result.loginResult eq 'SUCCESS'}"> | |
| 41 | + 성공 | |
| 42 | + </c:when> | |
| 43 | + <c:when test="${result.loginResult eq 'FAIL'}"> | |
| 44 | + 실패 | |
| 45 | + </c:when> | |
| 46 | + <c:otherwise> | |
| 47 | + <c:out value="${result.loginResult}"/> | |
| 48 | + </c:otherwise> | |
| 49 | + </c:choose> | |
| 50 | + </td> | |
| 51 | + <td><c:out value="${result.tryLoginId}"/></td> | |
| 52 | + <td>${result.receive}</td> | |
| 53 | + <td title="${result.reason}"><c:out value="${result.reason}"/></td> | |
| 54 | + <td><c:out value="${result.accessIp}"/></td> | |
| 55 | + <td class="user-agent" data-user-agent="<c:out value='${result.userAgent}'/>"></td> | |
| 56 | + <td><c:out value="${result.resultCode}"/></td> | |
| 57 | + <td><c:out value="${result.frstRegistPnttm}"/></td> | |
| 58 | + </tr> | |
| 59 | + </c:forEach> | |
| 60 | + <c:if test="${empty resultList}"> | |
| 61 | + <tr> | |
| 62 | + <td colspan="8"><spring:message code="common.nodata.msg"/></td> | |
| 63 | + </tr> | |
| 64 | + </c:if> | |
| 65 | + </tbody> | |
| 66 | + </table> | |
| 67 | +</div>(No newline at end of file) |
--- src/main/webapp/WEB-INF/jsp/sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp
+++ src/main/webapp/WEB-INF/jsp/sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp
... | ... | @@ -19,789 +19,789 @@ |
| 19 | 19 |
<!DOCTYPE html> |
| 20 | 20 |
<html> |
| 21 | 21 |
<head> |
| 22 |
-<meta http-equiv="Content-Language" content="ko"> |
|
| 23 |
-<link href="<c:url value='/'/>css/jstree/themes/default/style.min.css" rel="stylesheet" type="text/css"> |
|
| 24 |
-<style> |
|
| 25 |
-.jstree_orgChart {
|
|
| 26 |
- overflow: auto; |
|
| 27 |
- border: 1px solid silver; |
|
| 28 |
- min-height: 100px; |
|
| 29 |
- width: 290px; |
|
| 30 |
-} |
|
| 31 |
-</style> |
|
| 32 |
-<script src="<c:url value='/js/jquery-1.12.4.min.js' />"></script> |
|
| 33 |
-<script src="<c:url value='/js/jstree.min.js' />"></script> |
|
| 34 |
-<script src="<c:url value='/js/EgovCmmUtl.js' />"></script> |
|
| 35 |
-<script> |
|
| 36 |
-/********************************* |
|
| 37 |
- * jstree |
|
| 38 |
- ********************************* |
|
| 39 |
- */ |
|
| 40 |
-var newNodeId = ""; |
|
| 41 |
-function jstreeInit() {
|
|
| 42 |
- $('#kopost_organization').jstree({
|
|
| 43 |
- "core" : {
|
|
| 44 |
- "animation" : 0, |
|
| 45 |
- "multiple" : false, |
|
| 46 |
- "check_callback" : true, |
|
| 47 |
- "themes" : { "stripes" : true },
|
|
| 48 |
- "data" : {
|
|
| 49 |
- "url" : "<c:url value='/sym/mnu/mcm/EgovMenuCreatSelectJtreeAjax.do'/>", |
|
| 50 |
- "dataType" : "json", |
|
| 51 |
- "data" : function (node) {
|
|
| 52 |
- return {'id' : node.id, 'authorCode' : $('#authorCode').val() };
|
|
| 53 |
- } |
|
| 54 |
- } |
|
| 55 |
- }, |
|
| 56 |
- "types" : {
|
|
| 57 |
- "#" : {
|
|
| 58 |
- /* "max_children" : 4, */ |
|
| 59 |
- "max_depth" : 5, |
|
| 60 |
- "valid_children" : ["root"] |
|
| 61 |
- }, |
|
| 62 |
- "root" : {
|
|
| 63 |
- "icon" : "glyphicon glyphicon-flash", |
|
| 64 |
- "valid_children" : ["default"] |
|
| 65 |
- }, |
|
| 66 |
- "default" : {
|
|
| 67 |
- "valid_children" : ["default","file"] |
|
| 68 |
- }, |
|
| 69 |
- "file" : {
|
|
| 70 |
- "icon" : "jstree-file", |
|
| 71 |
- "valid_children" : [] |
|
| 72 |
- } |
|
| 73 |
- }, |
|
| 74 |
- "plugins" : [ |
|
| 75 |
- "contextmenu", "dnd", "search", |
|
| 76 |
- "types" |
|
| 77 |
- ] |
|
| 78 |
- }) |
|
| 79 |
- .bind('loaded.jstree', function(e, data) {
|
|
| 80 |
- $('#kopost_organization').jstree('open_node' , $('#0') )
|
|
| 81 |
- }) |
|
| 82 |
- .on('select_node.jstree', function (e, data) {
|
|
| 83 |
- if(!$('.organ_rightbox').is(":visible")){
|
|
| 84 |
- $(".organ_rightbox").show();
|
|
| 22 |
+ <meta http-equiv="Content-Language" content="ko"> |
|
| 23 |
+ <link href="<c:url value='/'/>css/jstree/themes/default/style.min.css" rel="stylesheet" type="text/css"> |
|
| 24 |
+ <style> |
|
| 25 |
+ .jstree_orgChart {
|
|
| 26 |
+ overflow: auto; |
|
| 27 |
+ border: 1px solid silver; |
|
| 28 |
+ min-height: 100px; |
|
| 29 |
+ width: 290px; |
|
| 85 | 30 |
} |
| 86 |
- /* 매뉴 선택 */ |
|
| 87 |
- var menuNo = data.node.id; |
|
| 88 |
- var upperMenuId = data.node.parent; |
|
| 89 |
- //하위 매뉴가 있으면 매뉴코드 변경못하게 |
|
| 90 |
- if(data.node.children.length > 0){
|
|
| 91 |
- $('#menuNo').attr("readonly",true);
|
|
| 92 |
- $('#existChildNode').val("Y");
|
|
| 93 |
- }else{
|
|
| 94 |
- $('#menuNo').attr("readonly",false);
|
|
| 95 |
- $('#existChildNode').val("N");
|
|
| 96 |
- } |
|
| 97 |
- |
|
| 98 |
- /* 메뉴 선택 */ |
|
| 99 |
- var menuNo = data.node.id; |
|
| 100 |
- //메뉴 추가시 자동 선택되게 |
|
| 101 |
- if(newNodeId !=""){
|
|
| 102 |
- menuNo = newNodeId ; |
|
| 103 |
- newNodeId = ""; |
|
| 104 |
- $('#'+data.instance.get_node(menuNo).a_attr.id).trigger("click") //클릭 이벤트 발생
|
|
| 105 |
- } |
|
| 106 |
- |
|
| 107 |
- $("#menuTopNm").text(data.node.text);
|
|
| 108 |
- |
|
| 109 |
- $.ajax({
|
|
| 110 |
- type:"POST", |
|
| 111 |
- url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoAjax.do' />", |
|
| 112 |
- data:{ "menuNo" : menuNo , "authorCode" : $('#authorCode').val()},
|
|
| 113 |
- dataType:'json', |
|
| 114 |
- //timeout:(1000*30), |
|
| 115 |
- success : function(returnData, status) {
|
|
| 116 |
- if (status == "success") {
|
|
| 117 |
- var menuManageVO = returnData.menuManageVO; |
|
| 118 |
- var menuUserTypeList = returnData.menuUserTypeList; |
|
| 119 |
- fn_select_menuNo(menuManageVO, menuUserTypeList); |
|
| 120 |
- } else { alert("ERROR"); return;}
|
|
| 121 |
- }, |
|
| 122 |
- error : function(request , status, error) {
|
|
| 123 |
- }, |
|
| 124 |
- complete : function () {
|
|
| 125 |
- deleteLodingBar(); |
|
| 126 |
- } |
|
| 127 |
- }); |
|
| 128 |
- }) |
|
| 129 |
- .on('rename_node.jstree', function (e, data) { //메뉴명 변경
|
|
| 130 |
- var nodeId = data.node.id; |
|
| 131 |
- var oldText = data.old; |
|
| 132 |
- var newText = data.text; |
|
| 133 |
- |
|
| 134 |
- if (nodeId > 0) {
|
|
| 135 |
- /* 부서명 변경 */ |
|
| 136 |
- if (oldText != newText) {
|
|
| 137 |
- if (confirm("메뉴명을 변경하시겠습니까?" )) {
|
|
| 138 |
- $.ajax({
|
|
| 139 |
- type:"POST", |
|
| 140 |
- url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoNmUpdateAjax.do' />", |
|
| 141 |
- data:{ "menuNo" : nodeId, "menuNm" : newText },
|
|
| 142 |
- dataType:'json', |
|
| 143 |
- success : function(returnData, status) {
|
|
| 144 |
- if (status == "success") {
|
|
| 145 |
- alert("메뉴명이 변경되었습니다.");
|
|
| 146 |
- } else { alert("ERROR"); return;}
|
|
| 147 |
- }, |
|
| 148 |
- error : function(request , status, error) {
|
|
| 149 |
- alert("메뉴명이 변경이 실패되었습니다.");
|
|
| 150 |
- }, |
|
| 151 |
- complete : function () {
|
|
| 152 |
- data.instance.refresh(); |
|
| 153 |
- deleteLodingBar(); |
|
| 31 |
+ </style> |
|
| 32 |
+ <script src="<c:url value='/js/jquery-1.12.4.min.js' />"></script> |
|
| 33 |
+ <script src="<c:url value='/js/jstree.min.js' />"></script> |
|
| 34 |
+ <script src="<c:url value='/js/EgovCmmUtl.js' />"></script> |
|
| 35 |
+ <script> |
|
| 36 |
+ /********************************* |
|
| 37 |
+ * jstree |
|
| 38 |
+ ********************************* |
|
| 39 |
+ */ |
|
| 40 |
+ var newNodeId = ""; |
|
| 41 |
+ function jstreeInit() {
|
|
| 42 |
+ $('#kopost_organization').jstree({
|
|
| 43 |
+ "core" : {
|
|
| 44 |
+ "animation" : 0, |
|
| 45 |
+ "multiple" : false, |
|
| 46 |
+ "check_callback" : true, |
|
| 47 |
+ "themes" : { "stripes" : true },
|
|
| 48 |
+ "data" : {
|
|
| 49 |
+ "url" : "<c:url value='/sym/mnu/mcm/EgovMenuCreatSelectJtreeAjax.do'/>", |
|
| 50 |
+ "dataType" : "json", |
|
| 51 |
+ "data" : function (node) {
|
|
| 52 |
+ return {'id' : node.id, 'authorCode' : $('#authorCode').val() };
|
|
| 154 | 53 |
} |
| 155 |
- }); |
|
| 156 |
- } else {
|
|
| 157 |
- data.instance.refresh(); |
|
| 54 |
+ } |
|
| 55 |
+ }, |
|
| 56 |
+ "types" : {
|
|
| 57 |
+ "#" : {
|
|
| 58 |
+ /* "max_children" : 4, */ |
|
| 59 |
+ "max_depth" : 5, |
|
| 60 |
+ "valid_children" : ["root"] |
|
| 61 |
+ }, |
|
| 62 |
+ "root" : {
|
|
| 63 |
+ "icon" : "glyphicon glyphicon-flash", |
|
| 64 |
+ "valid_children" : ["default"] |
|
| 65 |
+ }, |
|
| 66 |
+ "default" : {
|
|
| 67 |
+ "valid_children" : ["default","file"] |
|
| 68 |
+ }, |
|
| 69 |
+ "file" : {
|
|
| 70 |
+ "icon" : "jstree-file", |
|
| 71 |
+ "valid_children" : [] |
|
| 72 |
+ } |
|
| 73 |
+ }, |
|
| 74 |
+ "plugins" : [ |
|
| 75 |
+ "contextmenu", "dnd", "search", |
|
| 76 |
+ "types" |
|
| 77 |
+ ] |
|
| 78 |
+ }) |
|
| 79 |
+ .bind('loaded.jstree', function(e, data) {
|
|
| 80 |
+ $('#kopost_organization').jstree('open_node' , $('#0') )
|
|
| 81 |
+ }) |
|
| 82 |
+ .on('select_node.jstree', function (e, data) {
|
|
| 83 |
+ if(!$('.organ_rightbox').is(":visible")){
|
|
| 84 |
+ $(".organ_rightbox").show();
|
|
| 85 |
+ } |
|
| 86 |
+ /* 매뉴 선택 */ |
|
| 87 |
+ var menuNo = data.node.id; |
|
| 88 |
+ var upperMenuId = data.node.parent; |
|
| 89 |
+ //하위 매뉴가 있으면 매뉴코드 변경못하게 |
|
| 90 |
+ if(data.node.children.length > 0){
|
|
| 91 |
+ $('#menuNo').attr("readonly",true);
|
|
| 92 |
+ $('#existChildNode').val("Y");
|
|
| 93 |
+ }else{
|
|
| 94 |
+ $('#menuNo').attr("readonly",false);
|
|
| 95 |
+ $('#existChildNode').val("N");
|
|
| 96 |
+ } |
|
| 97 |
+ |
|
| 98 |
+ /* 메뉴 선택 */ |
|
| 99 |
+ var menuNo = data.node.id; |
|
| 100 |
+ //메뉴 추가시 자동 선택되게 |
|
| 101 |
+ if(newNodeId !=""){
|
|
| 102 |
+ menuNo = newNodeId ; |
|
| 103 |
+ newNodeId = ""; |
|
| 104 |
+ $('#'+data.instance.get_node(menuNo).a_attr.id).trigger("click") //클릭 이벤트 발생
|
|
| 105 |
+ } |
|
| 106 |
+ |
|
| 107 |
+ $("#menuTopNm").text(data.node.text);
|
|
| 108 |
+ |
|
| 109 |
+ $.ajax({
|
|
| 110 |
+ type:"POST", |
|
| 111 |
+ url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoAjax.do' />", |
|
| 112 |
+ data:{ "menuNo" : menuNo , "authorCode" : $('#authorCode').val()},
|
|
| 113 |
+ dataType:'json', |
|
| 114 |
+ //timeout:(1000*30), |
|
| 115 |
+ success : function(returnData, status) {
|
|
| 116 |
+ if (status == "success") {
|
|
| 117 |
+ var menuManageVO = returnData.menuManageVO; |
|
| 118 |
+ var menuUserTypeList = returnData.menuUserTypeList; |
|
| 119 |
+ fn_select_menuNo(menuManageVO, menuUserTypeList); |
|
| 120 |
+ } else { alert("ERROR"); return;}
|
|
| 121 |
+ }, |
|
| 122 |
+ error : function(request , status, error) {
|
|
| 123 |
+ }, |
|
| 124 |
+ complete : function () {
|
|
| 125 |
+ deleteLodingBar(); |
|
| 126 |
+ } |
|
| 127 |
+ }); |
|
| 128 |
+ }) |
|
| 129 |
+ .on('rename_node.jstree', function (e, data) { //메뉴명 변경
|
|
| 130 |
+ var nodeId = data.node.id; |
|
| 131 |
+ var oldText = data.old; |
|
| 132 |
+ var newText = data.text; |
|
| 133 |
+ |
|
| 134 |
+ if (nodeId > 0) {
|
|
| 135 |
+ /* 부서명 변경 */ |
|
| 136 |
+ if (oldText != newText) {
|
|
| 137 |
+ if (confirm("메뉴명을 변경하시겠습니까?" )) {
|
|
| 138 |
+ $.ajax({
|
|
| 139 |
+ type:"POST", |
|
| 140 |
+ url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoNmUpdateAjax.do' />", |
|
| 141 |
+ data:{ "menuNo" : nodeId, "menuNm" : newText },
|
|
| 142 |
+ dataType:'json', |
|
| 143 |
+ success : function(returnData, status) {
|
|
| 144 |
+ if (status == "success") {
|
|
| 145 |
+ alert("메뉴명이 변경되었습니다.");
|
|
| 146 |
+ } else { alert("ERROR"); return;}
|
|
| 147 |
+ }, |
|
| 148 |
+ error : function(request , status, error) {
|
|
| 149 |
+ alert("메뉴명이 변경이 실패되었습니다.");
|
|
| 150 |
+ }, |
|
| 151 |
+ complete : function () {
|
|
| 152 |
+ data.instance.refresh(); |
|
| 153 |
+ deleteLodingBar(); |
|
| 154 |
+ } |
|
| 155 |
+ }); |
|
| 156 |
+ } else {
|
|
| 157 |
+ data.instance.refresh(); |
|
| 158 |
+ } |
|
| 159 |
+ } |
|
| 160 |
+ } else {/* 메뉴 추가 */
|
|
| 161 |
+ |
|
| 162 |
+ } |
|
| 163 |
+ }) |
|
| 164 |
+ .on('delete_node.jstree', function (e, data) {
|
|
| 165 |
+ /* 메뉴 삭제 */ |
|
| 166 |
+ if(data.node.children.length != 0){
|
|
| 167 |
+ alert("하위 메뉴를 먼저 삭제 후 메뉴를 삭제해 주세요.");
|
|
| 168 |
+ data.instance.refresh(); |
|
| 169 |
+ }else{
|
|
| 170 |
+ if (confirm("[" + data.node.text + "]" + " 메뉴를 삭제하시겠습니까?")){
|
|
| 171 |
+ $.ajax({
|
|
| 172 |
+ type:"POST", |
|
| 173 |
+ url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoDeleteAjax.do' />", |
|
| 174 |
+ data:{ "menuNo" : data.node.id , "authorCode" : $('#authorCode').val() },
|
|
| 175 |
+ dataType:'json', |
|
| 176 |
+ //timeout:(1000*30), |
|
| 177 |
+ success : function(returnData, status) {
|
|
| 178 |
+ if (status == "success") {
|
|
| 179 |
+ alert("메뉴 정보가 삭제되었습니다.");
|
|
| 180 |
+ fn_init_menuInfo(); |
|
| 181 |
+ } else { alert("ERROR"); return;}
|
|
| 182 |
+ }, |
|
| 183 |
+ error : function(request , status, error) {
|
|
| 184 |
+ alert("메뉴 정보 삭제가 실패되었습니다.");
|
|
| 185 |
+ //alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
|
|
| 186 |
+ }, |
|
| 187 |
+ complete : function () {
|
|
| 188 |
+ data.instance.refresh(); |
|
| 189 |
+ deleteLodingBar(); |
|
| 190 |
+ } |
|
| 191 |
+ }); |
|
| 192 |
+ } else {
|
|
| 193 |
+ data.instance.refresh(); |
|
| 194 |
+ } |
|
| 195 |
+ } |
|
| 196 |
+ |
|
| 197 |
+ }) |
|
| 198 |
+ .on('create_node.jstree', function(e, data) {
|
|
| 199 |
+ if (confirm("메뉴를 추가하시겠습니까?")){
|
|
| 200 |
+ var instance = data.instance; |
|
| 201 |
+ var menuNm = data.text; |
|
| 202 |
+ var upperMenuId = data.node.parent; |
|
| 203 |
+ var menuOrdr = 1; |
|
| 204 |
+ var childrenNodes = instance.get_node(upperMenuId).children; |
|
| 205 |
+ |
|
| 206 |
+ // 하위 메뉴 있을 시 마지막 부서 sort_ord + 1 |
|
| 207 |
+ if (childrenNodes.length > 1) {
|
|
| 208 |
+ //var lastChildrenNode = instance.get_node(childrenNodes[childrenNodes.length - 2]); |
|
| 209 |
+ //sortOrd = lastChildrenNode.li_attr.sortOrd + 1; |
|
| 210 |
+ menuOrdr = childrenNodes.length ; |
|
| 211 |
+ } |
|
| 212 |
+ |
|
| 213 |
+ $.ajax({
|
|
| 214 |
+ type:"POST", |
|
| 215 |
+ url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoInsertAjax.do' />", |
|
| 216 |
+ data:{ "menuNm" : menuNm, "upperMenuId" : upperMenuId, "menuOrdr" : menuOrdr , "authorCode" : $('#authorCode').val() },
|
|
| 217 |
+ dataType:'json', |
|
| 218 |
+ //timeout:(1000*30), |
|
| 219 |
+ success : function(returnData, status) {
|
|
| 220 |
+ if (returnData.status == "success") {
|
|
| 221 |
+ alert("메뉴가 추가 되었습니다.");
|
|
| 222 |
+ //fn_select_menuNo(returnData.menuManageVO, returnData.menuManageVO.menuUserType); |
|
| 223 |
+ newNodeId = returnData.menuManageVO.menuNo ; |
|
| 224 |
+ }else if(returnData.status == "dupl"){
|
|
| 225 |
+ alert("중복된 아이디가 있습니다.\n 중복된 아이디변경/삭제후 다시 추가해 주세요\n"+ "("+returnData.menuManageResultVO.menuCours+")");
|
|
| 226 |
+ return; |
|
| 227 |
+ }else{
|
|
| 228 |
+ alert("메뉴 추가가 실패하였습니다.");
|
|
| 229 |
+ return; |
|
| 230 |
+ } |
|
| 231 |
+ }, |
|
| 232 |
+ error : function(request , status, error) {
|
|
| 233 |
+ alert("메뉴 추가가 실패되었습니다.")
|
|
| 234 |
+ }, |
|
| 235 |
+ complete : function () {
|
|
| 236 |
+ data.instance.refresh(); |
|
| 237 |
+ deleteLodingBar(); |
|
| 238 |
+ } |
|
| 239 |
+ }); |
|
| 240 |
+ }else{
|
|
| 241 |
+ data.instance.refresh(); |
|
| 242 |
+ } |
|
| 243 |
+ }) |
|
| 244 |
+ .on('move_node.jstree', function (e, data) {
|
|
| 245 |
+ /* 메뉴 위치 변경 */ |
|
| 246 |
+ var instance = data.instance; |
|
| 247 |
+ var menuNo = data.node.id; |
|
| 248 |
+ var childrenNodes = instance.get_node(menuNo).children; |
|
| 249 |
+ |
|
| 250 |
+ if (confirm("메뉴 위치를 변경하시겠습니까?" )){
|
|
| 251 |
+ //var partIdx = data.node.id; |
|
| 252 |
+ var upperMenuId = data.parent; |
|
| 253 |
+ var menuOrdr = data.position + 1; |
|
| 254 |
+ var sortOver = "A" ; |
|
| 255 |
+ $.ajax({
|
|
| 256 |
+ type:"POST", |
|
| 257 |
+ url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoMoveAjax.do' />", |
|
| 258 |
+ data:{ "menuNo" : menuNo, "upperMenuId" : upperMenuId, "menuOrdr" : menuOrdr , "authorCode" : $('#authorCode').val()},
|
|
| 259 |
+ dataType:'json', |
|
| 260 |
+ success : function(returnData, status) {
|
|
| 261 |
+ if (status == "success") {
|
|
| 262 |
+ alert("메뉴 위치가 변경되었습니다.");
|
|
| 263 |
+ } else { alert("ERROR"); return;}
|
|
| 264 |
+ }, |
|
| 265 |
+ error : function(request , status, error) {
|
|
| 266 |
+ alert("메뉴 위치 변경이 실패되었습니다.");
|
|
| 267 |
+ }, |
|
| 268 |
+ complete : function () {
|
|
| 269 |
+ data.instance.refresh(); |
|
| 270 |
+ deleteLodingBar(); |
|
| 271 |
+ } |
|
| 272 |
+ }); |
|
| 273 |
+ } else {
|
|
| 274 |
+ data.instance.refresh(); |
|
| 275 |
+ } |
|
| 276 |
+ }) ; |
|
| 277 |
+ |
|
| 278 |
+ |
|
| 279 |
+ } |
|
| 280 |
+ |
|
| 281 |
+ $( document ).ready(function() {
|
|
| 282 |
+ jstreeInit(); |
|
| 283 |
+ }); |
|
| 284 |
+ |
|
| 285 |
+ //직원 상세 초기화 |
|
| 286 |
+ function fn_add_emp() {
|
|
| 287 |
+ var partIdx =$("#selectPartIdx").val();
|
|
| 288 |
+ var upperIdxs = $("#selectPartParents").val();
|
|
| 289 |
+ |
|
| 290 |
+ // 직원 상세 초기화 |
|
| 291 |
+ document.empInfForm.reset(); |
|
| 292 |
+ $("#empFormTitle").text("메뉴 추가등록 상세");
|
|
| 293 |
+ $("input[name='paIdx']").val("");
|
|
| 294 |
+ |
|
| 295 |
+ fn_set_emp_part(partIdx, upperIdxs); |
|
| 296 |
+ } |
|
| 297 |
+ |
|
| 298 |
+ |
|
| 299 |
+ //메뉴 정보 세팅 |
|
| 300 |
+ function fn_select_menuNo(menuManageVO, menuUserTypeList){
|
|
| 301 |
+ var tmpHtml = ""; |
|
| 302 |
+ if(menuManageVO!=null){
|
|
| 303 |
+ $('#menuNo').val(menuManageVO.menuNo);
|
|
| 304 |
+ $('#tmp_Id').val(menuManageVO.menuNo);
|
|
| 305 |
+ $('#menuCours').text(menuManageVO.menuCours);
|
|
| 306 |
+ $('#menuOrdr').val(menuManageVO.menuOrdr);
|
|
| 307 |
+ $('#menuNm').val(menuManageVO.menuNm);
|
|
| 308 |
+ $('#menuDc').val(menuManageVO.menuDc);
|
|
| 309 |
+ $('#upperMenuIdText').text(menuManageVO.upperMenuId);
|
|
| 310 |
+ $('#upperMenuId').val(menuManageVO.upperMenuId);
|
|
| 311 |
+ $('#progrmFileNm').val(menuManageVO.progrmFileNm);
|
|
| 312 |
+ /* $('#progrmFileNmText').text(menuManageVO.progrmFileNm); */
|
|
| 313 |
+ $('#tmp_Name').val(menuManageVO.progrmFileNm);
|
|
| 314 |
+ $('#relateImageNm').val(menuManageVO.relateImageNm);
|
|
| 315 |
+ $('#relateImagePath').val(menuManageVO.relateImagePath);
|
|
| 316 |
+ $('#userType').val(menuManageVO.userType);
|
|
| 317 |
+ $('#url').val(menuManageVO.url);
|
|
| 318 |
+ $('#useYn').val(menuManageVO.useYn);
|
|
| 319 |
+ $('#satisYn').val(menuManageVO.satisYn);
|
|
| 320 |
+ if(""!=menuManageVO.emplyrId) $('#emplyrId').val(menuManageVO.emplyrId); //담당자 세팅
|
|
| 321 |
+ if(""!=menuManageVO.emplyrIdTxt) $('#emplyrIdTxt').val(menuManageVO.emplyrIdTxt); //담당자 세팅
|
|
| 322 |
+ |
|
| 323 |
+ if(menuManageVO.satisYn == null){
|
|
| 324 |
+ $('#satisYn').val('N')
|
|
| 325 |
+ } |
|
| 326 |
+ $("#menuTopNm").text( menuManageVO.menuNm );
|
|
| 327 |
+ $("#progrmHtmlFileId").val( menuManageVO.progrmHtmlFileId );
|
|
| 328 |
+ $("#progrmBbsId").val(menuManageVO.progrmBbsId);
|
|
| 329 |
+ $('#progrmFileNm_tmp').val(menuManageVO.progrmFileNm);
|
|
| 330 |
+ var menuType = menuManageVO.menuType ; |
|
| 331 |
+ |
|
| 332 |
+ if(menuType == "M"){
|
|
| 333 |
+ $("#satisTr").css("display", "none");
|
|
| 334 |
+ }else{
|
|
| 335 |
+ $("#satisTr").css("display", "");
|
|
| 336 |
+ } |
|
| 337 |
+ if(menuManageVO.progrmFileNm == 'dir' || menuType == 'M'){
|
|
| 338 |
+ $("#menuType").val("M"); //메뉴로 세팅
|
|
| 339 |
+ $('#progrmFileNm').attr("readonly", true);
|
|
| 340 |
+ $('#progrmFileNm_tmp').val("");
|
|
| 341 |
+ $('#url_tmp').val("");
|
|
| 342 |
+ }else{
|
|
| 343 |
+ $("#menuType").val(menuType);
|
|
| 344 |
+ //$('#progrmFileNm').attr("readonly", false);
|
|
| 345 |
+ $('#url_tmp').val(menuManageVO.url);
|
|
| 346 |
+ } |
|
| 347 |
+ |
|
| 348 |
+ //메뉴타입 설정 |
|
| 349 |
+ initShowUrl('Y');
|
|
| 350 |
+ $('#url').val(menuManageVO.url);
|
|
| 351 |
+ $(".main1_delete_btn").removeAttr("onclick");
|
|
| 352 |
+ $(".main1_delete_btn").attr("onclick", "fn_delete_menuInfo('"+menuManageVO.menuNo+"' , '"+menuManageVO.progrmFileNm+"' );return false;");
|
|
| 353 |
+ $(".main1_save_btn").removeAttr("onclick");
|
|
| 354 |
+ $(".main1_save_btn").attr("onclick", "fn_save_menuInfo('"+menuManageVO.menuNo+"');return false;");
|
|
| 355 |
+ |
|
| 356 |
+ $('.tr_item').remove();
|
|
| 357 |
+ if( ( "P" == $('#menuType').val() || "C" == $('#menuType').val()) && "ROLE_ANONYMOUS"==$('#authorCode').val() ){ //추가 게시판 조회(프로그램/사용자 화면만 조회)
|
|
| 358 |
+ $('#tr_add_bbs').show();
|
|
| 359 |
+ set_bbs(); |
|
| 360 |
+ }else{
|
|
| 361 |
+ $('#tr_add_bbs').hide();
|
|
| 362 |
+ } |
|
| 363 |
+ |
|
| 364 |
+ $('#htmlComfirm').hide();
|
|
| 365 |
+ if(""!=menuManageVO.progrmHtmlFileId){
|
|
| 366 |
+ $('#htmlComfirm').show();
|
|
| 367 |
+ $('#a_contentLink').attr("onclick" , "htmlComfirm('"+menuManageVO.progrmHtmlFileId+"');")
|
|
| 158 | 368 |
} |
| 159 | 369 |
} |
| 160 |
- } else {/* 메뉴 추가 */
|
|
| 161 |
- |
|
| 162 | 370 |
} |
| 163 |
- }) |
|
| 164 |
- .on('delete_node.jstree', function (e, data) {
|
|
| 165 |
- /* 메뉴 삭제 */ |
|
| 166 |
- if(data.node.children.length != 0){
|
|
| 167 |
- alert("하위 메뉴를 먼저 삭제 후 메뉴를 삭제해 주세요.");
|
|
| 168 |
- data.instance.refresh(); |
|
| 169 |
- }else{
|
|
| 170 |
- if (confirm("[" + data.node.text + "]" + " 메뉴를 삭제하시겠습니까?")){
|
|
| 371 |
+ |
|
| 372 |
+ //메뉴 정보 삭제 |
|
| 373 |
+ function fn_delete_menuInfo(menuNo , progrmFileNm ) {
|
|
| 374 |
+ if(menuNo == null || "undefined"== menuNo){
|
|
| 375 |
+ alert("삭제 하려는 메뉴를 먼저 선택해주세요.");
|
|
| 376 |
+ return ; |
|
| 377 |
+ } |
|
| 378 |
+ |
|
| 379 |
+ var instance = $('#kopost_organization').jstree(true);
|
|
| 380 |
+ if(instance.get_node(menuNo).children.length != 0){
|
|
| 381 |
+ alert("하위 메뉴를 먼저 삭제 후 메뉴를 삭제해 주세요.");
|
|
| 382 |
+ return; |
|
| 383 |
+ } |
|
| 384 |
+ |
|
| 385 |
+ if (confirm("메뉴를 삭제 하시겠습니까?")){
|
|
| 171 | 386 |
$.ajax({
|
| 172 | 387 |
type:"POST", |
| 173 |
- url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoDeleteAjax.do' />", |
|
| 174 |
- data:{ "menuNo" : data.node.id , "authorCode" : $('#authorCode').val() },
|
|
| 388 |
+ "url" : "<c:url value='/sym/mnu/mcm/EgovMenuInfoDeleteAjax.do'/>", |
|
| 389 |
+ data:{ "menuNo" : menuNo , "progrmFileNm" : progrmFileNm , "authorCode" : $('#authorCode').val() },
|
|
| 175 | 390 |
dataType:'json', |
| 176 | 391 |
//timeout:(1000*30), |
| 177 | 392 |
success : function(returnData, status) {
|
| 178 |
- if (status == "success") {
|
|
| 179 |
- alert("메뉴 정보가 삭제되었습니다.");
|
|
| 393 |
+ if (returnData.status == "success") {
|
|
| 394 |
+ // 직원 목록 갱신 |
|
| 395 |
+ var instance = $('#kopost_organization').jstree(true);
|
|
| 396 |
+ //$("#" + instance.get_node(partIdx).a_attr.id).trigger("click");
|
|
| 397 |
+ alert("메뉴 정보가 삭제 되었습니다.");
|
|
| 398 |
+ $("#kopost_organization").jstree("refresh");
|
|
| 180 | 399 |
fn_init_menuInfo(); |
| 181 |
- } else { alert("ERROR"); return;}
|
|
| 400 |
+ } else if(returnData.status == "duplPk"){
|
|
| 401 |
+ alert("삭제하려는 메뉴를 참조하고 있는 메뉴가 있습니다.\n 참조하는 메뉴를 삭제후 다시 시도해 주세요\n"+ "("+returnData.menuManageResultVO.menuCours+")");
|
|
| 402 |
+ return; |
|
| 403 |
+ } |
|
| 404 |
+ else {
|
|
| 405 |
+ alert("메뉴 삭제가 실패되었습니다.");
|
|
| 406 |
+ return; |
|
| 407 |
+ } |
|
| 182 | 408 |
}, |
| 183 | 409 |
error : function(request , status, error) {
|
| 184 |
- alert("메뉴 정보 삭제가 실패되었습니다.");
|
|
| 185 |
- //alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
|
|
| 410 |
+ alert("메뉴 삭제가 실패되었습니다..");
|
|
| 186 | 411 |
}, |
| 187 |
- complete : function () {
|
|
| 188 |
- data.instance.refresh(); |
|
| 412 |
+ complete : function (){
|
|
| 189 | 413 |
deleteLodingBar(); |
| 190 | 414 |
} |
| 191 | 415 |
}); |
| 192 |
- } else {
|
|
| 193 |
- data.instance.refresh(); |
|
| 194 | 416 |
} |
| 195 | 417 |
} |
| 196 |
- |
|
| 197 |
- }) |
|
| 198 |
- .on('create_node.jstree', function(e, data) {
|
|
| 199 |
- if (confirm("메뉴를 추가하시겠습니까?")){
|
|
| 200 |
- var instance = data.instance; |
|
| 201 |
- var menuNm = data.text; |
|
| 202 |
- var upperMenuId = data.node.parent; |
|
| 203 |
- var menuOrdr = 1; |
|
| 204 |
- var childrenNodes = instance.get_node(upperMenuId).children; |
|
| 205 |
- |
|
| 206 |
- // 하위 메뉴 있을 시 마지막 부서 sort_ord + 1 |
|
| 207 |
- if (childrenNodes.length > 1) {
|
|
| 208 |
- //var lastChildrenNode = instance.get_node(childrenNodes[childrenNodes.length - 2]); |
|
| 209 |
- //sortOrd = lastChildrenNode.li_attr.sortOrd + 1; |
|
| 210 |
- menuOrdr = childrenNodes.length ; |
|
| 418 |
+ |
|
| 419 |
+ //메뉴정보 init(메뉴 초기화) |
|
| 420 |
+ function fn_init_menuInfo() {
|
|
| 421 |
+ $("#menuTopNm").text("메뉴선택");
|
|
| 422 |
+ $("#menuForm input[type=text]").val("")
|
|
| 423 |
+ $('#menuCours').text("");
|
|
| 424 |
+ $('#upperMenuIdText').text("");
|
|
| 425 |
+ /* $('#progrmFileNmText').text(""); */
|
|
| 426 |
+ } |
|
| 427 |
+ |
|
| 428 |
+ //메뉴 초기화 |
|
| 429 |
+ function jstreeRefresh() {
|
|
| 430 |
+ var searchForm = document.searchForm ; |
|
| 431 |
+ searchForm.authorCode.value = $('#authorCode').val();
|
|
| 432 |
+ searchForm.submit(); |
|
| 433 |
+ } |
|
| 434 |
+ |
|
| 435 |
+ |
|
| 436 |
+ //메뉴 정보 저장. 등록/수정 |
|
| 437 |
+ function fn_save_menuInfo(menuNo) {
|
|
| 438 |
+ if(menuNo == null || "undefined"== menuNo){
|
|
| 439 |
+ alert("저장 하려는 메뉴를 먼저 메뉴트리에서 생성해 주세요."); return ;
|
|
| 211 | 440 |
} |
| 212 |
- |
|
| 441 |
+ |
|
| 442 |
+ var menuForm = document.menuForm; |
|
| 443 |
+ if(""==menuForm.menuNo.value){
|
|
| 444 |
+ alert("메뉴번호는 필수 값입니다"); return;
|
|
| 445 |
+ } |
|
| 446 |
+ |
|
| 447 |
+ if(!$.isNumeric(menuForm.menuNo.value)){
|
|
| 448 |
+ alert("메뉴번호는 숫자만 가능합니다."); return;
|
|
| 449 |
+ } |
|
| 450 |
+ |
|
| 451 |
+ if(!$.isNumeric(menuForm.menuOrdr.value)){
|
|
| 452 |
+ alert("메뉴순서는 숫자만 가능합니다."); return;
|
|
| 453 |
+ } |
|
| 454 |
+ |
|
| 455 |
+ var menuType = $("#menuType option:selected").val();
|
|
| 456 |
+ if(menuType !="M"){
|
|
| 457 |
+ if($("#progrmFileNm").val() == ""){
|
|
| 458 |
+ alert("프로그램 파일명은 필수 값입니다");
|
|
| 459 |
+ return; |
|
| 460 |
+ } |
|
| 461 |
+ } |
|
| 462 |
+ |
|
| 463 |
+ if(!confirm("저장하시겠습니까?")) return;
|
|
| 464 |
+ |
|
| 465 |
+ //추가 게시판 저장후 메뉴 정보 저장 |
|
| 466 |
+ //if( $('#tr_bbs').length > 0 ){
|
|
| 467 |
+ if(!save_line()){
|
|
| 468 |
+ console.log(); |
|
| 469 |
+ return; |
|
| 470 |
+ } |
|
| 471 |
+ //} |
|
| 472 |
+ |
|
| 473 |
+ var url = ""; |
|
| 474 |
+ url = "<c:url value='/sym/mnu/mcm/EgovMenuInfoUpdateAjax.do'/>"; |
|
| 475 |
+ var params = $(menuForm).serialize(); |
|
| 213 | 476 |
$.ajax({
|
| 214 | 477 |
type:"POST", |
| 215 |
- url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoInsertAjax.do' />", |
|
| 216 |
- data:{ "menuNm" : menuNm, "upperMenuId" : upperMenuId, "menuOrdr" : menuOrdr , "authorCode" : $('#authorCode').val() },
|
|
| 478 |
+ "url":url, |
|
| 479 |
+ data:params, |
|
| 217 | 480 |
dataType:'json', |
| 218 |
- //timeout:(1000*30), |
|
| 219 | 481 |
success : function(returnData, status) {
|
| 220 | 482 |
if (returnData.status == "success") {
|
| 221 |
- alert("메뉴가 추가 되었습니다.");
|
|
| 222 |
- //fn_select_menuNo(returnData.menuManageVO, returnData.menuManageVO.menuUserType); |
|
| 223 |
- newNodeId = returnData.menuManageVO.menuNo ; |
|
| 224 |
- }else if(returnData.status == "dupl"){
|
|
| 225 |
- alert("중복된 아이디가 있습니다.\n 중복된 아이디변경/삭제후 다시 추가해 주세요\n"+ "("+returnData.menuManageResultVO.menuCours+")");
|
|
| 483 |
+ alert("메뉴 정보가 저장 되었습니다.");
|
|
| 484 |
+ var instance = $('#kopost_organization').jstree(true);
|
|
| 485 |
+ $('#'+instance.get_node($('#tmp_Id').val()).a_attr.id).trigger("click");//이전 메뉴id선택되게
|
|
| 486 |
+ $('#tmp_Id').val($('#menuNo').val());
|
|
| 487 |
+ } else if(returnData.status == "upperDupl"){
|
|
| 488 |
+ alert("상위 메뉴 번호가 있습니다.");
|
|
| 489 |
+ return; |
|
| 490 |
+ }else if(returnData.status == "dupl"){
|
|
| 491 |
+ alert("이미 사용하고 있는 메뉴 번호가 있습니다.");
|
|
| 492 |
+ return; |
|
| 493 |
+ }else if(returnData.status == "duplProNm"){
|
|
| 494 |
+ alert("이미 사용하고 있는 프로그램파일명이 있습니다.");
|
|
| 226 | 495 |
return; |
| 227 | 496 |
}else{
|
| 228 |
- alert("메뉴 추가가 실패하였습니다.");
|
|
| 229 |
- return; |
|
| 497 |
+ alert("ERROR"); return;
|
|
| 230 | 498 |
} |
| 231 | 499 |
}, |
| 232 | 500 |
error : function(request , status, error) {
|
| 233 |
- alert("메뉴 추가가 실패되었습니다.")
|
|
| 501 |
+ alert("메뉴 정보 저장이 실패되었습니다.");
|
|
| 234 | 502 |
}, |
| 235 | 503 |
complete : function () {
|
| 236 |
- data.instance.refresh(); |
|
| 237 |
- deleteLodingBar(); |
|
| 238 |
- } |
|
| 239 |
- }); |
|
| 240 |
- }else{
|
|
| 241 |
- data.instance.refresh(); |
|
| 242 |
- } |
|
| 243 |
- }) |
|
| 244 |
- .on('move_node.jstree', function (e, data) {
|
|
| 245 |
- /* 메뉴 위치 변경 */ |
|
| 246 |
- var instance = data.instance; |
|
| 247 |
- var menuNo = data.node.id; |
|
| 248 |
- var childrenNodes = instance.get_node(menuNo).children; |
|
| 249 |
- |
|
| 250 |
- if (confirm("메뉴 위치를 변경하시겠습니까?" )){
|
|
| 251 |
- //var partIdx = data.node.id; |
|
| 252 |
- var upperMenuId = data.parent; |
|
| 253 |
- var menuOrdr = data.position + 1; |
|
| 254 |
- var sortOver = "A" ; |
|
| 255 |
- $.ajax({
|
|
| 256 |
- type:"POST", |
|
| 257 |
- url:"<c:url value='/sym/mnu/mcm/EgovMenuInfoMoveAjax.do' />", |
|
| 258 |
- data:{ "menuNo" : menuNo, "upperMenuId" : upperMenuId, "menuOrdr" : menuOrdr , "authorCode" : $('#authorCode').val()},
|
|
| 259 |
- dataType:'json', |
|
| 260 |
- success : function(returnData, status) {
|
|
| 261 |
- if (status == "success") {
|
|
| 262 |
- alert("메뉴 위치가 변경되었습니다.");
|
|
| 263 |
- } else { alert("ERROR"); return;}
|
|
| 264 |
- }, |
|
| 265 |
- error : function(request , status, error) {
|
|
| 266 |
- alert("메뉴 위치 변경이 실패되었습니다.");
|
|
| 267 |
- }, |
|
| 268 |
- complete : function () {
|
|
| 269 |
- data.instance.refresh(); |
|
| 504 |
+ $("#kopost_organization").jstree("refresh");
|
|
| 270 | 505 |
deleteLodingBar(); |
| 271 | 506 |
} |
| 272 | 507 |
}); |
| 273 |
- } else {
|
|
| 274 |
- data.instance.refresh(); |
|
| 275 | 508 |
} |
| 276 |
- }) ; |
|
| 277 |
- |
|
| 278 |
- |
|
| 279 |
-} |
|
| 280 |
- |
|
| 281 |
-$( document ).ready(function() {
|
|
| 282 |
- jstreeInit(); |
|
| 283 |
-}); |
|
| 284 | 509 |
|
| 285 |
-//직원 상세 초기화 |
|
| 286 |
-function fn_add_emp() {
|
|
| 287 |
- var partIdx =$("#selectPartIdx").val();
|
|
| 288 |
- var upperIdxs = $("#selectPartParents").val();
|
|
| 510 |
+ //메뉴 초기화 |
|
| 511 |
+ function initShowUrl(init){
|
|
| 512 |
+ var menuType = $("#menuType option:selected").val();
|
|
| 289 | 513 |
|
| 290 |
- // 직원 상세 초기화 |
|
| 291 |
- document.empInfForm.reset(); |
|
| 292 |
- $("#empFormTitle").text("메뉴 추가등록 상세");
|
|
| 293 |
- $("input[name='paIdx']").val("");
|
|
| 294 |
- |
|
| 295 |
- fn_set_emp_part(partIdx, upperIdxs); |
|
| 296 |
-} |
|
| 514 |
+ $("#url").val("");
|
|
| 515 |
+ $("#showUrl").hide();
|
|
| 516 |
+ $("#btnContent").hide();
|
|
| 517 |
+ $("#btnBBS").hide();
|
|
| 518 |
+ $('#htmlComfirm').hide();
|
|
| 519 |
+ $('#BBSNameSpan').text("");
|
|
| 520 |
+ if("M" == menuType){ //메뉴
|
|
| 521 |
+ $("#progrmFileNm").val("dir");
|
|
| 522 |
+ $("#url").val("");
|
|
| 523 |
+ $('#progrmFileNm').attr("readonly", true);
|
|
| 524 |
+ }else{
|
|
| 525 |
+ $("#progrmFileNm").val($("#progrmFileNm_tmp").val());
|
|
| 526 |
+ $("#url").val($("#url_tmp").val());
|
|
| 297 | 527 |
|
| 298 |
- |
|
| 299 |
-//메뉴 정보 세팅 |
|
| 300 |
-function fn_select_menuNo(menuManageVO, menuUserTypeList){
|
|
| 301 |
- var tmpHtml = ""; |
|
| 302 |
- if(menuManageVO!=null){
|
|
| 303 |
- $('#menuNo').val(menuManageVO.menuNo);
|
|
| 304 |
- $('#tmp_Id').val(menuManageVO.menuNo);
|
|
| 305 |
- $('#menuCours').text(menuManageVO.menuCours);
|
|
| 306 |
- $('#menuOrdr').val(menuManageVO.menuOrdr);
|
|
| 307 |
- $('#menuNm').val(menuManageVO.menuNm);
|
|
| 308 |
- $('#menuDc').val(menuManageVO.menuDc);
|
|
| 309 |
- $('#upperMenuIdText').text(menuManageVO.upperMenuId);
|
|
| 310 |
- $('#upperMenuId').val(menuManageVO.upperMenuId);
|
|
| 311 |
- $('#progrmFileNm').val(menuManageVO.progrmFileNm);
|
|
| 312 |
- /* $('#progrmFileNmText').text(menuManageVO.progrmFileNm); */
|
|
| 313 |
- $('#tmp_Name').val(menuManageVO.progrmFileNm);
|
|
| 314 |
- $('#relateImageNm').val(menuManageVO.relateImageNm);
|
|
| 315 |
- $('#relateImagePath').val(menuManageVO.relateImagePath);
|
|
| 316 |
- $('#userType').val(menuManageVO.userType);
|
|
| 317 |
- $('#url').val(menuManageVO.url);
|
|
| 318 |
- $('#useYn').val(menuManageVO.useYn);
|
|
| 319 |
- $('#satisYn').val(menuManageVO.satisYn);
|
|
| 320 |
- if(""!=menuManageVO.emplyrId) $('#emplyrId').val(menuManageVO.emplyrId); //담당자 세팅
|
|
| 321 |
- if(""!=menuManageVO.emplyrIdTxt) $('#emplyrIdTxt').val(menuManageVO.emplyrIdTxt); //담당자 세팅
|
|
| 322 |
- |
|
| 323 |
- if(menuManageVO.satisYn == null){
|
|
| 324 |
- $('#satisYn').val('N')
|
|
| 325 |
- } |
|
| 326 |
- $("#menuTopNm").text( menuManageVO.menuNm );
|
|
| 327 |
- $("#progrmHtmlFileId").val( menuManageVO.progrmHtmlFileId );
|
|
| 328 |
- $("#progrmBbsId").val(menuManageVO.progrmBbsId);
|
|
| 329 |
- $('#progrmFileNm_tmp').val(menuManageVO.progrmFileNm);
|
|
| 330 |
- var menuType = menuManageVO.menuType ; |
|
| 331 |
- |
|
| 332 |
- if(menuType == "M"){
|
|
| 333 |
- $("#satisTr").css("display", "none");
|
|
| 334 |
- }else{
|
|
| 335 |
- $("#satisTr").css("display", "");
|
|
| 336 |
- } |
|
| 337 |
- if(menuManageVO.progrmFileNm == 'dir' || menuType == 'M'){
|
|
| 338 |
- $("#menuType").val("M"); //메뉴로 세팅
|
|
| 339 |
- $('#progrmFileNm').attr("readonly", true);
|
|
| 340 |
- $('#progrmFileNm_tmp').val("");
|
|
| 341 |
- $('#url_tmp').val("");
|
|
| 342 |
- }else{
|
|
| 343 |
- $("#menuType").val(menuType);
|
|
| 344 |
- //$('#progrmFileNm').attr("readonly", false);
|
|
| 345 |
- $('#url_tmp').val(menuManageVO.url);
|
|
| 346 |
- } |
|
| 347 |
- |
|
| 348 |
- //메뉴타입 설정 |
|
| 349 |
- initShowUrl('Y');
|
|
| 350 |
- $('#url').val(menuManageVO.url);
|
|
| 351 |
- $(".main1_delete_btn").removeAttr("onclick");
|
|
| 352 |
- $(".main1_delete_btn").attr("onclick", "fn_delete_menuInfo('"+menuManageVO.menuNo+"' , '"+menuManageVO.progrmFileNm+"' );return false;");
|
|
| 353 |
- $(".main1_save_btn").removeAttr("onclick");
|
|
| 354 |
- $(".main1_save_btn").attr("onclick", "fn_save_menuInfo('"+menuManageVO.menuNo+"');return false;");
|
|
| 355 |
- |
|
| 356 |
- $('.tr_item').remove();
|
|
| 357 |
- if( ( "P" == $('#menuType').val() || "C" == $('#menuType').val()) && "ROLE_ANONYMOUS"==$('#authorCode').val() ){ //추가 게시판 조회(프로그램/사용자 화면만 조회)
|
|
| 358 |
- $('#tr_add_bbs').show();
|
|
| 359 |
- set_bbs(); |
|
| 360 |
- }else{
|
|
| 361 |
- $('#tr_add_bbs').hide();
|
|
| 362 |
- } |
|
| 363 |
- |
|
| 364 |
- $('#htmlComfirm').hide();
|
|
| 365 |
- if(""!=menuManageVO.progrmHtmlFileId){
|
|
| 366 |
- $('#htmlComfirm').show();
|
|
| 367 |
- $('#a_contentLink').attr("onclick" , "htmlComfirm('"+menuManageVO.progrmHtmlFileId+"');")
|
|
| 368 |
- } |
|
| 369 |
- } |
|
| 370 |
-} |
|
| 371 |
- |
|
| 372 |
-//메뉴 정보 삭제 |
|
| 373 |
-function fn_delete_menuInfo(menuNo , progrmFileNm ) {
|
|
| 374 |
- if(menuNo == null || "undefined"== menuNo){
|
|
| 375 |
- alert("삭제 하려는 메뉴를 먼저 선택해주세요.");
|
|
| 376 |
- return ; |
|
| 377 |
- } |
|
| 378 |
- |
|
| 379 |
- var instance = $('#kopost_organization').jstree(true);
|
|
| 380 |
- if(instance.get_node(menuNo).children.length != 0){
|
|
| 381 |
- alert("하위 메뉴를 먼저 삭제 후 메뉴를 삭제해 주세요.");
|
|
| 382 |
- return; |
|
| 383 |
- } |
|
| 384 |
- |
|
| 385 |
- if (confirm("메뉴를 삭제 하시겠습니까?")){
|
|
| 386 |
- $.ajax({
|
|
| 387 |
- type:"POST", |
|
| 388 |
- "url" : "<c:url value='/sym/mnu/mcm/EgovMenuInfoDeleteAjax.do'/>", |
|
| 389 |
- data:{ "menuNo" : menuNo , "progrmFileNm" : progrmFileNm , "authorCode" : $('#authorCode').val() },
|
|
| 390 |
- dataType:'json', |
|
| 391 |
- //timeout:(1000*30), |
|
| 392 |
- success : function(returnData, status) {
|
|
| 393 |
- if (returnData.status == "success") {
|
|
| 394 |
- // 직원 목록 갱신 |
|
| 528 |
+ if("P" == menuType){ //프로그램
|
|
| 529 |
+ $('#progrmFileNm').attr("readonly", false);
|
|
| 530 |
+ $("#url").attr("readonly", false);
|
|
| 531 |
+ }else if("C" == menuType ){ //컨텐츠
|
|
| 532 |
+ $('#progrmFileNm').attr("readonly", false);
|
|
| 533 |
+ $("#url").attr("readonly", false);
|
|
| 534 |
+ }else if("B" == menuType){ //게시판
|
|
| 535 |
+ $('#progrmFileNm').attr("readonly", false);
|
|
| 536 |
+ $("#url").attr("readonly", false);
|
|
| 537 |
+ }else if("O" == menuType){ //게시판
|
|
| 538 |
+ $('#progrmFileNm').attr("readonly", false);
|
|
| 539 |
+ $("#url").attr("readonly", false);
|
|
| 540 |
+ } |
|
| 541 |
+ if(init=='N'){
|
|
| 395 | 542 |
var instance = $('#kopost_organization').jstree(true);
|
| 396 |
- //$("#" + instance.get_node(partIdx).a_attr.id).trigger("click");
|
|
| 397 |
- alert("메뉴 정보가 삭제 되었습니다.");
|
|
| 398 |
- $("#kopost_organization").jstree("refresh");
|
|
| 399 |
- fn_init_menuInfo(); |
|
| 400 |
- } else if(returnData.status == "duplPk"){
|
|
| 401 |
- alert("삭제하려는 메뉴를 참조하고 있는 메뉴가 있습니다.\n 참조하는 메뉴를 삭제후 다시 시도해 주세요\n"+ "("+returnData.menuManageResultVO.menuCours+")");
|
|
| 402 |
- return; |
|
| 403 |
- } |
|
| 404 |
- else {
|
|
| 405 |
- alert("메뉴 삭제가 실패되었습니다.");
|
|
| 406 |
- return; |
|
| 407 |
- } |
|
| 408 |
- }, |
|
| 409 |
- error : function(request , status, error) {
|
|
| 410 |
- alert("메뉴 삭제가 실패되었습니다..");
|
|
| 411 |
- }, |
|
| 412 |
- complete : function (){
|
|
| 413 |
- deleteLodingBar(); |
|
| 414 |
- } |
|
| 415 |
- }); |
|
| 416 |
- } |
|
| 417 |
-} |
|
| 543 |
+ if($('#kopost_organization').jstree('get_selected')[0] != null){
|
|
| 544 |
+ if(instance.get_node($('#kopost_organization').jstree('get_selected')[0]).children.length != 0){
|
|
| 545 |
+ alert("하위 메뉴가 있을경우는 다른타입으로 변경할수 없습니다.");
|
|
| 546 |
+ return; |
|
| 547 |
+ } |
|
| 548 |
+ } |
|
| 549 |
+ } |
|
| 418 | 550 |
|
| 419 |
-//메뉴정보 init(메뉴 초기화) |
|
| 420 |
-function fn_init_menuInfo() {
|
|
| 421 |
- $("#menuTopNm").text("메뉴선택");
|
|
| 422 |
- $("#menuForm input[type=text]").val("")
|
|
| 423 |
- $('#menuCours').text("");
|
|
| 424 |
- $('#upperMenuIdText').text("");
|
|
| 425 |
- /* $('#progrmFileNmText').text(""); */
|
|
| 426 |
-} |
|
| 427 |
- |
|
| 428 |
-//메뉴 초기화 |
|
| 429 |
-function jstreeRefresh() {
|
|
| 430 |
- var searchForm = document.searchForm ; |
|
| 431 |
- searchForm.authorCode.value = $('#authorCode').val();
|
|
| 432 |
- searchForm.submit(); |
|
| 433 |
-} |
|
| 434 |
- |
|
| 435 |
- |
|
| 436 |
-//메뉴 정보 저장. 등록/수정 |
|
| 437 |
-function fn_save_menuInfo(menuNo) {
|
|
| 438 |
- if(menuNo == null || "undefined"== menuNo){
|
|
| 439 |
- alert("저장 하려는 메뉴를 먼저 메뉴트리에서 생성해 주세요."); return ;
|
|
| 440 |
- } |
|
| 441 |
- |
|
| 442 |
- var menuForm = document.menuForm; |
|
| 443 |
- if(""==menuForm.menuNo.value){
|
|
| 444 |
- alert("메뉴번호는 필수 값입니다"); return;
|
|
| 445 |
- } |
|
| 446 |
- |
|
| 447 |
- if(!$.isNumeric(menuForm.menuNo.value)){
|
|
| 448 |
- alert("메뉴번호는 숫자만 가능합니다."); return;
|
|
| 449 |
- } |
|
| 450 |
- |
|
| 451 |
- if(!$.isNumeric(menuForm.menuOrdr.value)){
|
|
| 452 |
- alert("메뉴순서는 숫자만 가능합니다."); return;
|
|
| 453 |
- } |
|
| 454 |
- |
|
| 455 |
- var menuType = $("#menuType option:selected").val();
|
|
| 456 |
- if(menuType !="M"){
|
|
| 457 |
- if($("#progrmFileNm").val() == ""){
|
|
| 458 |
- alert("프로그램 파일명은 필수 값입니다");
|
|
| 459 |
- return; |
|
| 460 |
- } |
|
| 461 |
- } |
|
| 462 |
- |
|
| 463 |
- if(!confirm("저장하시겠습니까?")) return;
|
|
| 464 |
- |
|
| 465 |
- //추가 게시판 저장후 메뉴 정보 저장 |
|
| 466 |
- //if( $('#tr_bbs').length > 0 ){
|
|
| 467 |
- if(!save_line()){
|
|
| 468 |
- console.log(); |
|
| 469 |
- return; |
|
| 470 |
- } |
|
| 471 |
- //} |
|
| 472 |
- |
|
| 473 |
- var url = ""; |
|
| 474 |
- url = "<c:url value='/sym/mnu/mcm/EgovMenuInfoUpdateAjax.do'/>"; |
|
| 475 |
- var params = $(menuForm).serialize(); |
|
| 476 |
- $.ajax({
|
|
| 477 |
- type:"POST", |
|
| 478 |
- "url":url, |
|
| 479 |
- data:params, |
|
| 480 |
- dataType:'json', |
|
| 481 |
- success : function(returnData, status) {
|
|
| 482 |
- if (returnData.status == "success") {
|
|
| 483 |
- alert("메뉴 정보가 저장 되었습니다.");
|
|
| 484 |
- var instance = $('#kopost_organization').jstree(true);
|
|
| 485 |
- $('#'+instance.get_node($('#tmp_Id').val()).a_attr.id).trigger("click");//이전 메뉴id선택되게
|
|
| 486 |
- $('#tmp_Id').val($('#menuNo').val());
|
|
| 487 |
- } else if(returnData.status == "upperDupl"){
|
|
| 488 |
- alert("상위 메뉴 번호가 있습니다.");
|
|
| 489 |
- return; |
|
| 490 |
- }else if(returnData.status == "dupl"){
|
|
| 491 |
- alert("이미 사용하고 있는 메뉴 번호가 있습니다.");
|
|
| 492 |
- return; |
|
| 493 |
- }else if(returnData.status == "duplProNm"){
|
|
| 494 |
- alert("이미 사용하고 있는 프로그램파일명이 있습니다.");
|
|
| 495 |
- return; |
|
| 496 |
- }else{
|
|
| 497 |
- alert("ERROR"); return;
|
|
| 498 |
- } |
|
| 499 |
- }, |
|
| 500 |
- error : function(request , status, error) {
|
|
| 501 |
- alert("메뉴 정보 저장이 실패되었습니다.");
|
|
| 502 |
- }, |
|
| 503 |
- complete : function () {
|
|
| 504 |
- $("#kopost_organization").jstree("refresh");
|
|
| 505 |
- deleteLodingBar(); |
|
| 506 |
- } |
|
| 507 |
- }); |
|
| 508 |
-} |
|
| 509 |
- |
|
| 510 |
-//메뉴 초기화 |
|
| 511 |
-function initShowUrl(init){
|
|
| 512 |
- var menuType = $("#menuType option:selected").val();
|
|
| 513 |
- |
|
| 514 |
- $("#url").val("");
|
|
| 515 |
- $("#showUrl").hide();
|
|
| 516 |
- $("#btnContent").hide();
|
|
| 517 |
- $("#btnBBS").hide();
|
|
| 518 |
- $('#htmlComfirm').hide();
|
|
| 519 |
- $('#BBSNameSpan').text("");
|
|
| 520 |
- if("M" == menuType){ //메뉴
|
|
| 521 |
- $("#progrmFileNm").val("dir");
|
|
| 522 |
- $("#url").val("");
|
|
| 523 |
- $('#progrmFileNm').attr("readonly", true);
|
|
| 524 |
- }else{
|
|
| 525 |
- $("#progrmFileNm").val($("#progrmFileNm_tmp").val());
|
|
| 526 |
- $("#url").val($("#url_tmp").val());
|
|
| 527 |
- |
|
| 528 |
- if("P" == menuType){ //프로그램
|
|
| 529 |
- $('#progrmFileNm').attr("readonly", false);
|
|
| 530 |
- $("#url").attr("readonly", false);
|
|
| 531 |
- }else if("C" == menuType ){ //컨텐츠
|
|
| 532 |
- $('#progrmFileNm').attr("readonly", false);
|
|
| 533 |
- $("#url").attr("readonly", false);
|
|
| 534 |
- }else if("B" == menuType){ //게시판
|
|
| 535 |
- $('#progrmFileNm').attr("readonly", false);
|
|
| 536 |
- $("#url").attr("readonly", false);
|
|
| 537 |
- }else if("O" == menuType){ //게시판
|
|
| 538 |
- $('#progrmFileNm').attr("readonly", false);
|
|
| 539 |
- $("#url").attr("readonly", false);
|
|
| 540 |
- } |
|
| 541 |
- if(init=='N'){
|
|
| 542 |
- var instance = $('#kopost_organization').jstree(true);
|
|
| 543 |
- if($('#kopost_organization').jstree('get_selected')[0] != null){
|
|
| 544 |
- if(instance.get_node($('#kopost_organization').jstree('get_selected')[0]).children.length != 0){
|
|
| 545 |
- alert("하위 메뉴가 있을경우는 다른타입으로 변경할수 없습니다.");
|
|
| 546 |
- return; |
|
| 547 |
- } |
|
| 551 |
+ $("#showUrl").show();
|
|
| 552 |
+ if("C" == menuType){
|
|
| 553 |
+ $("#btnContent").show();
|
|
| 554 |
+ $("#url").attr("readonly", false);
|
|
| 555 |
+ }else if("B" == menuType){
|
|
| 556 |
+ $("#btnBBS").show();
|
|
| 557 |
+ $("#url").attr("readonly", false);
|
|
| 558 |
+ } |
|
| 548 | 559 |
} |
| 549 | 560 |
} |
| 550 |
- |
|
| 551 |
- $("#showUrl").show();
|
|
| 552 |
- if("C" == menuType){
|
|
| 553 |
- $("#btnContent").show();
|
|
| 554 |
- $("#url").attr("readonly", false);
|
|
| 555 |
- }else if("B" == menuType){
|
|
| 556 |
- $("#btnBBS").show();
|
|
| 557 |
- $("#url").attr("readonly", false);
|
|
| 561 |
+ |
|
| 562 |
+ |
|
| 563 |
+ var docWidth = screen.availWidth; |
|
| 564 |
+ var docHeight = screen.availHeight; |
|
| 565 |
+ var scX = window.screenX||window.screenLeft||0; |
|
| 566 |
+ var scY = window.screenY||window.screenTop||0; |
|
| 567 |
+ /* ******************************************************** |
|
| 568 |
+ * 게시판목록조회 함수 |
|
| 569 |
+ ******************************************************** */ |
|
| 570 |
+ function searchBBSId(obj) {
|
|
| 571 |
+ var popupX = scX + (docWidth - 185) / 2; |
|
| 572 |
+ var popupY = scY + (docHeight - 195) / 2; |
|
| 573 |
+ |
|
| 574 |
+ memuPopup = window.open('', 'memuPopup', "width=800, height=730, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 575 |
+ document.searchForm.method = "post"; |
|
| 576 |
+ if("menuAdd"==$(obj).attr('id')){ //추가게시판 버튼 클릭시
|
|
| 577 |
+ document.searchForm.seCd.value = $(obj).attr('id');
|
|
| 578 |
+ document.searchForm.searchNm.value = $(obj).attr('value');
|
|
| 579 |
+ } |
|
| 580 |
+ document.searchForm.action = "/cop/bbs/EgovBBSIdListSearch.do"; |
|
| 581 |
+ document.searchForm.target = "memuPopup" ; |
|
| 582 |
+ document.searchForm.submit(); |
|
| 583 |
+ document.searchForm.target = "_self" ; |
|
| 584 |
+ document.searchForm.action= "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do"; |
|
| 558 | 585 |
} |
| 559 |
- } |
|
| 560 |
-} |
|
| 561 | 586 |
|
| 587 |
+ /* ******************************************************** |
|
| 588 |
+ * 화면컨텐츠ID 검색 팝업 |
|
| 589 |
+ ******************************************************** */ |
|
| 590 |
+ var memuPopup =""; |
|
| 591 |
+ function searchContentList() {
|
|
| 592 |
+ var popupX = scX + (docWidth - 185) / 2; |
|
| 593 |
+ var popupY = scY + (docHeight - 195) / 2; |
|
| 562 | 594 |
|
| 563 |
-var docWidth = screen.availWidth; |
|
| 564 |
-var docHeight = screen.availHeight; |
|
| 565 |
-var scX = window.screenX||window.screenLeft||0; |
|
| 566 |
-var scY = window.screenY||window.screenTop||0; |
|
| 567 |
-/* ******************************************************** |
|
| 568 |
- * 게시판목록조회 함수 |
|
| 569 |
- ******************************************************** */ |
|
| 570 |
-function searchBBSId(obj) {
|
|
| 571 |
- var popupX = scX + (docWidth - 185) / 2; |
|
| 572 |
- var popupY = scY + (docHeight - 195) / 2; |
|
| 573 |
- |
|
| 574 |
- memuPopup = window.open('', 'memuPopup', "width=800, height=730, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 575 |
- document.searchForm.method = "post"; |
|
| 576 |
- if("menuAdd"==$(obj).attr('id')){ //추가게시판 버튼 클릭시
|
|
| 577 |
- document.searchForm.seCd.value = $(obj).attr('id');
|
|
| 578 |
- document.searchForm.searchNm.value = $(obj).attr('value');
|
|
| 579 |
- } |
|
| 580 |
- document.searchForm.action = "/cop/bbs/EgovBBSIdListSearch.do"; |
|
| 581 |
- document.searchForm.target = "memuPopup" ; |
|
| 582 |
- document.searchForm.submit(); |
|
| 583 |
- document.searchForm.target = "_self" ; |
|
| 584 |
- document.searchForm.action= "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do"; |
|
| 585 |
-} |
|
| 586 |
- |
|
| 587 |
-/* ******************************************************** |
|
| 588 |
- * 화면컨텐츠ID 검색 팝업 |
|
| 589 |
- ******************************************************** */ |
|
| 590 |
-var memuPopup =""; |
|
| 591 |
-function searchContentList() {
|
|
| 592 |
- var popupX = scX + (docWidth - 185) / 2; |
|
| 593 |
- var popupY = scY + (docHeight - 195) / 2; |
|
| 594 |
- |
|
| 595 |
- memuPopup = window.open('', 'memuPopup', "width=800, height=730, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 596 |
- document.searchForm.method = "post"; |
|
| 597 |
- document.searchForm.action = "/uss/ion/cnt/contentListPopup.do"; |
|
| 598 |
- document.searchForm.target = "memuPopup" ; |
|
| 599 |
- document.searchForm.submit(); |
|
| 600 |
- document.searchForm.target = "_self" ; |
|
| 601 |
- document.searchForm.action= "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do"; |
|
| 602 |
-} |
|
| 603 |
- |
|
| 604 |
-/* ******************************************************** |
|
| 605 |
- * 사용자 매뉴 담당자 조회 함수 |
|
| 606 |
- ******************************************************** */ |
|
| 607 |
-function searchManageMenuList() {
|
|
| 608 |
- var popupX = scX + (docWidth - 185) / 2; |
|
| 609 |
- var popupY = scY + (docHeight - 195) / 2; |
|
| 610 |
- |
|
| 611 |
- memuPopup = window.open('', 'memuPopup', "width=800, height=730, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 612 |
- document.searchForm.method = "post"; |
|
| 613 |
- document.searchForm.action = "/uss/umt/user/EgovUserManageMenuAjax.do"; |
|
| 614 |
- document.searchForm.target = "memuPopup" ; |
|
| 615 |
- document.searchForm.submit(); |
|
| 616 |
- document.searchForm.target = "_self" ; |
|
| 617 |
- document.searchForm.action= "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do"; |
|
| 618 |
-} |
|
| 619 |
- |
|
| 620 |
- |
|
| 621 |
-function onkeyContentName(event){
|
|
| 622 |
- var tempContentUrl = "/web/content.do?proFn=" ; |
|
| 623 |
- if($("#menuType option:selected").val()=="C"){
|
|
| 624 |
- $("#url").val(tempContentUrl + $("#progrmFileNm").val()) ;
|
|
| 625 |
- } |
|
| 626 |
-} |
|
| 627 |
- |
|
| 628 |
- |
|
| 629 |
- |
|
| 630 |
-//행추가 |
|
| 631 |
-function add_line(bbsInfo){
|
|
| 632 |
- var eva_temp_tr = $('#temp_tr').clone();
|
|
| 633 |
- $('#tbl_bbsId').append(eva_temp_tr);
|
|
| 634 |
- eva_temp_tr.attr('id' , 'tr_bbs').attr('class' , 'tr_item');
|
|
| 635 |
- { //변수 변경
|
|
| 636 |
- var tr_item_length = $('.tr_item').size()-1 ;
|
|
| 637 |
- eva_temp_tr.find("#temp_bbsTxt").attr('name', eva_temp_tr.find("#temp_bbsTxt").attr('name').replace('[]' , '['+tr_item_length+']' )) ;
|
|
| 638 |
- eva_temp_tr.find("#temp_bbsTxt").attr('id' , 'bbsTxt_'+tr_item_length) ;
|
|
| 639 |
- eva_temp_tr.find("#temp_bbsIds").attr('name', eva_temp_tr.find("#temp_bbsIds").attr('name').replace('[]' , '['+tr_item_length+']' )) ;
|
|
| 640 |
- eva_temp_tr.find("#temp_bbsIds").attr('id' , 'menuAdd_'+tr_item_length) ;
|
|
| 641 |
- eva_temp_tr.find("#temp_bbsSorts").attr('name' , eva_temp_tr.find("#temp_bbsSorts").attr('name').replace('[]' , '['+tr_item_length+']' ) ) ;
|
|
| 642 |
- eva_temp_tr.find("#temp_bbsSorts").attr('id' , 'bbsSorts_'+tr_item_length) ;
|
|
| 643 |
- eva_temp_tr.find("#menuAdd").attr('value' , 'menuAdd_'+tr_item_length ) ;
|
|
| 644 |
- } |
|
| 645 |
- if(null != bbsInfo){
|
|
| 646 |
- $('#bbsTxt_'+tr_item_length).val(bbsInfo.bbsNm);
|
|
| 647 |
- $('#bbsSorts_'+tr_item_length).val(bbsInfo.bbsSort);
|
|
| 648 |
- $('#menuAdd_'+tr_item_length).val(bbsInfo.bbsId);
|
|
| 649 |
- |
|
| 650 |
- } |
|
| 651 |
-} |
|
| 652 |
- |
|
| 653 |
-//삭제시 배열 초기화 |
|
| 654 |
-var arrCd = new Array(); |
|
| 655 |
-function set_count(){ //tr 세팅
|
|
| 656 |
- $('.tr_item').each(function(index, item){
|
|
| 657 |
- $(this).find('input[name^=bbsTxt]').attr('name', 'bbsTxt['+index+']' ).attr('id' , 'bbsTxt_'+index ) ;
|
|
| 658 |
- $(this).find('input[name^=bbsSorts]').attr('name', 'bbsSorts['+index+']' );
|
|
| 659 |
- $(this).find('input[name^=bbsIds]').attr('name', 'bbsIds['+index+']' ).attr('id' , 'menuAdd_'+index ) ;
|
|
| 660 |
- $(this).find('#menuAdd').attr('value' , 'menuAdd_'+index) ;
|
|
| 661 |
- }); |
|
| 662 |
-} |
|
| 663 |
- |
|
| 664 |
-var arrDel = new Array; //1차배열 |
|
| 665 |
-function delete_line(obj){
|
|
| 666 |
- $(obj).parent().parent().remove(); |
|
| 667 |
- set_count(); |
|
| 668 |
-} |
|
| 669 |
- |
|
| 670 |
-function save_line() {
|
|
| 671 |
- /* if(0== $('.tr_item').size()){
|
|
| 672 |
- alert("선택된 게시판이 없습니다.");
|
|
| 673 |
- return; |
|
| 674 |
- } */ |
|
| 675 |
- |
|
| 676 |
- //빈 게시판 방지 |
|
| 677 |
- var blank_tr = false; |
|
| 678 |
- var blank_sort = false; |
|
| 679 |
- $('.tr_item').each(function() {
|
|
| 680 |
- if(""==$(this).find('input[name^=bbsTxt]').val()){
|
|
| 681 |
- blank_tr = true; |
|
| 595 |
+ memuPopup = window.open('', 'memuPopup', "width=800, height=730, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 596 |
+ document.searchForm.method = "post"; |
|
| 597 |
+ document.searchForm.action = "/uss/ion/cnt/contentListPopup.do"; |
|
| 598 |
+ document.searchForm.target = "memuPopup" ; |
|
| 599 |
+ document.searchForm.submit(); |
|
| 600 |
+ document.searchForm.target = "_self" ; |
|
| 601 |
+ document.searchForm.action= "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do"; |
|
| 682 | 602 |
} |
| 683 |
- |
|
| 684 |
- if(""==$(this).find('input[name^=bbsSort]').val()){
|
|
| 685 |
- blank_sort = true; |
|
| 603 |
+ |
|
| 604 |
+ /* ******************************************************** |
|
| 605 |
+ * 사용자 매뉴 담당자 조회 함수 |
|
| 606 |
+ ******************************************************** */ |
|
| 607 |
+ function searchManageMenuList() {
|
|
| 608 |
+ var popupX = scX + (docWidth - 185) / 2; |
|
| 609 |
+ var popupY = scY + (docHeight - 195) / 2; |
|
| 610 |
+ |
|
| 611 |
+ memuPopup = window.open('', 'memuPopup', "width=800, height=730, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 612 |
+ document.searchForm.method = "post"; |
|
| 613 |
+ document.searchForm.action = "/uss/umt/user/EgovUserManageMenuAjax.do"; |
|
| 614 |
+ document.searchForm.target = "memuPopup" ; |
|
| 615 |
+ document.searchForm.submit(); |
|
| 616 |
+ document.searchForm.target = "_self" ; |
|
| 617 |
+ document.searchForm.action= "/sym/mnu/mcm/EgovMenuCreatSelectJtree.do"; |
|
| 686 | 618 |
} |
| 687 |
- |
|
| 688 |
- }); |
|
| 689 |
- if(blank_tr) {
|
|
| 690 |
- alert("비어 있는 게시판이 있습니다.");
|
|
| 691 |
- return false; |
|
| 692 |
- } |
|
| 693 |
- if(blank_sort) {
|
|
| 694 |
- alert("게시판 순서를 넣어주세요.");
|
|
| 695 |
- return false; |
|
| 696 |
- } |
|
| 697 |
- |
|
| 698 |
- var save_line_return = false; |
|
| 699 |
- var frm = document.menuForm; |
|
| 700 |
- var data = new FormData(frm); |
|
| 701 |
- $.ajax({
|
|
| 702 |
- type: "POST", |
|
| 703 |
- url: "/sym/mnu/mcm/MenuBbsInsertAjax.do", |
|
| 704 |
- data: data, |
|
| 705 |
- dataType:'json', |
|
| 706 |
- processData: false, |
|
| 707 |
- contentType: false, |
|
| 708 |
- async: false, |
|
| 709 |
- cache: false, |
|
| 710 |
- timeout: 600000, |
|
| 711 |
- success: function (returnData, status) {
|
|
| 712 |
- if(status == 'success'){
|
|
| 713 |
- if(returnData.status == 'fail'){
|
|
| 714 |
- alert("게시판 등록 실패하였습니다.");
|
|
| 715 |
- }else if(returnData.status == 'auth_fail'){
|
|
| 716 |
- alert("세션이 종료되었습니다.");
|
|
| 717 |
- }else if(returnData.status =='success'){
|
|
| 718 |
- //alert("등록되었습니다.");
|
|
| 719 |
- save_line_return = true; |
|
| 720 |
- } |
|
| 721 |
- }else{
|
|
| 722 |
- alert("등록에 실패하였습니다.");
|
|
| 723 |
- return false; |
|
| 724 |
- } |
|
| 725 |
- }, |
|
| 726 |
- error: function (e) {
|
|
| 727 |
- console.log("ERROR : ", e);
|
|
| 728 |
- alert("등록에 실패하였습니다.");
|
|
| 729 |
- } |
|
| 730 |
- }); |
|
| 731 |
- return save_line_return; |
|
| 732 |
-} |
|
| 733 | 619 |
|
| 734 |
-function htmlComfirm(progrmHtmlFileId) {
|
|
| 735 |
- $.ajax({
|
|
| 736 |
- type: "POST", |
|
| 737 |
- url: "/sym/mnu/mcm/HtmlComfirmAjax.do", |
|
| 738 |
- data:{
|
|
| 739 |
- "cntId": progrmHtmlFileId |
|
| 740 |
- }, |
|
| 741 |
- dataType:'json', |
|
| 742 |
- timeout: 600000, |
|
| 743 |
- success: function (returnData, status) {
|
|
| 744 |
- if(status == 'success'){
|
|
| 745 |
- console.log("sdfsdf");
|
|
| 746 |
- window.open("/uss/ion/cnt/cntManageInsert.do?cntId="+returnData.cntManageVO.cntId+"&cntDtId="+returnData.cntManageVO.cntDtId);
|
|
| 747 |
- }else{
|
|
| 748 |
- //alert("등록에 실패하였습니다.");
|
|
| 749 |
- return false; |
|
| 750 |
- } |
|
| 751 |
- }, |
|
| 752 |
- error: function (e) {
|
|
| 753 |
- console.log("ERROR : ", e);
|
|
| 754 |
- alert("등록에 실패하였습니다.");
|
|
| 755 |
- } |
|
| 756 |
- }); |
|
| 757 |
-} |
|
| 758 | 620 |
|
| 759 |
-function set_bbs(){
|
|
| 760 |
- var frm = document.menuForm; |
|
| 761 |
- var data = new FormData(frm); |
|
| 762 |
- $.ajax({
|
|
| 763 |
- type: "POST", |
|
| 764 |
- url: "/sym/mnu/mcm/MenuBbsSelectAjax.do", |
|
| 765 |
- data: data, |
|
| 766 |
- dataType:'json', |
|
| 767 |
- processData: false, |
|
| 768 |
- contentType: false, |
|
| 769 |
- cache: false, |
|
| 770 |
- timeout: 600000, |
|
| 771 |
- success: function (returnData, status) {
|
|
| 772 |
- if(status == 'success'){
|
|
| 773 |
- for(var i = 0 ; i < returnData.boardMasterList.length ; i++){
|
|
| 774 |
- add_line(returnData.boardMasterList[i]); |
|
| 775 |
- } |
|
| 776 |
- }else{
|
|
| 777 |
- alert("등록에 실패하였습니다.");
|
|
| 778 |
- } |
|
| 779 |
- }, |
|
| 780 |
- error: function (e) {
|
|
| 781 |
- console.log("ERROR : ", e);
|
|
| 782 |
- alert("등록에 실패하였습니다.");
|
|
| 783 |
- } |
|
| 784 |
- }); |
|
| 785 |
- |
|
| 786 |
- |
|
| 787 |
- |
|
| 788 |
-} |
|
| 621 |
+ function onkeyContentName(event){
|
|
| 622 |
+ var tempContentUrl = "/web/content.do?proFn=" ; |
|
| 623 |
+ if($("#menuType option:selected").val()=="C"){
|
|
| 624 |
+ $("#url").val(tempContentUrl + $("#progrmFileNm").val()) ;
|
|
| 625 |
+ } |
|
| 626 |
+ } |
|
| 789 | 627 |
|
| 790 |
-</script> |
|
| 791 |
-<title>메뉴관리</title> |
|
| 628 |
+ |
|
| 629 |
+ |
|
| 630 |
+ //행추가 |
|
| 631 |
+ function add_line(bbsInfo){
|
|
| 632 |
+ var eva_temp_tr = $('#temp_tr').clone();
|
|
| 633 |
+ $('#tbl_bbsId').append(eva_temp_tr);
|
|
| 634 |
+ eva_temp_tr.attr('id' , 'tr_bbs').attr('class' , 'tr_item');
|
|
| 635 |
+ { //변수 변경
|
|
| 636 |
+ var tr_item_length = $('.tr_item').size()-1 ;
|
|
| 637 |
+ eva_temp_tr.find("#temp_bbsTxt").attr('name', eva_temp_tr.find("#temp_bbsTxt").attr('name').replace('[]' , '['+tr_item_length+']' )) ;
|
|
| 638 |
+ eva_temp_tr.find("#temp_bbsTxt").attr('id' , 'bbsTxt_'+tr_item_length) ;
|
|
| 639 |
+ eva_temp_tr.find("#temp_bbsIds").attr('name', eva_temp_tr.find("#temp_bbsIds").attr('name').replace('[]' , '['+tr_item_length+']' )) ;
|
|
| 640 |
+ eva_temp_tr.find("#temp_bbsIds").attr('id' , 'menuAdd_'+tr_item_length) ;
|
|
| 641 |
+ eva_temp_tr.find("#temp_bbsSorts").attr('name' , eva_temp_tr.find("#temp_bbsSorts").attr('name').replace('[]' , '['+tr_item_length+']' ) ) ;
|
|
| 642 |
+ eva_temp_tr.find("#temp_bbsSorts").attr('id' , 'bbsSorts_'+tr_item_length) ;
|
|
| 643 |
+ eva_temp_tr.find("#menuAdd").attr('value' , 'menuAdd_'+tr_item_length ) ;
|
|
| 644 |
+ } |
|
| 645 |
+ if(null != bbsInfo){
|
|
| 646 |
+ $('#bbsTxt_'+tr_item_length).val(bbsInfo.bbsNm);
|
|
| 647 |
+ $('#bbsSorts_'+tr_item_length).val(bbsInfo.bbsSort);
|
|
| 648 |
+ $('#menuAdd_'+tr_item_length).val(bbsInfo.bbsId);
|
|
| 649 |
+ |
|
| 650 |
+ } |
|
| 651 |
+ } |
|
| 652 |
+ |
|
| 653 |
+ //삭제시 배열 초기화 |
|
| 654 |
+ var arrCd = new Array(); |
|
| 655 |
+ function set_count(){ //tr 세팅
|
|
| 656 |
+ $('.tr_item').each(function(index, item){
|
|
| 657 |
+ $(this).find('input[name^=bbsTxt]').attr('name', 'bbsTxt['+index+']' ).attr('id' , 'bbsTxt_'+index ) ;
|
|
| 658 |
+ $(this).find('input[name^=bbsSorts]').attr('name', 'bbsSorts['+index+']' );
|
|
| 659 |
+ $(this).find('input[name^=bbsIds]').attr('name', 'bbsIds['+index+']' ).attr('id' , 'menuAdd_'+index ) ;
|
|
| 660 |
+ $(this).find('#menuAdd').attr('value' , 'menuAdd_'+index) ;
|
|
| 661 |
+ }); |
|
| 662 |
+ } |
|
| 663 |
+ |
|
| 664 |
+ var arrDel = new Array; //1차배열 |
|
| 665 |
+ function delete_line(obj){
|
|
| 666 |
+ $(obj).parent().parent().remove(); |
|
| 667 |
+ set_count(); |
|
| 668 |
+ } |
|
| 669 |
+ |
|
| 670 |
+ function save_line() {
|
|
| 671 |
+ /* if(0== $('.tr_item').size()){
|
|
| 672 |
+ alert("선택된 게시판이 없습니다.");
|
|
| 673 |
+ return; |
|
| 674 |
+ } */ |
|
| 675 |
+ |
|
| 676 |
+ //빈 게시판 방지 |
|
| 677 |
+ var blank_tr = false; |
|
| 678 |
+ var blank_sort = false; |
|
| 679 |
+ $('.tr_item').each(function() {
|
|
| 680 |
+ if(""==$(this).find('input[name^=bbsTxt]').val()){
|
|
| 681 |
+ blank_tr = true; |
|
| 682 |
+ } |
|
| 683 |
+ |
|
| 684 |
+ if(""==$(this).find('input[name^=bbsSort]').val()){
|
|
| 685 |
+ blank_sort = true; |
|
| 686 |
+ } |
|
| 687 |
+ |
|
| 688 |
+ }); |
|
| 689 |
+ if(blank_tr) {
|
|
| 690 |
+ alert("비어 있는 게시판이 있습니다.");
|
|
| 691 |
+ return false; |
|
| 692 |
+ } |
|
| 693 |
+ if(blank_sort) {
|
|
| 694 |
+ alert("게시판 순서를 넣어주세요.");
|
|
| 695 |
+ return false; |
|
| 696 |
+ } |
|
| 697 |
+ |
|
| 698 |
+ var save_line_return = false; |
|
| 699 |
+ var frm = document.menuForm; |
|
| 700 |
+ var data = new FormData(frm); |
|
| 701 |
+ $.ajax({
|
|
| 702 |
+ type: "POST", |
|
| 703 |
+ url: "/sym/mnu/mcm/MenuBbsInsertAjax.do", |
|
| 704 |
+ data: data, |
|
| 705 |
+ dataType:'json', |
|
| 706 |
+ processData: false, |
|
| 707 |
+ contentType: false, |
|
| 708 |
+ async: false, |
|
| 709 |
+ cache: false, |
|
| 710 |
+ timeout: 600000, |
|
| 711 |
+ success: function (returnData, status) {
|
|
| 712 |
+ if(status == 'success'){
|
|
| 713 |
+ if(returnData.status == 'fail'){
|
|
| 714 |
+ alert("게시판 등록 실패하였습니다.");
|
|
| 715 |
+ }else if(returnData.status == 'auth_fail'){
|
|
| 716 |
+ alert("세션이 종료되었습니다.");
|
|
| 717 |
+ }else if(returnData.status =='success'){
|
|
| 718 |
+ //alert("등록되었습니다.");
|
|
| 719 |
+ save_line_return = true; |
|
| 720 |
+ } |
|
| 721 |
+ }else{
|
|
| 722 |
+ alert("등록에 실패하였습니다.");
|
|
| 723 |
+ return false; |
|
| 724 |
+ } |
|
| 725 |
+ }, |
|
| 726 |
+ error: function (e) {
|
|
| 727 |
+ console.log("ERROR : ", e);
|
|
| 728 |
+ alert("등록에 실패하였습니다.");
|
|
| 729 |
+ } |
|
| 730 |
+ }); |
|
| 731 |
+ return save_line_return; |
|
| 732 |
+ } |
|
| 733 |
+ |
|
| 734 |
+ function htmlComfirm(progrmHtmlFileId) {
|
|
| 735 |
+ $.ajax({
|
|
| 736 |
+ type: "POST", |
|
| 737 |
+ url: "/sym/mnu/mcm/HtmlComfirmAjax.do", |
|
| 738 |
+ data:{
|
|
| 739 |
+ "cntId": progrmHtmlFileId |
|
| 740 |
+ }, |
|
| 741 |
+ dataType:'json', |
|
| 742 |
+ timeout: 600000, |
|
| 743 |
+ success: function (returnData, status) {
|
|
| 744 |
+ if(status == 'success'){
|
|
| 745 |
+ console.log("sdfsdf");
|
|
| 746 |
+ window.open("/uss/ion/cnt/cntManageInsert.do?cntId="+returnData.cntManageVO.cntId+"&cntDtId="+returnData.cntManageVO.cntDtId);
|
|
| 747 |
+ }else{
|
|
| 748 |
+ //alert("등록에 실패하였습니다.");
|
|
| 749 |
+ return false; |
|
| 750 |
+ } |
|
| 751 |
+ }, |
|
| 752 |
+ error: function (e) {
|
|
| 753 |
+ console.log("ERROR : ", e);
|
|
| 754 |
+ alert("등록에 실패하였습니다.");
|
|
| 755 |
+ } |
|
| 756 |
+ }); |
|
| 757 |
+ } |
|
| 758 |
+ |
|
| 759 |
+ function set_bbs(){
|
|
| 760 |
+ var frm = document.menuForm; |
|
| 761 |
+ var data = new FormData(frm); |
|
| 762 |
+ $.ajax({
|
|
| 763 |
+ type: "POST", |
|
| 764 |
+ url: "/sym/mnu/mcm/MenuBbsSelectAjax.do", |
|
| 765 |
+ data: data, |
|
| 766 |
+ dataType:'json', |
|
| 767 |
+ processData: false, |
|
| 768 |
+ contentType: false, |
|
| 769 |
+ cache: false, |
|
| 770 |
+ timeout: 600000, |
|
| 771 |
+ success: function (returnData, status) {
|
|
| 772 |
+ if(status == 'success'){
|
|
| 773 |
+ for(var i = 0 ; i < returnData.boardMasterList.length ; i++){
|
|
| 774 |
+ add_line(returnData.boardMasterList[i]); |
|
| 775 |
+ } |
|
| 776 |
+ }else{
|
|
| 777 |
+ alert("등록에 실패하였습니다.");
|
|
| 778 |
+ } |
|
| 779 |
+ }, |
|
| 780 |
+ error: function (e) {
|
|
| 781 |
+ console.log("ERROR : ", e);
|
|
| 782 |
+ alert("등록에 실패하였습니다.");
|
|
| 783 |
+ } |
|
| 784 |
+ }); |
|
| 785 |
+ |
|
| 786 |
+ |
|
| 787 |
+ |
|
| 788 |
+ } |
|
| 789 |
+ |
|
| 790 |
+ </script> |
|
| 791 |
+ <title>메뉴관리</title> |
|
| 792 | 792 |
</head> |
| 793 | 793 |
<body> |
| 794 |
- <div class="contWrap"> |
|
| 795 |
- <form name="searchForm" method="get" action="<c:url value='/sym/mnu/mcm/EgovMenuCreatSelectJtree.do'/>" > |
|
| 796 |
- <input name="authorCode" type="hidden" value="ROLE_ADMIN" /> |
|
| 797 |
- <input name="seCd" type="hidden" value="" /> |
|
| 798 |
- <input name="searchNm" type="hidden" value="" /> |
|
| 799 |
- </form> |
|
| 800 |
- <form name="menuForm" id="menuForm" > |
|
| 801 |
- |
|
| 794 |
+<div class="contWrap"> |
|
| 795 |
+ <form name="searchForm" method="get" action="<c:url value='/sym/mnu/mcm/EgovMenuCreatSelectJtree.do'/>" > |
|
| 796 |
+ <input name="authorCode" type="hidden" value="ROLE_ADMIN" /> |
|
| 797 |
+ <input name="seCd" type="hidden" value="" /> |
|
| 798 |
+ <input name="searchNm" type="hidden" value="" /> |
|
| 799 |
+ </form> |
|
| 800 |
+ <form name="menuForm" id="menuForm" > |
|
| 801 |
+ |
|
| 802 | 802 |
<input type="hidden" id="existChildNode" name="existChildNode" value="N" /> |
| 803 | 803 |
<input type="hidden" name="emplyrId" id="emplyrId" /><!-- 담당자ID --> |
| 804 |
- |
|
| 804 |
+ |
|
| 805 | 805 |
<div class="pageTitle"> |
| 806 | 806 |
<div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> |
| 807 | 807 |
<h2 class="titType1 c_222222 fwBold">메뉴관리</h2> |
... | ... | @@ -812,10 +812,10 @@ |
| 812 | 812 |
</div> |
| 813 | 813 |
<div class="pageCont"> |
| 814 | 814 |
<div class="selectWrap"> |
| 815 |
- <select name="authorCode" id="authorCode" class="select" onchange="jstreeRefresh(); return false;" title="검색조건선택"> |
|
| 816 |
- <option value='ROLE_ANONYMOUS' <c:if test="${menuCreatVO.authorCode == 'ROLE_ANONYMOUS' || empty menuCreatVO.authorCode }">selected</c:if>>사용자</option>
|
|
| 817 |
- <option value='ROLE_ADMIN' <c:if test="${menuCreatVO.authorCode == 'ROLE_ADMIN' }">selected</c:if>>관리자</option>
|
|
| 818 |
- </select> |
|
| 815 |
+ <select name="authorCode" id="authorCode" class="select" onchange="jstreeRefresh(); return false;" title="검색조건선택"> |
|
| 816 |
+ <option value='ROLE_ANONYMOUS' <c:if test="${menuCreatVO.authorCode == 'ROLE_ANONYMOUS' || empty menuCreatVO.authorCode }">selected</c:if>>사용자</option>
|
|
| 817 |
+ <option value='ROLE_ADMIN' <c:if test="${menuCreatVO.authorCode == 'ROLE_ADMIN' }">selected</c:if>>관리자</option>
|
|
| 818 |
+ </select> |
|
| 819 | 819 |
</div> |
| 820 | 820 |
|
| 821 | 821 |
<div class="orgWrap"> |
... | ... | @@ -836,48 +836,48 @@ |
| 836 | 836 |
<col style="width: 80%"> |
| 837 | 837 |
</colgroup> |
| 838 | 838 |
<tbody> |
| 839 |
- <tr> |
|
| 840 |
- <th><span>메뉴번호</span></th> |
|
| 841 |
- <td> |
|
| 842 |
- <div id="select_part"> |
|
| 843 |
- <input type="text" name="menuNo" id="menuNo" /> |
|
| 844 |
- <input type="hidden" id="tmp_Id" name="tmp_Id"/><!-- 이전메뉴 No --> |
|
| 845 |
- </div> |
|
| 846 |
- </td> |
|
| 847 |
- </tr> |
|
| 848 |
- <tr> |
|
| 849 |
- <th><span>메뉴명</span></th> |
|
| 850 |
- <td> |
|
| 851 |
- <input type="text" name="menuNm" id="menuNm" /> |
|
| 852 |
- <input type="hidden" id="tmp_Name" name="tmp_Name"/><!-- 이전메뉴 이름 --> |
|
| 853 |
- </td> |
|
| 854 |
- </tr> |
|
| 855 |
- <tr> |
|
| 856 |
- <th><span>타입</span></th> |
|
| 857 |
- <td> |
|
| 858 |
- <select name="menuType" id="menuType" title="" onchange="initShowUrl('N'); return false;">
|
|
| 859 |
- <option value="M" <c:if test="${userSearchVO.menuType == 'M'}">selected="selected"</c:if> >메뉴</option>
|
|
| 860 |
- <option value="P" <c:if test="${userSearchVO.menuType == 'P'}">selected="selected"</c:if> >프로그램</option>
|
|
| 861 |
- <option value="C" <c:if test="${userSearchVO.menuType == 'C'}">selected="selected"</c:if> >HTML컨텐츠</option>
|
|
| 862 |
- <option value="B" <c:if test="${userSearchVO.menuType == 'B'}">selected="selected"</c:if> >게시판</option>
|
|
| 863 |
- <option value="O" <c:if test="${userSearchVO.menuType == 'O'}">selected="selected"</c:if> >외부링크</option>
|
|
| 864 |
- </select> |
|
| 865 |
- <span> |
|
| 866 |
- |
|
| 839 |
+ <tr> |
|
| 840 |
+ <th><span>메뉴번호</span></th> |
|
| 841 |
+ <td> |
|
| 842 |
+ <div id="select_part"> |
|
| 843 |
+ <input type="text" name="menuNo" id="menuNo" /> |
|
| 844 |
+ <input type="hidden" id="tmp_Id" name="tmp_Id"/><!-- 이전메뉴 No --> |
|
| 845 |
+ </div> |
|
| 846 |
+ </td> |
|
| 847 |
+ </tr> |
|
| 848 |
+ <tr> |
|
| 849 |
+ <th><span>메뉴명</span></th> |
|
| 850 |
+ <td> |
|
| 851 |
+ <input type="text" name="menuNm" id="menuNm" /> |
|
| 852 |
+ <input type="hidden" id="tmp_Name" name="tmp_Name"/><!-- 이전메뉴 이름 --> |
|
| 853 |
+ </td> |
|
| 854 |
+ </tr> |
|
| 855 |
+ <tr> |
|
| 856 |
+ <th><span>타입</span></th> |
|
| 857 |
+ <td> |
|
| 858 |
+ <select name="menuType" id="menuType" title="" onchange="initShowUrl('N'); return false;">
|
|
| 859 |
+ <option value="M" <c:if test="${userSearchVO.menuType == 'M'}">selected="selected"</c:if> >메뉴</option>
|
|
| 860 |
+ <option value="P" <c:if test="${userSearchVO.menuType == 'P'}">selected="selected"</c:if> >프로그램</option>
|
|
| 861 |
+ <option value="C" <c:if test="${userSearchVO.menuType == 'C'}">selected="selected"</c:if> >HTML컨텐츠</option>
|
|
| 862 |
+ <option value="B" <c:if test="${userSearchVO.menuType == 'B'}">selected="selected"</c:if> >게시판</option>
|
|
| 863 |
+ <option value="O" <c:if test="${userSearchVO.menuType == 'O'}">selected="selected"</c:if> >외부링크</option>
|
|
| 864 |
+ </select> |
|
| 865 |
+ <span> |
|
| 866 |
+ |
|
| 867 | 867 |
<a style="display: none;cursor:pointer;" id="btnContent" |
| 868 |
- target="_blank" title="새창으로" onclick="javascript:searchContentList(); return false;" |
|
| 869 |
- style="selector-dummy:expression(this.hideFocus=false);" > |
|
| 868 |
+ target="_blank" title="새창으로" onclick="javascript:searchContentList(); return false;" |
|
| 869 |
+ style="selector-dummy:expression(this.hideFocus=false);" > |
|
| 870 | 870 |
<img src="<c:url value='/img/post/serch_img.png' />" alt='컨텐츠ID 검색' width="15" height="15" /> |
| 871 | 871 |
<span style="vertical-align: middle;">(화면컨텐츠ID 검색)</span> |
| 872 | 872 |
</a> |
| 873 | 873 |
<span style="display: none;cursor:pointer;padding-left:30px;vertical-align:middle;" id="htmlComfirm"> |
| 874 | 874 |
<a href="#" onclick="htmlComfirm();" id="a_contentLink">확인</a> |
| 875 | 875 |
</span> |
| 876 |
- |
|
| 876 |
+ |
|
| 877 | 877 |
<span id="contentNameSpan" style="color: blue"></span> |
| 878 |
- <a style="display: none;cursor:pointer;" id="btnBBS" |
|
| 879 |
- target="_blank" title="새창으로" onclick="javascript:searchBBSId(); return false;" |
|
| 880 |
- style="selector-dummy:expression(this.hideFocus=false);" > |
|
| 878 |
+ <a style="display: none;cursor:pointer;" id="btnBBS" |
|
| 879 |
+ target="_blank" title="새창으로" onclick="javascript:searchBBSId(); return false;" |
|
| 880 |
+ style="selector-dummy:expression(this.hideFocus=false);" > |
|
| 881 | 881 |
<img src="<c:url value='/img/post/serch_img.png' />" alt='게시판ID 검색' width="15" height="15" /> |
| 882 | 882 |
<span style="vertical-align: middle;">(게시판ID 검색)</span> |
| 883 | 883 |
</a> |
... | ... | @@ -887,82 +887,82 @@ |
| 887 | 887 |
URL <input type="text" name="url" id="url"/> |
| 888 | 888 |
<input type="hidden" id="url_tmp" name="url_tmp"/> |
| 889 | 889 |
</span> |
| 890 |
- </td> |
|
| 891 |
- </tr> |
|
| 892 |
- <tr> |
|
| 893 |
- <th><span>상위메뉴번호</span></th> |
|
| 894 |
- <td> |
|
| 895 |
- <span id="upperMenuIdText"></span> |
|
| 896 |
- <input type="hidden" id="upperMenuId" name="upperMenuId"/> |
|
| 897 |
- </td> |
|
| 898 |
- </tr> |
|
| 899 |
- <tr> |
|
| 900 |
- <th><span>프로그램파일명</span></th> |
|
| 901 |
- <td> |
|
| 902 |
- <input type="text" name="progrmFileNm" id="progrmFileNm" readonly="readonly" onkeyup="onkeyContentName(event);" /> |
|
| 903 |
- <input type="hidden" name="progrmHtmlFileId" id="progrmHtmlFileId" /> |
|
| 904 |
- <input type="hidden" name="progrmBbsId" id="progrmBbsId" /> |
|
| 905 |
- <input type="hidden" name="progrmFileNm_tmp" id="progrmFileNm_tmp" /> |
|
| 906 |
- </td> |
|
| 907 |
- </tr> |
|
| 908 |
- <tr> |
|
| 909 |
- <th><span>메뉴경로</span></th> |
|
| 910 |
- <td> |
|
| 890 |
+ </td> |
|
| 891 |
+ </tr> |
|
| 892 |
+ <tr> |
|
| 893 |
+ <th><span>상위메뉴번호</span></th> |
|
| 894 |
+ <td> |
|
| 895 |
+ <span id="upperMenuIdText"></span> |
|
| 896 |
+ <input type="hidden" id="upperMenuId" name="upperMenuId"/> |
|
| 897 |
+ </td> |
|
| 898 |
+ </tr> |
|
| 899 |
+ <tr> |
|
| 900 |
+ <th><span>프로그램파일명</span></th> |
|
| 901 |
+ <td> |
|
| 902 |
+ <input type="text" name="progrmFileNm" id="progrmFileNm" readonly="readonly" onkeyup="onkeyContentName(event);" /> |
|
| 903 |
+ <input type="hidden" name="progrmHtmlFileId" id="progrmHtmlFileId" /> |
|
| 904 |
+ <input type="hidden" name="progrmBbsId" id="progrmBbsId" /> |
|
| 905 |
+ <input type="hidden" name="progrmFileNm_tmp" id="progrmFileNm_tmp" /> |
|
| 906 |
+ </td> |
|
| 907 |
+ </tr> |
|
| 908 |
+ <tr> |
|
| 909 |
+ <th><span>메뉴경로</span></th> |
|
| 910 |
+ <td> |
|
| 911 | 911 |
<span id="menuCours"> |
| 912 | 912 |
</span> |
| 913 |
- </td> |
|
| 914 |
- </tr> |
|
| 915 |
- <tr> |
|
| 916 |
- <th><span>메뉴순서</span></th> |
|
| 917 |
- <td> |
|
| 918 |
- <input type="text" name="menuOrdr" id="menuOrdr" /> |
|
| 919 |
- </td> |
|
| 920 |
- </tr> |
|
| 921 |
- <tr> |
|
| 922 |
- <th><span>매뉴노출</span></th> |
|
| 923 |
- <td> |
|
| 924 |
- <select name="useYn" id="useYn" title="" > |
|
| 925 |
- <option value="Y" <c:if test="${userSearchVO.useYn == 'Y'}">selected="selected"</c:if> >사용</option>
|
|
| 926 |
- <option value="N" <c:if test="${userSearchVO.useYn == 'N'}">selected="selected"</c:if> >미사용</option>
|
|
| 927 |
- </select> |
|
| 928 |
- </td> |
|
| 929 |
- </tr> |
|
| 930 |
- <c:if test="${menuManageVO.authorCode == 'ROLE_ANONYMOUS'}">
|
|
| 913 |
+ </td> |
|
| 914 |
+ </tr> |
|
| 915 |
+ <tr> |
|
| 916 |
+ <th><span>메뉴순서</span></th> |
|
| 917 |
+ <td> |
|
| 918 |
+ <input type="text" name="menuOrdr" id="menuOrdr" /> |
|
| 919 |
+ </td> |
|
| 920 |
+ </tr> |
|
| 921 |
+ <tr> |
|
| 922 |
+ <th><span>매뉴노출</span></th> |
|
| 923 |
+ <td> |
|
| 924 |
+ <select name="useYn" id="useYn" title="" > |
|
| 925 |
+ <option value="Y" <c:if test="${userSearchVO.useYn == 'Y'}">selected="selected"</c:if> >사용</option>
|
|
| 926 |
+ <option value="N" <c:if test="${userSearchVO.useYn == 'N'}">selected="selected"</c:if> >미사용</option>
|
|
| 927 |
+ </select> |
|
| 928 |
+ </td> |
|
| 929 |
+ </tr> |
|
| 930 |
+ <c:if test="${menuManageVO.authorCode == 'ROLE_ANONYMOUS'}">
|
|
| 931 | 931 |
<tr id="satisTr"> |
| 932 | 932 |
<th><span>만족도 평가</span></th> |
| 933 | 933 |
<td> |
| 934 | 934 |
<select name="satisYn" id="satisYn" title="" > |
| 935 |
- <option value="Y" <c:if test="${userSearchVO.satisYn == 'Y'}">selected="selected"</c:if> >사용</option>
|
|
| 936 |
- <option value="N" <c:if test="${userSearchVO.satisYn == 'N'}">selected="selected"</c:if> >미사용</option>
|
|
| 935 |
+ <option value="Y" <c:if test="${userSearchVO.satisYn == 'Y'}">selected="selected"</c:if> >사용</option>
|
|
| 936 |
+ <option value="N" <c:if test="${userSearchVO.satisYn == 'N'}">selected="selected"</c:if> >미사용</option>
|
|
| 937 | 937 |
</select> |
| 938 | 938 |
</td> |
| 939 | 939 |
</tr> |
| 940 |
- </c:if> |
|
| 941 |
- |
|
| 942 |
- <%-- <tr> |
|
| 943 |
- <th><span>담당자</span></th> |
|
| 944 |
- <td> |
|
| 945 |
- <input type="text" name="emplyrIdTxt" id="emplyrIdTxt" style="width:4%;" readonly="readonly"/> |
|
| 946 |
- <a id="btnContent" style="cursor:pointer;" |
|
| 947 |
- target="_blank" title="새창으로" onclick="javascript:searchManageMenuList(); return false;" |
|
| 948 |
- style="selector-dummy:expression(this.hideFocus=false);" > |
|
| 949 |
- <img src="<c:url value='/img/post/serch_img.png' />" alt='게시판ID 검색' width="15" height="15" /> |
|
| 950 |
- <span style="vertical-align: middle;">담당자 검색</span> |
|
| 951 |
- </a> |
|
| 952 |
- </td> |
|
| 953 |
- </tr> --%> |
|
| 954 |
- |
|
| 955 |
- <tr id="tr_add_bbs" style="display:none;"> |
|
| 956 |
- <th><span>추가게시판</span></th> |
|
| 957 |
- <td> |
|
| 958 |
- <div class="add_line"> |
|
| 959 |
- <input type="button" value="추가" onclick="add_line();"> |
|
| 960 |
- </div> |
|
| 961 |
- <table id="tbl_bbsId"> |
|
| 962 |
- </table> |
|
| 963 |
- </td> |
|
| 964 |
- </tr> |
|
| 965 |
- |
|
| 940 |
+ </c:if> |
|
| 941 |
+ |
|
| 942 |
+ <%-- <tr> |
|
| 943 |
+ <th><span>담당자</span></th> |
|
| 944 |
+ <td> |
|
| 945 |
+ <input type="text" name="emplyrIdTxt" id="emplyrIdTxt" style="width:4%;" readonly="readonly"/> |
|
| 946 |
+ <a id="btnContent" style="cursor:pointer;" |
|
| 947 |
+ target="_blank" title="새창으로" onclick="javascript:searchManageMenuList(); return false;" |
|
| 948 |
+ style="selector-dummy:expression(this.hideFocus=false);" > |
|
| 949 |
+ <img src="<c:url value='/img/post/serch_img.png' />" alt='게시판ID 검색' width="15" height="15" /> |
|
| 950 |
+ <span style="vertical-align: middle;">담당자 검색</span> |
|
| 951 |
+ </a> |
|
| 952 |
+ </td> |
|
| 953 |
+ </tr> --%> |
|
| 954 |
+ |
|
| 955 |
+ <tr id="tr_add_bbs" style="display:none;"> |
|
| 956 |
+ <th><span>추가게시판</span></th> |
|
| 957 |
+ <td> |
|
| 958 |
+ <div class="add_line"> |
|
| 959 |
+ <input type="button" value="추가" onclick="add_line();"> |
|
| 960 |
+ </div> |
|
| 961 |
+ <table id="tbl_bbsId"> |
|
| 962 |
+ </table> |
|
| 963 |
+ </td> |
|
| 964 |
+ </tr> |
|
| 965 |
+ |
|
| 966 | 966 |
</tbody> |
| 967 | 967 |
</table> |
| 968 | 968 |
</div> |
... | ... | @@ -972,22 +972,22 @@ |
| 972 | 972 |
|
| 973 | 973 |
</div> |
| 974 | 974 |
</div> |
| 975 |
- </form> |
|
| 976 |
- </div> |
|
| 977 |
- |
|
| 978 |
- <table id="eva_temp_table" style="display:none"> |
|
| 979 |
- <tr id="temp_tr"> |
|
| 980 |
- <td> |
|
| 981 |
- 게시판<input type="text" name="bbsTxt[]" id="temp_bbsTxt" style="width:4%;" readonly="readonly"> |
|
| 982 |
- 순서<input type="text" name="bbsSorts[]" id="temp_bbsSorts" style="width:1%;" > |
|
| 983 |
- <input type="hidden" name="bbsIds[]" id="temp_bbsIds" style="width:4%;" readonly="readonly"> |
|
| 984 |
- <input type="button" value="삭제" onclick="delete_line(this);"> |
|
| 985 |
- <a id="menuAdd" value="bbsIds[]" style="cursor:pointer;" target="_blank" title="새창으로" onclick="javascript:searchBBSId(this); return false;"> |
|
| 986 |
- <img src="/img/post/serch_img.png" alt="게시판ID 검색" width="15" height="15"> |
|
| 987 |
- <span style="vertical-align: middle;">게시판 검색</span> |
|
| 988 |
- </a> |
|
| 989 |
- </td> |
|
| 990 |
- </tr> |
|
| 991 |
- </table> |
|
| 975 |
+ </form> |
|
| 976 |
+</div> |
|
| 977 |
+ |
|
| 978 |
+<table id="eva_temp_table" style="display:none"> |
|
| 979 |
+ <tr id="temp_tr"> |
|
| 980 |
+ <td> |
|
| 981 |
+ 게시판<input type="text" name="bbsTxt[]" id="temp_bbsTxt" style="width:4%;" readonly="readonly"> |
|
| 982 |
+ 순서<input type="text" name="bbsSorts[]" id="temp_bbsSorts" style="width:1%;" > |
|
| 983 |
+ <input type="hidden" name="bbsIds[]" id="temp_bbsIds" style="width:4%;" readonly="readonly"> |
|
| 984 |
+ <input type="button" value="삭제" onclick="delete_line(this);"> |
|
| 985 |
+ <a id="menuAdd" value="bbsIds[]" style="cursor:pointer;" target="_blank" title="새창으로" onclick="javascript:searchBBSId(this); return false;"> |
|
| 986 |
+ <img src="/img/post/serch_img.png" alt="게시판ID 검색" width="15" height="15"> |
|
| 987 |
+ <span style="vertical-align: middle;">게시판 검색</span> |
|
| 988 |
+ </a> |
|
| 989 |
+ </td> |
|
| 990 |
+ </tr> |
|
| 991 |
+</table> |
|
| 992 | 992 |
</body> |
| 993 | 993 |
</html>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/sym/site/authValidityTimeMng.jsp
... | ... | @@ -0,0 +1,78 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> | |
| 5 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 6 | +<%@ page import="itn.com.cmm.LoginVO"%> | |
| 7 | +<!DOCTYPE html> | |
| 8 | +<html> | |
| 9 | +<head> | |
| 10 | +<meta http-equiv="Content-Language" content="ko"> | |
| 11 | + | |
| 12 | +<title>로그인정책 목록조회</title> | |
| 13 | +<script type="text/javaScript" language="javascript" defer="defer"> | |
| 14 | +function fnUpdate(){ | |
| 15 | + let authValidtyTime = $('#selectAuthValidtyTime option:selected').val(); | |
| 16 | + $.ajax({ | |
| 17 | + url :"/sym/site/sessionTimeUpdateAjax.do" | |
| 18 | + ,type:"post" | |
| 19 | + ,data:{"sessionTimeCd":authValidtyTime} | |
| 20 | + ,dataType:"json" | |
| 21 | + ,success:function(data){ | |
| 22 | + alert("정상적으로 저장되었습니다."); | |
| 23 | + location.reload(); | |
| 24 | + } | |
| 25 | + ,error: function(){ | |
| 26 | + alert("에러발생"); | |
| 27 | + } | |
| 28 | + }); | |
| 29 | +} | |
| 30 | + | |
| 31 | +</script> | |
| 32 | +</head> | |
| 33 | +<body> | |
| 34 | +<noscript>자바스크립트를 지원하지 않는 브라우저에서는 일부 기능을 사용하실 수 없습니다.</noscript> | |
| 35 | +<form name="listForm" action="<c:url value='/sym/site/selectSiteManagerList.do'/>" method="post"> | |
| 36 | + <!-- cont --> | |
| 37 | + <div class="contWrap"> | |
| 38 | + <div class="pageTitle"> | |
| 39 | + <div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> | |
| 40 | + <h2 class="titType1 c_222222 fwBold">추가인증 유효시간 관리</h2> | |
| 41 | + <p class="tType6 c_999999">발신번호 추가인증의 유효시간을 설정할 수 있습니다.</p> | |
| 42 | + </div> | |
| 43 | + <div class="pageCont"> | |
| 44 | + <div class="tableWrap"> | |
| 45 | + <table class="tbType2"> | |
| 46 | + <colgroup> | |
| 47 | + <col width="20%"> | |
| 48 | + <col width="*"> | |
| 49 | + </colgroup> | |
| 50 | + <tbody> | |
| 51 | + <tr> | |
| 52 | + <th>추가인증 유효시간</th> | |
| 53 | + <td> | |
| 54 | + <c:forEach var="result" items="${sessionTimeList}" varStatus="status"> | |
| 55 | + <select name="selectAuthValidtyTime" id="selectAuthValidtyTime"> | |
| 56 | + <c:forEach var="sessionTimeCdList" items="${sessionTimeCdList}" varStatus="status"> | |
| 57 | + <option value="${sessionTimeCdList.code}" | |
| 58 | + <c:if test="${result.sessionTimeCd eq sessionTimeCdList.code}"> | |
| 59 | + selected | |
| 60 | + </c:if>>${sessionTimeCdList.codeNm}</option> | |
| 61 | + </c:forEach> | |
| 62 | + </select> ※ 권장 <span style="color: #0000FF;">4~8시간</span> (일과시간 기준) | |
| 63 | + <p class="tType7 c_999999" style="padding-top: 10px;">발신번호별 인증 시각을 기준으로 적용되며, 로그아웃·세션 만료 후 재로그인 시에는 다시 인증해야 합니다.</p> | |
| 64 | + </c:forEach> | |
| 65 | + </td> | |
| 66 | + </tr> | |
| 67 | + </tbody> | |
| 68 | + </table> | |
| 69 | + <div class="btnWrap"> | |
| 70 | + <input type="button" class="btnType1" value="수정" onclick="fnUpdate()"> | |
| 71 | + </div> | |
| 72 | + </div> | |
| 73 | + </div> | |
| 74 | + </div> | |
| 75 | + <!-- //cont --> | |
| 76 | +</form> | |
| 77 | +</body> | |
| 78 | +</html>(No newline at end of file) |
--- src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATModify.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATModify.jsp
... | ... | @@ -362,9 +362,17 @@ |
| 362 | 362 |
</td> |
| 363 | 363 |
</tr> |
| 364 | 364 |
<tr> |
| 365 |
+ <th><span class="reqArea">아이디</span></th> |
|
| 366 |
+ <td colspan="3"> |
|
| 367 |
+ <a href="#" onclick="javascript:fnSelectMber('<c:out value="${mjonKakaoATDetailVO.userId}"/>'); return false;">
|
|
| 368 |
+ <c:out value="${mjonKakaoATDetailVO.userId}"/>
|
|
| 369 |
+ </a> |
|
| 370 |
+ </td> |
|
| 371 |
+ </tr> |
|
| 372 |
+ <tr> |
|
| 365 | 373 |
<th><span class="reqArea">채널ID</span></th> |
| 366 | 374 |
<td colspan="3"> |
| 367 |
- <c:out value="${mjonKakaoATDetailVO.yellowId}"/>
|
|
| 375 |
+ <a href="/uss/ion/kakaoat/KakaoATChannelIDList.do" ><c:out value="${mjonKakaoATDetailVO.yellowId}"/></a>
|
|
| 368 | 376 |
</td> |
| 369 | 377 |
</tr> |
| 370 | 378 |
<!-- 알림톡,친구톡 템플릿 상세 팝업 호출 --> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/EmpPdfView.jsp
... | ... | @@ -0,0 +1,351 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<% | |
| 4 | + response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); | |
| 5 | + response.setHeader("Pragma", "no-cache"); | |
| 6 | + response.setDateHeader("Expires", 0); | |
| 7 | +%> | |
| 8 | +<!DOCTYPE html> | |
| 9 | +<html lang="ko"> | |
| 10 | +<head> | |
| 11 | + <meta charset="utf-8"> | |
| 12 | + <title>종사자 수 인증 증빙서류 미리보기</title> | |
| 13 | + <link rel="stylesheet" href="/pb/css/reset.css"> | |
| 14 | + <link rel="stylesheet" href="/pb/css/common.css"> | |
| 15 | + <link rel="stylesheet" href="/pb/css/content.css?date=202301160001"> | |
| 16 | + <link rel="stylesheet" href="/pb/css/popup.css"> | |
| 17 | + <script src="/pb/js/jquery-3.5.0.js"></script> | |
| 18 | + <script src="/js/pdfjs-3.11.174/build/pdf.js"></script> | |
| 19 | + <script>pdfjsLib.GlobalWorkerOptions.workerSrc = '/js/pdfjs-3.11.174/build/pdf.worker.js';</script> | |
| 20 | + <style>html { | |
| 21 | + overflow-x: hidden; | |
| 22 | + overflow-y: auto; | |
| 23 | + }</style> | |
| 24 | +</head> | |
| 25 | +<body> | |
| 26 | +<div class="pageCont" style="text-align: center; width: 1000px;"> | |
| 27 | + <div class="listTop" style="float: left; margin-top: 0; padding-top: 0;"> | |
| 28 | + <p class="tType5">종사자 수 인증 신청 정보</p> | |
| 29 | + </div> | |
| 30 | + <div class="tableWrap"> | |
| 31 | + <table class="tbType1"> | |
| 32 | + <colgroup> | |
| 33 | + <col style="width: 18%"> | |
| 34 | + <col style="width: 22%"> | |
| 35 | + <col style="width: 18%"> | |
| 36 | + <col style="width: 14%"> | |
| 37 | + <col style="width: 14%"> | |
| 38 | + <col style="width: 14%"> | |
| 39 | + </colgroup> | |
| 40 | + <thead> | |
| 41 | + <tr> | |
| 42 | + <th>아이디</th> | |
| 43 | + <th>기업명</th> | |
| 44 | + <th>사업자번호</th> | |
| 45 | + <th>대표자</th> | |
| 46 | + <th>신청 종사자 수</th> | |
| 47 | + <th>다운로드</th> | |
| 48 | + </tr> | |
| 49 | + </thead> | |
| 50 | + <tbody> | |
| 51 | + <tr> | |
| 52 | + <td><c:out value="${employeeCertVO.mberId}"/></td> | |
| 53 | + <td><c:out value="${employeeCertVO.mberNm}"/></td> | |
| 54 | + <td><c:out value="${employeeCertVO.bizNo}"/></td> | |
| 55 | + <td><c:out value="${employeeCertVO.managerNm}"/></td> | |
| 56 | + <td><c:out value="${empty employeeCertVO.applyCnt ? '-' : employeeCertVO.applyCnt}"/><c:if | |
| 57 | + test="${not empty employeeCertVO.applyCnt}">명</c:if> | |
| 58 | + </td> | |
| 59 | + <td> | |
| 60 | + <c:choose> | |
| 61 | + <c:when test="${not empty atchFileId}"> | |
| 62 | + <c:import url="/cmm/fms/selectMberFileInfs.do" charEncoding="utf-8"> | |
| 63 | + <c:param name="param_atchFileId" value="${atchFileId}"/> | |
| 64 | + </c:import> | |
| 65 | + </c:when> | |
| 66 | + <c:otherwise>-</c:otherwise> | |
| 67 | + </c:choose> | |
| 68 | + </td> | |
| 69 | + </tr> | |
| 70 | + </tbody> | |
| 71 | + </table> | |
| 72 | + </div> | |
| 73 | + | |
| 74 | + <br><br> | |
| 75 | + <div class="listTop" style="float: left; margin-top: 0; padding-top: 0;"> | |
| 76 | + <p class="tType5">승인에 필요한 서류</p> | |
| 77 | + </div> | |
| 78 | + <div class="tableWrap"> | |
| 79 | + <table class="tbType1"> | |
| 80 | + <colgroup> | |
| 81 | + <col style="width: 75%"> | |
| 82 | + <col style="width: 25%"> | |
| 83 | + </colgroup> | |
| 84 | + <tbody> | |
| 85 | + <tr> | |
| 86 | + <td class="left" style="padding: 10px 0; line-height: 1.8em;"> | |
| 87 | + 법인(기업) : 4대보험 사업장 가입자 명부, 임직원 명부, 조직도 중 1종<br> | |
| 88 | + ※ 사업장 전체 인원 수를 확인할 수 있어야 하며, 불필요한 개인정보는 마스킹 필요 | |
| 89 | + </td> | |
| 90 | + <td style="padding: 10px 0; vertical-align: middle;"> | |
| 91 | + <c:choose> | |
| 92 | + <c:when test="${employeeCertVO.authYn eq 'N' or employeeCertVO.authYn eq 'H'}"> | |
| 93 | + <button type="button" class="btnType1" style="background-color: #246ee9;" | |
| 94 | + onclick="return fnEmployeeCertApprove();">인증완료</button> | |
| 95 | + <button type="button" class="btnType1" id="btnReject" | |
| 96 | + onclick="return fnRejectAreaToggle();">반려 OPEN</button> | |
| 97 | + </c:when> | |
| 98 | + <c:when test="${employeeCertVO.authYn eq 'Y'}">인증완료</c:when> | |
| 99 | + <c:when test="${employeeCertVO.authYn eq 'C'}">반려</c:when> | |
| 100 | + </c:choose> | |
| 101 | + </td> | |
| 102 | + </tr> | |
| 103 | + </tbody> | |
| 104 | + </table> | |
| 105 | + </div> | |
| 106 | + | |
| 107 | + <div id="rejectArea" style="display: none;"> | |
| 108 | + <br><br> | |
| 109 | + <div class="listTop" style="float: left; margin-top: 0; padding-top: 0;"> | |
| 110 | + <p class="tType5">반려</p> | |
| 111 | + </div> | |
| 112 | + <div class="tableWrap"> | |
| 113 | + <form id="employeeCertRejectForm" method="post"> | |
| 114 | + <input type="hidden" name="employeeCertHstrySeq" | |
| 115 | + value="<c:out value='${employeeCertVO.employeeCertHstrySeq}'/>"/> | |
| 116 | + <input type="hidden" name="authYn" value="C"/> | |
| 117 | + <table class="tbType3"> | |
| 118 | + <colgroup> | |
| 119 | + <col style="width: 15%"> | |
| 120 | + <col style="width: 85%"> | |
| 121 | + </colgroup> | |
| 122 | + <tbody> | |
| 123 | + <tr> | |
| 124 | + <th>반려문구</th> | |
| 125 | + <td class="left"> | |
| 126 | + <select id="rejectCode" name="rejectCode" style="width: 89%;" | |
| 127 | + onchange="fnRejectReasonChange();"> | |
| 128 | + <option value="">선택</option> | |
| 129 | + <c:forEach var="code" items="${rejectCodeList}"> | |
| 130 | + <option value="<c:out value='${code.code}'/>" | |
| 131 | + data-reason="<c:out value='${code.codeDc}'/>"> | |
| 132 | + <c:out value="${code.codeNm}"/> | |
| 133 | + </option> | |
| 134 | + </c:forEach> | |
| 135 | + </select> | |
| 136 | + </td> | |
| 137 | + </tr> | |
| 138 | + <tr> | |
| 139 | + <th>반려사유</th> | |
| 140 | + <td class="left"> | |
| 141 | + <textarea id="rejectReason" name="rejectReason" maxlength="1000" | |
| 142 | + style="width: 87%; height: 160px;"></textarea> | |
| 143 | + </td> | |
| 144 | + </tr> | |
| 145 | + </tbody> | |
| 146 | + </table> | |
| 147 | + <div class="button_box" style="margin-top: 15px;"> | |
| 148 | + <button type="button" class="btnType btnType20" style="background-color: #246ee9;" | |
| 149 | + onclick="return fnEmployeeCertReject();">반려</button> | |
| 150 | + <button type="button" class="btnType btnType20" | |
| 151 | + onclick="return fnRejectAreaHide();">취소</button> | |
| 152 | + </div> | |
| 153 | + </form> | |
| 154 | + </div> | |
| 155 | + </div> | |
| 156 | + | |
| 157 | + <c:if test="${not empty fileList}"> | |
| 158 | + <div style="width: 100%; text-align: center; margin: 30px 0;"> | |
| 159 | + <c:forEach var="file" items="${fileList}" varStatus="status"> | |
| 160 | + <c:set var="buttonClass" value="btnType1"/> | |
| 161 | + <c:if test="${file.fileSn eq fileSn}"><c:set var="buttonClass" value="btnType2"/></c:if> | |
| 162 | + <button type="button" | |
| 163 | + class="<c:out value='${buttonClass}'/>" | |
| 164 | + onclick="return fnChangeFile('<c:out value='${file.atchFileId}'/>', '<c:out | |
| 165 | + value='${file.fileSn}'/>');"> | |
| 166 | + 첨부파일 <c:out value="${status.count}"/> | |
| 167 | + </button> | |
| 168 | + </c:forEach> | |
| 169 | + </div> | |
| 170 | + </c:if> | |
| 171 | + | |
| 172 | + <c:choose> | |
| 173 | + <c:when test="${empty selectedFile}"> | |
| 174 | + <div style="margin: 30px 0; color: red;">미리보기할 첨부파일을 찾을 수 없습니다.</div> | |
| 175 | + </c:when> | |
| 176 | + <c:otherwise> | |
| 177 | + <c:if test="${fileType eq 'etc'}"> | |
| 178 | + <div style="width: 100%; text-align: center; margin: 30px 0; color: red;">PDF 뷰어에서 지원하지 않는 형식의 파일입니다. | |
| 179 | + 첨부파일 다운로드 후 확인해 주세요. | |
| 180 | + </div> | |
| 181 | + </c:if> | |
| 182 | + <canvas id="the-canvas" | |
| 183 | + style="min-width: 600px; max-width: 1000px; margin-top: 25px; margin-bottom: 25px;"></canvas> | |
| 184 | + <div> | |
| 185 | + <button type="button" class="btnType" id="prev">Previous</button> | |
| 186 | + <span>Page: <span id="page_num"></span> / <span id="page_count"></span></span> | |
| 187 | + <button type="button" class="btnType" id="next">Next</button> | |
| 188 | + <a class="btnType" | |
| 189 | + href="<c:url value='/cmm/fms/FileDown.do'><c:param name='atchFileId' value='${selectedFile.atchFileId}'/><c:param name='fileSn' value='${selectedFile.fileSn}'/></c:url>">다운로드</a> | |
| 190 | + <div style="float: right; margin-right: 10px;"> | |
| 191 | + <button type="button" class="btnType" onclick="window.close();">CLOSE</button> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </c:otherwise> | |
| 195 | + </c:choose> | |
| 196 | +</div> | |
| 197 | + | |
| 198 | +<form id="pdfForm" method="post" action="<c:url value='/uss/ion/msg/EmpPdfView.do'/>"> | |
| 199 | + <input type="hidden" name="atchFileId" value="<c:out value='${atchFileId}'/>"/> | |
| 200 | + <input type="hidden" name="fileSn" value="<c:out value='${fileSn}'/>"/> | |
| 201 | + <input type="hidden" name="employeeCertHstrySeq" value="<c:out value='${employeeCertHstrySeq}'/>"/> | |
| 202 | +</form> | |
| 203 | + | |
| 204 | +<script> | |
| 205 | + function fnEmployeeCertApprove() { | |
| 206 | + if (!confirm('종사자 수 인증을 완료하시겠습니까?')) return false; | |
| 207 | + | |
| 208 | + $.ajax({ | |
| 209 | + type: 'POST', | |
| 210 | + url: '/uss/ion/msg/updateEmployeeAuth.do', | |
| 211 | + data: { | |
| 212 | + employeeCertHstrySeq: '<c:out value="${employeeCertVO.employeeCertHstrySeq}"/>', | |
| 213 | + authYn: 'Y' | |
| 214 | + }, | |
| 215 | + dataType: 'json', | |
| 216 | + success: function (data) { | |
| 217 | + alert(data.message || (data.success ? '처리되었습니다.' : '처리에 실패했습니다.')); | |
| 218 | + if (data.success) { | |
| 219 | + if (window.opener && !window.opener.closed) window.opener.location.reload(); | |
| 220 | + window.close(); | |
| 221 | + } | |
| 222 | + }, | |
| 223 | + error: function () { | |
| 224 | + alert('저장에 실패했습니다.'); | |
| 225 | + } | |
| 226 | + }); | |
| 227 | + return false; | |
| 228 | + } | |
| 229 | + | |
| 230 | + function fnRejectAreaToggle() { | |
| 231 | + if ($('#rejectArea').is(':visible')) return fnRejectAreaHide(); | |
| 232 | + $('#rejectArea').show(); | |
| 233 | + $('#btnReject').text('반려 CLOSE').removeClass('btnType1').addClass('btnType2'); | |
| 234 | + return false; | |
| 235 | + } | |
| 236 | + | |
| 237 | + function fnRejectAreaHide() { | |
| 238 | + $('#rejectArea').hide(); | |
| 239 | + $('#btnReject').text('반려 OPEN').removeClass('btnType2').addClass('btnType1'); | |
| 240 | + return false; | |
| 241 | + } | |
| 242 | + | |
| 243 | + function fnRejectReasonChange() { | |
| 244 | + var option = $('#rejectCode option:selected'); | |
| 245 | + $('#rejectReason').val(option.data('reason') || ''); | |
| 246 | + } | |
| 247 | + | |
| 248 | + function fnEmployeeCertReject() { | |
| 249 | + var rejectCode = $('#rejectCode'); | |
| 250 | + var rejectReason = $.trim($('#rejectReason').val()); | |
| 251 | + | |
| 252 | + if (!rejectCode.val()) { | |
| 253 | + alert('반려문구를 선택해 주세요.'); | |
| 254 | + rejectCode.focus(); | |
| 255 | + return false; | |
| 256 | + } | |
| 257 | + if (!rejectReason) { | |
| 258 | + alert('반려사유를 입력해 주세요.'); | |
| 259 | + $('#rejectReason').focus(); | |
| 260 | + return false; | |
| 261 | + } | |
| 262 | + if (!confirm('반려하시겠습니까?')) return false; | |
| 263 | + | |
| 264 | + $.ajax({ | |
| 265 | + type: 'POST', | |
| 266 | + url: '/uss/ion/msg/updateEmployeeAuth.do', | |
| 267 | + data: $('#employeeCertRejectForm').serialize(), | |
| 268 | + dataType: 'json', | |
| 269 | + success: function (data) { | |
| 270 | + alert(data.message || (data.success ? '처리되었습니다.' : '처리에 실패했습니다.')); | |
| 271 | + if (data.success) { | |
| 272 | + if (window.opener && !window.opener.closed) window.opener.location.reload(); | |
| 273 | + window.close(); | |
| 274 | + } | |
| 275 | + }, | |
| 276 | + error: function () { | |
| 277 | + alert('저장에 실패했습니다.'); | |
| 278 | + } | |
| 279 | + }); | |
| 280 | + return false; | |
| 281 | + } | |
| 282 | + | |
| 283 | + function fnChangeFile(atchFileId, fileSn) { | |
| 284 | + var form = document.getElementById('pdfForm'); | |
| 285 | + form.atchFileId.value = atchFileId; | |
| 286 | + form.fileSn.value = fileSn; | |
| 287 | + form.submit(); | |
| 288 | + return false; | |
| 289 | + } | |
| 290 | + | |
| 291 | + <c:if test="${not empty selectedFile}"> | |
| 292 | + (function () { | |
| 293 | + var pdfDoc = null; | |
| 294 | + var pageNum = 1; | |
| 295 | + var pageRendering = false; | |
| 296 | + var pageNumPending = null; | |
| 297 | + var scale = 1.4; | |
| 298 | + var canvas = document.getElementById('the-canvas'); | |
| 299 | + var context = canvas.getContext('2d'); | |
| 300 | + | |
| 301 | + function renderPage(num) { | |
| 302 | + pageRendering = true; | |
| 303 | + pdfDoc.getPage(num).then(function (page) { | |
| 304 | + var viewport = page.getViewport({scale: scale}); | |
| 305 | + canvas.height = viewport.height; | |
| 306 | + canvas.width = viewport.width; | |
| 307 | + return page.render({canvasContext: context, viewport: viewport}).promise; | |
| 308 | + }).then(function () { | |
| 309 | + pageRendering = false; | |
| 310 | + if (pageNumPending !== null) { | |
| 311 | + renderPage(pageNumPending); | |
| 312 | + pageNumPending = null; | |
| 313 | + } | |
| 314 | + }); | |
| 315 | + document.getElementById('page_num').textContent = num; | |
| 316 | + } | |
| 317 | + | |
| 318 | + function queueRenderPage(num) { | |
| 319 | + if (pageRendering) pageNumPending = num; | |
| 320 | + else renderPage(num); | |
| 321 | + } | |
| 322 | + | |
| 323 | + document.getElementById('prev').addEventListener('click', function () { | |
| 324 | + if (pageNum <= 1) return; | |
| 325 | + pageNum--; | |
| 326 | + queueRenderPage(pageNum); | |
| 327 | + }); | |
| 328 | + | |
| 329 | + document.getElementById('next').addEventListener('click', function () { | |
| 330 | + if (pageNum >= pdfDoc.numPages) return; | |
| 331 | + pageNum++; | |
| 332 | + queueRenderPage(pageNum); | |
| 333 | + }); | |
| 334 | + | |
| 335 | + var url = '${pdfPath}'; | |
| 336 | + pdfjsLib.getDocument(url).promise.then(function (loadedPdf) { | |
| 337 | + pdfDoc = loadedPdf; | |
| 338 | + document.getElementById('page_count').textContent = pdfDoc.numPages; | |
| 339 | + renderPage(pageNum); | |
| 340 | + }).catch(function () { | |
| 341 | + // canvas.style.display = 'none'; | |
| 342 | + // var message = document.createElement('div'); | |
| 343 | + // message.style.cssText = 'margin:30px 0;color:red;'; | |
| 344 | + // message.textContent = '파일을 미리 볼 수 없습니다. 다운로드해 확인해 주세요.'; | |
| 345 | + // canvas.parentNode.insertBefore(message, canvas); | |
| 346 | + }); | |
| 347 | + }()); | |
| 348 | + </c:if> | |
| 349 | +</script> | |
| 350 | +</body> | |
| 351 | +</html> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/EmployeeCertDetail.jsp
... | ... | @@ -0,0 +1,313 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> | |
| 4 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> | |
| 5 | +<body> | |
| 6 | +<script> | |
| 7 | + $(function () { | |
| 8 | + var rejectMessages = { | |
| 9 | + '02': '[문자온] 종사자 수 인증이 반려되었습니다. 첨부하신 서류로는 사업장 전체 인원 수를 확인할 수 없습니다. 인원이 확인되는 자료를 첨부(문자온 로그인-마이페이지-발신번호 관리-종사자 수 등록)하여 재신청해 주시면 빠른 심사 도와드리겠습니다.', | |
| 10 | + '03': '[문자온] 종사자 수 인증이 반려되었습니다. 첨부하신 서류는 인원 확인 자료로 인정되지 않습니다. “4대보험 사업장 가입자 명부”, “임직원 명부”, “조직도” 중 1종을 첨부(문자온 로그인-마이페이지-발신번호 관리-종사자 수 등록)하여 재신청해 주시면 빠른 심사 도와드리겠습니다.', | |
| 11 | + '04': '[문자온] 종사자 수 인증이 반려되었습니다. 신청하신 종사자 수와 증빙서류상 인원이 일치하지 않습니다. 증빙서류 기준 인원으로 재신청(문자온 로그인-마이페이지-발신번호 관리-종사자 수 등록)해 주시면 빠른 심사 도와드리겠습니다.', | |
| 12 | + '05': '[문자온] 종사자 수 인증이 반려되었습니다. 증빙서류의 사업자번호가 회원정보와 일치하지 않습니다. 가입하신 사업자번호 기준 서류를 첨부하여 재신청해 주시면 빠른 심사 도와드리겠습니다.' | |
| 13 | + }; | |
| 14 | + | |
| 15 | + toggleRejectArea(); | |
| 16 | + | |
| 17 | + $('#authYn').on('change', function () { | |
| 18 | + toggleRejectArea(); | |
| 19 | + }); | |
| 20 | + | |
| 21 | + $('#rejectCode').on('change', function () { | |
| 22 | + var rejectCode = $(this).val(); | |
| 23 | + | |
| 24 | + if (rejectCode === '01') { | |
| 25 | + $('#rejectReason').val('').focus(); | |
| 26 | + return; | |
| 27 | + } | |
| 28 | + | |
| 29 | + $('#rejectReason').val(rejectMessages[rejectCode] || ''); | |
| 30 | + }); | |
| 31 | + }); | |
| 32 | + | |
| 33 | + function toggleRejectArea() { | |
| 34 | + var isReject = $('#authYn').val() === 'C'; | |
| 35 | + | |
| 36 | + $('#rejectCode').prop('disabled', !isReject); | |
| 37 | + $('#rejectReason').prop('disabled', !isReject); | |
| 38 | + | |
| 39 | + if (!isReject) { | |
| 40 | + $('#rejectCode').val(''); | |
| 41 | + $('#rejectReason').val(''); | |
| 42 | + } | |
| 43 | + } | |
| 44 | + | |
| 45 | + function fnEmployeeCertUpdate() { | |
| 46 | + var authYn = $('#authYn').val(); | |
| 47 | + var rejectCode = $('#rejectCode').val(); | |
| 48 | + var rejectReason = $.trim($('#rejectReason').val()); | |
| 49 | + | |
| 50 | + if (authYn === 'C') { | |
| 51 | + if (!rejectCode) { | |
| 52 | + alert('반려문구를 선택해 주세요.'); | |
| 53 | + $('#rejectCode').focus(); | |
| 54 | + return false; | |
| 55 | + } | |
| 56 | + | |
| 57 | + if (!rejectReason) { | |
| 58 | + alert('반려사유를 입력해 주세요.'); | |
| 59 | + $('#rejectReason').focus(); | |
| 60 | + return false; | |
| 61 | + } | |
| 62 | + } | |
| 63 | + | |
| 64 | + if (!confirm('심사 내용을 수정하시겠습니까?')) return false; | |
| 65 | + | |
| 66 | + $.ajax({ | |
| 67 | + type: 'POST', | |
| 68 | + url: '/uss/ion/msg/updateEmployeeAuth.do', | |
| 69 | + data: { | |
| 70 | + employeeCertHstrySeq: "<c:out value='${employeeCertVO.employeeCertHstrySeq}'/>", | |
| 71 | + authYn: authYn, | |
| 72 | + rejectCode: rejectCode, | |
| 73 | + rejectReason: rejectReason | |
| 74 | + }, | |
| 75 | + dataType: 'json', | |
| 76 | + success: function (data) { | |
| 77 | + alert(data.message || (data.success ? '처리되었습니다.' : '처리에 실패했습니다.')); | |
| 78 | + if (data.success) location.reload(); | |
| 79 | + }, | |
| 80 | + error: function () { | |
| 81 | + alert('저장에 실패했습니다.'); | |
| 82 | + } | |
| 83 | + }); | |
| 84 | + | |
| 85 | + return false; | |
| 86 | + } | |
| 87 | +</script> | |
| 88 | +<div class="contWrap"> | |
| 89 | + <div class="pageTitle"> | |
| 90 | + <div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> | |
| 91 | + <h2 class="titType1 c_222222 fwBold">종사자 수 인증 심사 (상세)</h2> | |
| 92 | + <p class="tType6 c_999999">신청 내용과 증빙서류 및 기존 심사 이력을 확인할 수 있습니다.</p> | |
| 93 | + </div> | |
| 94 | + <div class="pageCont"> | |
| 95 | + <table class="tbType2"> | |
| 96 | + <tbody> | |
| 97 | + <tr> | |
| 98 | + <th>아이디</th> | |
| 99 | + <td><c:out value="${employeeCertVO.mberId}"/></td> | |
| 100 | + </tr> | |
| 101 | + <tr> | |
| 102 | + <th>기업명</th> | |
| 103 | + <td><c:out value="${employeeCertVO.mberNm}"/></td> | |
| 104 | + </tr> | |
| 105 | + <tr> | |
| 106 | + <th>사업자번호</th> | |
| 107 | + <td><c:out value="${employeeCertVO.bizNo}"/></td> | |
| 108 | + </tr> | |
| 109 | + <tr> | |
| 110 | + <th>대표자</th> | |
| 111 | + <td><c:out value="${employeeCertVO.managerNm}"/></td> | |
| 112 | + </tr> | |
| 113 | + <tr> | |
| 114 | + <th>현재 종사자 수</th> | |
| 115 | + <td> | |
| 116 | + <c:choose> | |
| 117 | + <c:when test="${empty employeeCertVO.certCnt}">-</c:when> | |
| 118 | + <c:otherwise><fmt:formatNumber value="${employeeCertVO.certCnt}" | |
| 119 | + pattern="#,###"/>명</c:otherwise> | |
| 120 | + </c:choose> | |
| 121 | + </td> | |
| 122 | + </tr> | |
| 123 | + <tr> | |
| 124 | + <th>신청 종사자 수</th> | |
| 125 | + <td><fmt:formatNumber value="${employeeCertVO.applyCnt}" pattern="#,###"/>명</td> | |
| 126 | + </tr> | |
| 127 | + <tr> | |
| 128 | + <th>심사상태</th> | |
| 129 | + <td> | |
| 130 | + <select name="authYn" id="authYn"> | |
| 131 | + <option value="Y" <c:if test="${employeeCertVO.authYn eq 'Y'}">selected</c:if>>인증완료</option> | |
| 132 | + <option value="C" <c:if test="${employeeCertVO.authYn eq 'C'}">selected</c:if>>반려</option> | |
| 133 | + </select> | |
| 134 | + </td> | |
| 135 | + </tr> | |
| 136 | + <tr> | |
| 137 | + <th>반려문구</th> | |
| 138 | + <td> | |
| 139 | + <select name="rejectCode" id="rejectCode" style="width: 20%"> | |
| 140 | + <option value="01" <c:if test="${employeeCertVO.rejectCode eq '01'}">selected</c:if>>직접입력</option> | |
| 141 | + <option value="02" <c:if test="${employeeCertVO.rejectCode eq '02'}">selected</c:if>>종사자 수 확인 | |
| 142 | + 불가 | |
| 143 | + </option> | |
| 144 | + <option value="03" <c:if test="${employeeCertVO.rejectCode eq '03'}">selected</c:if>>증빙서류 유형 | |
| 145 | + 부적합 | |
| 146 | + </option> | |
| 147 | + <option value="04" <c:if test="${employeeCertVO.rejectCode eq '04'}">selected</c:if>>신청 인원/증빙 | |
| 148 | + 불일치 | |
| 149 | + </option> | |
| 150 | + <option value="05" <c:if test="${employeeCertVO.rejectCode eq '05'}">selected</c:if>>사업자번호 불일치 | |
| 151 | + </option> | |
| 152 | + </select> | |
| 153 | + </td> | |
| 154 | + </tr> | |
| 155 | + <tr> | |
| 156 | + <th>반려사유</th> | |
| 157 | + <td> | |
| 158 | + <textarea style="width: 84% ; height: 250px" id="rejectReason" name="rejectReason"><c:out | |
| 159 | + value="${employeeCertVO.rejectReason}"/></textarea> | |
| 160 | + </td> | |
| 161 | + </tr> | |
| 162 | + | |
| 163 | + <tr> | |
| 164 | + <th>첨부파일</th> | |
| 165 | + <td class="upload_area"> | |
| 166 | + <div class="file_upload_box no_img_box fileWrap"> | |
| 167 | + <table> | |
| 168 | + <colgroup> | |
| 169 | + <col style="width:60%"> | |
| 170 | + <col style="width:10%"> | |
| 171 | + <col style="width:20%"> | |
| 172 | + <col style="width:10%"> | |
| 173 | + </colgroup> | |
| 174 | + <thead> | |
| 175 | + <tr> | |
| 176 | + <th>파일명</th> | |
| 177 | + <th>크기</th> | |
| 178 | + <th>등록일시</th> | |
| 179 | + <th>삭제</th> | |
| 180 | + </tr> | |
| 181 | + </thead> | |
| 182 | + </table> | |
| 183 | + </div> | |
| 184 | + <div class="fileWrap fileAfter file_list_div"> | |
| 185 | + <table> | |
| 186 | + <colgroup> | |
| 187 | + <col style="width:60%"> | |
| 188 | + <col style="width:20%"> | |
| 189 | + <col style="width:20%"> | |
| 190 | + </colgroup> | |
| 191 | + <thead> | |
| 192 | + <tr> | |
| 193 | + <th>파일명</th> | |
| 194 | + <th>크기</th> | |
| 195 | + <th>등록일시</th> | |
| 196 | + </tr> | |
| 197 | + </thead> | |
| 198 | + <tbody id="tbody_fiielist"> | |
| 199 | + <c:if test="${not empty fileList}"> | |
| 200 | + <c:forEach var="file" items="${fileList}"> | |
| 201 | + <tr class="item_${file.atchFileId}_${file.fileSn} uploaded_obj"> | |
| 202 | + <input type="hidden" name="fileSize" class="item_file_size" | |
| 203 | + value="<c:out value='${file.fileMg}'/>"/> | |
| 204 | + <td class="file_name"> | |
| 205 | + <img src="/direct/img/upload_hwp_img.png" alt=""/> | |
| 206 | + <a href="/cmm/fms/FileDown.do?atchFileId=${file.atchFileId}&fileSn=${file.fileSn}"> | |
| 207 | + <span class="file_name_text"><c:out | |
| 208 | + value="${file.orignlFileNm}"/></span> | |
| 209 | + </a> | |
| 210 | + </td> | |
| 211 | + <td> | |
| 212 | + <span class="file_size_text" value="<c:out value='${file.fileMg}'/>"></span> | |
| 213 | + </td> | |
| 214 | + <td> | |
| 215 | + <c:out value="${file.creatDt}"/> | |
| 216 | + </td> | |
| 217 | + </tr> | |
| 218 | + </c:forEach> | |
| 219 | + </c:if> | |
| 220 | + </tbody> | |
| 221 | + </table> | |
| 222 | + </div> | |
| 223 | + <div class="fileInfo file_list_div"> | |
| 224 | + <ul class="inline"> | |
| 225 | + <li> | |
| 226 | + <p>최대 <span class="c_e40000 fwBold limitcount_li">5</span>개 | <span | |
| 227 | + class="c_e40000 fwBold upload_number">50MB</span>제한</p> | |
| 228 | + </li> | |
| 229 | + <li> | |
| 230 | + <p><span class="c_456ded fwBold totalfileCount">1</span>개 | <span | |
| 231 | + class="c_456ded fwBold totalfileSize">72.01KB</span></p> | |
| 232 | + </li> | |
| 233 | + </ul> | |
| 234 | + </div> | |
| 235 | + </td> | |
| 236 | + </tr> | |
| 237 | + | |
| 238 | + <tr> | |
| 239 | + <th>수집ㆍ이용ㆍ동의</th> | |
| 240 | + <td><c:out value="${employeeCertVO.agreePnttm}"/></td> | |
| 241 | + </tr> | |
| 242 | + <tr> | |
| 243 | + <th>신청일시</th> | |
| 244 | + <td><c:out value="${employeeCertVO.frstRegistPnttm}"/></td> | |
| 245 | + </tr> | |
| 246 | + <tr> | |
| 247 | + <th>관리자 / 처리일시</th> | |
| 248 | + <td><c:out value="${employeeCertVO.lastUpdusrNm}"/> / <c:out | |
| 249 | + value="${employeeCertVO.lastUpdtPnttm}"/></td> | |
| 250 | + </tr> | |
| 251 | + <tr> | |
| 252 | + <th>심사 이력</th> | |
| 253 | + <td> | |
| 254 | + <div class="tableWrap"> | |
| 255 | + <table class="tbType1"> | |
| 256 | + <colgroup> | |
| 257 | + <col style="width:20%"> | |
| 258 | + <col style="width:12%"> | |
| 259 | + <col style="width:12%"> | |
| 260 | + <col style="width:18%"> | |
| 261 | + <col style="width:20%"> | |
| 262 | + <col style="width:14%"> | |
| 263 | + </colgroup> | |
| 264 | + <thead> | |
| 265 | + <tr> | |
| 266 | + <th style="text-align: center">신청일시</th> | |
| 267 | + <th style="text-align: center">신청 인원</th> | |
| 268 | + <th style="text-align: center">처리결과</th> | |
| 269 | + <th style="text-align: center">관리자</th> | |
| 270 | + <th style="text-align: center">처리일시</th> | |
| 271 | + <th style="text-align: center">사유</th> | |
| 272 | + </tr> | |
| 273 | + </thead> | |
| 274 | + <tbody> | |
| 275 | + <c:forEach var="history" items="${historyList}"> | |
| 276 | + <tr> | |
| 277 | + <td style="padding: 20px 25px;"><c:out value="${history.frstRegistPnttm}"/></td> | |
| 278 | + <td style="padding: 20px 25px;"><fmt:formatNumber value="${history.applyCnt}" | |
| 279 | + pattern="#,###"/>명 | |
| 280 | + </td> | |
| 281 | + <td style="padding: 20px 25px;"><c:out value="${history.authYnTxt}"/></td> | |
| 282 | + <td style="padding: 20px 25px;"><c:out value="${history.lastUpdusrNm}"/></td> | |
| 283 | + <td style="padding: 20px 25px;"><c:out value="${history.lastUpdtPnttm}"/></td> | |
| 284 | + <td style="padding: 20px 25px;" title="<c:out value='${history.rejectReason}'/>"> | |
| 285 | + <c:out value="${history.rejectReason}"/></td> | |
| 286 | + </tr> | |
| 287 | + </c:forEach> | |
| 288 | + <c:if test="${empty historyList}"> | |
| 289 | + <tr> | |
| 290 | + <td colspan="6"><spring:message code="common.nodata.msg"/></td> | |
| 291 | + </tr> | |
| 292 | + </c:if> | |
| 293 | + </tbody> | |
| 294 | + </table> | |
| 295 | + </div> | |
| 296 | + </td> | |
| 297 | + </tr> | |
| 298 | + </tbody> | |
| 299 | + <colgroup> | |
| 300 | + <col style="width:20%"> | |
| 301 | + <col style="width:80%"> | |
| 302 | + </colgroup> | |
| 303 | + </table> | |
| 304 | + | |
| 305 | + <div class="btnWrap"> | |
| 306 | + <input type="button" class="btnType1 bg_888888" value="목 록" | |
| 307 | + onclick="location.href='/uss/ion/msg/EmployeeCertList.do'; return false;"> | |
| 308 | + <input type="button" class="btnType1" value="수 정" | |
| 309 | + onclick="fnEmployeeCertUpdate(); return false;"> | |
| 310 | + </div> | |
| 311 | + </div> | |
| 312 | +</div> | |
| 313 | +</body> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/EmployeeCertList.jsp
... | ... | @@ -0,0 +1,44 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> | |
| 5 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 6 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> | |
| 7 | +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> | |
| 8 | +<body> | |
| 9 | +<%@ include file="include/employee/list/_context.jspf"%> | |
| 10 | +<form name="listForm" action="<c:url value='/uss/ion/msg/EmployeeCertList.do'/>" method="post"> | |
| 11 | + <input type="hidden" name="delFlag" value="Y" /> | |
| 12 | + <input type="hidden" name="pageType" /> | |
| 13 | + <input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" /> | |
| 14 | + <input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" /> | |
| 15 | + <input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" /> | |
| 16 | + <div class="contWrap"> | |
| 17 | + <div class="pageTitle"> | |
| 18 | + <div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> | |
| 19 | + <h2 class="titType1 c_222222 fwBold">종사자 수 인증 심사</h2> | |
| 20 | + <p class="tType6 c_999999">기업회원이 신청한 종사자 수 인증을 심사할 수 있습니다.</p> | |
| 21 | + </div> | |
| 22 | + <div class="pageCont"> | |
| 23 | + <%@include file="include/employee/list/_search.jspf"%> | |
| 24 | + <%@include file="include/employee/list/_table.jspf"%> | |
| 25 | + <%@include file="include/employee/list/_paging.jspf"%> | |
| 26 | + </div> | |
| 27 | + </div> | |
| 28 | +</form> | |
| 29 | + | |
| 30 | +<form name="modiForm" id="modiForm" method="post"> | |
| 31 | + <input name="mberId" type="hidden" /> | |
| 32 | +</form> | |
| 33 | + | |
| 34 | +<form name="popupForm" id="popupForm" method="post"> | |
| 35 | + <input name="phmId" type="hidden" /> | |
| 36 | +</form> | |
| 37 | + | |
| 38 | +<form name="empPdfForm" method="post"> | |
| 39 | + <input name="atchFileId" type="hidden" /> | |
| 40 | + <input name="fileSn" type="hidden" /> | |
| 41 | + <input name="employeeCertHstrySeq" type="hidden" /> | |
| 42 | +</form> | |
| 43 | + | |
| 44 | +</body> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/EmployeeCertRejectPop.jsp
... | ... | @@ -0,0 +1,101 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<!DOCTYPE html> | |
| 4 | +<html lang="ko"> | |
| 5 | +<head> | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <title>종사자 수 인증 반려</title> | |
| 8 | + <link rel="stylesheet" href="/publish/testcss/css/reset.css"> | |
| 9 | + <link rel="stylesheet" href="/publish/testcss/css/font.css"> | |
| 10 | + <link rel="stylesheet" href="/publish/testcss/css/sample.css"> | |
| 11 | + <script src="/publish/js/jquery-3.5.0.js"></script> | |
| 12 | + <script> | |
| 13 | + function fnRejectReasonChange() { | |
| 14 | + var option = document.querySelector("#rejectCode option:checked"); | |
| 15 | + document.getElementById("rejectReason").value = option ? option.getAttribute("data-reason") || "" : ""; | |
| 16 | + } | |
| 17 | + | |
| 18 | + function fnEmployeeCertReject() { | |
| 19 | + var rejectCode = document.getElementById("rejectCode"); | |
| 20 | + var rejectReason = document.getElementById("rejectReason"); | |
| 21 | + if (!rejectCode.value) { | |
| 22 | + alert("반려문구를 선택해 주세요."); | |
| 23 | + rejectCode.focus(); | |
| 24 | + return; | |
| 25 | + } | |
| 26 | + if (!rejectReason.value.trim()) { | |
| 27 | + alert("반려사유를 입력해 주세요."); | |
| 28 | + rejectReason.focus(); | |
| 29 | + return; | |
| 30 | + } | |
| 31 | + if (!confirm("반려하시겠습니까?")) return; | |
| 32 | + | |
| 33 | + $.ajax({ | |
| 34 | + type: "POST", | |
| 35 | + url: "/uss/ion/msg/updateEmployeeAuth.do", | |
| 36 | + data: $("#employeeCertRejectForm").serialize(), | |
| 37 | + dataType: "json", | |
| 38 | + success: function(data) { | |
| 39 | + alert(data.message || (data.success ? "처리되었습니다." : "처리에 실패했습니다.")); | |
| 40 | + if (data.success) { | |
| 41 | + if (window.opener && !window.opener.closed) window.opener.location.reload(); | |
| 42 | + window.close(); | |
| 43 | + } | |
| 44 | + }, | |
| 45 | + error: function() { | |
| 46 | + alert("저장에 실패했습니다."); | |
| 47 | + } | |
| 48 | + }); | |
| 49 | + } | |
| 50 | + </script> | |
| 51 | +</head> | |
| 52 | +<body> | |
| 53 | +<form id="employeeCertRejectForm" method="post"> | |
| 54 | + <input type="hidden" name="employeeCertHstrySeq" value="<c:out value='${employeeCertVO.employeeCertHstrySeq}'/>"/> | |
| 55 | + <input type="hidden" name="authYn" value="C"/> | |
| 56 | + <div class="layer_popup active" style="width:90%"> | |
| 57 | + <div class="layer_content" style="padding:0;"> | |
| 58 | + <table> | |
| 59 | + <colgroup> | |
| 60 | + <col style="width:100px;"> | |
| 61 | + <col style="width:auto;"> | |
| 62 | + </colgroup> | |
| 63 | + <tbody> | |
| 64 | + <tr> | |
| 65 | + <th>반려문구</th> | |
| 66 | + <td> | |
| 67 | + <c:choose> | |
| 68 | + <c:when test="${employeeCertVO.authYn eq 'N' or employeeCertVO.authYn eq 'H'}"> | |
| 69 | + <select id="rejectCode" name="rejectCode" onchange="fnRejectReasonChange();"> | |
| 70 | + <option value="">선택</option> | |
| 71 | + <c:forEach var="code" items="${rejectCodeList}"> | |
| 72 | + <option value="<c:out value='${code.code}'/>" data-reason="<c:out value='${code.codeDc}'/>"> | |
| 73 | + <c:out value="${code.codeNm}"/> | |
| 74 | + </option> | |
| 75 | + </c:forEach> | |
| 76 | + </select> | |
| 77 | + </c:when> | |
| 78 | + <c:otherwise><c:out value="${employeeCertVO.rejectCodeTxt}"/></c:otherwise> | |
| 79 | + </c:choose> | |
| 80 | + </td> | |
| 81 | + </tr> | |
| 82 | + <tr> | |
| 83 | + <th>반려사유</th> | |
| 84 | + <td> | |
| 85 | + <textarea id="rejectReason" name="rejectReason" maxlength="1000" style="height:130px" | |
| 86 | + <c:if test="${employeeCertVO.authYn eq 'C'}">readonly="readonly"</c:if>><c:out value="${employeeCertVO.rejectReason}"/></textarea> | |
| 87 | + </td> | |
| 88 | + </tr> | |
| 89 | + </tbody> | |
| 90 | + </table> | |
| 91 | + <div class="button_box"> | |
| 92 | + <c:if test="${employeeCertVO.authYn eq 'N' or employeeCertVO.authYn eq 'H'}"> | |
| 93 | + <button type="button" onclick="fnEmployeeCertReject();">반려</button> | |
| 94 | + </c:if> | |
| 95 | + <button type="button" style="color:#8595b0;border:1px solid #8595b0;background:#fff;" onclick="window.close();">취소</button> | |
| 96 | + </div> | |
| 97 | + </div> | |
| 98 | + </div> | |
| 99 | +</form> | |
| 100 | +</body> | |
| 101 | +</html> |
--- src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp
... | ... | @@ -753,7 +753,7 @@ |
| 753 | 753 |
<c:otherwise> |
| 754 | 754 |
<span style="color: #0000FF;"> |
| 755 | 755 |
<c:out value="${result.msgGroupCnt}"/>(<fmt:formatNumber value="${(result.successCount / result.msgGroupCnt) * 100}" pattern="#,###" />%)
|
| 756 |
- <c:if test="${result.msgGroupCnt eq result.callRejectionCount && result.callbackYn eq 'N' && result.userCallbackYn eq 'N' }">
|
|
| 756 |
+ <c:if test="${ result.callbackYn eq 'N' && result.userCallbackYn eq 'N' }">
|
|
| 757 | 757 |
<input type="button" style="margin-left:3px;margin-right:0;vertical-align:top;color:#ffffff !important;" class="btnType1" onclick="fn_sendMsgData('<c:out value="${result.msgGroupId}"/>','<c:out value="${result.callFrom}"/>','<c:out value="${result.userId}"/>');" value="문자" />
|
| 758 | 758 |
</c:if> |
| 759 | 759 |
<c:if test="${result.callbackYn eq 'Y' }">
|
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/include/employee/list/_action.jspx
... | ... | @@ -0,0 +1,4 @@ |
| 1 | +<div class="btnWrap"> | |
| 2 | + <input type="button" class="btnType2" value="삭제" onclick="fn_delete(); return false;"/> | |
| 3 | + <input type="button" class="btnType1" value="등록" onclick="location.href='/uss/ion/msg/SendNumberModify.do'; return false;" value="등록" /> | |
| 4 | +</div> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/include/employee/list/_context.jspf
... | ... | @@ -0,0 +1,90 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<script> | |
| 3 | + function linkPage(pageNo){ | |
| 4 | + var listForm = document.listForm ; | |
| 5 | + listForm.pageIndex.value = pageNo ; | |
| 6 | + listForm.submit(); | |
| 7 | + } | |
| 8 | + | |
| 9 | + function fnSelectMber(mberId) { | |
| 10 | + document.modiForm.mberId.value = mberId; | |
| 11 | + window.open("about:blank", 'popupSelectMber', 'width=900, height=1800, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbar=no'); | |
| 12 | + document.modiForm.action = "<c:url value='/uss/umt/user/EgovGnrlselectedUserView.do'/>"; | |
| 13 | + document.modiForm.target = "popupSelectMber"; | |
| 14 | + document.modiForm.submit(); | |
| 15 | + } | |
| 16 | + | |
| 17 | + function fn_employeeCertApprove(employeeCertHstrySeq) { | |
| 18 | + if (!confirm("종사자 수 인증을 완료하시겠습니까?")) return false; | |
| 19 | + $.ajax({ | |
| 20 | + type: "POST", | |
| 21 | + url: "/uss/ion/msg/updateEmployeeAuth.do", | |
| 22 | + data: { | |
| 23 | + employeeCertHstrySeq: employeeCertHstrySeq, | |
| 24 | + authYn: "Y" | |
| 25 | + }, | |
| 26 | + dataType: "json", | |
| 27 | + success: function(data) { | |
| 28 | + alert(data.message || (data.success ? "처리되었습니다." : "처리에 실패했습니다.")); | |
| 29 | + if (data.success) location.reload(); | |
| 30 | + }, | |
| 31 | + error: function() { | |
| 32 | + alert("저장에 실패했습니다."); | |
| 33 | + } | |
| 34 | + }); | |
| 35 | + return false; | |
| 36 | + } | |
| 37 | + | |
| 38 | + function fn_employeeCertReject(employeeCertHstrySeq) { | |
| 39 | + return fn_employeeCertRejectPopup(employeeCertHstrySeq); | |
| 40 | + } | |
| 41 | + | |
| 42 | + function fn_employeeCertRejectReason(employeeCertHstrySeq) { | |
| 43 | + return fn_employeeCertRejectPopup(employeeCertHstrySeq); | |
| 44 | + } | |
| 45 | + | |
| 46 | + function fn_employeeCertRejectPopup(employeeCertHstrySeq) { | |
| 47 | + var url = "/uss/ion/msg/EmployeeCertRejectPop.do?employeeCertHstrySeq=" + encodeURIComponent(employeeCertHstrySeq); | |
| 48 | + window.open(url, 'employeeCertRejectPop', 'width=600, height=310, top=400, left=650, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbar=no'); | |
| 49 | + return false; | |
| 50 | + } | |
| 51 | + | |
| 52 | + function fn_empPdfView(atchFileId, employeeCertHstrySeq) { | |
| 53 | + var form = document.empPdfForm; | |
| 54 | + form.atchFileId.value = atchFileId; | |
| 55 | + form.fileSn.value = 0; | |
| 56 | + form.employeeCertHstrySeq.value = employeeCertHstrySeq; | |
| 57 | + | |
| 58 | + window.open("about:blank", "empPdfViewPopup", "width=1020,height=800,top=100,left=0,fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=no,location=no,scrollbars=no"); | |
| 59 | + form.action = "<c:url value='/uss/ion/msg/EmpPdfView.do'/>"; | |
| 60 | + form.target = "empPdfViewPopup"; | |
| 61 | + form.submit(); | |
| 62 | + return false; | |
| 63 | + } | |
| 64 | + // | |
| 65 | + // $("#rejectCode").on("change", function() { | |
| 66 | + // var rejectCode = $(this).val(); | |
| 67 | + // var rejectReason = getRejectReasonText(rejectCode); | |
| 68 | + // $("#rejectReason").val(rejectReason); | |
| 69 | + // }); | |
| 70 | + // | |
| 71 | + // function getRejectReasonText(rejectCode) { | |
| 72 | + // switch (rejectCode) { | |
| 73 | + // case "01": | |
| 74 | + // return ""; | |
| 75 | + // case "02": | |
| 76 | + // return "[문자온] 종사자 수 인증이 반려되었습니다. 첨부하신 서류로는 사업장 전체 인원 수를 확인할 수 없습니다. 인원이 확인되는 자료를 첨부하여 재신청해 주세요."; | |
| 77 | + // | |
| 78 | + // case "03": | |
| 79 | + // return "[문자온] 종사자 수 인증이 반려되었습니다. 첨부하신 서류는 인원 확인 자료로 인정되지 않습니다. 인정 가능한 증빙서류를 첨부하여 재신청해 주세요."; | |
| 80 | + // | |
| 81 | + // case "04": | |
| 82 | + // return "[문자온] 종사자 수 인증이 반려되었습니다. 신청하신 종사자 수와 증빙서류상 인원이 일치하지 않습니다. 증빙서류 기준 인원으로 재신청해 주세요."; | |
| 83 | + // | |
| 84 | + // case "05": | |
| 85 | + // return "[문자온] 종사자 수 인증이 반려되었습니다. 증빙서류의 사업자번호가 회원정보와 일치하지 않습니다. 가입하신 사업자번호 기준 서류를 첨부하여 재신청해 주세요."; | |
| 86 | + // default: | |
| 87 | + // return ""; | |
| 88 | + // } | |
| 89 | + // } | |
| 90 | +</script> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/include/employee/list/_paging.jspf
... | ... | @@ -0,0 +1,9 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="btnWrap"></div> | |
| 3 | +<c:if test="${!empty resultList}"> | |
| 4 | + <div class="page"> | |
| 5 | + <ul class="inline"> | |
| 6 | + <ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="linkPage" /> | |
| 7 | + </ul> | |
| 8 | + </div> | |
| 9 | +</c:if>(No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/include/employee/list/_search.jspf
... | ... | @@ -0,0 +1,59 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="listSerch"> | |
| 3 | + <div class="calendar_wrap"> | |
| 4 | + <select name="setCalMonth" onchange="fnSetCalMonth(this.value)"> | |
| 5 | + <option value="0">전체</option> | |
| 6 | + <option value="1">1개월</option> | |
| 7 | + <option value="3">3개월</option> | |
| 8 | + <option value="6">6개월</option> | |
| 9 | + </select> | |
| 10 | + <input type="hidden" name="cal_url" id="cal_url" value="/sym/cmm/EgovNormalCalPopup.do"> | |
| 11 | + <div class="calendar_box" | |
| 12 | + onclick="javascript:fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchStartDate);"> | |
| 13 | + <input style="width:auto;min-width: 83px;" type="text" class="date_format" name="searchStartDate" | |
| 14 | + id="searchStartDate" size="4" maxlength="4" readonly="" | |
| 15 | + value="<c:out value='${searchVO.searchStartDate}'/>"> | |
| 16 | + <input type="button" class="calBtn"> | |
| 17 | + </div> | |
| 18 | + <span class="line">~</span> | |
| 19 | + <div class="calendar_box" | |
| 20 | + onclick="javascript:fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchEndDate);"> | |
| 21 | + <input style="width:auto;min-width: 83px;" type="text" class="date_format" name="searchEndDate" | |
| 22 | + id="searchEndDate" size="4" maxlength="4" readonly="" | |
| 23 | + value="<c:out value='${searchVO.searchEndDate}'/>"> | |
| 24 | + <input type="button" class="calBtn"> | |
| 25 | + </div> | |
| 26 | + </div> | |
| 27 | + <br/><br/> | |
| 28 | + <!-- <br /><br /> | |
| 29 | + <div style="width: 100%; height: 3px;"></div> --> | |
| 30 | + <select name="searchCondition2" class="select" title="검색조건 선택"> | |
| 31 | + <option value="" <c:if test="${searchVO.searchCondition2 == ''}">selected="selected"</c:if>>심사상태(전체)</option> | |
| 32 | + <option value="N" <c:if test="${searchVO.searchCondition2 == 'N'}">selected="selected"</c:if>>심사중</option> | |
| 33 | + <option value="Y" <c:if test="${searchVO.searchCondition2 == 'Y'}">selected="selected"</c:if>>인증완료</option> | |
| 34 | + <option value="C" <c:if test="${searchVO.searchCondition2 == 'C'}">selected="selected"</c:if>>반려</option> | |
| 35 | + </select> | |
| 36 | + <select name="searchCondition" class="select" title="검색조건 선택"> | |
| 37 | + <option value="" <c:if test="${searchVO.searchCondition == ''}">selected="selected"</c:if>>전체</option> | |
| 38 | + <option value="1" <c:if test="${searchVO.searchCondition == '1'}">selected="selected"</c:if>>사용자ID</option> | |
| 39 | + <option value="2" <c:if test="${searchVO.searchCondition == '2'}">selected="selected"</c:if>>기업명</option> | |
| 40 | + <option value="3" <c:if test="${searchVO.searchCondition == '3'}">selected="selected"</c:if>>사업자번호</option> | |
| 41 | + </select> | |
| 42 | + <input id="searchKeyword" name="searchKeyword" class="recentSearch" type="text" | |
| 43 | + value="<c:out value='${searchVO.searchKeyword}'/>" size="15" title="검색" maxlength="100"/> | |
| 44 | + <input type="button" class="btnType1" value="검색" onclick="fn_search(); return false;"> | |
| 45 | + <input type="button" class="btnType1" onclick="fn_searchReset(); return false;" value="초기화"> | |
| 46 | +</div> | |
| 47 | +<div class="listTop"> | |
| 48 | + <p class="tType5">총 <span class="tType4 c_456ded fwBold"><fmt:formatNumber | |
| 49 | + value="${paginationInfo.totalRecordCount}" pattern="#,###"/></span>건</p> | |
| 50 | + <div class="rightWrap"> | |
| 51 | + <select name="pageUnit" id="pageUnit" class="select" title="검색조건선택" onchange="linkPage(1);"> | |
| 52 | + <option value='10' <c:if test="${searchVO.pageUnit == '10' or searchVO.pageUnit == ''}">selected</c:if>> | |
| 53 | + 10줄 | |
| 54 | + </option> | |
| 55 | + <option value='20' <c:if test="${searchVO.pageUnit == '20'}">selected</c:if>>20줄</option> | |
| 56 | + <option value='30' <c:if test="${searchVO.pageUnit == '30'}">selected</c:if>>30줄</option> | |
| 57 | + </select> | |
| 58 | + </div> | |
| 59 | +</div> |
+++ src/main/webapp/WEB-INF/jsp/uss/ion/msg/include/employee/list/_table.jspf
... | ... | @@ -0,0 +1,121 @@ |
| 1 | +<%@ page pageEncoding="UTF-8" %> | |
| 2 | +<div class="tableWrap"> | |
| 3 | + <table class="tbType1"> | |
| 4 | + <colgroup> | |
| 5 | + <col style="width: 5%"> | |
| 6 | + <col style="width: 8%"> | |
| 7 | + <col style="width: 13%"> | |
| 8 | + <col style="width: 10%"> | |
| 9 | + <col style="width: 7%"> | |
| 10 | + <col style="width: 7%"> | |
| 11 | + <col style="width: 7%"> | |
| 12 | + <col style="width: 7%"> | |
| 13 | + <col style="width: 8%"> | |
| 14 | + <col style="width: 2%"> | |
| 15 | + <col style="width: 7%"> | |
| 16 | + <col style="width: 9%"> | |
| 17 | + <col style="width: 12%"> | |
| 18 | + <col style="width: 12%"> | |
| 19 | + </colgroup> | |
| 20 | + <thead> | |
| 21 | + <tr> | |
| 22 | + <th>번호</th> | |
| 23 | + <th>아이디</th> | |
| 24 | + <th>기업명</th> | |
| 25 | + <th>사업자번호</th> | |
| 26 | + <th>대표자</th> | |
| 27 | + <th>현재<br>종사자 수</th> | |
| 28 | + <th>신청<br>종사자 수</th> | |
| 29 | + <th>심사상태</th> | |
| 30 | + <th>첨부파일</th> | |
| 31 | + <th></th> | |
| 32 | + <th>관리자</th> | |
| 33 | + <th>관리</th> | |
| 34 | + <th>신청일시</th> | |
| 35 | + <th>처리일시</th> | |
| 36 | + </tr> | |
| 37 | + </thead> | |
| 38 | + <tbody> | |
| 39 | + <c:forEach var="result" items="${resultList}" varStatus="status"> | |
| 40 | + <tr> | |
| 41 | + <td> | |
| 42 | + <c:out value="${paginationInfo.totalRecordCount - ((paginationInfo.currentPageNo - 1) * paginationInfo.recordCountPerPage) - status.index}"/> | |
| 43 | + </td> | |
| 44 | + <td title="<c:out value='${result.mberId}'/>"> | |
| 45 | + <a href="#" onclick="javascript:fnSelectMber('<c:out value="${result.mberId}"/>'); return false;"> | |
| 46 | + <c:out value="${result.mberId}"/> | |
| 47 | + </a> | |
| 48 | + </td> | |
| 49 | + <td class="tl" title="<c:out value='${result.mberNm}'/>"> | |
| 50 | + <a href="/uss/ion/msg/EmployeeCertDetail.do?employeeCertHstrySeq=<c:out value='${result.employeeCertHstrySeq}'/>"> | |
| 51 | + <c:out value="${result.mberNm}"/> | |
| 52 | + </a> | |
| 53 | + </td> | |
| 54 | + <td title="<c:out value='${result.bizNo}'/>"> | |
| 55 | + <a href="/uss/ion/msg/EmployeeCertDetail.do?employeeCertHstrySeq=<c:out value='${result.employeeCertHstrySeq}'/>"> | |
| 56 | + <c:out value="${result.bizNo}"/> | |
| 57 | + </a> | |
| 58 | + </td> | |
| 59 | + <td><c:out value="${result.managerNm}"/></td> | |
| 60 | + <td>${empty result.certCnt ? '-' : result.certCnt += '명'}</td> | |
| 61 | + <td>${empty result.applyCnt ? '-' : result.applyCnt += '명'}</td> | |
| 62 | + <td> | |
| 63 | + <c:choose> | |
| 64 | + <c:when test="${result.authYn eq 'N' or result.authYn eq 'H'}">심사중</c:when> | |
| 65 | + <c:when test="${result.authYn eq 'Y'}">인증완료</c:when> | |
| 66 | + <c:when test="${result.authYn eq 'C'}">반려</c:when> | |
| 67 | + <c:otherwise>-</c:otherwise> | |
| 68 | + </c:choose> | |
| 69 | + </td> | |
| 70 | + <td class="brRm"> | |
| 71 | + <c:choose> | |
| 72 | + <c:when test="${not empty result.atchFileId}"> | |
| 73 | + <c:import url="/cmm/fms/selectAddrAgencyFileInfs.do" charEncoding="utf-8"> | |
| 74 | + <c:param name="param_atchFileId" value="${result.atchFileId}"/> | |
| 75 | + </c:import> | |
| 76 | + </td> | |
| 77 | + <td> | |
| 78 | + <a href="#" onclick="fn_empPdfView('<c:out value='${result.atchFileId}'/>', '<c:out value='${result.employeeCertHstrySeq}'/>'); return false;"> | |
| 79 | + <img src="/publish/images/content/file_view.png" style="vertical-align:middle;" alt="미리보기"/> | |
| 80 | + </a> | |
| 81 | + | |
| 82 | + </c:when> | |
| 83 | + <c:otherwise>-</c:otherwise> | |
| 84 | + </c:choose> | |
| 85 | + </td> | |
| 86 | + <td> | |
| 87 | + <c:choose> | |
| 88 | + <c:when test="${empty result.lastUpdusrNm}">-</c:when> | |
| 89 | + <c:otherwise><c:out value="${result.lastUpdusrNm}"/></c:otherwise> | |
| 90 | + </c:choose> | |
| 91 | + </td> | |
| 92 | + <td> | |
| 93 | + <c:choose> | |
| 94 | + <c:when test="${result.authYn eq 'N' or result.authYn eq 'H'}"> | |
| 95 | + <button type="button" class="btnType btnType20" onclick="fn_employeeCertApprove('<c:out value='${result.employeeCertHstrySeq}'/>'); return false;" style="padding:0 5px;">인증완료</button> | |
| 96 | + <button type="button" class="btnType btnType20" onclick="fn_employeeCertReject('<c:out value='${result.employeeCertHstrySeq}'/>'); return false;" style="padding:0 5px;">반려</button> | |
| 97 | + </c:when> | |
| 98 | + <c:when test="${result.authYn eq 'C'}"> | |
| 99 | + <button type="button" class="btnType btnType20" onclick="fn_employeeCertRejectReason('<c:out value='${result.employeeCertHstrySeq}'/>'); return false;" style="padding:0 5px;">반려사유</button> | |
| 100 | + </c:when> | |
| 101 | + <c:otherwise>-</c:otherwise> | |
| 102 | + </c:choose> | |
| 103 | + </td> | |
| 104 | + <td><c:out value="${result.frstRegistPnttm}"/></td> | |
| 105 | + <td> | |
| 106 | + <c:choose> | |
| 107 | + <c:when test="${result.authYn eq 'N' or result.authYn eq 'H'}">-</c:when> | |
| 108 | + <c:when test="${empty result.lastUpdtPnttm}">-</c:when> | |
| 109 | + <c:otherwise><c:out value="${result.lastUpdtPnttm}"/></c:otherwise> | |
| 110 | + </c:choose> | |
| 111 | + </td> | |
| 112 | + </tr> | |
| 113 | + </c:forEach> | |
| 114 | + <c:if test="${empty resultList}"> | |
| 115 | + <tr> | |
| 116 | + <td colspan="13"><spring:message code="common.nodata.msg"/></td> | |
| 117 | + </tr> | |
| 118 | + </c:if> | |
| 119 | + </tbody> | |
| 120 | + </table> | |
| 121 | +</div> |
+++ src/main/webapp/WEB-INF/jsp/uss/olp/hpc/ForeignAccessBlockList.jsp
... | ... | @@ -0,0 +1,291 @@ |
| 1 | +<%@ page contentType="text/html; charset=utf-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> | |
| 5 | +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> | |
| 6 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> | |
| 7 | +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> | |
| 8 | +<% | |
| 9 | + response.setHeader("Cache-Control","no-store"); | |
| 10 | + response.setHeader("Pragma","no-cache"); | |
| 11 | + response.setDateHeader("Expires",0); | |
| 12 | + if (request.getProtocol().equals("HTTP/1.1")) response.setHeader("Cache-Control", "no-cache"); | |
| 13 | +%> | |
| 14 | +<!DOCTYPE html> | |
| 15 | +<html lang="ko"> | |
| 16 | +<head> | |
| 17 | +<title>운영관리 > 국외접속 차단</title> | |
| 18 | +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" > | |
| 19 | +<meta http-equiv="content-language" content="ko"> | |
| 20 | +<meta http-equiv="X-UA-Compatible" content="IE=edge" /> | |
| 21 | +<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap" rel="stylesheet"> | |
| 22 | +<link rel="stylesheet" href="/pb/css/reset.css"> | |
| 23 | +<link rel="stylesheet" href="/pb/css/common.css"> | |
| 24 | +<link rel="stylesheet" href="/pb/css/content.css"> | |
| 25 | +<link rel="stylesheet" href="/pb/css/popup.css"> | |
| 26 | +<%-- | |
| 27 | +<script src="/pb/js/jquery-3.5.0.js"></script> | |
| 28 | +<script src="/pb/js/common.js"></script> | |
| 29 | +<script type="text/javascript" src="<c:url value='/js/EgovMultiFile.js'/>"></script>--%> | |
| 30 | +<style> | |
| 31 | + /* 검색 영역 강제 스타일 교정 (기존 CSS 충돌 방지) */ | |
| 32 | + .custom-search-box { | |
| 33 | + width: 100% !important; | |
| 34 | + background-color: #f7f8f9 !important; | |
| 35 | + border: 1px solid #e1e4e7 !important; | |
| 36 | + border-radius: 6px !important; | |
| 37 | + padding: 15px 20px !important; | |
| 38 | + box-sizing: border-box !important; | |
| 39 | + margin: 15px 0 25px 0 !important; | |
| 40 | + display: flex !important; | |
| 41 | + flex-wrap: wrap !important; | |
| 42 | + gap: 12px 15px !important; | |
| 43 | + align-items: center !important; | |
| 44 | + } | |
| 45 | + | |
| 46 | + .custom-search-box .search-group { | |
| 47 | + display: flex !important; | |
| 48 | + align-items: center !important; | |
| 49 | + gap: 8px !important; | |
| 50 | + } | |
| 51 | + | |
| 52 | + .custom-search-box select { | |
| 53 | + height: 36px !important; | |
| 54 | + border: 1px solid #ccc !important; | |
| 55 | + border-radius: 4px !important; | |
| 56 | + padding: 0 25px 0 10px !important; | |
| 57 | + background-color: #fff !important; | |
| 58 | + font-size: 14px !important; | |
| 59 | + } | |
| 60 | + | |
| 61 | + .custom-search-box input[type="text"] { | |
| 62 | + height: 36px !important; | |
| 63 | + border: 1px solid #ccc !important; | |
| 64 | + border-radius: 4px !important; | |
| 65 | + padding: 0 10px !important; | |
| 66 | + background-color: #fff !important; | |
| 67 | + font-size: 14px !important; | |
| 68 | + box-sizing: border-box !important; | |
| 69 | + } | |
| 70 | + | |
| 71 | + .custom-search-box .calendar_wrap { | |
| 72 | + display: flex !important; | |
| 73 | + align-items: center !important; | |
| 74 | + gap: 5px !important; | |
| 75 | + } | |
| 76 | + | |
| 77 | + .custom-search-box .calendar_box { | |
| 78 | + display: inline-flex !important; | |
| 79 | + align-items: center !important; | |
| 80 | + } | |
| 81 | + | |
| 82 | + .custom-search-box .btn-search { | |
| 83 | + height: 36px !important; | |
| 84 | + padding: 0 18px !important; | |
| 85 | + background-color: #3b82f6 !important; | |
| 86 | + color: #fff !important; | |
| 87 | + border: none !important; | |
| 88 | + border-radius: 4px !important; | |
| 89 | + font-weight: 500 !important; | |
| 90 | + cursor: pointer !important; | |
| 91 | + font-size: 14px !important; | |
| 92 | + } | |
| 93 | + | |
| 94 | + .custom-search-box .btn-search:hover { | |
| 95 | + background-color: #2563eb !important; | |
| 96 | + } | |
| 97 | +</style> | |
| 98 | +<script type="text/javaScript" language="javascript"> | |
| 99 | +function fn_search(){ | |
| 100 | + linkPage(1); | |
| 101 | +} | |
| 102 | + | |
| 103 | +function linkPage(pageNo){ | |
| 104 | + var listForm = document.listForm ; | |
| 105 | + listForm.pageIndex.value = pageNo ; | |
| 106 | + listForm.submit(); | |
| 107 | +} | |
| 108 | + | |
| 109 | +//기간선택 select | |
| 110 | +function fnSetCalMonth(val) { | |
| 111 | + var form = document.listForm; | |
| 112 | + var today = new Date(); | |
| 113 | + | |
| 114 | + var year = today.getFullYear(); | |
| 115 | + var month = ("0"+(today.getMonth()+1)).slice(-2); | |
| 116 | + var date = ("0"+today.getDate()).slice(-2); | |
| 117 | + | |
| 118 | + var sDate = new Date(today.setMonth(today.getMonth() - val)); | |
| 119 | + | |
| 120 | + var sYear = sDate.getFullYear(); | |
| 121 | + var sMonth = ("0"+(sDate.getMonth()+1)).slice(-2); | |
| 122 | + var sDate = ("0"+sDate.getDate()).slice(-2); | |
| 123 | + | |
| 124 | + form.searchStartDate.value = sYear + "-" + sMonth + "-" + sDate; | |
| 125 | + form.searchEndDate.value = year + "-" + month + "-" + date; | |
| 126 | + | |
| 127 | +} | |
| 128 | + | |
| 129 | +function fnChangeBlockYn(){ | |
| 130 | + | |
| 131 | + if(confirm("사용여부를 수정하시겠습니까?")){ | |
| 132 | + var blockYn = $('#changeBlockYn option:selected').val(); | |
| 133 | + $.ajax({ | |
| 134 | + type: "POST", | |
| 135 | + url: "/uss/olp/hak/updateAccessBlockYn.do", | |
| 136 | + data : {"blockYn" : blockYn}, | |
| 137 | + dataType:'json', | |
| 138 | + async: false, | |
| 139 | + success: function (response) { | |
| 140 | + if (response.result === "success") { | |
| 141 | + alert("수정하였습니다."); | |
| 142 | + } | |
| 143 | + }, | |
| 144 | + error: function (e) { | |
| 145 | + alert("ERROR : " + JSON.stringify(e)); | |
| 146 | + } | |
| 147 | + }); | |
| 148 | + } | |
| 149 | + | |
| 150 | +} | |
| 151 | +</script> | |
| 152 | +</head> | |
| 153 | +<body> | |
| 154 | +<div class="contWrap blocked_cont"> | |
| 155 | + <div class="pageTitle"> | |
| 156 | + <div class="pageIcon"><img src="/pb/img/pageTitIcon4.png" alt=""></div> | |
| 157 | + <h2 class="titType1 c_222222 fwBold">국외접속 차단</h2> | |
| 158 | + <p class="tType6 c_999999">국외 IP 접속 차단 설정 현황을 파악할 수 있으며, 차단 이력을 조회할 수 있습니다.</p> | |
| 159 | + </div> | |
| 160 | + | |
| 161 | + <div class="pageCont"> | |
| 162 | + <form name="listForm" action="<c:url value='/uss/olp/hak/ForeignAccessBlock.do'/>" method="post"> | |
| 163 | + <input name="pageIndex" type="hidden" value="<c:out value='${searchVO.pageIndex}'/>"/> | |
| 164 | + | |
| 165 | + <span class="tbTit">국외접속 차단 설정 - 사용자 로그인 시 국외 IP 접속 차단</span> | |
| 166 | + | |
| 167 | + <div class="tableWrap"> | |
| 168 | + <table class="tbType2"> | |
| 169 | + <colgroup> | |
| 170 | + <col style="width: 15%"> | |
| 171 | + <col style="width: 85%"> | |
| 172 | + </colgroup> | |
| 173 | + <tbody> | |
| 174 | + <tr> | |
| 175 | + <th><span>국외접속 차단 사용여부</span></th> | |
| 176 | + <td> | |
| 177 | + <select name="changeBlockYn" id="changeBlockYn"> | |
| 178 | + <option value="Y" <c:if test="${accessBlockYn == 'Y'}">selected="selected"</c:if>>사용</option> | |
| 179 | + <option value="N" <c:if test="${accessBlockYn == 'N'}">selected="selected"</c:if>>미사용</option> | |
| 180 | + </select> | |
| 181 | + <button type="button" class="btnType bluebor" onclick="fnChangeBlockYn()">수정</button> | |
| 182 | + </td> | |
| 183 | + </tr> | |
| 184 | + <tr> | |
| 185 | + <th><span>차단 대상</span></th> | |
| 186 | + <td>대한민국 외 전체 국가</td> | |
| 187 | + </tr> | |
| 188 | + <tr> | |
| 189 | + <th><span>국가 판별 기준</span></th> | |
| 190 | + <td> | |
| 191 | + <b class="fwMd">[MaxMind/GeoLite2]</b> <small class="tType7 c_999999 fwBold">최종 갱신 2026-08-30</small> | |
| 192 | + </td> | |
| 193 | + </tr> | |
| 194 | + </tbody> | |
| 195 | + </table> | |
| 196 | + </div> | |
| 197 | + <br> | |
| 198 | + <span class="tbTit">국외접속 차단 이력 - 국외 IP 로그인 차단 기록 조회</span> | |
| 199 | + | |
| 200 | + <div class="custom-search-box"> | |
| 201 | + <div class="search-group"> | |
| 202 | + <select name="setCalMonth" onchange="fnSetCalMonth(this.value)"> | |
| 203 | + <option value="0">전체</option> | |
| 204 | + <option value="1">1개월</option> | |
| 205 | + <option value="3">3개월</option> | |
| 206 | + <option value="6">6개월</option> | |
| 207 | + </select> | |
| 208 | + <div class="calendar_wrap"> | |
| 209 | + <input type="hidden" name="cal_url" id="cal_url" value="/sym/cmm/EgovNormalCalPopup.do" > | |
| 210 | + <div class="calendar_box" onclick="javascript:fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchStartDate);"> | |
| 211 | + <input style="min-width: 133px;" type="text" class="date_format" name="searchStartDate" id="searchStartDate" size="4" maxlength="4" readonly="" value=""> | |
| 212 | + <input type="button" class="calBtn"> | |
| 213 | + </div> | |
| 214 | + <span class="line">~</span> | |
| 215 | + <div class="calendar_box" onclick="javascript:fn_egov_NormalCalendar(document.forms.listForm, document.forms.listForm.searchEndDate);"> | |
| 216 | + <input style="min-width: 133px;" type="text" class="date_format" name="searchEndDate" id="searchEndDate" size="4" maxlength="4" readonly="" value=""> | |
| 217 | + <input type="button" class="calBtn"> | |
| 218 | + </div> | |
| 219 | + </div> | |
| 220 | + </div> | |
| 221 | + <div class="search-group"> | |
| 222 | + <select id="searchCondition" name="searchCondition" title="조회조건" style="min-width: 170px;" > | |
| 223 | + <%--<option value="" <c:if test="${empty searchVO.searchCondition }">selected="selected"</c:if> >계정ID/접속 IP(전체)</option> | |
| 224 | + <option value="1" <c:if test="${searchVO.searchCondition == '1'}">selected="selected"</c:if> >계정ID</option>--%> | |
| 225 | + <option value="1" <c:if test="${searchVO.searchCondition == '1'}">selected="selected"</c:if> >접속 IP</option> | |
| 226 | + </select> | |
| 227 | + <input id="searchKeyword" name="searchKeyword" class="recentSearch" type="text" value="<c:out value='${searchVO.searchKeyword}'/>" size="15" title="검색" maxlength="100" /> | |
| 228 | + <input type="button" class="btnType1" value="검색" onclick="fn_search();" style="background-color: #456ded"> | |
| 229 | + </div> | |
| 230 | + </div> | |
| 231 | + | |
| 232 | + <div class="listTop"> | |
| 233 | + <p class="tType5">총<span class="tType4 c_456ded fwBold"><fmt:formatNumber value="${paginationInfo.totalRecordCount}" pattern="#,###" /></span>건</p> | |
| 234 | + </div> | |
| 235 | + | |
| 236 | + <div class="tableWrap"> | |
| 237 | + <table class="tbType1"> | |
| 238 | + <colgroup> | |
| 239 | + <col style="width:80px;"/> | |
| 240 | + <col style="width:auto;"/> | |
| 241 | + <col style="width:15%;"/> | |
| 242 | + <col style="width:auto;"/> | |
| 243 | + <col style="width:10%;"/> | |
| 244 | + </colgroup> | |
| 245 | + <thead> | |
| 246 | + <tr> | |
| 247 | + <th>번호</th> | |
| 248 | + <th>차단일시</th> | |
| 249 | + <th>접속 IP</th> | |
| 250 | + <th>판별 국가</th> | |
| 251 | + <th>차단 결과</th> | |
| 252 | + </tr> | |
| 253 | + </thead> | |
| 254 | + <tbody> | |
| 255 | + <c:forEach var="result" items="${resultList}" varStatus="status"> | |
| 256 | + <tr> | |
| 257 | + <td><c:out value="${(result.pageIndex - 1) * result.pageSize + status.count}"/></td> | |
| 258 | + <td>${result.blockDt}</td> | |
| 259 | + <td>${result.accessIp}</td> | |
| 260 | + <td>${result.countryCode}(${result.countryName})</td> | |
| 261 | + <td style="color: #e40000 !important;">차단</td> | |
| 262 | + </tr> | |
| 263 | + </c:forEach> | |
| 264 | + <c:if test="${empty resultList}"> | |
| 265 | + <tr><td colspan="5">자료가 없습니다.</td></tr> | |
| 266 | + </c:if> | |
| 267 | + </tbody> | |
| 268 | + </table> | |
| 269 | + </div> | |
| 270 | + <div class="page"> | |
| 271 | + <ul class="inline"> | |
| 272 | + <c:if test="${!empty resultList}"> | |
| 273 | + <ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="linkPage" /> | |
| 274 | + </c:if> | |
| 275 | + <c:if test="${empty resultList}"> | |
| 276 | + <li><input type="button" class="pageFirst"></li> | |
| 277 | + <li><input type="button" class="pageBefore"></li> | |
| 278 | + <li>1</li> | |
| 279 | + <li><input type="button" class="pageNext"></li> | |
| 280 | + <li><input type="button" class="pageLast"></li> | |
| 281 | + </c:if> | |
| 282 | + </ul> | |
| 283 | + </div> | |
| 284 | + <!-- //페이지 네비게이션 끝 --> | |
| 285 | + </form> | |
| 286 | + </div> | |
| 287 | +</div> | |
| 288 | +<!-- 페이지 네비게이션 시작 --> | |
| 289 | +</div> | |
| 290 | +</body> | |
| 291 | +</html> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?