Files
wace_plm/WebContent/WEB-INF/classes/com/pms/mapper/board.xml
chpark da06c4684c Initial commit: WACE PLM with database initialization features
- Add Docker Compose configurations for dev, prod, and standalone environments
- Add database initialization scripts (init-db.sh, init-db-docker.sh)
- Add enhanced start-docker-linux.sh with DB init support
- Add comprehensive database initialization guide
- Support for automatic dbexport.pgsql import on first run
- Include safety checks for production environment
2025-08-29 15:46:08 +09:00

589 lines
16 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="board">
<!-- 게시판 목록을 페이징 처리하여 가져온다. -->
<select id="getBoardPagingList" parameterType="map" resultType="map">
SELECT
T.*
FROM
(
SELECT
TBL.*
,(ROW_NUMBER() OVER()) AS RNUM
FROM(
SELECT
OBJID
,SYSTEM_TYPE
,CASE SYSTEM_TYPE
WHEN 'pdm' THEN 'PDM'
WHEN 'pms' THEN 'PMS'
WHEN 'viewer' THEN 'Viewer'
ELSE SYSTEM_TYPE
END SYSTEM_TYPE_TITLE
,CASE BOARD_TYPE
WHEN 'notice' THEN '공지사항'
WHEN 'qna' THEN 'QnA'
ELSE BOARD_TYPE
END BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,RES_CATEGORY
,REQ_CONTENTS
,RES_CONTENTS
,TITLE
,RES_REGDATE
,PLAN_DATE
,ACT_DATE
,TO_CHAR(RES_REGDATE,'YYYY-MM-DD') AS RES_REGDATE_TITLE
,RES_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_DEPT_NAME
,IMPORTANT
,REQ_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_DEPT_NAME
,REQ_REGDATE
,TO_CHAR(REQ_REGDATE,'YYYY-MM-DD') AS REQ_REGDATE_TITLE
,CASE RES_WRITER
WHEN null THEN 'N'
WHEN '' THEN 'N'
ELSE ''
END COMPLETE_FLAG
,CASE
WHEN REQ_WRITER = #{userId} THEN 'Y'
ELSE 'N'
END REQ_WRITER_FLAG
,QNA_NO
,RES_STATE
FROM BOARD B
WHERE 1=1
<if test=" search_systemType != '' and search_systemType != null">
AND UPPER(SYSTEM_TYPE) = UPPER(#{search_systemType})
</if>
<if test=" search_boardType != '' and search_boardType != null">
AND UPPER(BOARD_TYPE) = UPPER(#{search_boardType})
</if>
<if test=" search_category != '' and search_category != null">
AND CATEGORY = #{search_reqcategory}
</if>
<if test=" search_reqcategory != '' and search_reqcategory != null">
AND REQ_CATEGORY = #{search_reqcategory}
</if>
<if test=" search_rescategory != '' and search_rescategory != null">
AND RES_CATEGORY = #{search_rescategory}
</if>
<if test=" search_resstate != '' and search_resstate != null">
AND RES_STATE = #{search_resstate}
</if>
<if test=" search_status != '' and search_status != null">
<if test=" 'reg'.equals(search_status) ">
AND (ACT_DATE is null or ACT_DATE = '')
</if>
<if test=" 'complete'.equals(search_status) ">
AND (ACT_DATE is not null and ACT_DATE != '')
</if>
</if>
<if test=" search_title != '' and search_title != null">
AND TITLE LIKE '%${search_title}%'
</if>
<if test=" search_reqDateFrom != '' and search_reqDateFrom != null">
<![CDATA[ AND REQ_REGDATE >= TO_DATE(#{search_reqDateFrom},'YYYY-MM-DD') ]]>
</if>
<if test=" search_reqDateTo != '' and search_reqDateTo != null">
<![CDATA[ AND REQ_REGDATE <= TO_DATE(#{search_reqDateTo},'YYYY-MM-DD') ]]>
</if>
<if test=" search_important != '' and search_important != null">
AND UPPER(IMPORTANT) = UPPER(#{search_important})
</if>
ORDER BY QNA_NO::integer DESC
) TBL WHERE 1=1
) T WHERE 1=1
<if test="PAGE_END != null and PAGE_END != ''">
AND <![CDATA[ RNUM::integer <= #{PAGE_END}::integer ]]>
</if>
<if test="PAGE_START != null and PAGE_START != ''">
AND <![CDATA[ RNUM::integer >= #{PAGE_START}::integer]]>
</if>
</select>
<select id="getpopupList" parameterType="map" resultType="map">
SELECT
OBJID AS OBJID
FROM
(
SELECT
B.*,
(ROW_NUMBER() OVER(ORDER BY REQ_REGDATE DESC)) RNUM
FROM BOARD B
WHERE BOARD_TYPE='notice'
) A
WHERE A.RNUM = 1
</select>
<!-- 게시판 상세 내용을 가져온다. -->
<select id="getBoardDetailInfo" parameterType="map" resultType="map">
SELECT
(ROW_NUMBER() OVER()) AS RNUM
,OBJID
,SYSTEM_TYPE
,CASE SYSTEM_TYPE
WHEN 'pdm' THEN 'PDM'
WHEN 'pms' THEN 'PMS'
WHEN 'viewer' THEN 'VIEWER'
ELSE ''
END SYSTEM_TYPE_TITLE
,BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,RES_CATEGORY
,REQ_CONTENTS
,RES_CONTENTS
,TITLE
,RES_REGDATE
,TO_CHAR(RES_REGDATE,'YYYY-MM-DD') AS RES_REGDATE_TITLE
,RES_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_DEPT_NAME
,IMPORTANT
,REQ_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_DEPT_NAME
,REQ_REGDATE
,TO_CHAR(REQ_REGDATE,'YYYY-MM-DD') AS REQ_REGDATE_TITLE
,PLAN_DATE
,ACT_DATE
,QNA_NO
,RES_STATE
FROM BOARD
WHERE 1=1
<if test=" objId != '' and objId != null">
AND OBJID = #{objId}
</if>
<if test=" search_systemType != '' and search_systemType != null">
AND UPPER(SYSTEM_TYPE) = #{search_systemType}
</if>
<if test=" search_boardType != '' and search_boardType != null">
AND UPPER(BOARD_TYPE) = #{search_boardType}
</if>
</select>
<!-- 게시판 댓글을 가져온다. -->
<select id="getBoardCommentsInfo" parameterType="map" resultType="map">
select
c.*
,(ROW_NUMBER() OVER()) AS RNUM
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = C.user_id) AS U_NAME
,(SELECT count(1) FROM attach_file_info afi WHERE afi.target_objid::varchar = c.objid::varchar) AS FILE_CNT
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REGDATE_Y_M_D
from
comments c
where 1 = 1
and POST_OBJID = #{objId}
</select>
<!-- 게시판 댓글을 가져온다. -->
<select id="getBoardCommentsInfoMap" parameterType="map" resultType="map">
select
c.*,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = C.user_id) AS U_NAME
from
comments c
where 1 = 1
and POST_OBJID = #{postObjId}
and OBJID = #{objId}
</select>
<!-- 게시판의 개수를 가져온다. -->
<select id="getBoardListCnt" parameterType="map" resultType="map">
SELECT
CEIL(TOTAL_CNT/#{COUNT_PER_PAGE})::numeric::integer AS MAX_PAGE_SIZE,
TOTAL_CNT::integer
FROM (
SELECT
COUNT(1)::float TOTAL_CNT
FROM(
SELECT
(ROW_NUMBER() OVER()) AS RNUM
,OBJID
,SYSTEM_TYPE
,BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,RES_CATEGORY
,REQ_CONTENTS
,RES_CONTENTS
,TITLE
,RES_REGDATE
,TO_CHAR(RES_REGDATE,'YYYY-MM-DD') AS RES_REGDATE_TITLE
,RES_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_DEPT_NAME
,IMPORTANT
,REQ_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_DEPT_NAME
,REQ_REGDATE
,TO_CHAR(REQ_REGDATE,'YYYY-MM-DD') AS REQ_REGDATE_TITLE
,QNA_NO
FROM BOARD
WHERE 1=1
<if test=" search_systemType != '' and search_systemType != null">
AND UPPER(SYSTEM_TYPE) = UPPER(#{search_systemType})
</if>
<if test=" search_boardType != '' and search_boardType != null">
AND UPPER(BOARD_TYPE) = UPPER(#{search_boardType})
</if>
<if test=" search_category != '' and search_category != null">
AND CATEGORY = #{search_reqcategory}
</if>
<if test=" search_reqcategory != '' and search_reqcategory != null">
AND REQ_CATEGORY = #{search_reqcategory}
</if>
<if test=" search_rescategory != '' and search_rescategory != null">
AND RES_CATEGORY = #{search_rescategory}
</if>
<if test=" search_resstate != '' and search_resstate != null">
AND RES_STATE = #{search_resstate}
</if>
<if test=" search_status != '' and search_status != null">
<if test=" 'reg'.equals(search_status) ">
AND (ACT_DATE is null or ACT_DATE = '')
</if>
<if test=" 'complete'.equals(search_status) ">
AND (ACT_DATE is not null and ACT_DATE != '')
</if>
</if>
<if test=" search_title != '' and search_title != null">
AND TITLE LIKE '%${search_title}%'
</if>
<if test=" search_reqDateFrom != '' and search_reqDateFrom != null">
<![CDATA[ AND TO_DATE(REQ_REGDATE,'YYYY-MM-DD') >= TO_DATE(#{search_reqDateFrom},'YYYY-MM-DD') ]]>
</if>
<if test=" search_reqDateTo != '' and search_reqDateTo != null">
<![CDATA[ AND TO_DATE(REQ_REGDATE,'YYYY-MM-DD') <= TO_DATE(#{search_reqDateTo},'YYYY-MM-DD') ]]>
</if>
<if test=" search_important != '' and search_important != null">
AND UPPER(IMPORTANT) = UPPER(#{search_important})
</if>
ORDER BY QNA_NO DESC
) A WHERE 1=1
) A
</select>
<!-- 게시판 내용을 저장한다. -->
<update id="mergeBoardInfo" parameterType="map">
INSERT INTO BOARD
(
OBJID
,SYSTEM_TYPE
,BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,RES_CATEGORY
,REQ_CONTENTS
,RES_CONTENTS
,TITLE
,RES_REGDATE
,RES_WRITER
,IMPORTANT
,REQ_WRITER
,REQ_REGDATE
)
VALUES
(
#{objId}
,#{systemType}
,#{boardType}
,#{category}
,#{reqCategory}
,#{resCategory}
,#{reqContents}
,#{resContents}
,#{title}
,now()
,#{resWriter}
,#{important}
,#{reqWriter}
,now()
) ON CONFLICT (OBJID) DO
UPDATE
SET
SYSTEM_TYPE = #{systemType},
BOARD_TYPE = #{boardType},
CATEGORY = #{category},
REQ_CATEGORY = #{reqCategory},
RES_CATEGORY = #{resCategory},
REQ_CONTENTS = #{reqContents},
RES_CONTENTS = #{resContents},
TITLE = #{title},
RES_REGDATE = now(),
RES_WRITER = #{resWriter},
IMPORTANT = #{important},
REQ_WRITER = #{reqWriter},
REQ_REGDATE = now()
</update>
<!-- 게시판 팝업을 통해 내용을 삭제한다. -->
<delete id="deleteBoardInfo" parameterType="map">
DELETE FROM BOARD WHERE OBJID = #{objId}
</delete>
<!-- 게시판 리스트를 체크를 통해 삭제한다. -->
<delete id="deleteBoardListInfo" parameterType="map">
DELETE FROM BOARD WHERE OBJID = #{OBJECID}
</delete>
<!-- 게시물 댓글을 저장한다. -->
<update id="mergeBoardContentsInfo" parameterType="map">
INSERT INTO COMMENTS
(
USER_NAME,
USER_ID,
CONTENTS,
COMMENT_OBJID,
COMMENT_PARENTS,
POST_OBJID,
COMMENT_LAYER,
OBJID,
CHECK_VIEW,
REGDATE
)VALUES(
#{userName}
,#{WRITER}
,#{CONTENTS}
,#{OBJID}
,#{COMMENT_PARENTS}
,#{POST_OBJID}
,#{COMMENT_LAYER}
,#{OBJID}
,'true'
,now()
) ON
CONFLICT (OBJID) DO
UPDATE
SET
USER_NAME = #{userName} ,
CONTENTS = #{CONTENTS} ,
COMMENT_OBJID = #{OBJID} ,
COMMENT_PARENTS = #{COMMENT_PARENTS} ,
POST_OBJID = #{POST_OBJID} ,
COMMENT_LAYER = #{COMMENT_LAYER} ,
CHECK_VIEW = 'true' ,
REGDATE = NOW()
</update>
<!-- 게시물 댓글을 삭제한다. -->
<delete id="deleteBoardContentsInfo" parameterType="map">
DELETE FROM COMMENTS WHERE COMMENT_OBJID = #{OBJID}
</delete>
<!-- 게시판 내용을 저장한다. -->
<update id="mergeReqBoardInfo" parameterType="map">
<!-- oracle
INSERT INTO BOARD T USING DUAL ON ( T.OBJID = #{objId})
WHEN MATCHED THEN
UPDATE
SET
T.SYSTEM_TYPE = #{systemType},
T.BOARD_TYPE = #{boardType},
T.CATEGORY = #{category},
T.REQ_CATEGORY = #{reqCategory},
T.REQ_CONTENTS = #{reqContents},
T.TITLE = #{title}
WHEN NOT MATCHED THEN
INSERT
(
T.OBJID
,T.SYSTEM_TYPE
,T.BOARD_TYPE
,T.CATEGORY
,T.REQ_CATEGORY
,T.REQ_CONTENTS
,T.TITLE
,T.REQ_WRITER
,T.REQ_REGDATE
)
VALUES
(
#{objId}
,#{systemType}
,#{boardType}
,#{category}
,#{reqCategory}
,#{reqContents}
,#{title}
,#{reqWriter}
,SYSDATE
)
-->
INSERT INTO BOARD
(
OBJID
,SYSTEM_TYPE
,BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,REQ_CONTENTS
,TITLE
,REQ_WRITER
,REQ_REGDATE
,QNA_NO
,RES_STATE
)
VALUES
(
#{objId}
,#{systemType}
,#{boardType}
,#{category}
,#{reqCategory}
,#{reqContents}
,#{title}
,#{reqWriter}
,now()
,(SELECT NEXTVAL('qna_seq'))
,'접수'
)
ON CONFLICT (OBJID) DO
UPDATE
SET
SYSTEM_TYPE = #{systemType},
BOARD_TYPE = #{boardType},
CATEGORY = #{category},
REQ_CATEGORY = #{reqCategory},
RES_CATEGORY = #{resCategory},
REQ_CONTENTS = #{reqContents},
RES_CONTENTS = #{resContents},
TITLE = #{title},
RES_REGDATE = now(),
RES_WRITER = #{resWriter},
IMPORTANT = #{important},
RES_STATE = #{resstate}
</update>
<!-- 게시판 내용을 저장한다. -->
<update id="mergeResBoardInfo" parameterType="map">
<!-- oracle
MERGE INTO BOARD T USING DUAL ON ( T.OBJID = #{objId})
-->
<!-- postgresql 15
MERGE INTO BOARD T
USING (SELECT #{objId} AS OBJID) AS T1
ON T.OBJID = T1.OBJID
WHEN MATCHED THEN
-->
INSERT INTO BOARD
(
OBJID
,SYSTEM_TYPE
,BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,RES_CATEGORY
,REQ_CONTENTS
,RES_CONTENTS
,TITLE
,RES_REGDATE
,RES_WRITER
,IMPORTANT
,REQ_WRITER
,REQ_REGDATE
,RES_STATE
)
VALUES
(
#{objId}
,#{systemType}
,#{boardType}
,#{category}
,#{reqCategory}
,#{resCategory}
,#{reqContents}
,#{resContents}
,#{title}
,now()
,#{resWriter}
,#{important}
,#{reqWriter}
,now()
,#{resstate}
) ON CONFLICT (OBJID) DO
UPDATE
SET
PLAN_DATE = #{PLAN_DATE},
ACT_DATE = #{ACT_DATE},
RES_CATEGORY = #{resCategory},
RES_CONTENTS = #{resContents},
RES_REGDATE = now(),
RES_WRITER = #{resWriter},
RES_STATE = #{resstate}
</update>
<delete id="deleteReqBoardInfo" parameterType="map">
DELETE FROM BOARD WHERE OBJID = #{objId}
</delete>
<!-- Main 페이지에서 보여줄 게시판 목록을 가져온다. -->
<select id="getMainBoardList" parameterType="map" resultType="map">
SELECT * FROM (
SELECT
ROWNUM RNUM
,OBJID
,SYSTEM_TYPE
,BOARD_TYPE
,CATEGORY
,REQ_CATEGORY
,RES_CATEGORY
,REQ_CONTENTS
,RES_CONTENTS
,TITLE
,RES_REGDATE
,TO_CHAR(RES_REGDATE,'YYYY-MM-DD') AS RES_REGDATE_TITLE
,RES_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = RES_WRITER) AS RES_DEPT_NAME
,IMPORTANT
,REQ_WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_USER_NAME
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = REQ_WRITER) AS REQ_DEPT_NAME
,REQ_REGDATE
,TO_CHAR(REQ_REGDATE,'YYYY-MM-DD') AS REQ_REGDATE_TITLE
,DECODE(RES_WRITER,null,'N','','N') AS COMPLETE_FLAG
,DECODE(REQ_WRITER,#{userId},'Y') AS REQ_WRITER_FLAG
FROM BOARD
WHERE 1=1
<if test=" search_systemType != '' and search_systemType != null">
AND UPPER(SYSTEM_TYPE) = UPPER(#{search_systemType})
</if>
<if test=" search_boardType != '' and search_boardType != null">
AND UPPER(BOARD_TYPE) = UPPER(#{search_boardType})
</if>
<if test=" search_title != '' and search_title != null">
AND TITLE LIKE '%${search_title}%'
</if>
<if test=" search_reqDateFrom != '' and search_reqDateFrom != null">
<![CDATA[ AND REQ_REGDATE >= TO_DATE(#{search_reqDateFrom},'YYYY-MM-DD') ]]>
</if>
<if test=" search_reqDateTo != '' and search_reqDateTo != null">
<![CDATA[ AND REQ_REGDATE <= TO_DATE(#{search_reqDateTo},'YYYY-MM-DD') ]]>
</if>
<if test=" search_important != '' and search_important != null">
AND UPPER(IMPORTANT) = UPPER(#{search_important})
</if>
ORDER BY IMPORTANT,REQ_REGDATE DESC
)<![CDATA[WHERE RNUM <= #{viewCount}]]>
</select>
</mapper>