Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 432c54b58e | |||
| ffce1ef370 | |||
| 5b783fe817 | |||
| 4e1d15c574 | |||
| 0707f726b8 | |||
| a6c2c631ec | |||
| 898671cd4d | |||
| 1739d607ab | |||
| dca7c687c8 | |||
| d0b75f6d83 | |||
| 9b35c0e445 | |||
| d797aae068 | |||
| 5ca0ea9c92 | |||
| e546b17ff5 | |||
| 441754d72c | |||
| baf73eb534 | |||
| b652e9f9cc | |||
| 778747ba7e | |||
| baccdcdf5f | |||
| a396981ebb | |||
| 179fd7d95c | |||
| 78b5561e7a | |||
| 031a7fad81 | |||
| 49b7f0b984 | |||
| 680bbce797 | |||
| 8a54aee412 | |||
| 049fe4ee29 | |||
| 000e3145bd | |||
| 862c73bd38 | |||
| 2f7fcc5081 |
+7
-4
@@ -20,20 +20,23 @@ ENV TZ=Asia/Seoul \
|
||||
OTEL_EXPORTER_OTLP_PROTOCOL=grpc \
|
||||
OTEL_RESOURCE_ATTRIBUTES="deployment.environment=${OTEL_ENV}" \
|
||||
JAVA_TOOL_OPTIONS="\
|
||||
-Xms1g \
|
||||
-Xmx1g \
|
||||
-Xms2g \
|
||||
-Xmx2g \
|
||||
-XX:+UseG1GC \
|
||||
-XX:MaxGCPauseMillis=200 \
|
||||
-XX:+UnlockExperimentalVMOptions \
|
||||
-XX:+UseStringDeduplication \
|
||||
-XX:+HeapDumpOnOutOfMemoryError \
|
||||
-XX:HeapDumpPath=/tmp \
|
||||
-XX:HeapDumpPath=/heapdumps \
|
||||
-XX:+ExitOnOutOfMemoryError \
|
||||
-XX:+DisableExplicitGC \
|
||||
-javaagent:/opt/opentelemetry-javaagent.jar"
|
||||
|
||||
# 타임존 설정
|
||||
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
|
||||
|
||||
RUN mkdir -p /heapdumps && chown -R 1000:1000 /heapdumps
|
||||
|
||||
# OTEL 에이전트 복사
|
||||
COPY --from=otel /opentelemetry-javaagent.jar /opt/opentelemetry-javaagent.jar
|
||||
RUN chown 1000:1000 /opt/opentelemetry-javaagent.jar
|
||||
@@ -46,4 +49,4 @@ COPY target/sayit-helpdesk.war /usr/local/tomcat/webapps/ROOT.war
|
||||
RUN chown -R 1000:1000 /usr/local/tomcat/
|
||||
|
||||
EXPOSE 8080
|
||||
CMD ["catalina.sh","run"]
|
||||
CMD ["catalina.sh","run"]
|
||||
|
||||
Vendored
+44
-4
@@ -67,7 +67,7 @@ spec:
|
||||
emptyDir: {}
|
||||
- name: maven-cache
|
||||
persistentVolumeClaim:
|
||||
claimName: maven-repo-pvc
|
||||
claimName: maven-repo-pvc-rwx
|
||||
"""
|
||||
) {
|
||||
node(L) {
|
||||
@@ -81,8 +81,10 @@ spec:
|
||||
def OTEL_ENV = (TARGET_ENV == 'dev') ? 'dev' : (TARGET_ENV == 'stage') ? 'stage' : 'prod'
|
||||
def OTEL_SERVICE_NAME = (TARGET_ENV == 'dev') ? 'sayit-helpdesk-dev' : (TARGET_ENV == 'stage') ? 'sayit-helpdesk-stage' : 'sayit-helpdesk'
|
||||
|
||||
def IMAGE_TAG = "${TARGET_ENV}-${env.BUILD_NUMBER}" // dev-123 / stage-123 / prod-123
|
||||
def LATEST_TAG = "latest-${TARGET_ENV}" // latest-dev / latest-stage / latest-prod
|
||||
def IS_SESSION_JOB = env.JOB_NAME?.contains('session') ? 'true' : 'false'
|
||||
def IMAGE_TAG_PREFIX = (IS_SESSION_JOB == 'true') ? "${TARGET_ENV}-session" : TARGET_ENV
|
||||
def IMAGE_TAG = "${IMAGE_TAG_PREFIX}-${env.BUILD_NUMBER}" // dev-123 / dev-session-123
|
||||
def LATEST_TAG = "latest-${IMAGE_TAG_PREFIX}" // latest-dev / latest-dev-session
|
||||
|
||||
timestamps {
|
||||
|
||||
@@ -92,6 +94,7 @@ spec:
|
||||
echo "APP_NS = ${APP_NS}"
|
||||
echo "OTEL_ENV = ${OTEL_ENV}"
|
||||
echo "OTEL_SERVICE_NAME = ${OTEL_SERVICE_NAME}"
|
||||
echo "IS_SESSION_JOB = ${IS_SESSION_JOB}"
|
||||
echo "IMAGE_TAG = ${IMAGE_TAG}"
|
||||
echo "LATEST_TAG = ${LATEST_TAG}"
|
||||
}
|
||||
@@ -146,15 +149,52 @@ spec:
|
||||
container('kubectl') {
|
||||
sh """
|
||||
set -eux
|
||||
if [ "${IS_SESSION_JOB}" = "true" ]; then
|
||||
kubectl -n ${APP_NS} patch deploy ${DEPLOY} --type=merge -p '{"spec":{"replicas":0}}'
|
||||
for i in \$(seq 1 150); do
|
||||
POD_COUNT=\$(kubectl -n ${APP_NS} get pod -l app=${DEPLOY} --no-headers 2>/dev/null | wc -l | tr -d ' ')
|
||||
[ "\${POD_COUNT}" = "0" ] && break
|
||||
sleep 2
|
||||
if [ "\${i}" = "150" ]; then
|
||||
kubectl -n ${APP_NS} get pod -l app=${DEPLOY} -o wide
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -f "k8s/${TARGET_ENV}/session-redis.yaml" ]; then
|
||||
kubectl apply -f "k8s/${TARGET_ENV}/session-redis.yaml"
|
||||
kubectl -n ${APP_NS} rollout status deploy/sayit-helpdesk-session-redis --timeout=120s
|
||||
fi
|
||||
|
||||
if [ "${TARGET_ENV}" = "dev" ]; then
|
||||
kubectl -n ${APP_NS} patch deploy ${DEPLOY} --type=strategic -p '{"spec":{"template":{"spec":{"containers":[{"name":"'${DEPLOY}'","env":[{"name":"SPRING_PROFILES_ACTIVE","value":"redis-session"}],"volumeMounts":[{"name":"heapdumps","mountPath":"/heapdumps"}]}],"volumes":[{"name":"heapdumps","nfs":{"server":"192.168.0.120","path":"/volume2/NFS/helpdesk-dev/heapdumps"}}]}}}}'
|
||||
elif [ "${TARGET_ENV}" = "prod" ]; then
|
||||
kubectl -n ${APP_NS} patch deploy ${DEPLOY} --type=strategic -p '{"spec":{"template":{"spec":{"containers":[{"name":"'${DEPLOY}'","env":[{"name":"SPRING_PROFILES_ACTIVE","value":"redis-session"}]}]}}}}'
|
||||
fi
|
||||
|
||||
kubectl -n ${APP_NS} set image deploy/${DEPLOY} ${DEPLOY}=${REG}/${IMAGE}:${IMAGE_TAG}
|
||||
|
||||
if [ "${IS_SESSION_JOB}" = "true" ]; then
|
||||
kubectl -n ${APP_NS} patch deploy ${DEPLOY} --type=merge -p '{"spec":{"replicas":1}}'
|
||||
fi
|
||||
|
||||
kubectl -n ${APP_NS} rollout status deploy/${DEPLOY} --timeout=300s
|
||||
|
||||
DEPLOY_IMAGE=\$(kubectl -n ${APP_NS} get deploy ${DEPLOY} -o jsonpath='{.spec.template.spec.containers[0].image}')
|
||||
test "\${DEPLOY_IMAGE}" = "${REG}/${IMAGE}:${IMAGE_TAG}"
|
||||
|
||||
kubectl -n ${APP_NS} get deploy ${DEPLOY} -o wide
|
||||
kubectl -n ${APP_NS} get pods -l app=${DEPLOY} -o wide
|
||||
kubectl -n ${APP_NS} get pod -l app=${DEPLOY} -o jsonpath='{.items[*].spec.containers[*].image}'; echo
|
||||
|
||||
if [ "${IS_SESSION_JOB}" = "true" ]; then
|
||||
POD_IMAGES=\$(kubectl -n ${APP_NS} get pod -l app=${DEPLOY} -o jsonpath='{.items[*].spec.containers[*].image}')
|
||||
test "\${POD_IMAGES}" = "${REG}/${IMAGE}:${IMAGE_TAG}"
|
||||
fi
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: sayit-helpdesk-session-redis
|
||||
namespace: sayit-helpdesk-dev
|
||||
labels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
spec:
|
||||
containers:
|
||||
- name: redis
|
||||
image: redis:7.2-alpine
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- redis-server
|
||||
- --save
|
||||
- ""
|
||||
- --appendonly
|
||||
- "no"
|
||||
ports:
|
||||
- name: redis
|
||||
containerPort: 6379
|
||||
readinessProbe:
|
||||
tcpSocket:
|
||||
port: redis
|
||||
initialDelaySeconds: 3
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 2
|
||||
failureThreshold: 3
|
||||
livenessProbe:
|
||||
tcpSocket:
|
||||
port: redis
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 2
|
||||
failureThreshold: 3
|
||||
resources:
|
||||
requests:
|
||||
cpu: 50m
|
||||
memory: 64Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 256Mi
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: sayit-helpdesk-session-redis
|
||||
namespace: sayit-helpdesk-dev
|
||||
labels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: sayit-helpdesk-session-redis
|
||||
ports:
|
||||
- name: redis
|
||||
port: 6379
|
||||
targetPort: redis
|
||||
@@ -0,0 +1,67 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: sayit-helpdesk-session-redis
|
||||
namespace: sayit-helpdesk
|
||||
labels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
spec:
|
||||
containers:
|
||||
- name: redis
|
||||
image: redis:7.2-alpine
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- redis-server
|
||||
- --save
|
||||
- ""
|
||||
- --appendonly
|
||||
- "no"
|
||||
ports:
|
||||
- name: redis
|
||||
containerPort: 6379
|
||||
readinessProbe:
|
||||
tcpSocket:
|
||||
port: redis
|
||||
initialDelaySeconds: 3
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 2
|
||||
failureThreshold: 3
|
||||
livenessProbe:
|
||||
tcpSocket:
|
||||
port: redis
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 2
|
||||
failureThreshold: 3
|
||||
resources:
|
||||
requests:
|
||||
cpu: 50m
|
||||
memory: 64Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 256Mi
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: sayit-helpdesk-session-redis
|
||||
namespace: sayit-helpdesk
|
||||
labels:
|
||||
app: sayit-helpdesk-session-redis
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: sayit-helpdesk-session-redis
|
||||
ports:
|
||||
- name: redis
|
||||
port: 6379
|
||||
targetPort: redis
|
||||
@@ -20,6 +20,7 @@
|
||||
<log4j2.version>2.1</log4j2.version>
|
||||
<jackson.version>1.9.13</jackson.version>
|
||||
<httpcomponents.version>4.5.2</httpcomponents.version>
|
||||
<spring.session.version>1.1.1.RELEASE</spring.session.version>
|
||||
</properties>
|
||||
|
||||
<!--<repositories>-->
|
||||
@@ -130,6 +131,25 @@
|
||||
<artifactId>egovframework.rte.fdl.property</artifactId>
|
||||
<version>${egovframework.rte.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.session</groupId>
|
||||
<artifactId>spring-session-data-redis</artifactId>
|
||||
<version>${spring.session.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-oxm</artifactId>
|
||||
<version>${spring.maven.artifact.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Framework -->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.springframework</groupId>-->
|
||||
@@ -229,16 +249,28 @@
|
||||
<!-- </dependency>-->
|
||||
|
||||
<!-- Database -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>5.1.31</version>
|
||||
</dependency>
|
||||
<!-- mysql 5.X -->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>mysql</groupId>-->
|
||||
<!-- <artifactId>mysql-connector-java</artifactId>-->
|
||||
<!-- <version>5.1.31</version>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<version>1.4</version>
|
||||
</dependency>
|
||||
<!-- mysql 8.4.7 -->
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<version>9.5.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-pool</groupId>
|
||||
<artifactId>commons-pool</artifactId>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Logging (Log4j 2 + SLF4J) -->
|
||||
<!-- <dependency>
|
||||
@@ -532,17 +564,17 @@
|
||||
<!-- </dependency>-->
|
||||
<!-- <!– Add other system jars similarly if compilation fails –>-->
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tmax.tibero</groupId>
|
||||
<artifactId>tibero-jdbc</artifactId>
|
||||
<version>5.0</version>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.tmax.tibero</groupId>-->
|
||||
<!-- <artifactId>tibero-jdbc</artifactId>-->
|
||||
<!-- <version>5.0</version>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<dependency>
|
||||
<groupId>oracle</groupId>
|
||||
<artifactId>ojdbc14</artifactId>
|
||||
<version>10.2.0.4.0</version>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>oracle</groupId>-->
|
||||
<!-- <artifactId>ojdbc14</artifactId>-->
|
||||
<!-- <version>10.2.0.4.0</version>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<dependency>
|
||||
<groupId>com.acube</groupId>
|
||||
@@ -789,4 +821,4 @@
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
</project>
|
||||
|
||||
@@ -46,6 +46,10 @@ extends EgovComAbstractDAO {
|
||||
return (Integer)this.select("dmsHdbDAO.selectDmsHdbListTotCnt_S", (Object)searchVO);
|
||||
}
|
||||
|
||||
public List selectDmsHdbStat(DmsHdbDefaultVO searchVO) throws Exception {
|
||||
return this.list("dmsHdbDAO.selectDmsHdbStat_D", (Object)searchVO);
|
||||
}
|
||||
|
||||
public List selectDmsHdbReplyList(DmsHdbDefaultVO searchVO) {
|
||||
return this.list("dmsHdbDAO.selectDmsHdbReplyList_D", (Object)searchVO);
|
||||
}
|
||||
@@ -70,8 +74,10 @@ extends EgovComAbstractDAO {
|
||||
return (List<DmsHdbGraphVO>) this.list("dmsHdbDAO.selectDmsHdbPerYearChart", (Object)searchVO);
|
||||
}
|
||||
|
||||
public DmsHdbGraphVO selectDmsHdbForMonthChart(DmsHdbDefaultVO searchVO) {
|
||||
return (DmsHdbGraphVO)this.select("dmsHdbDAO.selectDmsHdbForMonthChart", (Object)searchVO);
|
||||
}
|
||||
/*
|
||||
* public DmsHdbGraphVO selectDmsHdbForMonthChart(DmsHdbDefaultVO searchVO) {
|
||||
* return (DmsHdbGraphVO)this.select("dmsHdbDAO.selectDmsHdbForMonthChart",
|
||||
* (Object)searchVO); }
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,8 @@ public interface DmsHdbService {
|
||||
|
||||
public int selectDmsHdbListTotCnt(DmsHdbDefaultVO var1);
|
||||
|
||||
public List selectDmsHdbStat(DmsHdbDefaultVO var1) throws Exception;
|
||||
|
||||
public String checkFileWhiteList(MultipartHttpServletRequest var1, String var2, String var3) throws Exception;
|
||||
|
||||
public List selectDmsHdbReplyList(DmsHdbDefaultVO var1);
|
||||
@@ -46,6 +48,6 @@ public interface DmsHdbService {
|
||||
|
||||
public List<DmsHdbGraphVO> selectDmsHdbPerYearChart(DmsHdbDefaultVO var1);
|
||||
|
||||
public DmsHdbGraphVO selectDmsHdbForMonthChart(DmsHdbDefaultVO var1);
|
||||
/* public DmsHdbGraphVO selectDmsHdbForMonthChart(DmsHdbDefaultVO var1); */
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,10 @@ import egovframework.dms.prj.vo.DmsPrjDefaultVO;
|
||||
import egovframework.edosi.egov.helper.UserDetailsHelper;
|
||||
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
|
||||
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
|
||||
import egovframework.rte.psl.dataaccess.util.EgovMap;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@@ -128,13 +131,33 @@ public class DmsHdbServiceImpl implements DmsHdbService {
|
||||
return resultVO;
|
||||
}
|
||||
|
||||
public List selectDmsHdbList(DmsHdbDefaultVO searchVO) throws Exception {
|
||||
return this.dmsHdbDAO.selectDmsHdbList(searchVO);
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<EgovMap> selectDmsHdbList(DmsHdbDefaultVO searchVO) throws Exception {
|
||||
|
||||
List<EgovMap> list = this.dmsHdbDAO.selectDmsHdbList(searchVO);
|
||||
|
||||
for (EgovMap map : list) {
|
||||
Object createDateObj = map.get("createDate");
|
||||
|
||||
if (createDateObj != null) {
|
||||
// ISO 문자열: 2025-11-11T11:44:43
|
||||
String createDateStr = createDateObj.toString();
|
||||
|
||||
// T → 공백 치환
|
||||
map.put("createDate", createDateStr.replace('T', ' '));
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public int selectDmsHdbListTotCnt(DmsHdbDefaultVO searchVO) {
|
||||
return this.dmsHdbDAO.selectDmsHdbListTotCnt(searchVO);
|
||||
}
|
||||
|
||||
public List selectDmsHdbStat(DmsHdbDefaultVO searchVO) throws Exception {
|
||||
return this.dmsHdbDAO.selectDmsHdbStat(searchVO);
|
||||
}
|
||||
|
||||
public String addMultiFiles(MultipartHttpServletRequest multiRequest, String targetNm) throws Exception {
|
||||
multiRequest.setCharacterEncoding("utf-8");
|
||||
@@ -301,7 +324,8 @@ public class DmsHdbServiceImpl implements DmsHdbService {
|
||||
return this.dmsHdbDAO.selectDmsHdbPerYearChart(searchVO);
|
||||
}
|
||||
|
||||
public DmsHdbGraphVO selectDmsHdbForMonthChart(DmsHdbDefaultVO searchVO) {
|
||||
return this.dmsHdbDAO.selectDmsHdbForMonthChart(searchVO);
|
||||
}
|
||||
/*
|
||||
* public DmsHdbGraphVO selectDmsHdbForMonthChart(DmsHdbDefaultVO searchVO) {
|
||||
* return this.dmsHdbDAO.selectDmsHdbForMonthChart(searchVO); }
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ import egovframework.edosi.egov.helper.UserDetailsHelper;
|
||||
import egovframework.edosi.filter.XssFilter;
|
||||
import egovframework.edosi.resource.EdosiResource;
|
||||
import egovframework.rte.fdl.property.EgovPropertyService;
|
||||
import egovframework.rte.psl.dataaccess.util.EgovMap;
|
||||
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
@@ -86,9 +87,6 @@ public class DmsHdbController {
|
||||
String prjSeq = request.getParameter("prjSeq");
|
||||
Map<String, Object> prjInfo = (Map<String, Object>) request.getSession().getAttribute("prjInfo");
|
||||
String prjNm = prjInfo == null ? null : (String) prjInfo.get("prjNm");
|
||||
String hdbStsA = prjInfo == null ? null : (String) prjInfo.get("hdbStsA");
|
||||
String hdbStsB = prjInfo == null ? null : (String) prjInfo.get("hdbStsB");
|
||||
String hdbStsC = prjInfo == null ? null : (String) prjInfo.get("hdbStsC");
|
||||
|
||||
if (moveDetail != null || prjSeq != null) {
|
||||
request.getSession().setAttribute("prjSeq", (Object)prjSeq);
|
||||
@@ -114,9 +112,6 @@ public class DmsHdbController {
|
||||
model.addAttribute("ROLE_CUS", (Object)UserDetailsHelper.isRole((String)"ROLE_CUS"));
|
||||
model.addAttribute("ROLE_EMP", (Object)UserDetailsHelper.isRole((String)"ROLE_EMP"));
|
||||
model.addAttribute("prjNm", prjNm);
|
||||
model.addAttribute("hdbStsA", hdbStsA);
|
||||
model.addAttribute("hdbStsB", hdbStsB);
|
||||
model.addAttribute("hdbStsC", hdbStsC);
|
||||
this.initModelData(model, bmode);
|
||||
return viewName;
|
||||
}
|
||||
@@ -159,6 +154,12 @@ public class DmsHdbController {
|
||||
if (totCnt > 0) {
|
||||
List dmsHdbList = this.dmsHdbService.selectDmsHdbList(searchVO);
|
||||
model.addAttribute("resultList", (Object)dmsHdbList);
|
||||
List dmsHdbStatList = this.dmsHdbService.selectDmsHdbStat(searchVO);
|
||||
EgovMap dmsHdbStat = null;
|
||||
if (dmsHdbStatList != null && !dmsHdbStatList.isEmpty()) {
|
||||
dmsHdbStat = (EgovMap) dmsHdbStatList.get(0);
|
||||
}
|
||||
model.addAttribute("dmsHdbStat", (Object)dmsHdbStat);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
@@ -170,8 +171,11 @@ public class DmsHdbController {
|
||||
List<DmsHdbGraphVO> annualList = dmsHdbService.selectDmsHdbPerYearChart(searchVO);
|
||||
model.addAttribute("annualList", annualList);
|
||||
|
||||
DmsHdbGraphVO monthlyList = dmsHdbService.selectDmsHdbForMonthChart(searchVO);
|
||||
model.addAttribute("monthlyList", monthlyList);
|
||||
/*
|
||||
* DmsHdbGraphVO monthlyList =
|
||||
* dmsHdbService.selectDmsHdbForMonthChart(searchVO);
|
||||
* model.addAttribute("monthlyList", monthlyList);
|
||||
*/
|
||||
// model.addAttribute("year", year);
|
||||
|
||||
return "dms/dmsHdb/DmsHdbList";
|
||||
|
||||
@@ -51,9 +51,6 @@ public class TemplateController {
|
||||
HashMap<String, String> prjInfo = new HashMap<String, String>();
|
||||
prjInfo.put("prjSeq", prjSeq);
|
||||
prjInfo.put("prjNm", dmsPrjVO.getPrjNm());
|
||||
prjInfo.put("hdbStsA", request.getParameter("hdbStsA"));
|
||||
prjInfo.put("hdbStsB", request.getParameter("hdbStsB"));
|
||||
prjInfo.put("hdbStsC", request.getParameter("hdbStsC"));
|
||||
request.getSession().setAttribute("prjInfo", prjInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package egovframework.main.web;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.FilterConfig;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||
|
||||
public class OptionalSpringSessionFilter implements Filter {
|
||||
|
||||
private static final String PROPERTIES_PATH = "egovframework/egovProps/globals.properties";
|
||||
private static final String ENABLED_KEY = "Session.Redis.Enabled";
|
||||
private static final String TARGET_BEAN_NAME = "springSessionRepositoryFilter";
|
||||
|
||||
private ServletContext servletContext;
|
||||
private boolean enabled;
|
||||
private volatile Filter delegate;
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
this.servletContext = filterConfig.getServletContext();
|
||||
this.enabled = Boolean.parseBoolean(loadProperty(ENABLED_KEY, "false"));
|
||||
if (this.enabled) {
|
||||
this.servletContext.log("Spring Session Redis filter is enabled.");
|
||||
} else {
|
||||
this.servletContext.log("Spring Session Redis filter is disabled.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||
throws IOException, ServletException {
|
||||
if (!this.enabled) {
|
||||
chain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
Filter current = getDelegate();
|
||||
if (current == null) {
|
||||
chain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
current.doFilter(request, response, chain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
this.delegate = null;
|
||||
}
|
||||
|
||||
private Filter getDelegate() throws ServletException {
|
||||
Filter current = this.delegate;
|
||||
if (current != null) {
|
||||
return current;
|
||||
}
|
||||
synchronized (this) {
|
||||
current = this.delegate;
|
||||
if (current == null) {
|
||||
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(this.servletContext);
|
||||
if (!context.containsBean(TARGET_BEAN_NAME)) {
|
||||
this.enabled = false;
|
||||
this.servletContext.log("Spring Session Redis filter bean was not found. Falling back to local servlet sessions.");
|
||||
return null;
|
||||
}
|
||||
current = context.getBean(TARGET_BEAN_NAME, Filter.class);
|
||||
this.delegate = current;
|
||||
}
|
||||
return current;
|
||||
}
|
||||
}
|
||||
|
||||
private String loadProperty(String key, String defaultValue) {
|
||||
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(PROPERTIES_PATH);
|
||||
if (input == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
Properties properties = new Properties();
|
||||
properties.load(input);
|
||||
return properties.getProperty(key, defaultValue).trim();
|
||||
} catch (IOException e) {
|
||||
this.servletContext.log("Failed to load " + PROPERTIES_PATH + ". Using default for " + key + ".", e);
|
||||
return defaultValue;
|
||||
} finally {
|
||||
try {
|
||||
input.close();
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,11 +27,18 @@ Globals.DbType =mysql
|
||||
#Globals.Password =sksrhdqnffkr
|
||||
|
||||
## \uC138\uC774\uD5EC\uD504\uB370\uC2A4\uD06C
|
||||
Globals.DriverClassName=com.mysql.jdbc.Driver
|
||||
# mysql 5.X
|
||||
#Globals.DriverClassName=com.mysql.jdbc.Driver
|
||||
# mysql 8.4.7
|
||||
Globals.DriverClassName=com.mysql.cj.jdbc.Driver
|
||||
|
||||
#\uC6B4\uC601
|
||||
#Globals.Url=jdbc:mysql://192.168.0.217:3306/helpdesk_db?characterEncoding=utf8
|
||||
#\uAC1C\uBC1C
|
||||
Globals.Url=jdbc:mysql://192.168.0.114:13314/helpdesk_db?characterEncoding=utf8
|
||||
## mysql 5.X
|
||||
#Globals.Url=jdbc:mysql://192.168.0.114:13316/helpdesk_db?characterEncoding=utf8
|
||||
## mysql 8.4.7
|
||||
Globals.Url=jdbc:mysql://192.168.0.114:13316/helpdesk_db?characterEncoding=utf8
|
||||
Globals.UserName =helpdesk
|
||||
Globals.Password =helpdesk
|
||||
|
||||
@@ -145,3 +152,12 @@ ldap.url =ldap://localhost:10389
|
||||
ldap.rootDn =c=kr
|
||||
ldap.username =uid=admin,ou=system
|
||||
ldap.password =secret
|
||||
|
||||
# Spring Session Redis
|
||||
Session.Redis.Enabled=true
|
||||
Session.Redis.Host=sayit-helpdesk-session-redis
|
||||
Session.Redis.Port=6379
|
||||
Session.Redis.Database=0
|
||||
Session.Redis.Timeout=2000
|
||||
Session.Redis.Namespace=sayit-helpdesk-dev:session
|
||||
Session.Redis.MaxInactiveIntervalInSeconds=36000
|
||||
|
||||
@@ -150,3 +150,12 @@ ldap.url =ldap://localhost:10389
|
||||
ldap.rootDn =c=kr
|
||||
ldap.username =uid=admin,ou=system
|
||||
ldap.password =secret
|
||||
|
||||
# Spring Session Redis
|
||||
Session.Redis.Enabled=true
|
||||
Session.Redis.Host=sayit-helpdesk-session-redis
|
||||
Session.Redis.Port=6379
|
||||
Session.Redis.Database=0
|
||||
Session.Redis.Timeout=2000
|
||||
Session.Redis.Namespace=sayit-helpdesk:session
|
||||
Session.Redis.MaxInactiveIntervalInSeconds=36000
|
||||
|
||||
@@ -145,3 +145,12 @@ ldap.url =ldap://localhost:10389
|
||||
ldap.rootDn =c=kr
|
||||
ldap.username =uid=admin,ou=system
|
||||
ldap.password =secret
|
||||
|
||||
# Spring Session Redis
|
||||
Session.Redis.Enabled=false
|
||||
Session.Redis.Host=sayit-helpdesk-session-redis
|
||||
Session.Redis.Port=6379
|
||||
Session.Redis.Database=0
|
||||
Session.Redis.Timeout=2000
|
||||
Session.Redis.Namespace=sayit-helpdesk-stage:session
|
||||
Session.Redis.MaxInactiveIntervalInSeconds=36000
|
||||
|
||||
@@ -27,11 +27,18 @@ Globals.DbType =mysql
|
||||
#Globals.Password =sksrhdqnffkr
|
||||
|
||||
## \uC138\uC774\uD5EC\uD504\uB370\uC2A4\uD06C
|
||||
Globals.DriverClassName=com.mysql.jdbc.Driver
|
||||
# mysql 5.X
|
||||
#Globals.DriverClassName=com.mysql.jdbc.Driver
|
||||
# mysql 8.4.7
|
||||
Globals.DriverClassName=com.mysql.cj.jdbc.Driver
|
||||
|
||||
#\uC6B4\uC601
|
||||
#Globals.Url=jdbc:mysql://192.168.0.217:3306/helpdesk_db?characterEncoding=utf8
|
||||
#\uAC1C\uBC1C
|
||||
Globals.Url=jdbc:mysql://192.168.0.114:13314/helpdesk_db?characterEncoding=utf8
|
||||
## mysql 5.X
|
||||
#Globals.Url=jdbc:mysql://192.168.0.114:13316/helpdesk_db?characterEncoding=utf8
|
||||
## mysql 8.4.7
|
||||
Globals.Url=jdbc:mysql://192.168.0.114:13316/helpdesk_db?characterEncoding=utf8
|
||||
Globals.UserName =helpdesk
|
||||
Globals.Password =helpdesk
|
||||
|
||||
@@ -55,7 +62,7 @@ Globals.OrgNm=\uC138\uC774\uC815\uBCF4\uAE30\uC220
|
||||
Globals.OrgCode=8188
|
||||
|
||||
#Globals.AccessIp=10
|
||||
Globals.SiteTitle=\uC138\uC774\uC815\uBCF4\uAE30\uC220 Help-desk (\uB85C\uCEEC)
|
||||
Globals.SiteTitle=\uC138\uC774\uC815\uBCF4\uAE30\uC220 Help-desk (\uAC1C\uBC1C)
|
||||
#Globals.MobileStartPage=/mobile/intro.do
|
||||
Globals.MobileStartPage=/login.do
|
||||
PushUrl=http://www.sejong.go.kr/sotong
|
||||
@@ -145,3 +152,6 @@ ldap.url =ldap://localhost:10389
|
||||
ldap.rootDn =c=kr
|
||||
ldap.username =uid=admin,ou=system
|
||||
ldap.password =secret
|
||||
|
||||
# Spring Session Redis
|
||||
Session.Redis.Enabled=false
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
|
||||
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
|
||||
|
||||
<beans profile="redis-session">
|
||||
<context:annotation-config/>
|
||||
|
||||
<util:constant id="redisFlushModeOnSave"
|
||||
static-field="org.springframework.session.data.redis.RedisFlushMode.ON_SAVE"/>
|
||||
<util:constant id="configureRedisActionNoOp"
|
||||
static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
|
||||
|
||||
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
|
||||
<property name="maxInactiveIntervalInSeconds" value="${Session.Redis.MaxInactiveIntervalInSeconds}"/>
|
||||
<property name="redisNamespace" value="${Session.Redis.Namespace}"/>
|
||||
<property name="redisFlushMode" ref="redisFlushModeOnSave"/>
|
||||
<property name="configureRedisAction" ref="configureRedisActionNoOp"/>
|
||||
</bean>
|
||||
|
||||
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
|
||||
<property name="hostName" value="${Session.Redis.Host}"/>
|
||||
<property name="port" value="${Session.Redis.Port}"/>
|
||||
<property name="database" value="${Session.Redis.Database}"/>
|
||||
<property name="timeout" value="${Session.Redis.Timeout}"/>
|
||||
<property name="usePool" value="true"/>
|
||||
</bean>
|
||||
|
||||
<bean id="cookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
|
||||
<property name="cookieName" value="JSESSIONID"/>
|
||||
<property name="cookiePath" value="/"/>
|
||||
<property name="useHttpOnlyCookie" value="true"/>
|
||||
</bean>
|
||||
</beans>
|
||||
</beans>
|
||||
@@ -171,6 +171,77 @@
|
||||
|
||||
</select>
|
||||
|
||||
<select id="dmsHdbDAO.selectDmsHdbStat_D" parameterClass="dmsHdbSerarchVO" resultClass="egovMap">
|
||||
|
||||
SELECT
|
||||
COUNT(CASE
|
||||
WHEN B.HDB_STS = 'A'
|
||||
AND B.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
THEN 1
|
||||
END) AS hdbStsA
|
||||
|
||||
, COUNT(CASE
|
||||
WHEN B.HDB_STS = 'B'
|
||||
AND B.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
THEN 1
|
||||
END) AS hdbStsB
|
||||
|
||||
, COUNT(CASE
|
||||
WHEN B.HDB_STS = 'C'
|
||||
AND B.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
THEN 1
|
||||
END) AS hdbStsC
|
||||
|
||||
, COUNT(CASE
|
||||
WHEN B.HDB_STS = 'A'
|
||||
AND YEAR(B.CREATE_DATE) = YEAR(NOW())
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
THEN 1
|
||||
END) AS hdbStsYrA
|
||||
|
||||
, COUNT(CASE
|
||||
WHEN B.HDB_STS = 'B'
|
||||
AND YEAR(B.CREATE_DATE) = YEAR(NOW())
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
THEN 1
|
||||
END) AS hdbStsYrB
|
||||
|
||||
, COUNT(CASE
|
||||
WHEN B.HDB_STS = 'C'
|
||||
AND YEAR(B.CREATE_DATE) = YEAR(NOW())
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
THEN 1
|
||||
END) AS hdbStsYrC
|
||||
|
||||
FROM
|
||||
DMS_HDB B
|
||||
WHERE 1=1
|
||||
AND B.REC_STS = 'A'
|
||||
AND (B.TITLE != '' OR B.CONTENTS != '')
|
||||
|
||||
<isNotEmpty property="prjSeq" prepend="AND">
|
||||
B.PRJ_SEQ = #prjSeq#
|
||||
</isNotEmpty>
|
||||
|
||||
<isNotEmpty property="searchKeyword">
|
||||
<isEqual property="searchCondition" compareValue="1" prepend="AND">
|
||||
B.TITLE LIKE CONCAT('%', #searchKeyword#, '%')
|
||||
</isEqual>
|
||||
<isEqual property="searchCondition" compareValue="2" prepend="AND">
|
||||
B.WRITER_NM LIKE CONCAT('%', #searchKeyword#, '%')
|
||||
</isEqual>
|
||||
</isNotEmpty>
|
||||
</select>
|
||||
|
||||
<select id="dmsHdbDAO.selectDmsHdbListTotCnt_S" parameterClass="dmsHdbSerarchVO" resultClass="int">
|
||||
SELECT
|
||||
COUNT(*) totcnt
|
||||
@@ -306,7 +377,7 @@
|
||||
</select>
|
||||
|
||||
<!-- 현재 기준 한달간 현황 donut chart -->
|
||||
<select id="dmsHdbDAO.selectDmsHdbForMonthChart" parameterClass="dmsHdbSerarchVO" resultClass="egovframework.dms.hdb.vo.DmsHdbGraphVO">
|
||||
<!-- <select id="dmsHdbDAO.selectDmsHdbForMonthChart" parameterClass="dmsHdbSerarchVO" resultClass="egovframework.dms.hdb.vo.DmsHdbGraphVO">
|
||||
SELECT
|
||||
COUNT(CASE WHEN HDB_STS = 'A' THEN 1 END) AS hdbStsA,
|
||||
COUNT(CASE WHEN HDB_STS = 'B' THEN 1 END) AS hdbStsB,
|
||||
@@ -316,5 +387,5 @@
|
||||
AND D.PRJ_SEQ = #prjSeq#
|
||||
AND (D.TITLE != '' OR D.CONTENTS != '')
|
||||
<![CDATA[ AND D.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY) ]]>
|
||||
</select>
|
||||
</select> -->
|
||||
</sqlMap>
|
||||
@@ -128,9 +128,9 @@
|
||||
B.DEPT_CD,
|
||||
B.POSITION_NM,
|
||||
C.PRJ_NM,
|
||||
COUNT(CASE WHEN D.HDB_STS = 'A' AND YEAR(D.CREATE_DATE) = YEAR(NOW()) AND D.REC_STS = 'A' AND (D.TITLE != '' OR D.CONTENTS != '') THEN 1 END) AS hdbStsA,
|
||||
COUNT(CASE WHEN D.HDB_STS = 'B' AND YEAR(D.CREATE_DATE) = YEAR(NOW()) AND D.REC_STS = 'A' AND (D.TITLE != '' OR D.CONTENTS != '') THEN 1 END) AS hdbStsB,
|
||||
COUNT(CASE WHEN D.HDB_STS = 'C' AND YEAR(D.CREATE_DATE) = YEAR(NOW()) AND D.REC_STS = 'A' AND (D.TITLE != '' OR D.CONTENTS != '') THEN 1 END) AS hdbStsC
|
||||
COUNT(CASE WHEN D.HDB_STS = 'A' AND D.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY) AND D.REC_STS = 'A' AND (D.TITLE != '' OR D.CONTENTS != '') THEN 1 END) AS hdbStsA,
|
||||
COUNT(CASE WHEN D.HDB_STS = 'B' AND D.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY) AND D.REC_STS = 'A' AND (D.TITLE != '' OR D.CONTENTS != '') THEN 1 END) AS hdbStsB,
|
||||
COUNT(CASE WHEN D.HDB_STS = 'C' AND D.CREATE_DATE >= DATE_SUB(NOW(), INTERVAL 30 DAY) AND D.REC_STS = 'A' AND (D.TITLE != '' OR D.CONTENTS != '') THEN 1 END) AS hdbStsC
|
||||
FROM DMS_PRJ_AUTH_USER A
|
||||
JOIN HMS_USER B
|
||||
ON A.USER_ID = B.USER_ID
|
||||
|
||||
@@ -129,9 +129,11 @@
|
||||
<tbody>
|
||||
<c:forEach var="list" items="${commentList }">
|
||||
<tr>
|
||||
<th class="left" colspan="3">
|
||||
등록자 : ${list.userNm } | 등록일시 : <fmt:formatDate value="${list.createDate }" pattern="yyyy.MM.dd hh:mm"/>
|
||||
<c:if test="${loginVO.name eq list.userNm }"> <a href="#" onclick="fn_egov_comment_delete('${list.brdReplySeq }', '${commentVO.parentUrl}');">[삭제]</a> </c:if>
|
||||
<th class="left" colspan="3">
|
||||
등록자 : ${list.userNm } | 등록일시 :
|
||||
<fmt:parseDate value="${list.createDate}" pattern="yyyy-MM-dd'T'HH:mm:ss" var="parsedCreateDate"/>
|
||||
<fmt:formatDate value="${parsedCreateDate}" pattern="yyyy.MM.dd HH:mm"/>
|
||||
<c:if test="${loginVO.name eq list.userNm }"> <a href="#" onclick="fn_egov_comment_delete('${list.brdReplySeq }', '${commentVO.parentUrl}');">[삭제]</a></c:if>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -72,7 +72,11 @@
|
||||
<td><a href="#view" onclick="return fn_egov_select('${list.userSeq}')">${list.userNm} (${list.userId})</a></td>
|
||||
<td>${list.tel}</td>
|
||||
<td>${list.deptNm}</td>
|
||||
<td><fmt:formatDate value="${list.createDate }" pattern="yyyy-MM-dd" /></td>
|
||||
<td>
|
||||
<fmt:parseDate value="${list.createDate}" pattern="yyyy-MM-dd'T'HH:mm:ss" var="createdDate"/>
|
||||
<fmt:formatDate value="${createdDate}" pattern="yyyy-MM-dd"/>
|
||||
</td>
|
||||
|
||||
<td>${list.userType}</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
|
||||
@@ -24,11 +24,17 @@
|
||||
<script src="/js/common/charts-plugin-datalabels.js"></script>
|
||||
|
||||
<c:set var="now" value="<%= new java.util.Date() %>" />
|
||||
<fmt:formatDate value="${now}" pattern="yyyy" var="curYear" />
|
||||
<div class="location_box">
|
||||
<div class="loc_h3"><h3>${prjNm} <%=MainGlobals.MENU_HDB%>
|
||||
(<span class="year-text"><fmt:formatDate value="${now}" pattern="yyyy" /> 년 - </span><span class="sts-a">접수: ${hdbStsA}</span>,
|
||||
<span class="sts-b">처리중: ${hdbStsB}</span>,
|
||||
<span class="sts-c">완료: ${hdbStsC}</span> )
|
||||
<div class="loc_h3"><h3>${prjNm} <%=MainGlobals.MENU_HDB%>
|
||||
(
|
||||
<span class="year-text">
|
||||
<%-- ${curYear} 년 --%>
|
||||
한달간 처리 현황
|
||||
</span>
|
||||
<span class="sts-a">접수: ${dmsHdbStat.hdbStsA}</span>,
|
||||
<span class="sts-b">처리중: ${dmsHdbStat.hdbStsB}</span>,
|
||||
<span class="sts-c">완료: ${dmsHdbStat.hdbStsC}</span> )
|
||||
</h3><span></span></div>
|
||||
<span class="loccation"><img src="/images/admin/loccation_home.png" alt="홈" /> > <strong><%=MainGlobals.MENU_HDB%></strong></span>
|
||||
</div>
|
||||
@@ -111,7 +117,9 @@
|
||||
<img src="/images/admin/cf_tit_ic.png">
|
||||
</c:if>
|
||||
</td>
|
||||
<td>${list.createDate}</td>
|
||||
<td>
|
||||
${list.createDate}
|
||||
</td>
|
||||
<td>${list.rdCnt }</td>
|
||||
<%-- <td>${list.compScdDate}</td> --%>
|
||||
</tr>
|
||||
@@ -154,19 +162,33 @@
|
||||
sbData.append("]");
|
||||
|
||||
// 한달 현황 (도넛)
|
||||
DmsHdbGraphVO monthlyList = (DmsHdbGraphVO) request.getAttribute("monthlyList");
|
||||
/* DmsHdbGraphVO monthlyList = (DmsHdbGraphVO) request.getAttribute("monthlyList");
|
||||
|
||||
int cntA = monthlyList.getHdbStsA(); // 접수
|
||||
int cntB = monthlyList.getHdbStsB(); // 처리중
|
||||
int cntC = monthlyList.getHdbStsC(); // 완료
|
||||
int cntC = monthlyList.getHdbStsC(); // 완료 */
|
||||
%>
|
||||
|
||||
<div class="chart-container">
|
||||
<!-- 막대 그래프 -->
|
||||
<div class="chart-box" style="flex:2;">
|
||||
<canvas id="yearChart"></canvas>
|
||||
</div>
|
||||
|
||||
<div class="chart-wrapper">
|
||||
<div class="chart-title">
|
||||
<div class="chart-main-title">
|
||||
${curYear}년 요청 통계
|
||||
</div>
|
||||
<div class="chart-sub-title"><strong>Total [ </strong>
|
||||
<span class="sts-a">접수 ${dmsHdbStat.hdbStsYrA}건</span>
|
||||
<span class="sep">/</span>
|
||||
<span class="sts-b">처리중 ${dmsHdbStat.hdbStsYrB}건</span>
|
||||
<span class="sep">/</span>
|
||||
<span class="sts-c">완료 ${dmsHdbStat.hdbStsYrC}건</span>
|
||||
<strong> ]</strong>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 막대 그래프 -->
|
||||
<div class="chart-box" style="flex:2;">
|
||||
<canvas id="yearChart"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 도넛 그래프 -->
|
||||
<div class="chart-box" style="flex:1; position:relative;">
|
||||
<canvas id="monthChart"></canvas>
|
||||
@@ -190,6 +212,11 @@ Chart.register(ChartDataLabels);
|
||||
const annualLabels = <%= sbLabels.toString() %>;
|
||||
const annualData = <%= sbData.toString() %>;
|
||||
|
||||
const YEAR = '${curYear}';
|
||||
const hdbStsA = Number('${dmsHdbStat.hdbStsA != null ? hdbStsA : 0}');
|
||||
const hdbStsB = Number('${dmsHdbStat.hdbStsB != null ? hdbStsB : 0}');
|
||||
const hdbStsC = Number('${dmsHdbStat.hdbStsC != null ? hdbStsC : 0}');
|
||||
|
||||
new Chart(
|
||||
document.getElementById('yearChart'),
|
||||
{
|
||||
@@ -210,8 +237,8 @@ new Chart(
|
||||
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: '2025년 월별 요청 통계',
|
||||
display: false,
|
||||
//text: YEAR + `년 요청 통계 (접수 ${hdbStsA}건 / 처리중 ${hdbStsB}건 / 완료 ${hdbStsC}건)`,
|
||||
font: { size: 20, weight: 'bold' },
|
||||
padding: { top: 10, bottom: 20 }
|
||||
},
|
||||
@@ -262,9 +289,9 @@ new Chart(
|
||||
/****************************************
|
||||
* 2) 한달 현황 도넛 차트
|
||||
****************************************/
|
||||
const cntA = <%= cntA %>; // 접수
|
||||
const cntB = <%= cntB %>; // 처리중
|
||||
const cntC = <%= cntC %>; // 완료
|
||||
const cntA = ${dmsHdbStat.hdbStsA}; // 접수
|
||||
const cntB = ${dmsHdbStat.hdbStsB}; // 처리중
|
||||
const cntC = ${dmsHdbStat.hdbStsC}; // 완료
|
||||
|
||||
const monthChartCanvas = document.getElementById('monthChart');
|
||||
const noDataMsg = document.getElementById('noDataMsg');
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/dwr/interface/DwrCommonService.js"></script>
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/js/common/jquery/jquery.js"></script>
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/js/common/common.js"></script>
|
||||
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/cms/all.css?ver=20251125_1">
|
||||
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/cms/all.css?ver=20260108_1">
|
||||
<style>
|
||||
.main_wrap_body{ background:url(${pageContext.request.contextPath}/images/admin/login_bg.gif) repeat left top; font-family:"맑은 고딕",Malgun Gothic,AppleGothic,sans-serif,"돋움", Dotum; }
|
||||
.main_wrap{display:block; height:100%; left:0; position:fixed; top:0; width:100%; z-index:10000;}
|
||||
@@ -46,9 +46,9 @@
|
||||
.main_box .bottom_box .bottom_logo{width:20%; float: left; margin-left: 10px;}
|
||||
/* .main_box .bottom_box .bottom_txt{width:70%; float: left;} */
|
||||
|
||||
.sts-a { color: red; font-size: 12px;}
|
||||
.sts-b { color: green; font-size: 12px; }
|
||||
.sts-c { color: blue; font-size: 12px; }
|
||||
.sts-a { color: rgb(75,192,192); font-size: 12px;}
|
||||
.sts-b { color: rgb(255,99,132); font-size: 12px; }
|
||||
.sts-c { color: rgb(54,162,235); font-size: 12px; }
|
||||
</style>
|
||||
</head>
|
||||
<body class="main_wrap_body">
|
||||
@@ -67,7 +67,8 @@
|
||||
<div class="cent_menu">
|
||||
<p class="prj_txt">● 프로젝트 현황</p>
|
||||
<c:set var="now" value="<%= new java.util.Date() %>" />
|
||||
<span class="year-info">※괄호 안 현황 정보는 <fmt:formatDate value="${now}" pattern="yyyy" />년도 기준입니다.</span>
|
||||
<%-- <span class="year-info">※괄호 안 현황 정보는 <fmt:formatDate value="${now}" pattern="yyyy" />년도 기준입니다.</span> --%>
|
||||
<span class="year-info">※괄호 안 현황 정보는 지난 한달 간 데이터 집계입니다.</span>
|
||||
<div class="txt_field">
|
||||
<c:if test="${empty sessionPrjList }">
|
||||
<p class="txt_list">담당하신 프로젝트가 없습니다. 관리자에게 문의해주세요.<p>
|
||||
@@ -75,7 +76,7 @@
|
||||
<c:if test="${!empty sessionPrjList }">
|
||||
<c:forEach items="${sessionPrjList }" var="list">
|
||||
<p class="txt_list">
|
||||
<a href='/dms/contents/dms/hdb/01/hdb.01.001.motion?prjSeq=${list.prjSeq }&moveDetail=Y&hdbStsA=${list.hdbStsA}&hdbStsB=${list.hdbStsB}&hdbStsC=${list.hdbStsC}'>
|
||||
<a href='/dms/contents/dms/hdb/01/hdb.01.001.motion?prjSeq=${list.prjSeq }&moveDetail=Y'>
|
||||
- ${list.prjNm }
|
||||
(<span class="sts-a">접수: ${list.hdbStsA}</span>,
|
||||
<span class="sts-b">처리중: ${list.hdbStsB}</span>,
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
<tr>
|
||||
<th>등록일</th>
|
||||
<td class="left">
|
||||
<%-- <fmt:formatDate value="${dmsHdbVO.createDate}" pattern="yyyy-MM-dd" /> --%>
|
||||
${dmsDtbVO.createDate}
|
||||
<fmt:parseDate value="${dmsHdbVO.createDate}" pattern="yyyy-MM-dd'T'HH:mm:ss" var="parsedCreateDate"/>
|
||||
<fmt:formatDate value="${parsedCreateDate}" pattern="yyyy-MM-dd" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
<tr>
|
||||
<th>등록일</th>
|
||||
<td class="left">
|
||||
<%-- <fmt:formatDate value="${dmsHdbVO.createDate}" pattern="yyyy-MM-dd" /> --%>
|
||||
${dmsHdbVO.createDate}
|
||||
<fmt:parseDate value="${dmsHdbVO.createDate}" pattern="yyyy-MM-dd'T'HH:mm:ss" var="createdDate"/>
|
||||
<fmt:formatDate value="${createdDate}" pattern="yyyy-MM-dd HH:mm:ss"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -29,7 +29,7 @@ if(UserHelper.isAuthenticated()) {
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/dwr/interface/DwrCommonService.js"></script>
|
||||
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/mobile/common.css">
|
||||
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/mobile/layout.css">
|
||||
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/mobile/contents.css">
|
||||
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/mobile/contents.css?ver=20260106">
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/js/mobile/jquery-1.7.1.min.js"></script><!--전체메뉴-->
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/js/mobile/jquery.easing.1.3.js" ></script><!--전체메뉴-->
|
||||
<script type="text/javascript" src="${pageContext.request.contextPath}/js/mobile/mobTnav.js" ></script><!--전체메뉴-->
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
|
||||
<display-name>Default</display-name>
|
||||
<filter>
|
||||
<filter-name>springSessionRepositoryFilter</filter-name>
|
||||
<filter-class>egovframework.main.web.OptionalSpringSessionFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>springSessionRepositoryFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter>
|
||||
<filter-name>encodingFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
@import url(font.css);
|
||||
@import url(main.css);
|
||||
@import url(layout.css);
|
||||
@import url(contents.css?ver=20251125);
|
||||
@import url(contents.css);
|
||||
@import url(login.css);
|
||||
@import url(form.css);
|
||||
@@ -414,23 +414,23 @@ a.btn_search_gray:HOVER {background-color:#4c4c4c; border:1px solid #2f2f2f;}
|
||||
}
|
||||
|
||||
/*요청처리현황*/
|
||||
.sts-a { color: green !important; font-size: 12px; }
|
||||
.sts-b { color: red !important; font-size: 12px; }
|
||||
.sts-c { color: blue !important; font-size: 12px; }
|
||||
.sts-a { color: rgb(75,192,192) !important; font-size: 12px; }
|
||||
.sts-b { color: rgb(255,99,132) !important; font-size: 12px; }
|
||||
.sts-c { color: rgb(54,162,235) !important; font-size: 12px; }
|
||||
|
||||
.year-text {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.year-info-wrap {
|
||||
text-align: right; /* 오른쪽 정렬 */
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.year-info {
|
||||
font-size: 12px;
|
||||
color: red; /* 빨간 글씨 */
|
||||
color: red;
|
||||
position: relative;
|
||||
left: 370px;
|
||||
left: 300px;
|
||||
}
|
||||
|
||||
/*차트*/
|
||||
@@ -444,9 +444,47 @@ a.btn_search_gray:HOVER {background-color:#4c4c4c; border:1px solid #2f2f2f;}
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.chart-wrapper {
|
||||
width: 100%;
|
||||
max-width: 900px; /* 차트 너비와 동일하게 */
|
||||
margin: 0 auto; /* 중앙 정렬 */
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.chart-title {
|
||||
text-align: center;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.chart-main-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
margin-bottom: 6px; /* 줄바꿈 간격 */
|
||||
}
|
||||
|
||||
.chart-sub-title {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* 상태별 색상 */
|
||||
.chart-sub-title .sts-a {
|
||||
color: rgb(75,192,192); /* 접수 - 초록 */
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.chart-sub-title .sts-b {
|
||||
color: rgb(255,99,132); /* 처리중 - 빨강 */
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.chart-sub-title .sts-c {
|
||||
color: rgb(54,162,235); /* 완료 - 파랑 */
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.chart-sub-title .sep {
|
||||
margin: 0 6px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user