대시보드 수정.
parent
d7dca6482c
commit
7e94455564
@ -0,0 +1,168 @@
|
||||
package cokr.xit.fims.cmmn;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
import cokr.xit.base.code.CommonCode;
|
||||
import cokr.xit.foundation.data.DataObject;
|
||||
|
||||
|
||||
public class CodeConverter {
|
||||
|
||||
Map<String, List<CommonCode>> commonCodes = new HashMap<String, List<CommonCode>>();
|
||||
|
||||
List<DataObject> sggList = new ArrayList<DataObject>();
|
||||
List<DataObject> deptList = new ArrayList<DataObject>();
|
||||
List<DataObject> vltnList = new ArrayList<DataObject>();
|
||||
List<DataObject> userList = new ArrayList<DataObject>();
|
||||
List<DataObject> teamList = new ArrayList<DataObject>();
|
||||
|
||||
public CodeConverter(Map<String, List<CommonCode>> commonCodes){
|
||||
this.commonCodes = commonCodes;
|
||||
}
|
||||
|
||||
|
||||
/** 코드값으로 코드를 반환한다.
|
||||
* @param codeGroupName 코드그룹명, value 코드값
|
||||
* @return 코드
|
||||
*/
|
||||
public String valueToCode(String codeGroupName, String value){
|
||||
String result = "";
|
||||
|
||||
List<CommonCode> commonCodeList = commonCodes.get(codeGroupName);
|
||||
|
||||
for(int i = 0; i < commonCodeList.size(); i++) {
|
||||
if(value.replaceAll(Matcher.quoteReplacement(" "), "").equals(commonCodeList.get(i).getValue().replaceAll(Matcher.quoteReplacement(" "), ""))) {
|
||||
result = commonCodeList.get(i).getCode();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** 코드로 코드값을 반환한다.
|
||||
* @param codeGroupName 코드그룹명, code 코드
|
||||
* @return 코드값
|
||||
*/
|
||||
public String codeToValue(String codeGroupName, String code){
|
||||
String result = "";
|
||||
|
||||
List<CommonCode> commonCodeList = commonCodes.get(codeGroupName);
|
||||
|
||||
for(int i = 0; i < commonCodeList.size(); i++) {
|
||||
if(code.equals(commonCodeList.get(i).getCode())) {
|
||||
result = commonCodeList.get(i).getValue();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** 코드나 코드명이 비어있을 경우 변환하여 값을 채운다.
|
||||
* @param dataObject 맵 데이터, codeGroupName 코드그룹명, codeName 코드가 저장된 키 이름, valueName 코드값이 저장된 키 이름
|
||||
* @return
|
||||
*/
|
||||
public void fillIfEmpty(DataObject dataObject, String codeGroupName, String codeName, String valueName) {
|
||||
if(!dataObject.string(valueName).equals("") && dataObject.string(codeName).equals("")) {
|
||||
dataObject.put(codeName, this.valueToCode(codeGroupName, dataObject.string(valueName)));
|
||||
} else if(dataObject.string(valueName).equals("") && !dataObject.string(codeName).equals("")) {
|
||||
dataObject.put(valueName, this.codeToValue(codeGroupName, dataObject.string(codeName)));
|
||||
}
|
||||
}
|
||||
|
||||
/** 위반코드로 위반항목명을 반환한다.
|
||||
* @param taskSeCd 업무구분코드, vltnCd 위반항목코드
|
||||
* @return 위반항목명
|
||||
*/
|
||||
public String vltnCdToValue(String taskSeCd, String vltnCd) {
|
||||
String result = "";
|
||||
String codeGroup = "";
|
||||
|
||||
switch(taskSeCd){
|
||||
case "PVS" :
|
||||
codeGroup = "FIM004";
|
||||
break;
|
||||
case "BPV" :
|
||||
codeGroup = "FIM005";
|
||||
break;
|
||||
case "DPV" :
|
||||
codeGroup = "FIM006";
|
||||
break;
|
||||
case "ECA" :
|
||||
codeGroup = "FIM061";
|
||||
break;
|
||||
case "PES" :
|
||||
codeGroup = "FIM064";
|
||||
break;
|
||||
default :
|
||||
throw new RuntimeException("위반코드 변환 오류");
|
||||
}
|
||||
|
||||
List<CommonCode> commonCodeList = commonCodes.get(codeGroup);
|
||||
|
||||
for(int i = 0; i < commonCodeList.size(); i++) {
|
||||
if(vltnCd.equals(commonCodeList.get(i).getCode())) {
|
||||
result = commonCodeList.get(i).getValue();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void putOtherCode(String type, DataObject dataobject){
|
||||
switch(type) {
|
||||
case "SGG_CD" :
|
||||
this.sggList.add(dataobject);
|
||||
break;
|
||||
case "DEPT_CD" :
|
||||
this.deptList.add(dataobject);
|
||||
break;
|
||||
case "VLTN_ID" :
|
||||
this.vltnList.add(dataobject);
|
||||
break;
|
||||
case "USER_ID" :
|
||||
this.userList.add(dataobject);
|
||||
break;
|
||||
case "TEAM_ID" :
|
||||
this.teamList.add(dataobject);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public String uniqOtherCodeToValue(String type, String uniqId) {
|
||||
String result = "";
|
||||
|
||||
List<DataObject> otherCodeList = null;
|
||||
switch(type) {
|
||||
case "SGG_CD" :
|
||||
otherCodeList = this.sggList;
|
||||
break;
|
||||
case "DEPT_CD" :
|
||||
otherCodeList = this.deptList;
|
||||
break;
|
||||
case "VLTN_ID" :
|
||||
otherCodeList = this.vltnList;
|
||||
break;
|
||||
case "USER_ID" :
|
||||
otherCodeList = this.userList;
|
||||
break;
|
||||
case "TEAM_ID" :
|
||||
otherCodeList = this.teamList;
|
||||
break;
|
||||
}
|
||||
if(otherCodeList == null) {
|
||||
return result;
|
||||
}
|
||||
|
||||
for(int i = 0; i < otherCodeList.size(); i++) {
|
||||
if(uniqId.equals(otherCodeList.get(i).string(type))) {
|
||||
result = otherCodeList.get(i).string("NAME");
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
public class CodeSubsetInfo {
|
||||
|
||||
private String sourceGroup;
|
||||
|
||||
private String[] sourceCodes;
|
||||
|
||||
private String targetCode;
|
||||
|
||||
private String targetCodeVal;
|
||||
|
||||
public String getSourceGroup(){
|
||||
return this.sourceGroup;
|
||||
}
|
||||
|
||||
public void setSourceGroup(String sourceGroup){
|
||||
this.sourceGroup = sourceGroup;
|
||||
}
|
||||
|
||||
public String[] getSourceCodes(){
|
||||
return this.sourceCodes;
|
||||
}
|
||||
|
||||
public void setSourceCodes(String[] sourceCodes){
|
||||
this.sourceCodes = sourceCodes;
|
||||
}
|
||||
|
||||
public String getTargetCode(){
|
||||
return this.targetCode;
|
||||
}
|
||||
|
||||
public void setTargetCode(String targetCode){
|
||||
this.targetCode = targetCode;
|
||||
}
|
||||
|
||||
public String getTargetCodeVal(){
|
||||
return this.targetCodeVal;
|
||||
}
|
||||
|
||||
public void setTargetCodeVal(String targetCodeVal){
|
||||
this.targetCodeVal = targetCodeVal;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class CompositeKey {
|
||||
private String level1;
|
||||
private String level2;
|
||||
private String level3;
|
||||
private String level4;
|
||||
|
||||
public String[] toArray() {
|
||||
|
||||
if(this.level2 == null) {
|
||||
return new String[] { this.level1 };
|
||||
}
|
||||
if(this.level3 == null) {
|
||||
return new String[] { this.level1, this.level2 };
|
||||
}
|
||||
if(this.level4 == null) {
|
||||
return new String[] { this.level1, this.level2, this.level3 };
|
||||
}
|
||||
|
||||
return new String[] { this.level1, this.level2, this.level3, this.level4 };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if(this == o) return true;
|
||||
if(o == null || getClass() != o.getClass()) return false;
|
||||
CompositeKey k = (CompositeKey) o;
|
||||
|
||||
return Objects.equals(level1, k.level1)
|
||||
&& Objects.equals(level2, k.level2)
|
||||
&& Objects.equals(level3, k.level3)
|
||||
&& Objects.equals(level4, k.level4);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(level1,level2,level3,level4);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
public class GroupInfo {
|
||||
|
||||
/**
|
||||
* 기준 컬럼
|
||||
*/
|
||||
private String refCol;
|
||||
|
||||
/**
|
||||
* 분류 유형
|
||||
*/
|
||||
private String ctgrType;
|
||||
|
||||
/**
|
||||
* 상세 분류
|
||||
*/
|
||||
private String dtlCtgr;
|
||||
|
||||
|
||||
public String getRefCol(){
|
||||
return this.refCol;
|
||||
}
|
||||
|
||||
public void setRefCol(String refCol){
|
||||
this.refCol = refCol;
|
||||
}
|
||||
|
||||
public String getCtgrType(){
|
||||
return this.ctgrType;
|
||||
}
|
||||
|
||||
public void setCtgrType(String ctgrType){
|
||||
this.ctgrType = ctgrType;
|
||||
}
|
||||
|
||||
public String getDtlCtgr(){
|
||||
return this.dtlCtgr;
|
||||
}
|
||||
|
||||
public void setDtlCtgr(String dtlCtgr){
|
||||
this.dtlCtgr = dtlCtgr;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,96 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
public class NumberValueInfo {
|
||||
|
||||
/**
|
||||
* 구분자 기준 컬럼
|
||||
*/
|
||||
private String seperatorRefCol;
|
||||
|
||||
/**
|
||||
* 조건 값
|
||||
*/
|
||||
private String conditionValue;
|
||||
|
||||
/**
|
||||
* 구분자 분류 유형
|
||||
*/
|
||||
private String seperatorCtgrType;
|
||||
|
||||
/**
|
||||
* 구분자 상세분류
|
||||
*/
|
||||
private String seperatorDtlCtgr;
|
||||
|
||||
/**
|
||||
* 수치값 집계 유형(count 건수, sum 합계, ratio 비율)
|
||||
*/
|
||||
private String aggregateType;
|
||||
|
||||
/**
|
||||
* 합계 기준 컬럼
|
||||
*/
|
||||
private String sumRefCol;
|
||||
|
||||
/**
|
||||
* 비율 전체 참조 인덱스
|
||||
*/
|
||||
private int ratioRefIndex;
|
||||
|
||||
|
||||
public String getSeperatorRefCol(){
|
||||
return this.seperatorRefCol;
|
||||
}
|
||||
|
||||
public void setSeperatorRefCol(String seperatorRefCol){
|
||||
this.seperatorRefCol = seperatorRefCol;
|
||||
}
|
||||
|
||||
public String getConditionValue(){
|
||||
return this.conditionValue;
|
||||
}
|
||||
|
||||
public void setConditionValue(String conditionValue){
|
||||
this.conditionValue = conditionValue;
|
||||
}
|
||||
|
||||
public String getSeperatorCtgrType(){
|
||||
return this.seperatorCtgrType;
|
||||
}
|
||||
|
||||
public void setSeperatorCtgrType(String seperatorCtgrType){
|
||||
this.seperatorCtgrType = seperatorCtgrType;
|
||||
}
|
||||
|
||||
public String getSeperatorDtlCtgr(){
|
||||
return this.seperatorDtlCtgr;
|
||||
}
|
||||
|
||||
public void setSeperatorDtlCtgr(String seperatorDtlCtgr){
|
||||
this.seperatorDtlCtgr = seperatorDtlCtgr;
|
||||
}
|
||||
|
||||
public String getAggregateType(){
|
||||
return this.aggregateType;
|
||||
}
|
||||
|
||||
public void setAggregateType(String aggregateType){
|
||||
this.aggregateType = aggregateType;
|
||||
}
|
||||
|
||||
public String getSumRefCol(){
|
||||
return this.sumRefCol;
|
||||
}
|
||||
|
||||
public void setSumRefCol(String sumRefCol){
|
||||
this.sumRefCol = sumRefCol;
|
||||
}
|
||||
|
||||
public int getRatioRefIndex(){
|
||||
return this.ratioRefIndex;
|
||||
}
|
||||
|
||||
public void setRatioRefIndex(int ratioRefIndex){
|
||||
this.ratioRefIndex = ratioRefIndex;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cokr.xit.foundation.data.DataObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**통계 자료 정보
|
||||
* @author leebj
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class Stat {
|
||||
|
||||
/**
|
||||
* 통계 제목
|
||||
*/
|
||||
private String statTitle;
|
||||
|
||||
/**
|
||||
* 통계 부 제목
|
||||
*/
|
||||
private String statSubTitle;
|
||||
|
||||
/**
|
||||
* 집계 여부
|
||||
*/
|
||||
private String aggregateYn;
|
||||
|
||||
/**
|
||||
* 항목 제목
|
||||
*/
|
||||
private String[] itemsLabel;
|
||||
|
||||
/**
|
||||
* 수치 값 제목
|
||||
*/
|
||||
private String[] numberValueLabel;
|
||||
|
||||
/**
|
||||
* (집계일 때)통계 항목
|
||||
*/
|
||||
private List<StatItem> statItems;
|
||||
|
||||
/**
|
||||
* (목록일 때)결과 목록(현황)
|
||||
*/
|
||||
private List<DataObject> resultList;
|
||||
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cokr.xit.foundation.data.DataObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class StatItem {
|
||||
|
||||
/**
|
||||
* 항목 ID
|
||||
*/
|
||||
private String[] itemId;
|
||||
|
||||
/**
|
||||
* 항목 명
|
||||
*/
|
||||
private String[] itemName;
|
||||
|
||||
/**
|
||||
* 수치 값
|
||||
*/
|
||||
private int[] numberValue;
|
||||
|
||||
/**
|
||||
* 참조 목록
|
||||
*/
|
||||
private List<DataObject> refList;
|
||||
|
||||
}
|
||||
@ -0,0 +1,275 @@
|
||||
package cokr.xit.fims.stat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cokr.xit.fims.cmmn.CmmnQuery;
|
||||
|
||||
/**통계 요청
|
||||
*
|
||||
* <p>상세 설명:
|
||||
*
|
||||
* <pre>
|
||||
* ============ 변경 이력 ============
|
||||
* 2023-10-24 leebj 최초 작성
|
||||
* ================================
|
||||
* </pre>
|
||||
*/
|
||||
public class StatQuery extends CmmnQuery {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 구조 형식(aggregate 집계, list 목록)
|
||||
*/
|
||||
private String structureType;
|
||||
|
||||
/**
|
||||
* 통계 영역
|
||||
*/
|
||||
private String statDomain;
|
||||
|
||||
/**
|
||||
* 참조 리스트 추가 여부
|
||||
*/
|
||||
private String refListYn;
|
||||
|
||||
/**
|
||||
* 항목 정보
|
||||
*/
|
||||
private List<GroupInfo> groupInfoList;
|
||||
|
||||
/**
|
||||
* 수치값 정보
|
||||
*/
|
||||
private List<NumberValueInfo> numberValueInfoList;
|
||||
|
||||
/**
|
||||
* 코드 서브셋 정보
|
||||
*/
|
||||
List<CodeSubsetInfo> codeSubsetInfoList;
|
||||
|
||||
/**
|
||||
* 고정적으로 표시할 항목 ID (항목이 단일키일 경우)
|
||||
*/
|
||||
private String[] fixedItemId;
|
||||
|
||||
/**
|
||||
* 명명된 복합 수치값 구분자
|
||||
*/
|
||||
private String namedNumberValueSeperator;
|
||||
|
||||
/**
|
||||
* 전역 집계 형식
|
||||
*/
|
||||
private String globalAggregate;
|
||||
|
||||
/**
|
||||
* 전역 합계 기준 컬럼
|
||||
*/
|
||||
private String globalSumRefCol;
|
||||
|
||||
/**
|
||||
* 표기할 소수점 자릿수
|
||||
*/
|
||||
private int decimalPoint;
|
||||
|
||||
/**
|
||||
* 날짜 컬럼
|
||||
*/
|
||||
private String dayColumn;
|
||||
|
||||
/**
|
||||
* 시작일자
|
||||
*/
|
||||
private String firstDay;
|
||||
|
||||
/**
|
||||
* 종료일자
|
||||
*/
|
||||
private String lastDay;
|
||||
|
||||
/**
|
||||
* 날짜 범위
|
||||
*/
|
||||
private int dayRange;
|
||||
|
||||
/**
|
||||
* 차량구분
|
||||
*/
|
||||
private String carGb;
|
||||
|
||||
/**
|
||||
* 서손자료 제외
|
||||
*/
|
||||
private String schExclEnd;
|
||||
|
||||
/**
|
||||
* 렌트카 차량만 조회
|
||||
*/
|
||||
private String schOnlyRent;
|
||||
|
||||
|
||||
public String getStructureType() {
|
||||
return ifEmpty(structureType, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setStructureType(String structureType) {
|
||||
this.structureType = structureType;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getStatDomain() {
|
||||
return ifEmpty(statDomain, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setStatDomain(String statDomain) {
|
||||
this.statDomain = statDomain;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getRefListYn() {
|
||||
return ifEmpty(refListYn, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setRefListYn(String refListYn) {
|
||||
this.refListYn = refListYn;
|
||||
return self();
|
||||
}
|
||||
|
||||
public List<GroupInfo> getGroupInfoList() {
|
||||
return this.groupInfoList;
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setGroupInfoList(List<GroupInfo> groupInfoList) {
|
||||
this.groupInfoList = groupInfoList;
|
||||
return self();
|
||||
}
|
||||
|
||||
public List<NumberValueInfo> getNumberValueInfoList() {
|
||||
return this.numberValueInfoList;
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setNumberValueInfoList(List<NumberValueInfo> numberValueInfoList) {
|
||||
this.numberValueInfoList = numberValueInfoList;
|
||||
return self();
|
||||
}
|
||||
|
||||
|
||||
public String getNamedNumberValueSeperator() {
|
||||
return ifEmpty(namedNumberValueSeperator, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setNamedNumberValueSeperator(String namedNumberValueSeperator) {
|
||||
this.namedNumberValueSeperator = namedNumberValueSeperator;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getGlobalAggregate() {
|
||||
return ifEmpty(globalAggregate, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setGlobalAggregate(String globalAggregate) {
|
||||
this.globalAggregate = globalAggregate;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getGlobalSumRefCol() {
|
||||
return ifEmpty(globalSumRefCol, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setGlobalSumRefCol(String globalSumRefCol) {
|
||||
this.globalSumRefCol = globalSumRefCol;
|
||||
return self();
|
||||
}
|
||||
|
||||
public int getDecimalPoint() {
|
||||
return ifEmpty(decimalPoint, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setDecimalPoint(int decimalPoint) {
|
||||
this.decimalPoint = decimalPoint;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String[] getFixedItemId() {
|
||||
return ifEmpty(fixedItemId, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setFixedItemId(String... fixedItemId) {
|
||||
this.fixedItemId = fixedItemId;
|
||||
return self();
|
||||
}
|
||||
|
||||
public int getDayRange() {
|
||||
return ifEmpty(dayRange, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setDayRange(int dayRange) {
|
||||
this.dayRange = dayRange;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getDayColumn() {
|
||||
return ifEmpty(dayColumn, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setDayColumn(String dayColumn) {
|
||||
this.dayColumn = dayColumn;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getFirstDay() {
|
||||
return ifEmpty(firstDay, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setFirstDay(String firstDay) {
|
||||
this.firstDay = firstDay;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getLastDay() {
|
||||
return ifEmpty(lastDay, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setLastDay(String lastDay) {
|
||||
this.lastDay = lastDay;
|
||||
return self();
|
||||
}
|
||||
|
||||
public List<CodeSubsetInfo> getCodeSubsetInfoList() {
|
||||
return this.codeSubsetInfoList;
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setCodeSubsetInfoList(List<CodeSubsetInfo> codeSubsetInfoList) {
|
||||
this.codeSubsetInfoList = codeSubsetInfoList;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getCarGb() {
|
||||
return ifEmpty(carGb, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setCarGb(String carGb) {
|
||||
this.carGb = carGb;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getSchExclEnd() {
|
||||
return ifEmpty(schExclEnd, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setSchExclEnd(String schExclEnd) {
|
||||
this.schExclEnd = schExclEnd;
|
||||
return self();
|
||||
}
|
||||
|
||||
public String getSchOnlyRent() {
|
||||
return ifEmpty(schOnlyRent, () -> null);
|
||||
}
|
||||
|
||||
public <T extends StatQuery> T setSchOnlyRent(String schOnlyRent) {
|
||||
this.schOnlyRent = schOnlyRent;
|
||||
return self();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
package cokr.xit.fims.stat.service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import cokr.xit.base.code.CommonCode;
|
||||
import cokr.xit.fims.stat.Stat;
|
||||
import cokr.xit.fims.stat.StatQuery;
|
||||
|
||||
public interface StatService {
|
||||
|
||||
Stat getStatistics(StatQuery statQuery, Map<String, List<CommonCode>> commonCodes);
|
||||
|
||||
}
|
||||
@ -0,0 +1,651 @@
|
||||
package cokr.xit.fims.stat.service.bean;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import cokr.xit.base.code.CommonCode;
|
||||
import cokr.xit.base.user.DepartmentQuery;
|
||||
import cokr.xit.base.user.SigunguQuery;
|
||||
import cokr.xit.base.user.UserQuery;
|
||||
import cokr.xit.base.user.service.bean.DepartmentBean;
|
||||
import cokr.xit.base.user.service.bean.SigunguBean;
|
||||
import cokr.xit.base.user.service.bean.UserBean;
|
||||
import cokr.xit.fims.cmmn.CmmnQuery;
|
||||
import cokr.xit.fims.cmmn.CmmnUtil;
|
||||
import cokr.xit.fims.cmmn.CodeConverter;
|
||||
import cokr.xit.fims.mngt.VltnQuery;
|
||||
import cokr.xit.fims.mngt.dao.VltnMapper;
|
||||
import cokr.xit.fims.stat.CodeSubsetInfo;
|
||||
import cokr.xit.fims.stat.CompositeKey;
|
||||
import cokr.xit.fims.stat.GroupInfo;
|
||||
import cokr.xit.fims.stat.NumberValueInfo;
|
||||
import cokr.xit.fims.stat.Stat;
|
||||
import cokr.xit.fims.stat.StatItem;
|
||||
import cokr.xit.fims.stat.StatQuery;
|
||||
import cokr.xit.foundation.component.AbstractBean;
|
||||
import cokr.xit.foundation.data.DataObject;
|
||||
|
||||
|
||||
@Component("statBean")
|
||||
public class StatBean extends AbstractBean {
|
||||
|
||||
@Resource(name="sigunguBean")
|
||||
protected SigunguBean sigunguBean;
|
||||
|
||||
@Resource(name = "departmentBean")
|
||||
private DepartmentBean departmentBean;
|
||||
|
||||
@Resource(name="userBean")
|
||||
private UserBean userBean;
|
||||
|
||||
@Resource(name="vltnMapper")
|
||||
private VltnMapper vltnMapper;
|
||||
|
||||
/**쿼리에서 날짜와 관련된 파라미터를 설정한다.
|
||||
* @param sql처리용 query, dayCol 날짜조회용 컬럼, from 조회시작일, to 조회종료일
|
||||
* @return
|
||||
*/
|
||||
public void daySetting(CmmnQuery someQuery, String className, String dayCol, String from, String to) {
|
||||
try {
|
||||
if(dayCol.equals("REG_DT")) {
|
||||
Method m0 = CmmnQuery.class.getDeclaredMethod("setSchDateOpt", String.class);
|
||||
m0.invoke(someQuery, "regDt");
|
||||
Method m1 = CmmnQuery.class.getDeclaredMethod("setSchDateFrom", String.class);
|
||||
m1.invoke(someQuery, from);
|
||||
Method m2 = CmmnQuery.class.getDeclaredMethod("setSchDateTo", String.class);
|
||||
m2.invoke(someQuery, to);
|
||||
} else if(dayCol.equals("DMND_DT")) {
|
||||
Method m1 = someQuery.getClass().getDeclaredMethod("setSchDmndDtFrom", String.class);
|
||||
m1.invoke(someQuery, from);
|
||||
Method m2 = someQuery.getClass().getDeclaredMethod("setSchDmndDtTo", String.class);
|
||||
m2.invoke(someQuery, to);
|
||||
} else if(dayCol.equals("CRDN_YMD")) {
|
||||
Method m1 = someQuery.getClass().getDeclaredMethod("setSchCrdnYmdFrom", String.class);
|
||||
m1.invoke(someQuery, from);
|
||||
Method m2 = someQuery.getClass().getDeclaredMethod("setSchCrdnYmdTo", String.class);
|
||||
m2.invoke(someQuery, to);
|
||||
} else if(dayCol.equals("SNDNG_YMD")) {
|
||||
Method m1 = someQuery.getClass().getDeclaredMethod("setSchSndngYmdFrom", String.class);
|
||||
m1.invoke(someQuery, from);
|
||||
Method m2 = someQuery.getClass().getDeclaredMethod("setSchSndngYmdTo", String.class);
|
||||
m2.invoke(someQuery, to);
|
||||
} else if(dayCol.equals("RCPT_YMD")) {
|
||||
if(className.equals("LevyExclQuery")) {
|
||||
Method m1 = someQuery.getClass().getDeclaredMethod("setSchRcptYmdFrom", String.class);
|
||||
m1.invoke(someQuery, from);
|
||||
Method m2 = someQuery.getClass().getDeclaredMethod("setSchRcptYmdTo", String.class);
|
||||
m2.invoke(someQuery, to);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**통계요청에 따라 데이터목록에서 통계를 생성한다.
|
||||
* @param queryResult SQL쿼리 처리 결과, statQuery 통계 요청
|
||||
* @return 통계
|
||||
*/
|
||||
public Stat groupByCartegory(List<DataObject> queryResult, StatQuery statQuery) {
|
||||
|
||||
Stat stat = new Stat();
|
||||
|
||||
//통계 항목별 그룹핑
|
||||
Map<CompositeKey, List<DataObject>> group = this.grouping(queryResult, statQuery);
|
||||
|
||||
//고정 항목 설정
|
||||
if(statQuery.getFixedItemId() != null) {
|
||||
this.itemFix(group, statQuery);
|
||||
}
|
||||
|
||||
//수치 값 추출
|
||||
Set<CompositeKey> keySet = group.keySet();
|
||||
Iterator<CompositeKey> it = keySet.iterator();
|
||||
|
||||
List<StatItem> statItems = new ArrayList<>();
|
||||
while(it.hasNext()){
|
||||
CompositeKey compositeKey = it.next();
|
||||
StatItem statItem = new StatItem();
|
||||
|
||||
statItem.setItemId(compositeKey.toArray());
|
||||
|
||||
List<DataObject> listByKey = group.get(compositeKey);
|
||||
|
||||
int[] numberValues = this.extractNumberValue(listByKey, statQuery);
|
||||
|
||||
statItem.setNumberValue(numberValues);
|
||||
|
||||
if(ifEmpty(statQuery.getRefListYn(), () -> "").equals("Y")) {
|
||||
statItem.setRefList(listByKey);
|
||||
}
|
||||
|
||||
statItems.add(statItem);
|
||||
}
|
||||
|
||||
stat.setStatItems(statItems);
|
||||
|
||||
return stat;
|
||||
}
|
||||
|
||||
/**통계요청에 따라 데이터목록을 그룹핑한다.
|
||||
* @param queryResult SQL쿼리 처리 결과, statQuery 통계 요청
|
||||
* @return 통계 항목별로 그룹핑된 목록
|
||||
*/
|
||||
public Map<CompositeKey, List<DataObject>> grouping(List<DataObject> queryResult, StatQuery statQuery){
|
||||
|
||||
List<GroupInfo> groupInfoList = statQuery.getGroupInfoList();
|
||||
|
||||
List<CodeSubsetInfo> subsetInfoList = statQuery.getCodeSubsetInfoList();
|
||||
|
||||
Map<CompositeKey, List<DataObject>> group = queryResult.stream()
|
||||
.collect(
|
||||
Collectors.groupingBy(
|
||||
(item) -> {
|
||||
|
||||
CompositeKey compositeKey = new CompositeKey();
|
||||
|
||||
for(int i = 0; i < groupInfoList.size(); i++) {
|
||||
String key = "";
|
||||
GroupInfo groupInfo = groupInfoList.get(i);
|
||||
|
||||
String refCol = groupInfo.getRefCol();
|
||||
String colValue = item.string(refCol);
|
||||
|
||||
if(ifEmpty(groupInfo.getCtgrType(), ()-> "").equals("")) {
|
||||
key = colValue;
|
||||
if(key.equals("")) {
|
||||
key = "(정보없음)";
|
||||
}
|
||||
if(i == 0) {
|
||||
compositeKey.setLevel1(key);
|
||||
}
|
||||
if(i == 1) {
|
||||
compositeKey.setLevel2(key);
|
||||
}
|
||||
if(i == 2) {
|
||||
compositeKey.setLevel3(key);
|
||||
}
|
||||
if(i == 3) {
|
||||
compositeKey.setLevel4(key);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
String ctgrType = groupInfo.getCtgrType();
|
||||
String addOption = groupInfo.getDtlCtgr();
|
||||
|
||||
if(ctgrType.equals("date")) {
|
||||
|
||||
if(addOption.equals("YYYY")) { //연도별
|
||||
key = colValue.substring(0,4);
|
||||
} else if(addOption.equals("YYYYMM")) { //연월별
|
||||
key = colValue.substring(0,6);
|
||||
} else if(addOption.equals("YYYYMMDD")) { //일자별
|
||||
key = colValue.substring(0,8);
|
||||
} else if(addOption.equals("DAY_OF_WEEK")) { //요일별
|
||||
key = CmmnUtil.getDayOfWeek(colValue);
|
||||
} else if(addOption.equals("HH")) { //시간대별
|
||||
if(colValue.length() == 14) {
|
||||
key = colValue.substring(8,10);
|
||||
} else {
|
||||
key = colValue.substring(0,2);
|
||||
}
|
||||
} else {
|
||||
key = colValue;
|
||||
}
|
||||
|
||||
if(key.equals("")) {
|
||||
key = "(날짜없음)";
|
||||
}
|
||||
} else if(ctgrType.equals("code") || ctgrType.equals("otherCode")) {
|
||||
|
||||
if(ctgrType.equals("code")
|
||||
&& subsetInfoList != null
|
||||
&& !subsetInfoList.isEmpty()
|
||||
) {
|
||||
|
||||
for(CodeSubsetInfo subsetInfo : subsetInfoList) {
|
||||
if(subsetInfo.getSourceGroup().equals(addOption)) {
|
||||
if(Arrays.asList(subsetInfo.getSourceCodes()).contains(colValue)) {
|
||||
colValue = subsetInfo.getTargetCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
key = colValue;
|
||||
|
||||
if(key.equals("")) {
|
||||
key = "(정보없음)";
|
||||
}
|
||||
|
||||
} else if(ctgrType.equals("method")) {
|
||||
|
||||
if(addOption.equals("businessYnOfCar")){
|
||||
|
||||
String ffnlgCarmdlCd = item.string("FFNLG_CARMDL_CD");
|
||||
String vhrno = item.string("VHRNO");
|
||||
// key = crdnStngBean.getBusinessYnOfCar(ffnlgCarmdlCd, vhrno);
|
||||
|
||||
} else {
|
||||
key = colValue;
|
||||
if(key.equals("")) {
|
||||
key = "(정보없음)";
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
key = colValue;
|
||||
if(key.equals("")) {
|
||||
key = "(정보없음)";
|
||||
}
|
||||
}
|
||||
|
||||
if(i == 0) {
|
||||
compositeKey.setLevel1(key);
|
||||
}
|
||||
if(i == 1) {
|
||||
compositeKey.setLevel2(key);
|
||||
}
|
||||
if(i == 2) {
|
||||
compositeKey.setLevel3(key);
|
||||
}
|
||||
if(i == 3) {
|
||||
compositeKey.setLevel4(key);
|
||||
}
|
||||
}
|
||||
|
||||
return compositeKey;
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
/** 통계에 고정적으로 표시할 항목을 설정한다.
|
||||
* @param group 그룹핑한 데이터 목록, statQuery 통계 요청;
|
||||
* @return
|
||||
*/
|
||||
public void itemFix(Map<CompositeKey, List<DataObject>> group, StatQuery statQuery) {
|
||||
|
||||
String[] fixedItemId = statQuery.getFixedItemId();
|
||||
|
||||
CompositeKey[] fixedItemKey = new CompositeKey[fixedItemId.length];
|
||||
|
||||
for(int i=0; i < fixedItemId.length; i++) {
|
||||
CompositeKey newObj = new CompositeKey();
|
||||
newObj.setLevel1(fixedItemId[i]);
|
||||
fixedItemKey[i] = newObj;
|
||||
}
|
||||
|
||||
for(int i=0; i < fixedItemKey.length; i++) {
|
||||
if(!group.containsKey(fixedItemKey[i])) {
|
||||
group.put(fixedItemKey[i], null);
|
||||
}
|
||||
}
|
||||
|
||||
Set<CompositeKey> keySet = group.keySet();
|
||||
Iterator<CompositeKey> it = keySet.iterator();
|
||||
|
||||
List<CompositeKey> deleteTargets = new ArrayList<>();
|
||||
|
||||
while(it.hasNext()) {
|
||||
CompositeKey compositekey = it.next();
|
||||
if(!Arrays.asList(fixedItemKey).contains(compositekey)) {
|
||||
deleteTargets.add(compositekey);
|
||||
}
|
||||
}
|
||||
|
||||
for(CompositeKey deleteTarget : deleteTargets) {
|
||||
group.remove(deleteTarget);
|
||||
}
|
||||
}
|
||||
|
||||
/**통계요청에 따라 수치값(합계, 건수)을 계산한다.
|
||||
* @param listByKey 특정 범주로 묶인 데이터 목록, statQuery 통계 요청
|
||||
* @return 수치값
|
||||
*/
|
||||
public int[] extractNumberValue(List<DataObject> listByKey, StatQuery statQuery) {
|
||||
|
||||
List<NumberValueInfo> numberValueInfoList = statQuery.getNumberValueInfoList();
|
||||
|
||||
List<CodeSubsetInfo> subsetInfoList = statQuery.getCodeSubsetInfoList();
|
||||
|
||||
int[] aggregateArr = new int[numberValueInfoList.size()];
|
||||
for(int i=0; i < numberValueInfoList.size(); i++) {
|
||||
aggregateArr[i] = 0;
|
||||
}
|
||||
|
||||
if(listByKey != null) {
|
||||
for(int i=0; i<listByKey.size(); i++) {
|
||||
|
||||
DataObject dataObject = listByKey.get(i);
|
||||
|
||||
for(int j=0; j < aggregateArr.length; j++) {
|
||||
NumberValueInfo numverValueInfo = numberValueInfoList.get(j);
|
||||
|
||||
String seperatorRefCol = ifEmpty(numverValueInfo.getSeperatorRefCol(), ()-> "");
|
||||
String conditionValue = ifEmpty(numverValueInfo.getConditionValue(), ()-> "");
|
||||
|
||||
String seperatorCtgrType = ifEmpty(numverValueInfo.getSeperatorCtgrType(), ()-> "");
|
||||
String seperatorDtlCtgr = ifEmpty(numverValueInfo.getSeperatorDtlCtgr(), ()-> "");
|
||||
|
||||
String aggregateType = ifEmpty(numverValueInfo.getAggregateType(), ()-> "");
|
||||
String sumRefCol = ifEmpty(numverValueInfo.getSumRefCol(), ()-> "");
|
||||
|
||||
if(!seperatorRefCol.equals("")) {
|
||||
|
||||
String dataColumnValue = dataObject.string(seperatorRefCol);
|
||||
|
||||
if(seperatorCtgrType.equals("date")) {
|
||||
if(seperatorDtlCtgr.equals("YYYY")) { //연도별
|
||||
dataColumnValue = dataColumnValue.substring(0,4);
|
||||
} else if(seperatorDtlCtgr.equals("YYYYMM")) { //연월별
|
||||
dataColumnValue = dataColumnValue.substring(0,6);
|
||||
} else if(seperatorDtlCtgr.equals("YYYYMMDD")) { //일자별
|
||||
dataColumnValue = dataColumnValue.substring(0,8);
|
||||
} else if(seperatorDtlCtgr.equals("DAY_OF_WEEK")) { //요일별
|
||||
dataColumnValue = CmmnUtil.getDayOfWeek(dataColumnValue);
|
||||
} else if(seperatorDtlCtgr.equals("HH")) { //시간대별
|
||||
if(dataColumnValue.length() == 14) {
|
||||
dataColumnValue = dataColumnValue.substring(8,10);
|
||||
} else {
|
||||
dataColumnValue = dataColumnValue.substring(0,2);
|
||||
}
|
||||
}
|
||||
|
||||
} else if(seperatorCtgrType.equals("code") || seperatorCtgrType.equals("otherCode")) {
|
||||
|
||||
if(seperatorCtgrType.equals("code")
|
||||
&& subsetInfoList != null
|
||||
&& !subsetInfoList.isEmpty()
|
||||
) {
|
||||
|
||||
for(CodeSubsetInfo subsetInfo : subsetInfoList) {
|
||||
if(subsetInfo.getSourceGroup().equals(seperatorDtlCtgr)) {
|
||||
if(Arrays.asList(subsetInfo.getSourceCodes()).contains(dataColumnValue)) {
|
||||
dataColumnValue = subsetInfo.getTargetCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(!dataColumnValue.equals(conditionValue)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(aggregateType.equals("sum")) {
|
||||
aggregateArr[j] += dataObject.number(sumRefCol).intValue();
|
||||
} else {
|
||||
aggregateArr[j] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return aggregateArr;
|
||||
}
|
||||
|
||||
/** 특정 범주로 묶인 통계 항목에 항목명을 추가한다.
|
||||
* @param statItems 통계 항목 목록, statQuery 통계 요청, allCode 코드 목록
|
||||
* @return
|
||||
*/
|
||||
public void attachItemName(List<StatItem> statItems, StatQuery statQuery, Map<String, List<CommonCode>> allCode) {
|
||||
|
||||
CodeConverter codeConverter = new CodeConverter(allCode);
|
||||
|
||||
List<GroupInfo> groupInfoList = statQuery.getGroupInfoList();
|
||||
|
||||
int taskSeCdIndex = -1;
|
||||
for(int i=0; i < groupInfoList.size(); i++) {
|
||||
if(groupInfoList.get(i).getCtgrType().equals("code")
|
||||
&& groupInfoList.get(i).getDtlCtgr().equals("FIM054")) {
|
||||
taskSeCdIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
for(StatItem statItem : statItems) {
|
||||
|
||||
String[] compositeItemId = statItem.getItemId();
|
||||
String[] compositeItemName = new String[compositeItemId.length];
|
||||
|
||||
for(int i=0; i < compositeItemId.length ;i++) {
|
||||
|
||||
GroupInfo groupInfo = groupInfoList.get(i);
|
||||
|
||||
String ctgrType = ifEmpty(groupInfo.getCtgrType(), ()-> "");
|
||||
String dtlCtgr = ifEmpty(groupInfo.getDtlCtgr(), ()-> "");
|
||||
|
||||
|
||||
if(ctgrType.equals("") || ctgrType.equals("plain")
|
||||
|| ctgrType.equals("date") || ctgrType.equals("method")) { //일반텍스트
|
||||
compositeItemName[i] = compositeItemId[i];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
String itemName = "";
|
||||
|
||||
if(ctgrType.equals("code")){ //공통코드
|
||||
String converted = codeConverter.codeToValue(dtlCtgr, compositeItemId[i]);
|
||||
if(ifEmpty(converted, ()->"").equals("")) {
|
||||
itemName = compositeItemId[i];
|
||||
} else {
|
||||
itemName = converted;
|
||||
}
|
||||
} else if(ctgrType.equals("otherCode")) { //비공통코드
|
||||
|
||||
if(dtlCtgr.equals("VLTN_CD")) {
|
||||
|
||||
String taskSeCd = "";
|
||||
if(taskSeCdIndex != -1) {
|
||||
taskSeCd = compositeItemId[taskSeCdIndex];
|
||||
} else if(!statQuery.getTaskSeCd().equals("")) {
|
||||
taskSeCd = statQuery.getTaskSeCd();
|
||||
}
|
||||
|
||||
if(taskSeCd.equals("")) {
|
||||
throw new RuntimeException("위반코드 변환 오류");
|
||||
}
|
||||
|
||||
String converted = codeConverter.vltnCdToValue(taskSeCd, compositeItemId[i]);
|
||||
if(ifEmpty(converted, ()->"").equals("")) {
|
||||
itemName = compositeItemId[i];
|
||||
} else {
|
||||
itemName = converted;
|
||||
}
|
||||
} else if(dtlCtgr.equals("VLTN_ID") || dtlCtgr.equals("TEAM_ID")
|
||||
|| dtlCtgr.equals("SGG_CD") || dtlCtgr.equals("DEPT_CD") || dtlCtgr.equals("USER_ID")) {
|
||||
|
||||
String find = codeConverter.uniqOtherCodeToValue(dtlCtgr,compositeItemId[i]);
|
||||
if(!find.equals("")) {
|
||||
itemName = find;
|
||||
} else {
|
||||
DataObject findRow = this.selectOtherCode(dtlCtgr, compositeItemId[i]);
|
||||
|
||||
if(findRow != null){
|
||||
itemName = findRow.string("NAME");
|
||||
codeConverter.putOtherCode(dtlCtgr, findRow);
|
||||
} else {
|
||||
itemName = compositeItemId[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
compositeItemName[i] = itemName;
|
||||
}
|
||||
|
||||
statItem.setItemName(compositeItemName);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** 통계의 수치값 중 비율(%)을 계산한다.
|
||||
* @param statItems 통계 항목 목록, statQuery 통계 요청
|
||||
* @return
|
||||
*/
|
||||
public void attachRatioValue(List<StatItem> statItems, StatQuery statQuery) {
|
||||
|
||||
int decimalPoint = statQuery.getDecimalPoint();
|
||||
|
||||
List<NumberValueInfo> numberValueInfoList = statQuery.getNumberValueInfoList();
|
||||
|
||||
for(StatItem statItem : statItems) {
|
||||
|
||||
for(int i = 0; i < numberValueInfoList.size(); i++) {
|
||||
NumberValueInfo numberValueInfo = numberValueInfoList.get(i);
|
||||
|
||||
String aggregateType = numberValueInfo.getAggregateType();
|
||||
|
||||
if(aggregateType.equals("ratio")) {
|
||||
|
||||
int refIndex = numberValueInfo.getRatioRefIndex();
|
||||
|
||||
int totValue = statItem.getNumberValue()[refIndex];
|
||||
if(totValue == 0) {
|
||||
statItem.getNumberValue()[i] = 0;
|
||||
} else {
|
||||
int originalValue = statItem.getNumberValue()[i];
|
||||
double ratioValue = (double) originalValue / (double) totValue;
|
||||
double percent = ratioValue * Math.pow(10, 2f+decimalPoint);
|
||||
statItem.getNumberValue()[i] = (int) Math.floor(percent);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public DataObject selectOtherCode(String type, String uniqId) {
|
||||
DataObject result = null;
|
||||
|
||||
switch(type) {
|
||||
case "SGG_CD" :
|
||||
List<DataObject> sggs = sigunguBean.getSigunguList(new SigunguQuery().setSggIDs(uniqId));
|
||||
if(sggs != null && !sggs.isEmpty()) {
|
||||
sggs.get(0).set("NAME", sggs.get(0).string("SGG_NM"));
|
||||
result = sggs.get(0);
|
||||
}
|
||||
break;
|
||||
case "DEPT_CD" :
|
||||
List<DataObject> depts = departmentBean.getDepartmentList(new DepartmentQuery().setDeptIDs(uniqId));
|
||||
if(depts != null && !depts.isEmpty()) {
|
||||
depts.get(0).set("NAME", depts.get(0).string("DEPT_NM"));
|
||||
result = depts.get(0);
|
||||
}
|
||||
break;
|
||||
case "VLTN_ID" :
|
||||
DataObject vltn = vltnMapper.selectVltnInfo(new VltnQuery().setVltnId(uniqId));
|
||||
if(vltn != null && !vltn.isEmpty()) {
|
||||
vltn.set("NAME", vltn.string("VLTN_NM"));
|
||||
result = vltn;
|
||||
}
|
||||
break;
|
||||
case "USER_ID" :
|
||||
List<DataObject> users = userBean.getUserList(new UserQuery().setUserIDs(uniqId));
|
||||
if(users != null && !users.isEmpty()) {
|
||||
users.get(0).set("NAME", users.get(0).string("USER_NM"));
|
||||
result = users.get(0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/** 통계결과를 정렬한다.
|
||||
* @param stat 통계
|
||||
* @return
|
||||
*/
|
||||
public void sort(Stat stat) {
|
||||
|
||||
List<StatItem> statItems = stat.getStatItems();
|
||||
|
||||
if(statItems != null && statItems.size() > 0) {
|
||||
|
||||
Comparator<StatItem> comparator = getStatItemComparator(statItems.get(0));
|
||||
|
||||
statItems = statItems.stream().sorted(comparator).collect(Collectors.toList());
|
||||
|
||||
stat.setStatItems(statItems);
|
||||
}
|
||||
}
|
||||
|
||||
public Comparator<StatItem> getStatItemComparator(StatItem sample){
|
||||
|
||||
String[] itemIds = sample.getItemId();
|
||||
|
||||
int level = itemIds.length;
|
||||
|
||||
Comparator<StatItem> chainComparator = getStatItemNLevelComparator(1);
|
||||
if(level > 1) {
|
||||
for(int i=2; i <= level; i++) {
|
||||
chainComparator = chainComparator.thenComparing(getStatItemNLevelComparator(i));
|
||||
}
|
||||
}
|
||||
|
||||
return chainComparator;
|
||||
}
|
||||
|
||||
public Comparator<StatItem> getStatItemNLevelComparator(int level){
|
||||
|
||||
Comparator<StatItem> nLevelComparator = (statItemA, statItemB) -> {
|
||||
|
||||
String[] statItemAIds = statItemA.getItemId();
|
||||
String[] statItemBIds = statItemB.getItemId();
|
||||
|
||||
Comparator<String[]> tempComparator = getIndexOfStringArrayComparator(level-1);
|
||||
|
||||
return tempComparator.compare(statItemAIds, statItemBIds);
|
||||
};
|
||||
|
||||
return nLevelComparator;
|
||||
}
|
||||
|
||||
|
||||
public Comparator<String[]> getStringArrayChainComparator(int lastIndex){
|
||||
|
||||
Comparator<String[]> chainComparator = getIndexOfStringArrayComparator(0);
|
||||
|
||||
if(lastIndex > 0) {
|
||||
for(int i=1; i <= lastIndex; i++) {
|
||||
chainComparator = chainComparator.thenComparing(getIndexOfStringArrayComparator(i));
|
||||
}
|
||||
}
|
||||
|
||||
return chainComparator;
|
||||
}
|
||||
|
||||
public Comparator<String[]> getIndexOfStringArrayComparator(int index) {
|
||||
|
||||
Comparator<String[]> onlyNComparator = (arr1, arr2) -> {
|
||||
String str1 = arr1[index];
|
||||
String str2 = arr2[index];
|
||||
return str1.compareTo(str2);
|
||||
};
|
||||
|
||||
return onlyNComparator;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,202 @@
|
||||
package cokr.xit.fims.stat.service.bean;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import cokr.xit.base.code.CommonCode;
|
||||
import cokr.xit.fims.base.FimsUser;
|
||||
import cokr.xit.fims.cmmn.CmmnUtil;
|
||||
import cokr.xit.fims.rent.RentQuery;
|
||||
import cokr.xit.fims.rent.service.LsctMpngService;
|
||||
import cokr.xit.fims.rent.service.RentEntService;
|
||||
import cokr.xit.fims.stat.NumberValueInfo;
|
||||
import cokr.xit.fims.stat.Stat;
|
||||
import cokr.xit.fims.stat.StatQuery;
|
||||
import cokr.xit.fims.stat.service.StatService;
|
||||
import cokr.xit.foundation.component.AbstractServiceBean;
|
||||
import cokr.xit.foundation.data.DataObject;
|
||||
|
||||
@Service("statService")
|
||||
public class StatServiceBean extends AbstractServiceBean implements StatService {
|
||||
|
||||
@Resource(name = "statBean")
|
||||
private StatBean statBean;
|
||||
|
||||
/**임대 기업 대장 서비스*/
|
||||
@Resource(name = "rentEntService")
|
||||
private RentEntService rentEntService;
|
||||
|
||||
/**임대차계약 대장 서비스*/
|
||||
@Resource(name = "lsctMpngService")
|
||||
private LsctMpngService lsctMpngService;
|
||||
|
||||
@Override
|
||||
public Stat getStatistics(StatQuery statQuery, Map<String, List<CommonCode>> commonCodes) {
|
||||
Stat stat = new Stat();
|
||||
|
||||
List<DataObject> queryResult = new ArrayList<>();
|
||||
|
||||
SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
|
||||
Date curDate = new Date();
|
||||
String today = yyyyMMdd.format(curDate);
|
||||
|
||||
boolean daySetting = false;
|
||||
|
||||
if(statQuery.getStructureType().equals("aggregate")) {
|
||||
String dayColumn = ifEmpty(statQuery.getDayColumn(), () -> "");
|
||||
String lastDay = ifEmpty(statQuery.getLastDay(), () -> "");
|
||||
String firstDay = ifEmpty(statQuery.getFirstDay(), () -> "");
|
||||
|
||||
if(!dayColumn.equals("")) {
|
||||
daySetting = true;
|
||||
}
|
||||
|
||||
String[] numberValueLabel = null;
|
||||
String namedNumberValueSeperator = ifEmpty(statQuery.getNamedNumberValueSeperator(), () -> "");
|
||||
|
||||
if(namedNumberValueSeperator.equals("completeAndTotal")) { //완료자료 및 전체자료
|
||||
String globalAggregate = statQuery.getGlobalAggregate();
|
||||
String globalSumRefCol = ifEmpty(statQuery.getGlobalSumRefCol(), () -> "") ;
|
||||
|
||||
List<NumberValueInfo> numberValueInfoList = new ArrayList<NumberValueInfo>();
|
||||
NumberValueInfo col1 = new NumberValueInfo();
|
||||
col1.setSeperatorRefCol("COMPLETE_YN");
|
||||
col1.setConditionValue("Y");
|
||||
col1.setAggregateType(globalAggregate);
|
||||
col1.setSumRefCol(globalSumRefCol);
|
||||
numberValueInfoList.add(col1);
|
||||
NumberValueInfo col2 = new NumberValueInfo();
|
||||
col2.setAggregateType(globalAggregate);
|
||||
col2.setSumRefCol(globalSumRefCol);
|
||||
numberValueInfoList.add(col2);
|
||||
statQuery.setNumberValueInfoList(numberValueInfoList);
|
||||
|
||||
numberValueLabel = new String[] {"처리","전체"};
|
||||
|
||||
daySetting = true;
|
||||
|
||||
} else if(namedNumberValueSeperator.equals("lastFewDays")) {
|
||||
daySetting = true;
|
||||
|
||||
int dayRange = statQuery.getDayRange() == 0 ? 15 : statQuery.getDayRange();
|
||||
|
||||
if(dayColumn.equals("")) {
|
||||
dayColumn = "REG_DT";
|
||||
}
|
||||
|
||||
lastDay = today;
|
||||
firstDay = CmmnUtil.addDay(lastDay, (-1 * (dayRange-1)));
|
||||
|
||||
String globalAggregate = statQuery.getGlobalAggregate();
|
||||
|
||||
List<NumberValueInfo> numberValueInfoList = new ArrayList<NumberValueInfo>();
|
||||
|
||||
for(int i=0; i<dayRange; i++) {
|
||||
NumberValueInfo numberValueInfo = new NumberValueInfo();
|
||||
numberValueInfo.setSeperatorRefCol(dayColumn);
|
||||
numberValueInfo.setConditionValue(CmmnUtil.addDay(firstDay,i));
|
||||
numberValueInfo.setSeperatorCtgrType("date");
|
||||
numberValueInfo.setSeperatorCtgrType("YYYYMMDD");
|
||||
numberValueInfo.setAggregateType(globalAggregate);
|
||||
numberValueInfoList.add(numberValueInfo);
|
||||
}
|
||||
statQuery.setNumberValueInfoList(numberValueInfoList);
|
||||
|
||||
numberValueLabel = new String[dayRange];
|
||||
for(int i=0; i < dayRange; i++) {
|
||||
if(i == (dayRange-1)) {
|
||||
numberValueLabel[i] = "금일";
|
||||
} else {
|
||||
numberValueLabel[i] = Integer.toString((dayRange - (i+1)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String domain = statQuery.getStatDomain();
|
||||
|
||||
if(domain.equals("")) {
|
||||
throw new RuntimeException("통계 유형 확인 오류");
|
||||
}
|
||||
|
||||
String domainKey = "";
|
||||
//
|
||||
if(domain.equals("crdn")) {
|
||||
domainKey = "CRDN_ID";
|
||||
} else if(domain.equals("aprvStts")) {
|
||||
domainKey = "LSCT_MPNG_ID";
|
||||
|
||||
// 사용자 정보
|
||||
FimsUser fimsUser = (FimsUser)currentUser().getUser();
|
||||
|
||||
// 사용자와 매핑되어있는 임대업체 정보 조회
|
||||
RentQuery req = new RentQuery();
|
||||
req.setUserId(fimsUser.getId());
|
||||
req.setOrderBy(null);
|
||||
|
||||
List<DataObject> entRegNoList = rentEntService.getUserRentEntMpngs(req);
|
||||
|
||||
String[] entRegNos = new String[entRegNoList.size()];
|
||||
if (entRegNoList != null) {
|
||||
for (int iLoop = 0; iLoop < entRegNoList.size(); iLoop++) {
|
||||
entRegNos[iLoop] = entRegNoList.get(iLoop).string("ENT_REG_NO");
|
||||
}
|
||||
}
|
||||
// req.setSchEntRegNos(entRegNos);
|
||||
req.setOrderBy(null);
|
||||
|
||||
if(daySetting) {
|
||||
statBean.daySetting(req, req.getClass().getSimpleName(), dayColumn, firstDay, lastDay);
|
||||
}
|
||||
|
||||
queryResult = lsctMpngService.getLsctAprvToMpngList(req);
|
||||
}
|
||||
|
||||
if(!domainKey.equals("")) {
|
||||
Iterator<DataObject> iterator = queryResult.iterator();
|
||||
while(iterator.hasNext()) {
|
||||
DataObject dataObject = iterator.next();
|
||||
String dataId = dataObject.string(domainKey);
|
||||
dataObject.set("DATA_ID", dataId);
|
||||
}
|
||||
}
|
||||
|
||||
//통계 생성
|
||||
stat = statBean.groupByCartegory(queryResult, statQuery);
|
||||
|
||||
//통계 항목명 변환
|
||||
statBean.attachItemName(stat.getStatItems(), statQuery, commonCodes);
|
||||
|
||||
//비율 값 계산
|
||||
boolean exsistRatioValue = false;
|
||||
for(NumberValueInfo numberValueInfo : statQuery.getNumberValueInfoList()) {
|
||||
if(numberValueInfo.getAggregateType().equals("ratio")) {
|
||||
exsistRatioValue = true;
|
||||
}
|
||||
}
|
||||
if(exsistRatioValue){
|
||||
statBean.attachRatioValue(stat.getStatItems(), statQuery);
|
||||
}
|
||||
|
||||
//수치값 제목(건수, 금액, 비율 등)
|
||||
if(numberValueLabel != null) {
|
||||
stat.setNumberValueLabel(numberValueLabel);
|
||||
}
|
||||
|
||||
//정렬
|
||||
statBean.sort(stat);
|
||||
|
||||
stat.setAggregateYn("Y");
|
||||
}
|
||||
|
||||
return stat;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,125 @@
|
||||
package cokr.xit.fims.stat.web;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import cokr.xit.base.code.CommonCode;
|
||||
import cokr.xit.base.user.dao.UserMapper;
|
||||
import cokr.xit.base.web.ApplicationController;
|
||||
import cokr.xit.fims.cmmn.service.bean.StngBean;
|
||||
import cokr.xit.fims.stat.CodeSubsetInfo;
|
||||
import cokr.xit.fims.stat.GroupInfo;
|
||||
import cokr.xit.fims.stat.NumberValueInfo;
|
||||
import cokr.xit.fims.stat.Stat;
|
||||
import cokr.xit.fims.stat.StatQuery;
|
||||
import cokr.xit.fims.stat.service.StatService;
|
||||
|
||||
/**통계 관리 서비스 웹 컨트롤러.<br />
|
||||
* {웹 컨텍스트}/stat 로 접근할 수 있다.
|
||||
* @author leebj
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping(name="통계", value=Stat01Controller.CLASS_URL)
|
||||
public class Stat01Controller extends ApplicationController {
|
||||
|
||||
public static final String CLASS_URL = "/stat/stat01";
|
||||
|
||||
public class METHOD_URL {
|
||||
public static final String
|
||||
getStatistics = "/010/info.do"
|
||||
;
|
||||
}
|
||||
|
||||
@Resource(name="statService")
|
||||
private StatService statService;
|
||||
|
||||
@Resource(name="userMapper")
|
||||
protected UserMapper userMapper;
|
||||
|
||||
@Resource(name = "stngBean")
|
||||
private StngBean stngBean;
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping(name="통계 요청", value=METHOD_URL.getStatistics)
|
||||
public ModelAndView getStatistics(StatQuery statQuery) {
|
||||
ModelAndView mav = new ModelAndView("jsonView");
|
||||
|
||||
List<String> codeGroup = new ArrayList<String>();
|
||||
List<GroupInfo> groupInfoList = statQuery.getGroupInfoList();
|
||||
|
||||
if(groupInfoList != null) {
|
||||
for(int i=0; i < groupInfoList.size(); i++) {
|
||||
GroupInfo groupInfo = groupInfoList.get(i);
|
||||
String ctgrType = ifEmpty(groupInfo.getCtgrType(), () -> "");
|
||||
String dtlCtgr = ifEmpty(groupInfo.getDtlCtgr(), () -> "");
|
||||
if(ctgrType.equals("code")) {
|
||||
codeGroup.add(dtlCtgr);
|
||||
} else if(ctgrType.equals("otherCode")) {
|
||||
if(dtlCtgr.equals("VLTN_CD")) {
|
||||
codeGroup.add("FIM054");
|
||||
codeGroup.add("FIM004");
|
||||
codeGroup.add("FIM005");
|
||||
codeGroup.add("FIM006");
|
||||
codeGroup.add("FIM061");
|
||||
codeGroup.add("FIM064");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<NumberValueInfo> numberValueInfoList = statQuery.getNumberValueInfoList();
|
||||
|
||||
if(numberValueInfoList != null) {
|
||||
for(int i=0; i < numberValueInfoList.size(); i++) {
|
||||
NumberValueInfo numberValueInfo = numberValueInfoList.get(i);
|
||||
String ctgrType = ifEmpty(numberValueInfo.getSeperatorCtgrType(), () -> "");
|
||||
String dtlCtgr = ifEmpty(numberValueInfo.getSeperatorDtlCtgr(), () -> "");
|
||||
if(ctgrType.equals("code")) {
|
||||
codeGroup.add(dtlCtgr);
|
||||
} else if(ctgrType.equals("otherCode")) {
|
||||
if(dtlCtgr.equals("VLTN_CD")) {
|
||||
codeGroup.add("FIM054");
|
||||
codeGroup.add("FIM004");
|
||||
codeGroup.add("FIM005");
|
||||
codeGroup.add("FIM006");
|
||||
codeGroup.add("FIM061");
|
||||
codeGroup.add("FIM064");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, List<CommonCode>> commonCodes = new HashMap<String, List<CommonCode>>();
|
||||
|
||||
if(codeGroup.size() > 0) {
|
||||
commonCodes = getCodesOf(codeGroup.toArray(new String[codeGroup.size()]));
|
||||
}
|
||||
|
||||
if(statQuery.getCodeSubsetInfoList() != null && !statQuery.getCodeSubsetInfoList().isEmpty()) {
|
||||
for(CodeSubsetInfo subsetInfo : statQuery.getCodeSubsetInfoList()) {
|
||||
CommonCode newCode = new CommonCode();
|
||||
newCode.setGroupID(subsetInfo.getSourceGroup());
|
||||
newCode.setCode(subsetInfo.getTargetCode());
|
||||
newCode.setValue(subsetInfo.getTargetCodeVal());
|
||||
commonCodes.get(subsetInfo.getSourceGroup()).add(newCode);
|
||||
}
|
||||
}
|
||||
|
||||
Stat stat = statService.getStatistics(statQuery, commonCodes);
|
||||
|
||||
mav.addObject("stat", stat);
|
||||
|
||||
return mav;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue