부과 메뉴 생성 및 리포트 기능 추가
parent
c421513251
commit
9d3924d3e1
@ -0,0 +1,119 @@
|
|||||||
|
package go.kr.project.levy.levy.controller;
|
||||||
|
|
||||||
|
import egovframework.constant.TilesConstants;
|
||||||
|
import egovframework.util.ApiResponseUtil;
|
||||||
|
import go.kr.project.common.model.CmmnCodeSearchVO;
|
||||||
|
import go.kr.project.common.service.CommonCodeService;
|
||||||
|
import go.kr.project.noti.model.NotiImpltInfoVO;
|
||||||
|
import go.kr.project.noti.model.NotiImpltTrprInfoVO;
|
||||||
|
import go.kr.project.noti.service.NotiService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levy.controller
|
||||||
|
* fileName : LevyController
|
||||||
|
* author : 김동규
|
||||||
|
* date : 2025-10-14
|
||||||
|
* description : 부과 관리 관련 요청을 처리하는 컨트롤러
|
||||||
|
* 중요한 로직 주석: 부과 관련 화면 제공 및 CRUD API를 처리하는 컨트롤러
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-10-14 김동규 최초 생성
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/levy/levy/")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "부과정보 관리", description = "부과 정보 관리 관련 API")
|
||||||
|
public class LevyController {
|
||||||
|
|
||||||
|
/** 이행정보 서비스 */
|
||||||
|
private final NotiService service;
|
||||||
|
|
||||||
|
/** 코드 서비스 */
|
||||||
|
private final CommonCodeService commonCodeService;
|
||||||
|
|
||||||
|
@GetMapping("/list.do")
|
||||||
|
@Operation(summary = "이행정보 관리 화면", description = "이행정보 목록을 조회합니다.")
|
||||||
|
public String mainPage(Model model, HttpServletRequest request) {
|
||||||
|
|
||||||
|
//진행단계 코드 조회
|
||||||
|
CmmnCodeSearchVO impltTaskSeCdSearchVO = CmmnCodeSearchVO.builder()
|
||||||
|
.searchCdGroupId("IMPLT_TASK_SE_CD")
|
||||||
|
.sortColumn("SORT_ORDR")
|
||||||
|
.sortAscending(true)
|
||||||
|
.build();
|
||||||
|
model.addAttribute("impltTaskSeCdList", commonCodeService.selectCodeDetailList(impltTaskSeCdSearchVO));
|
||||||
|
|
||||||
|
return "levy/levy/list"+ TilesConstants.BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행정보 목록을 조회하는 AJAX 메소드
|
||||||
|
* 공통 응답 형식(ApiResponse)을 사용하여 응답합니다.
|
||||||
|
*
|
||||||
|
* @param paramVO 검색 조건을 담은 VO 객체
|
||||||
|
* @return 이행정보 목록과 성공 상태를 담은 ResponseEntity 객체
|
||||||
|
* @throws Exception 조회 중 발생할 수 있는 예외
|
||||||
|
*/
|
||||||
|
@Operation(summary = "이행정보 목록 조회 (AJAX)", description = "이행정보 목록을 조회하고 JSON 형식으로 반환합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "이행정보 목록 조회 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "이행정보 목록 조회 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/levyImpltInfolist.ajax")
|
||||||
|
public ResponseEntity<?> levyImpltInfolistAjax(@ModelAttribute NotiImpltInfoVO paramVO) {
|
||||||
|
|
||||||
|
// 총 이행정보 수 조회
|
||||||
|
int totalCount = service.selectImpltInfoListTotalCount(paramVO);
|
||||||
|
paramVO.setTotalCount(totalCount);
|
||||||
|
|
||||||
|
// 페이징 처리를 위한 설정
|
||||||
|
paramVO.setPagingYn("Y");
|
||||||
|
|
||||||
|
// 페이징 처리된 이행정보 목록 조회
|
||||||
|
List<NotiImpltInfoVO> list = service.selectImpltInfoList(paramVO);
|
||||||
|
return ApiResponseUtil.successWithGrid(list, paramVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행 대상자를 조회하는 AJAX 메소드
|
||||||
|
*
|
||||||
|
* @param paramVO 검색 조건을 담은 VO 객체
|
||||||
|
* @return 이행 대상자 목록과 성공 상태를 담은 ResponseEntity 객체
|
||||||
|
* @throws Exception 조회 중 발생할 수 있는 예외
|
||||||
|
*/
|
||||||
|
@Operation(summary = "이행 대상자 목록 조회", description = "이행 대상자 목록을 조회합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "이행 대상자 목록 조회 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "이행 대상자 목록 조회 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/levyImpltTrprInfolist.ajax")
|
||||||
|
public ResponseEntity<?> levyImpltInfolistAjax(@ModelAttribute NotiImpltTrprInfoVO paramVO) {
|
||||||
|
|
||||||
|
List<NotiImpltTrprInfoVO> result = service.selectImpltTrprInfoList(paramVO);
|
||||||
|
|
||||||
|
return ApiResponseUtil.successWithGrid(result, paramVO);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
package go.kr.project.levy.levy.mapper;
|
||||||
|
|
||||||
|
import go.kr.project.levy.levy.model.LevyNotiImpltInfoVO;
|
||||||
|
import go.kr.project.levy.levy.model.LevyNotiImpltTrprInfoVO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levy.mapper
|
||||||
|
* fileName : LevyMapper
|
||||||
|
* author : 김동규
|
||||||
|
* date : 2025-10-14
|
||||||
|
* description : 이행정보 관련 데이터베이스 접근을 위한 MyBatis 매퍼 인터페이스
|
||||||
|
* 중요한 로직 주석: 이행정보 테이블(tb_implt_info)과 이행대상자 테이블(tb_implt_trpr_info)에 대한 CRUD 작업을 수행한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-08 시스템 관리자 최초 생성
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface LevyMapper {
|
||||||
|
|
||||||
|
// ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행정보 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectImpltInfoListTotalCount(LevyNotiImpltInfoVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행정보 목록을 조회한다.
|
||||||
|
* @param vo 조회할 단속 정보와 이행업무구분코드를 담은 VO 객체
|
||||||
|
* @return 조회된 이행정보
|
||||||
|
*/
|
||||||
|
List<LevyNotiImpltInfoVO> selectImpltInfoList(LevyNotiImpltInfoVO vo);
|
||||||
|
|
||||||
|
// ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행 대상자 정보 목록을 조회한다.
|
||||||
|
* @param vo 조회할 이행정보 ID를 담은 VO 객체
|
||||||
|
* @return 이행 대상자 정보 목록
|
||||||
|
*/
|
||||||
|
List<LevyNotiImpltTrprInfoVO> selectImpltTrprInfoList(LevyNotiImpltTrprInfoVO vo);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,133 @@
|
|||||||
|
package go.kr.project.levy.levy.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import go.kr.project.common.model.PagingVO;
|
||||||
|
import go.kr.project.noti.model.NotiImpltTrprInfoVO;
|
||||||
|
import lombok.*;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levy.model
|
||||||
|
* fileName : LevyNotiImpltInfoVO
|
||||||
|
* author : 김동규
|
||||||
|
* date : 2025-10-14
|
||||||
|
* description : 이행정보 관련 데이터를 담는 Value Object 클래스
|
||||||
|
* 중요한 로직 주석: 이행정보 테이블(tb_implt_info)과 매핑되는 VO 클래스로 페이징 기능을 포함한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-10-14 김동규 최초 생성
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@ToString
|
||||||
|
public class LevyNotiImpltInfoVO extends PagingVO {
|
||||||
|
|
||||||
|
// ==================== 기본 테이블 컬럼 (TB_IMPLT_INFO) ====================
|
||||||
|
|
||||||
|
/** 이행정보 ID */
|
||||||
|
private String impltInfoId;
|
||||||
|
|
||||||
|
/** 시군구 코드 */
|
||||||
|
private String sggCd;
|
||||||
|
|
||||||
|
/** 단속 연도 */
|
||||||
|
private String crdnYr;
|
||||||
|
|
||||||
|
/** 단속 번호 */
|
||||||
|
private String crdnNo;
|
||||||
|
|
||||||
|
/** 이행업무구분코드 (1:처분사전, 2:시정명령, 3:시정촉구, 4:부과예고, 5:부과, 6:납부촉구) */
|
||||||
|
private String impltTaskSeCd;
|
||||||
|
|
||||||
|
/** 이행 시작 일자 (행정처분 시작일) */
|
||||||
|
private String impltBgngYmd;
|
||||||
|
|
||||||
|
/** 이행 종료 일자 (행정처분 종료일) */
|
||||||
|
private String impltEndYmd;
|
||||||
|
|
||||||
|
/** 행정처분 간격일 (자동계산) */
|
||||||
|
private Integer impltDaysCnt;
|
||||||
|
|
||||||
|
/** 등록 일시 */
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
|
||||||
|
private LocalDateTime regDt;
|
||||||
|
|
||||||
|
/** 등록자 */
|
||||||
|
private String rgtr;
|
||||||
|
|
||||||
|
/** 수정 일시 */
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
|
||||||
|
private LocalDateTime mdfcnDt;
|
||||||
|
|
||||||
|
/** 수정자 */
|
||||||
|
private String mdfr;
|
||||||
|
|
||||||
|
/** 삭제 여부 */
|
||||||
|
private String delYn;
|
||||||
|
|
||||||
|
/** 삭제 일시 */
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
|
||||||
|
private LocalDateTime delDt;
|
||||||
|
|
||||||
|
/** 삭제자 */
|
||||||
|
private String dltr;
|
||||||
|
|
||||||
|
// ==================== 추가 필드 ====================
|
||||||
|
|
||||||
|
/** 모드 (C:등록, U:수정, V:보기, D:삭제) */
|
||||||
|
private String mode;
|
||||||
|
|
||||||
|
/** 단속 정보 (조인용) */
|
||||||
|
private String dsclYmd; // 적발일자
|
||||||
|
private String exmnr; // 조사원
|
||||||
|
private String lotnoWholAddr; // 지번전체주소
|
||||||
|
private String lotnoAddr; // 지번주소
|
||||||
|
private String lotnoMno; // 지번본번
|
||||||
|
private String lotnoSno; // 지번부번
|
||||||
|
|
||||||
|
// ==================== 조인 컬럼 (코드명) ====================
|
||||||
|
|
||||||
|
/** 이행업무구분코드명 */
|
||||||
|
private String impltTaskSeCdNm;
|
||||||
|
|
||||||
|
/** 지역구분코드 */
|
||||||
|
private String rgnSeCd;
|
||||||
|
|
||||||
|
/** 지역구분코드명 */
|
||||||
|
private String rgnSeCdNm;
|
||||||
|
|
||||||
|
/** 표준읍면동코드 */
|
||||||
|
private String stdgEmdCd;
|
||||||
|
|
||||||
|
/** 표준읍면동코드명 */
|
||||||
|
private String stdgEmdCdNm;
|
||||||
|
|
||||||
|
private String rgtrNm;
|
||||||
|
private String mdrfNm;
|
||||||
|
|
||||||
|
// ==================== 검색 조건 ====================
|
||||||
|
|
||||||
|
/** 검색 조건 - 단속 연도 */
|
||||||
|
private String schCrdnYr;
|
||||||
|
|
||||||
|
/** 검색 조건 - 진행 단계 코드 */
|
||||||
|
private String schImpltTaskSeCd;
|
||||||
|
|
||||||
|
/** 검색 조건 - 행정처분시작일 */
|
||||||
|
private String schImpltBgngYmd1;
|
||||||
|
private String schImpltBgngYmd2;
|
||||||
|
// ==================== 이행 대상자 정보, 등록용도 ====================
|
||||||
|
|
||||||
|
/** 이행 대상자 정보 리스트 */
|
||||||
|
private List<NotiImpltTrprInfoVO> impltTrprInfoList;
|
||||||
|
}
|
||||||
@ -0,0 +1,126 @@
|
|||||||
|
package go.kr.project.levy.levy.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import go.kr.project.common.model.PagingVO;
|
||||||
|
import lombok.*;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levy.model
|
||||||
|
* fileName : LevyNotiImpltTrprInfoVO
|
||||||
|
* author : 김동규
|
||||||
|
* date : 2025-10-14
|
||||||
|
* description : 이행 대상자 정보 관련 데이터를 담는 Value Object 클래스
|
||||||
|
* 중요한 로직 주석: 이행 대상자 정보 테이블(tb_implt_trpr_info)과 매핑되는 VO 클래스
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-10-14 김동규 최초 생성
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@ToString
|
||||||
|
public class LevyNotiImpltTrprInfoVO extends PagingVO {
|
||||||
|
|
||||||
|
// ==================== 기본 테이블 컬럼 (TB_IMPLT_TRPR_INFO) ====================
|
||||||
|
|
||||||
|
/** 이행 대상자 정보 ID */
|
||||||
|
private String impltTrprInfoId;
|
||||||
|
|
||||||
|
/** 시군구 코드 */
|
||||||
|
private String sggCd;
|
||||||
|
|
||||||
|
/** 이행 정보 ID */
|
||||||
|
private String impltInfoId;
|
||||||
|
|
||||||
|
/** 이행 대상자 성명 */
|
||||||
|
private String impltTrprFlnm;
|
||||||
|
|
||||||
|
/** 이행 대상자 주소 */
|
||||||
|
private String impltTrprAddr;
|
||||||
|
|
||||||
|
/** 이행 대상자 상세주소 */
|
||||||
|
private String impltTrprDaddr;
|
||||||
|
|
||||||
|
/** 이행 대상자 우편번호 */
|
||||||
|
private String impltTrprZip;
|
||||||
|
|
||||||
|
/** 이행 대상자 구분 코드 (1:소유자, 2:행위자) */
|
||||||
|
private String impltTrprSeCd;
|
||||||
|
|
||||||
|
/** 소유자 행위자 정보 ID */
|
||||||
|
private String ownrActrInfoId;
|
||||||
|
|
||||||
|
/** 행위 번호 */
|
||||||
|
private String actNo;
|
||||||
|
|
||||||
|
/** 등록 일시 */
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
|
||||||
|
private LocalDateTime regDt;
|
||||||
|
|
||||||
|
/** 등록자 */
|
||||||
|
private String rgtr;
|
||||||
|
|
||||||
|
/** 수정 일시 */
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
|
||||||
|
private LocalDateTime mdfcnDt;
|
||||||
|
|
||||||
|
/** 수정자 */
|
||||||
|
private String mdfr;
|
||||||
|
|
||||||
|
/** 삭제 여부 */
|
||||||
|
private String delYn;
|
||||||
|
|
||||||
|
/** 삭제 일시 */
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
|
||||||
|
private LocalDateTime delDt;
|
||||||
|
|
||||||
|
/** 삭제자 */
|
||||||
|
private String dltr;
|
||||||
|
|
||||||
|
// ==================== 조인 컬럼 (코드명) ====================
|
||||||
|
|
||||||
|
/** 이행 대상자 구분 코드명 */
|
||||||
|
private String impltTrprSeCdNm;
|
||||||
|
|
||||||
|
/** 시군구 코드명 */
|
||||||
|
private String sggCdNm;
|
||||||
|
|
||||||
|
/** 행위 구분 */
|
||||||
|
private String actTypeCdNm;
|
||||||
|
|
||||||
|
// ==================== 추가 필드 (체크박스 선택용) ====================
|
||||||
|
|
||||||
|
/** 체크박스 선택 여부 */
|
||||||
|
//private boolean selected;
|
||||||
|
|
||||||
|
//private String lotnoMno;
|
||||||
|
//private String lotnoSno;
|
||||||
|
|
||||||
|
// ==================== 검색 조건 ====================
|
||||||
|
|
||||||
|
/** 검색 조건 - 이행 정보 ID */
|
||||||
|
private String schImpltInfoId;
|
||||||
|
|
||||||
|
// ==================== TUI 그리드용 속성 ====================
|
||||||
|
/**
|
||||||
|
* TUI Grid 행 속성 (예: 체크박스, 클래스명)
|
||||||
|
* <pre>
|
||||||
|
* {
|
||||||
|
* "checked": true,
|
||||||
|
* "className": {
|
||||||
|
* "row": ["red"]
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
private java.util.Map<String, Object> _attributes;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
package go.kr.project.levy.levy.service;
|
||||||
|
|
||||||
|
import go.kr.project.levy.levy.model.LevyNotiImpltInfoVO;
|
||||||
|
import go.kr.project.levy.levy.model.LevyNotiImpltTrprInfoVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levy.service
|
||||||
|
* fileName : LevyService
|
||||||
|
* author : 김동규
|
||||||
|
* date : 2025-10-14
|
||||||
|
* description : 이행정보 관련 비즈니스 로직을 처리하는 서비스 인터페이스
|
||||||
|
* 중요한 로직 주석: 이행정보와 이행대상자 정보의 CRUD 기능을 제공한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-10-14 김동규 최초 생성
|
||||||
|
*/
|
||||||
|
public interface LevyService {
|
||||||
|
|
||||||
|
// ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행정보 목록의 총 개수를 조회합니다.
|
||||||
|
*
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectImpltInfoListTotalCount(LevyNotiImpltInfoVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행정보 목록을 조회한다.
|
||||||
|
* @param vo 조회할 단속 정보와 이행업무구분코드를 담은 VO 객체
|
||||||
|
* @return 조회된 이행정보
|
||||||
|
*/
|
||||||
|
List<LevyNotiImpltInfoVO> selectImpltInfoList(LevyNotiImpltInfoVO vo);
|
||||||
|
|
||||||
|
// ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이행 대상자 정보 목록을 조회한다.
|
||||||
|
* @param vo 조회할 이행정보 ID를 담은 VO 객체
|
||||||
|
* @return 이행 대상자 정보 목록
|
||||||
|
*/
|
||||||
|
List<LevyNotiImpltTrprInfoVO> selectImpltTrprInfoList(LevyNotiImpltTrprInfoVO vo);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
package go.kr.project.levy.levy.service.impl;
|
||||||
|
|
||||||
|
import go.kr.project.levy.levy.mapper.LevyMapper;
|
||||||
|
import go.kr.project.levy.levy.model.LevyNotiImpltInfoVO;
|
||||||
|
import go.kr.project.levy.levy.model.LevyNotiImpltTrprInfoVO;
|
||||||
|
import go.kr.project.levy.levy.service.LevyService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levy.service.impl
|
||||||
|
* fileName : LevyServiceImpl
|
||||||
|
* author : 김동규
|
||||||
|
* date : 2025-10-14
|
||||||
|
* description : 이행정보 관련 비즈니스 로직을 처리하는 서비스 구현 클래스
|
||||||
|
* 중요한 로직 주석: 이행정보와 이행대상자 정보의 CRUD 기능을 제공하며, 트랜잭션 처리를 포함한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-10-14 김동규 최초 생성
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class LevyServiceImpl extends EgovAbstractServiceImpl implements LevyService {
|
||||||
|
|
||||||
|
private final LevyMapper mapper;
|
||||||
|
|
||||||
|
// ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ====================
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int selectImpltInfoListTotalCount(LevyNotiImpltInfoVO vo) {
|
||||||
|
return mapper.selectImpltInfoListTotalCount(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LevyNotiImpltInfoVO> selectImpltInfoList(LevyNotiImpltInfoVO vo) {
|
||||||
|
return mapper.selectImpltInfoList(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ====================
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LevyNotiImpltTrprInfoVO> selectImpltTrprInfoList(LevyNotiImpltTrprInfoVO vo) {
|
||||||
|
return mapper.selectImpltTrprInfoList(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,107 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="go.kr.project.levy.levy.mapper.LevyMapper">
|
||||||
|
|
||||||
|
<!-- ==================== 이행정보(TB_IMPLT_INFO) 관련 쿼리 ==================== -->
|
||||||
|
|
||||||
|
<!-- 이행정보 조회 -->
|
||||||
|
<select id="selectImpltInfoList" parameterType="LevyNotiImpltInfoVO" resultType="LevyNotiImpltInfoVO">
|
||||||
|
SELECT
|
||||||
|
ii.IMPLT_INFO_ID,
|
||||||
|
ii.SGG_CD,
|
||||||
|
ii.CRDN_YR,
|
||||||
|
ii.CRDN_NO,
|
||||||
|
ii.IMPLT_TASK_SE_CD,
|
||||||
|
ii.IMPLT_BGNG_YMD,
|
||||||
|
ii.IMPLT_END_YMD,
|
||||||
|
ii.REG_DT,
|
||||||
|
ii.RGTR,
|
||||||
|
ii.MDFCN_DT,
|
||||||
|
ii.MDFR,
|
||||||
|
ii.DEL_YN,
|
||||||
|
ii.DEL_DT,
|
||||||
|
ii.DLTR,
|
||||||
|
-- 단속 정보 (조인)
|
||||||
|
c.DSCL_YMD,
|
||||||
|
c.EXMNR,
|
||||||
|
c.RGN_SE_CD,
|
||||||
|
rgnSeCd.CD_NM as RGN_SE_CD_NM,
|
||||||
|
p.STDG_EMD_CD,
|
||||||
|
stdgEmdCd.CD_NM as STDG_EMD_CD_NM,
|
||||||
|
p.LOTNO_ADDR,
|
||||||
|
p.LOTNO_MNO,
|
||||||
|
p.LOTNO_SNO,
|
||||||
|
impltTaskSe.CD_NM as IMPLT_TASK_SE_CD_NM,
|
||||||
|
ru.USER_NM AS RGTR_NM, /* 등록자 명 */
|
||||||
|
mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM TB_IMPLT_INFO ii
|
||||||
|
INNER JOIN tb_crdn c ON ii.CRDN_YR = c.CRDN_YR AND ii.CRDN_NO = c.CRDN_NO AND c.DEL_YN = 'N'
|
||||||
|
LEFT JOIN tb_pstn_info p ON p.CRDN_YR = c.CRDN_YR AND p.CRDN_NO = c.CRDN_NO AND p.DEL_YN = 'N'
|
||||||
|
-- 코드성 데이터 조인
|
||||||
|
LEFT JOIN tb_cd_detail impltTaskSe ON impltTaskSe.CD_GROUP_ID = 'IMPLT_TASK_SE_CD' AND impltTaskSe.CD_ID = ii.IMPLT_TASK_SE_CD
|
||||||
|
LEFT JOIN tb_cd_detail stdgEmdCd ON stdgEmdCd.CD_GROUP_ID = 'STDG_EMD_CD' AND stdgEmdCd.CD_ID = p.STDG_EMD_CD
|
||||||
|
LEFT JOIN tb_cd_detail rgnSeCd ON rgnSeCd.CD_GROUP_ID = 'RGN_SE_CD' AND rgnSeCd.CD_ID = c.RGN_SE_CD
|
||||||
|
LEFT JOIN tb_user ru ON ii.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON ii.MDFR = mu.USER_ID
|
||||||
|
WHERE ii.CRDN_YR = #{schCrdnYr}
|
||||||
|
AND ii.DEL_YN = 'N'
|
||||||
|
AND ii.IMPLT_BGNG_YMD BETWEEN #{schImpltBgngYmd1} AND #{schImpltBgngYmd2}
|
||||||
|
<if test='schImpltTaskSeCd != null and schImpltTaskSeCd != ""'>
|
||||||
|
AND ii.IMPLT_TASK_SE_CD = #{schImpltTaskSeCd}
|
||||||
|
</if>
|
||||||
|
ORDER BY CRDN_NO ASC
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 이행정보 조회 -->
|
||||||
|
<select id="selectImpltInfoListTotalCount" parameterType="LevyNotiImpltInfoVO" resultType="int">
|
||||||
|
SELECT Count(*)
|
||||||
|
FROM TB_IMPLT_INFO ii
|
||||||
|
INNER JOIN tb_crdn c ON ii.CRDN_YR = c.CRDN_YR AND ii.CRDN_NO = c.CRDN_NO AND c.DEL_YN = 'N'
|
||||||
|
LEFT JOIN tb_pstn_info p ON p.CRDN_YR = c.CRDN_YR AND p.CRDN_NO = c.CRDN_NO AND p.DEL_YN = 'N'
|
||||||
|
WHERE ii.CRDN_YR = #{schCrdnYr}
|
||||||
|
AND ii.DEL_YN = 'N'
|
||||||
|
AND ii.IMPLT_BGNG_YMD BETWEEN #{schImpltBgngYmd1} AND #{schImpltBgngYmd2}
|
||||||
|
<if test='schImpltTaskSeCd != null and schImpltTaskSeCd != ""'>
|
||||||
|
AND ii.IMPLT_TASK_SE_CD = #{schImpltTaskSeCd}
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 쿼리 ==================== -->
|
||||||
|
|
||||||
|
<!-- 이행 대상자 정보 목록 조회 -->
|
||||||
|
<select id="selectImpltTrprInfoList" parameterType="LevyNotiImpltTrprInfoVO"
|
||||||
|
resultType="LevyNotiImpltTrprInfoVO">
|
||||||
|
SELECT
|
||||||
|
iti.IMPLT_TRPR_INFO_ID,
|
||||||
|
iti.SGG_CD,
|
||||||
|
iti.IMPLT_INFO_ID,
|
||||||
|
iti.IMPLT_TRPR_FLNM,
|
||||||
|
iti.IMPLT_TRPR_ADDR,
|
||||||
|
iti.IMPLT_TRPR_DADDR,
|
||||||
|
iti.IMPLT_TRPR_ZIP,
|
||||||
|
iti.IMPLT_TRPR_SE_CD,
|
||||||
|
iti.OWNR_ACTR_INFO_ID,
|
||||||
|
iti.REG_DT,
|
||||||
|
iti.RGTR,
|
||||||
|
iti.MDFCN_DT,
|
||||||
|
iti.MDFR,
|
||||||
|
iti.DEL_YN,
|
||||||
|
iti.DEL_DT,
|
||||||
|
iti.DLTR,
|
||||||
|
iti.ACT_NO,
|
||||||
|
-- 코드성 데이터 조인 (코드명)
|
||||||
|
impltTrprSe.CD_NM as IMPLT_TRPR_SE_CD_NM,
|
||||||
|
actTypeCd.CD_NM AS ACT_TYPE_CD_NM,
|
||||||
|
sggCd.CD_NM as SGG_CD_NM
|
||||||
|
FROM TB_IMPLT_TRPR_INFO iti
|
||||||
|
-- 코드성 데이터 조인
|
||||||
|
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = iti.IMPLT_TRPR_SE_CD
|
||||||
|
LEFT JOIN tb_cd_detail actTypeCd ON actTypeCd.CD_GROUP_ID = 'ACT_TYPE_CD' AND actTypeCd.CD_ID = iti.ACT_NO
|
||||||
|
LEFT JOIN tb_cd_detail sggCd ON sggCd.CD_GROUP_ID = 'SGG_CD' AND sggCd.CD_ID = iti.SGG_CD
|
||||||
|
WHERE iti.IMPLT_INFO_ID = #{schImpltInfoId}
|
||||||
|
AND iti.DEL_YN = 'N'
|
||||||
|
ORDER BY iti.IMPLT_TRPR_SE_CD, iti.IMPLT_TRPR_FLNM
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,619 @@
|
|||||||
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||||
|
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||||
|
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
|
||||||
|
|
||||||
|
<!-- Main body -->
|
||||||
|
<div class="main_body">
|
||||||
|
<section id="section8" class="main_bars">
|
||||||
|
<div class="bgs-main">
|
||||||
|
<section id="section5">
|
||||||
|
<div class="sub_title"></div>
|
||||||
|
<button type="button" id="updaterBtn" class="newbtn bg4">수정</button>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="contants_body">
|
||||||
|
<div class="gs_b_top">
|
||||||
|
<ul class="lef">
|
||||||
|
<li class="th">단속 년도</li>
|
||||||
|
<li>
|
||||||
|
<input type="text" id="schCrdnYr" name="schCrdnYr" maxlength="4" class="input calender yearpicker" style="width: 80px;" autocomplete="off" value="${dateUtil:getCurrentDateTime('yyyy')}"/>
|
||||||
|
</li>
|
||||||
|
<li class="th">진행단계</li>
|
||||||
|
<li>
|
||||||
|
<select id="schImpltTaskSeCd" name="schImpltTaskSeCd" class="input" style="width: 120px;">
|
||||||
|
<option value="">전체</option>
|
||||||
|
<c:forEach var="code" items="${impltTaskSeCdList}">
|
||||||
|
<option value="${code.cdId}" <c:if test="${param.schImpltTaskSeCd eq code.cdId}">selected</c:if>>
|
||||||
|
${code.cdNm}
|
||||||
|
</option>
|
||||||
|
</c:forEach>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li class="th">행정처분시작일</li>
|
||||||
|
<li>
|
||||||
|
<input type="text" id="schImpltBgngYmd1" name="schImpltBgngYmd1" class="input calender datepicker"
|
||||||
|
style="width: 120px;" maxlength="10" validation-check="required"
|
||||||
|
value="${dateUtil:getCurrentDateAddMonths('yyyy-MM-dd', -1)}"
|
||||||
|
onchange="calculateDaysBetween();" />
|
||||||
|
</li>
|
||||||
|
<li class="th">~</li>
|
||||||
|
<li>
|
||||||
|
<input type="text" id="schImpltBgngYmd2" name="schImpltBgngYmd2" class="input calender datepicker"
|
||||||
|
style="width: 120px;" maxlength="10" validation-check="required"
|
||||||
|
value="${dateUtil:getCurrentDateTime('yyyy-MM-dd')}"
|
||||||
|
onchange="calculateDaysBetween();" />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="rig2">
|
||||||
|
<li><button type="button" id="search_btn" class="newbtnss bg1">검색</button></li>
|
||||||
|
<li><button type="button" id="reset_btn" class="newbtnss bg5" style="margin-left: 5px;">초기화</button></li>
|
||||||
|
<li><button type="button" id="openReviBtn" class="newbtnss bg1" onclick="openReviReport()">이행강제금 부과통지서</button></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="gs_booking">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="box_column">
|
||||||
|
<ul class="box_title" style="display: flex; justify-content: space-between; align-items: center;">
|
||||||
|
<li class="tit">이행 정보 목록</li>
|
||||||
|
<li class="rig">
|
||||||
|
<span id="totalCount" class="total-count" style="padding-left: 25px;padding-right: 25px;">총 0건</span>
|
||||||
|
<select id="perPageSelect" class="input" style="width: 112px; ">
|
||||||
|
<option value="15">페이지당 10</option>
|
||||||
|
<option value="50">페이지당 20</option>
|
||||||
|
</select>
|
||||||
|
<span class="page_number"><span id="currentPage"></span><span class="bar">/</span><span id="totalPages"></span> Pages</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="containers">
|
||||||
|
<div id="masterGrid"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 하단 영역 (상세그룹 코드 관리) -->
|
||||||
|
<div class="gs_booking" style="margin-top: 30px;">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="box_column">
|
||||||
|
<ul class="box_title">
|
||||||
|
<li class="tit">이행자 목록</li>
|
||||||
|
</ul>
|
||||||
|
<div class="containers">
|
||||||
|
<div id="detailGrid"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- //하단 영역 (상세그룹 코드 관리) -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- /Main body -->
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 조사원 등록/조회 목록 관리 모듈
|
||||||
|
* 조사원 목록을 조회하고 관리하는 기능을 제공합니다.
|
||||||
|
*/
|
||||||
|
(function(window, $) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var SEARCH_MASTER_COND = {};
|
||||||
|
|
||||||
|
// 페이징 정보를 저장할 전역 변수
|
||||||
|
var GRID_PAGINATION_INFO = {
|
||||||
|
totalCount: 0,
|
||||||
|
page: 0,
|
||||||
|
perPage: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// 검색정보 설정
|
||||||
|
var setMasterSearchCond = function() {
|
||||||
|
var schCrdnYr = $.trim(nvl($("#schCrdnYr").val(), ""));
|
||||||
|
var schImpltTaskSeCd = $.trim(nvl($("#schImpltTaskSeCd").val(), ""));
|
||||||
|
var schImpltBgngYmd1 = $.trim(nvl($("#schImpltBgngYmd1").val(), "")).replace(/-/g, "");
|
||||||
|
var schImpltBgngYmd2 = $.trim(nvl($("#schImpltBgngYmd2").val(), "")).replace(/-/g, "");
|
||||||
|
|
||||||
|
SEARCH_MASTER_COND.schCrdnYr = schCrdnYr;
|
||||||
|
SEARCH_MASTER_COND.schImpltTaskSeCd = schImpltTaskSeCd;
|
||||||
|
SEARCH_MASTER_COND.schImpltBgngYmd1 = schImpltBgngYmd1;
|
||||||
|
SEARCH_MASTER_COND.schImpltBgngYmd2 = schImpltBgngYmd2;
|
||||||
|
//console.log(SEARCH_MASTER_COND.schImpltBgngYmd2);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 조사원 목록 관리 네임스페이스
|
||||||
|
*/
|
||||||
|
var LevyList = {
|
||||||
|
/**
|
||||||
|
* 선택된 행 정보
|
||||||
|
*/
|
||||||
|
schImpltInfoId: '',
|
||||||
|
selectedRow: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 마스터 그리드 관련 객체
|
||||||
|
*/
|
||||||
|
masterGrid: {
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스
|
||||||
|
*/
|
||||||
|
instance: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 설정 초기화
|
||||||
|
* @returns {Object} 그리드 설정 객체
|
||||||
|
*/
|
||||||
|
initConfig: function() {
|
||||||
|
// 데이터 소스 설정
|
||||||
|
var dataSource = this.createDataSource();
|
||||||
|
|
||||||
|
// 현재 선택된 perPage 값 가져오기
|
||||||
|
var perPage = parseInt($('#perPageSelect').val() || 10, 10);
|
||||||
|
|
||||||
|
// 그리드 설정 객체 생성
|
||||||
|
var gridConfig = new XitTuiGridConfig();
|
||||||
|
|
||||||
|
// 기본 설정
|
||||||
|
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
|
||||||
|
gridConfig.setOptGridId('masterGrid'); // 그리드를 출력할 Element ID
|
||||||
|
gridConfig.setOptGridHeight(170); // 그리드 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번, checkbox: 체크박스, '': 출력 안함)
|
||||||
|
gridConfig.setOptUseClientSort(false); // 서버사이드 정렬 false
|
||||||
|
|
||||||
|
// 페이징 옵션 설정
|
||||||
|
gridConfig.setOptPageOptions({
|
||||||
|
useClient: false, // 클라이언트 페이징 여부(false: 서버 페이징)
|
||||||
|
perPage: perPage // 페이지당 표시 건수
|
||||||
|
});
|
||||||
|
gridConfig.setOptColumns(this.getGridColumns());
|
||||||
|
|
||||||
|
return gridConfig;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 컬럼 정의
|
||||||
|
* @returns {Array} 그리드 컬럼 배열
|
||||||
|
*/
|
||||||
|
getGridColumns: function() {
|
||||||
|
var self = this;
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
header: '단속년도',
|
||||||
|
name: 'crdnYr',
|
||||||
|
align: 'center',
|
||||||
|
width: 90
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '단속번호',
|
||||||
|
name: 'crdnNo',
|
||||||
|
align: 'center',
|
||||||
|
width: 100,
|
||||||
|
sortable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '진행단계',
|
||||||
|
name: 'impltTaskSeCdNm',
|
||||||
|
align: 'center',
|
||||||
|
width: 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '구분',
|
||||||
|
name: 'rgnSeCdNm',
|
||||||
|
align: 'center',
|
||||||
|
width: 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '단속동',
|
||||||
|
name: 'stdgEmdCdNm',
|
||||||
|
align: 'center',
|
||||||
|
width: 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '행정처분시작일',
|
||||||
|
name: 'impltBgngYmd',
|
||||||
|
align: 'center',
|
||||||
|
width: 110,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '행정처분종료일',
|
||||||
|
name: 'impltEndYmd',
|
||||||
|
align: 'center',
|
||||||
|
width: 110,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '등록일시',
|
||||||
|
name: 'regDt',
|
||||||
|
align: 'center',
|
||||||
|
width: 130
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '등록자',
|
||||||
|
name: 'rgtrNm',
|
||||||
|
align: 'center',
|
||||||
|
width: 100
|
||||||
|
}
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 데이터 소스 생성
|
||||||
|
* @returns {Object} 데이터 소스 설정 객체
|
||||||
|
*/
|
||||||
|
createDataSource: function() {
|
||||||
|
return {
|
||||||
|
api: {
|
||||||
|
readData: {
|
||||||
|
url: '<c:url value="/levy/levy/levyImpltInfolist.ajax"/>',
|
||||||
|
method: 'POST',
|
||||||
|
contentType: 'application/x-www-form-urlencoded',
|
||||||
|
processData: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initialRequest: false, // 초기 데이터 요청 여부
|
||||||
|
serializer: function(params) {
|
||||||
|
setMasterSearchCond();
|
||||||
|
SEARCH_MASTER_COND.perPage = params.perPage;
|
||||||
|
SEARCH_MASTER_COND.page = params.page;
|
||||||
|
var searchParams = $.param(SEARCH_MASTER_COND);
|
||||||
|
return searchParams;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스 생성
|
||||||
|
*/
|
||||||
|
create: function() {
|
||||||
|
var gridConfig = this.initConfig();
|
||||||
|
var Grid = tui.Grid;
|
||||||
|
this.instance = gridConfig.instance(Grid);
|
||||||
|
|
||||||
|
// 그리드 테마 설정
|
||||||
|
Grid.applyTheme('striped');
|
||||||
|
|
||||||
|
this.gridBindEvents();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 이벤트 바인딩
|
||||||
|
*/
|
||||||
|
gridBindEvents: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// 데이터 로딩 완료 이벤트 - 라디오 버튼 초기화
|
||||||
|
this.instance.on('successResponse', function(ev) {
|
||||||
|
var responseObj = JSON.parse(ev.xhr.response);
|
||||||
|
if( responseObj ){
|
||||||
|
$("#currentPage").text(responseObj.data.pagination.page);
|
||||||
|
$("#totalPages").text(responseObj.data.pagination.totalPages);
|
||||||
|
var totalCount = responseObj.data.pagination.totalCount;
|
||||||
|
$("#totalCount").text('총 ' + totalCount.toLocaleString() + '건');
|
||||||
|
|
||||||
|
// 페이징 정보를 전역 변수에 저장 (formatter에서 사용하기 위해)
|
||||||
|
GRID_PAGINATION_INFO.totalCount = responseObj.data.pagination.totalCount;
|
||||||
|
GRID_PAGINATION_INFO.page = responseObj.data.pagination.page;
|
||||||
|
GRID_PAGINATION_INFO.perPage = responseObj.data.pagination.perPage;
|
||||||
|
|
||||||
|
//하단 그리드 초기화
|
||||||
|
LevyList.selectCdGroupId = '';
|
||||||
|
LevyList.detailGrid.instance.readData(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행 초기화
|
||||||
|
LevyList.selectedRow = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.instance.on('focusChange', function(ev) {
|
||||||
|
if (ev.rowKey === undefined) return;
|
||||||
|
|
||||||
|
var rowData = self.instance.getRow(ev.rowKey);
|
||||||
|
if (!rowData) return;
|
||||||
|
|
||||||
|
LevyList.selectedRow = self.instance.getRow(ev.rowKey);
|
||||||
|
LevyList.schImpltInfoId = rowData.impltInfoId;
|
||||||
|
LevyList.detailGrid.instance.readData(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 클릭 이벤트 - 라디오 버튼 즉시 체크를 위해 추가
|
||||||
|
this.instance.on('click', function(ev) {
|
||||||
|
if (ev.rowKey !== undefined && ev.rowKey !== null) {
|
||||||
|
LevyList.selectedRow = self.instance.getRow(ev.rowKey);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 더블클릭 이벤트 - detailView 페이지를 새 탭으로 열기
|
||||||
|
this.instance.on('dblclick', function(ev) {
|
||||||
|
var rowKey = ev.rowKey;
|
||||||
|
var rowData = self.instance.getRow(rowKey);
|
||||||
|
if (rowData) {
|
||||||
|
//LevyList.openViewPopup(rowData.NotiId);
|
||||||
|
LevyList.openImpltTaskPopup(LevyList.selectedRow.crdnYr, LevyList.selectedRow.crdnNo, LevyList.selectedRow.impltTaskSeCd);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
openImpltTaskPopup: function(crdnYr, crdnNo, impltTaskSeCd) {
|
||||||
|
|
||||||
|
if (!this.selectedRow) {
|
||||||
|
alert('수정할 단속 건을 선택해주세요.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 기존 이행정보가 있는지 확인하여 모드 결정
|
||||||
|
var self = this;
|
||||||
|
$.ajax({
|
||||||
|
url: '<c:url value="/crdn/crndRegistAndView/crdnImpltTask/selectImpltInfo.ajax"/>',
|
||||||
|
type: 'GET',
|
||||||
|
data: {
|
||||||
|
crdnYr: crdnYr,
|
||||||
|
crdnNo: crdnNo,
|
||||||
|
impltTaskSeCd: impltTaskSeCd
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
var mode = (response && response.success && response.data) ? 'U' : 'C';
|
||||||
|
var url = '<c:url value="/crdn/crndRegistAndView/crdnImpltTask/impltTaskPopup.do"/>?mode=' + mode +
|
||||||
|
'&crdnYr=' + encodeURIComponent(crdnYr) +
|
||||||
|
'&crdnNo=' + encodeURIComponent(crdnNo) +
|
||||||
|
'&impltTaskSeCd=' + encodeURIComponent(impltTaskSeCd);
|
||||||
|
openPopup(url, 1200, 610, 'impltTaskPopup');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
openReviReport: function() {
|
||||||
|
if (!this.selectedRow) {
|
||||||
|
alert("리포트를 볼 부과항목을 선택해주세요.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var crdnNo = this.selectedRow.crdnNo; // 선택된 행의 키값
|
||||||
|
var url = '<%=request.getContextPath()%>/ubi4/levyReport.jsp?crdnNo=' + encodeURIComponent(crdnNo);
|
||||||
|
var options = "width=800,height=1000,scrollbars=yes,resizable=yes";
|
||||||
|
window.open(url, "levyReport", options);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
detailGrid : {
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스
|
||||||
|
*/
|
||||||
|
instance : null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 설정 초기화
|
||||||
|
* @returns {Object} 그리드 설정 객체
|
||||||
|
*/
|
||||||
|
initConfig : function() {
|
||||||
|
// 데이터 소스 설정
|
||||||
|
var dataSource = this.createDataSource();
|
||||||
|
|
||||||
|
// 그리드 설정 객체 생성
|
||||||
|
var gridConfig = new XitTuiGridConfig();
|
||||||
|
|
||||||
|
// 기본 설정
|
||||||
|
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
|
||||||
|
gridConfig.setOptGridId('detailGrid'); // 그리드를 출력할 Element ID
|
||||||
|
gridConfig.setOptGridHeight(170); // 그리드 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번, checkbox: 체크박스, '': 출력 안함)
|
||||||
|
gridConfig.setOptUseClientSort(true); // 서버사이드 정렬 false
|
||||||
|
gridConfig.setOptColumns(this.getGridColumns());
|
||||||
|
|
||||||
|
return gridConfig;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 컬럼 정의
|
||||||
|
* @returns {Array} 그리드 컬럼 배열
|
||||||
|
*/
|
||||||
|
getGridColumns : function() {
|
||||||
|
var self = this;
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
header : '행위번호',
|
||||||
|
name : 'actNo',
|
||||||
|
align : 'center',
|
||||||
|
width : 60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header : '행위구분',
|
||||||
|
name : 'actTypeCdNm',
|
||||||
|
align : 'center',
|
||||||
|
width : 140
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header : '소유자,행위자 구분',
|
||||||
|
name : 'impltTrprSeCdNm',
|
||||||
|
align : 'center',
|
||||||
|
width : 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header : '성명',
|
||||||
|
name : 'impltTrprFlnm',
|
||||||
|
align : 'center',
|
||||||
|
width : 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header : '우편번호',
|
||||||
|
name : 'impltTrprZip',
|
||||||
|
align : 'center',
|
||||||
|
width : 80
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header : '주소',
|
||||||
|
name : 'impltTrprAddr',
|
||||||
|
align : 'center',
|
||||||
|
width : 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header : '상세주소',
|
||||||
|
name : 'impltTrprDaddr',
|
||||||
|
align : 'center',
|
||||||
|
width : 350
|
||||||
|
}
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 데이터 소스 생성
|
||||||
|
* @returns {Object} 데이터 소스 설정 객체
|
||||||
|
*/
|
||||||
|
createDataSource : function() {
|
||||||
|
return {
|
||||||
|
api : {
|
||||||
|
readData : {
|
||||||
|
url : '<c:url value="/noti/impltTrprInfolist.ajax"/>',
|
||||||
|
method : 'POST',
|
||||||
|
contentType : 'application/x-www-form-urlencoded',
|
||||||
|
processData : true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initialRequest : false, // 초기 데이터 요청 여부
|
||||||
|
serializer : function(params) {
|
||||||
|
// 검색 폼 데이터
|
||||||
|
//setDetailSearchCond();
|
||||||
|
var searchParams = $.param({schImpltInfoId: LevyList.schImpltInfoId});
|
||||||
|
//console.log(searchParams);
|
||||||
|
return searchParams;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스 생성
|
||||||
|
*/
|
||||||
|
create : function() {
|
||||||
|
var gridConfig = this.initConfig();
|
||||||
|
var Grid = tui.Grid;
|
||||||
|
this.instance = gridConfig.instance(Grid);
|
||||||
|
|
||||||
|
// 그리드 테마 설정
|
||||||
|
Grid.applyTheme('striped');
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 목록 새로고침
|
||||||
|
*/
|
||||||
|
refreshList: function() {
|
||||||
|
if (this.masterGrid.instance) {
|
||||||
|
this.masterGrid.instance.readData(GRID_PAGINATION_INFO.page);
|
||||||
|
this.detailGrid.instance.readData(1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이벤트 핸들러 설정
|
||||||
|
*/
|
||||||
|
eventBindEvents: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// 수정 버튼 클릭 이벤트
|
||||||
|
$("#updaterBtn").on('click', function() {
|
||||||
|
// 선택된 행 확인
|
||||||
|
if (!self.selectedRow) {
|
||||||
|
alert('수정할 단속 건을 선택해주세요.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행의 데이터로 팝업 열기
|
||||||
|
LevyList.openImpltTaskPopup(LevyList.selectedRow.crdnYr, LevyList.selectedRow.crdnNo, LevyList.selectedRow.impltTaskSeCd);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 검색 버튼 클릭 이벤트
|
||||||
|
$("#search_btn").on('click', function() {
|
||||||
|
self.masterGrid.instance.readData(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 초기화 버튼 클릭 이벤트
|
||||||
|
$("#reset_btn").on('click', function() {
|
||||||
|
// 모든 검색 조건 초기화
|
||||||
|
$("#schCrdnYr").val("");
|
||||||
|
$("#schImpltTaskSeCd").val("");
|
||||||
|
$("#schImpltBgngYmd1").val("");
|
||||||
|
$("#schImpltBgngYmd2").val("");
|
||||||
|
|
||||||
|
// 그리드 데이터 새로고침
|
||||||
|
self.masterGrid.instance.readData(1);
|
||||||
|
self.detailGrid.instance.readData(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 엔터키 검색
|
||||||
|
$(".gs_b_top input").on('keypress', function(e) {
|
||||||
|
if (e.which === 13) {
|
||||||
|
e.preventDefault();
|
||||||
|
$("#search_btn").trigger('click');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// perPage 변경 이벤트 추가
|
||||||
|
$('#perPageSelect').on('change', function() {
|
||||||
|
var perPage = parseInt($(this).val(), 10);
|
||||||
|
self.masterGrid.instance.setPerPage(perPage);
|
||||||
|
|
||||||
|
// 선택된 행 초기화
|
||||||
|
self.selectedRow = null;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// 의견서 리포트 보기 버튼 바인딩
|
||||||
|
$("#openReviBtn").on('click', function() {
|
||||||
|
self.openReviReport();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 모듈 초기화
|
||||||
|
*/
|
||||||
|
init: function() {
|
||||||
|
|
||||||
|
// 그리드 생성
|
||||||
|
this.masterGrid.create();
|
||||||
|
this.detailGrid.create();
|
||||||
|
|
||||||
|
// 이벤트 핸들러 설정
|
||||||
|
this.eventBindEvents();
|
||||||
|
|
||||||
|
this.masterGrid.instance.readData(${param.page eq null or param.page eq 0 ? 1 : param.page});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 팝업 콜백 함수 (팝업에서 호출)
|
||||||
|
window.refreshCrdnList = function() {
|
||||||
|
LevyList.refreshList();
|
||||||
|
};
|
||||||
|
|
||||||
|
// DOM 준비 완료 시 초기화
|
||||||
|
$(document).ready(function() {
|
||||||
|
LevyList.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
})(window, jQuery);
|
||||||
|
</script>
|
||||||
@ -0,0 +1,127 @@
|
|||||||
|
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
|
||||||
|
<%!
|
||||||
|
String nullToStr(String s1, String s2) {
|
||||||
|
return ((s1 == null)?s2:s1);
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
<%
|
||||||
|
String jrf = nullToStr(request.getParameter("jrf"), "levyReport.jrf");
|
||||||
|
String pstnIdxNo = request.getParameter("pstnIdxNo"); // 선택한 위치지수번호
|
||||||
|
String arg = "pstnIdxNo#" + pstnIdxNo + "#"; // 유비리포트 파라미터
|
||||||
|
String resId = nullToStr(request.getParameter("resId"), "UBIHTML");
|
||||||
|
%>
|
||||||
|
|
||||||
|
<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>levy Report</title>
|
||||||
|
<!--[if IE]><script src='./js/ubiexcanvas.js'></script><![endif]-->
|
||||||
|
<script src='./js/ubihtml.js'></script>
|
||||||
|
<script src='./js/msg.js'></script>
|
||||||
|
<script src='./js/ubinonax.js'></script>
|
||||||
|
<script language='javascript'>
|
||||||
|
// <!--
|
||||||
|
/*-----------------------------------------------------------------------------------
|
||||||
|
htmlViewer.setUserSaveList('Image,Pdf,Docx,Xls,Pptx,Hml,Cell');
|
||||||
|
htmlViewer.setUserPrintList('Ubi,Html,Pdf');
|
||||||
|
htmlViewer.setVisibleToolbar('INFO', false);
|
||||||
|
htmlViewer.HmlExtension='hwp';
|
||||||
|
htmlViewer.printHTML(); // HTML PrintSet
|
||||||
|
htmlViewer.printPDF(); // PDF PrintSet
|
||||||
|
htmlViewer.export('PDF'); // PDF/EXCEL/EXCEL_NO/HWP/PPTX/HML/DOCX/CELL/IMAGE
|
||||||
|
htmlViewer.print(); // Direct Print(WS VIEWER)
|
||||||
|
htmlViewer.printSet(); // PrintSet(WS VIEWER)
|
||||||
|
//htmlViewer.events.printEnd = UbiPrintEnd;
|
||||||
|
//htmlViewer.events.exportEnd = UbiExportEnd;
|
||||||
|
-----------------------------------------------------------------------------------*/
|
||||||
|
/* URL 정보 */
|
||||||
|
// var app = 'myapp';
|
||||||
|
var app = '';
|
||||||
|
var appUrl = self.location.protocol + '//' + self.location.host + (app==''?'':('/' + app));
|
||||||
|
|
||||||
|
/* Viewer Object */
|
||||||
|
var htmlViewer = null;
|
||||||
|
|
||||||
|
/* Viewer Param */
|
||||||
|
var pKey = '<%= session.getId() %>';
|
||||||
|
var pServerUrl = appUrl + '${pageContext.request.contextPath}/UbiServer';
|
||||||
|
// var pResUrl = appUrl + '/ubi4/js/'; //2020.05.04 박민규-Spring Security 더블슬래시(//) 기본정책으로 인한 주석처리
|
||||||
|
var pResUrl = appUrl + '${pageContext.request.contextPath}/ubi4/js';
|
||||||
|
var pDivId = 'UbiHTMLViewer';
|
||||||
|
var pScale = 'WholePage'; //WholePage/PageWidth/60~300
|
||||||
|
|
||||||
|
/* Modify for your environment */
|
||||||
|
var pJrf = '<%= jrf %>';
|
||||||
|
var pArg = '<%= arg %>';
|
||||||
|
var pResId = '<%= resId %>';
|
||||||
|
|
||||||
|
/* Report Preview */
|
||||||
|
function UbiLoadReport() {
|
||||||
|
|
||||||
|
UbiResize();
|
||||||
|
htmlViewer = new UbiViewer( {
|
||||||
|
|
||||||
|
key : pKey,
|
||||||
|
ubiserverurl : pServerUrl,
|
||||||
|
resource : pResUrl,
|
||||||
|
resid : pResId,
|
||||||
|
divid : pDivId,
|
||||||
|
scale : pScale,
|
||||||
|
jrffile : pJrf,
|
||||||
|
arg : pArg
|
||||||
|
});
|
||||||
|
htmlViewer.showReport(UbiPreviewEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Preview Callback */
|
||||||
|
function UbiPreviewEnd() {
|
||||||
|
|
||||||
|
// 전용뷰어 사용 기준 페이지 : 50페이지 이상이면 전용뷰어 인쇄만 활성화 됩니다.
|
||||||
|
var basePageNum = 50;
|
||||||
|
try {
|
||||||
|
if( basePageNum <= htmlViewer.totalPage ) {
|
||||||
|
|
||||||
|
htmlViewer.setEnableToolbar("PRINT_PDF", false);
|
||||||
|
htmlViewer.setEnableToolbar("PRINT_HTML", false);
|
||||||
|
htmlViewer.setEnableToolbar("PRINT_UBI", true);
|
||||||
|
htmlViewer.setPluginprogress(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
htmlViewer.setEnableToolbar("PRINT_PDF", true);
|
||||||
|
htmlViewer.setEnableToolbar("PRINT_HTML", true);
|
||||||
|
htmlViewer.setEnableToolbar("PRINT_UBI", false);
|
||||||
|
htmlViewer.setPluginprogress(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print Callback */
|
||||||
|
function UbiPrintEnd(flag) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Export Callback */
|
||||||
|
function UbiExportEnd(flag, msg) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Viewer Object Resize */
|
||||||
|
function UbiResize() {
|
||||||
|
|
||||||
|
/* Size Gap */
|
||||||
|
var gap = 6;
|
||||||
|
var w = ((self.innerWidth || (document.documentElement && document.documentElement.clientWidth) || document.body.clientWidth)) - gap;
|
||||||
|
var h = ((self.innerHeight || (document.documentElement && document.documentElement.clientHeight) || document.body.clientHeight)) - gap;
|
||||||
|
document.getElementById(pDivId).style.width = w + 'px';
|
||||||
|
document.getElementById(pDivId).style.height = h + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body style='margin:1px' onload='UbiLoadReport()' onresize='UbiResize()'>
|
||||||
|
<div id='UbiHTMLViewer' style='border:1px solid #767676; border-bottom-width:2px;'></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Binary file not shown.
Loading…
Reference in New Issue