Files
invyone/backend-spring/src/main/resources/mapper/commonCode.xml
T
DDD1542 2348800e68
Build & Deploy to K8s / build-and-deploy (push) Successful in 9m22s
refactor(common-code): 마스터-디테일 재설계 — code_info(그룹) + code_detail(재귀 트리)
카테고리/캐스케이딩 시스템 (B/C/D) 전부 폐기:
- BE: mapper/Service/Controller 9세트 삭제 (cascading*, categoryTree, tableCategoryValue, categoryValueCascading, codeMerge)
- FE: 페이지 3 + API 8 + hooks 2 + 폐기 컴포넌트 6 삭제, 14곳 의존성 정리
- DB: 12 테이블 DROP, TABLE_TYPE_COLUMNS.CODE_CATEGORY → CODE_INFO rename

신설 commonCode 마스터-디테일:
- code_info: 1레벨 그룹 마스터
- code_detail: 2~∞ depth 재귀 트리 (parent_detail_id self-FK, depth 자동 계산)
- API: /api/common-codes/{info,detail}
- CodeCategoryFormModal/Panel → CodeInfoFormModal/Panel rename
- code_category 컬럼명 전부 code_info 로 치환 (mapper/Java/FE)
- 옛 commonCode API URL (/categories/...) → getCodeOptions 어댑터 + /detail?code_info=... 전환

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 16:50:50 +09:00

440 lines
12 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="commonCode">
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- CODE_INFO — 1레벨 그룹 마스터 -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<select id="getCodeInfoList" parameterType="map" resultType="map">
SELECT
CODE_INFO
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, SORT_ORDER
, IS_ACTIVE
, MENU_OBJID
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
FROM CODE_INFO
WHERE 1=1
<include refid="common.companyCodeFilter"/>
<if test="search != null and search != ''">
AND (
LOWER(CODE_INFO) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(CODE_NAME) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(COALESCE(CODE_NAME_ENG, '')) LIKE LOWER(CONCAT('%', #{search}, '%'))
)
</if>
<if test="is_active != null">
AND IS_ACTIVE = #{is_active}
</if>
ORDER BY SORT_ORDER ASC, CODE_INFO ASC
<include refid="common.pagination"/>
</select>
<select id="getCodeInfoListCnt" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM CODE_INFO
WHERE 1=1
<include refid="common.companyCodeFilter"/>
<if test="search != null and search != ''">
AND (
LOWER(CODE_INFO) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(CODE_NAME) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(COALESCE(CODE_NAME_ENG, '')) LIKE LOWER(CONCAT('%', #{search}, '%'))
)
</if>
<if test="is_active != null">
AND IS_ACTIVE = #{is_active}
</if>
</select>
<select id="getCodeInfoInfo" parameterType="map" resultType="map">
SELECT
CODE_INFO
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, SORT_ORDER
, IS_ACTIVE
, MENU_OBJID
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
FROM CODE_INFO
WHERE CODE_INFO = #{code_info}
<include refid="common.companyCodeFilter"/>
</select>
<insert id="insertCodeInfo" parameterType="map">
INSERT INTO CODE_INFO (
CODE_INFO
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, SORT_ORDER
, IS_ACTIVE
, MENU_OBJID
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
) VALUES (
#{code_info}
, #{code_name}
, #{code_name_eng}
, #{description}
, #{sort_order}
, #{is_active}
, #{menu_objid}
, #{company_code}
, #{created_by}
, #{updated_by}
, NOW()
, NOW()
)
</insert>
<update id="updateCodeInfo" parameterType="map">
UPDATE CODE_INFO
<set>
<if test="code_name != null">CODE_NAME = #{code_name},</if>
<if test="code_name_eng != null">CODE_NAME_ENG = #{code_name_eng},</if>
<if test="description != null">DESCRIPTION = #{description},</if>
<if test="sort_order != null">SORT_ORDER = #{sort_order},</if>
<if test="is_active != null">IS_ACTIVE = #{is_active},</if>
<if test="menu_objid != null">MENU_OBJID = #{menu_objid},</if>
UPDATED_BY = #{updated_by},
UPDATED_DATE = NOW()
</set>
WHERE CODE_INFO = #{code_info}
<include refid="common.companyCodeFilter"/>
</update>
<delete id="deleteCodeInfo" parameterType="map">
DELETE FROM CODE_INFO
WHERE CODE_INFO = #{code_info}
<include refid="common.companyCodeFilter"/>
</delete>
<select id="getCodeInfoDuplicateCnt" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM CODE_INFO
WHERE CODE_INFO = #{code_info}
<include refid="common.companyCodeFilter"/>
</select>
<select id="getCodeInfoDuplicateByField" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM CODE_INFO
WHERE 1=1
<include refid="common.companyCodeFilter"/>
<choose>
<when test='field == "code_info"'>AND CODE_INFO = #{value}</when>
<when test='field == "code_name"'>AND CODE_NAME = #{value}</when>
<when test='field == "code_name_eng"'>AND CODE_NAME_ENG = #{value}</when>
<otherwise>AND CODE_INFO = #{value}</otherwise>
</choose>
<if test="exclude_code != null and exclude_code != ''">
AND CODE_INFO != #{exclude_code}
</if>
</select>
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- CODE_DETAIL — 2레벨 ~ 무한대 트리 -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<select id="getCodeDetailList" parameterType="map" resultType="map">
SELECT
CODE_DETAIL_ID
, CODE_INFO
, PARENT_DETAIL_ID
, CODE_VALUE
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, DEPTH
, SORT_ORDER
, IS_ACTIVE
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
FROM CODE_DETAIL
WHERE CODE_INFO = #{code_info}
<include refid="common.companyCodeFilter"/>
<choose>
<when test="parent_detail_id != null">
AND PARENT_DETAIL_ID = #{parent_detail_id}
</when>
<when test="only_roots != null and only_roots == true">
AND PARENT_DETAIL_ID IS NULL
</when>
</choose>
<if test="search != null and search != ''">
AND (
LOWER(CODE_VALUE) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(CODE_NAME) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(COALESCE(CODE_NAME_ENG, '')) LIKE LOWER(CONCAT('%', #{search}, '%'))
)
</if>
<if test="is_active != null">
AND IS_ACTIVE = #{is_active}
</if>
ORDER BY DEPTH ASC, SORT_ORDER ASC, CODE_VALUE ASC
<include refid="common.pagination"/>
</select>
<select id="getCodeDetailListCnt" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM CODE_DETAIL
WHERE CODE_INFO = #{code_info}
<include refid="common.companyCodeFilter"/>
<choose>
<when test="parent_detail_id != null">
AND PARENT_DETAIL_ID = #{parent_detail_id}
</when>
<when test="only_roots != null and only_roots == true">
AND PARENT_DETAIL_ID IS NULL
</when>
</choose>
<if test="search != null and search != ''">
AND (
LOWER(CODE_VALUE) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(CODE_NAME) LIKE LOWER(CONCAT('%', #{search}, '%'))
OR LOWER(COALESCE(CODE_NAME_ENG, '')) LIKE LOWER(CONCAT('%', #{search}, '%'))
)
</if>
<if test="is_active != null">
AND IS_ACTIVE = #{is_active}
</if>
</select>
<select id="getCodeDetailInfo" parameterType="map" resultType="map">
SELECT
CODE_DETAIL_ID
, CODE_INFO
, PARENT_DETAIL_ID
, CODE_VALUE
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, DEPTH
, SORT_ORDER
, IS_ACTIVE
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
FROM CODE_DETAIL
WHERE CODE_DETAIL_ID = #{code_detail_id}
<include refid="common.companyCodeFilter"/>
</select>
<!--
그룹 전체 트리 — 재귀 CTE 로 평탄화.
depth 오름차순 → sort_order 오름차순 → code_value 오름차순.
-->
<select id="getCodeDetailTree" parameterType="map" resultType="map">
WITH RECURSIVE TREE AS (
SELECT
CODE_DETAIL_ID
, CODE_INFO
, PARENT_DETAIL_ID
, CODE_VALUE
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, DEPTH
, SORT_ORDER
, IS_ACTIVE
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
, ARRAY[SORT_ORDER, CODE_DETAIL_ID] AS PATH
FROM CODE_DETAIL
WHERE CODE_INFO = #{code_info}
AND PARENT_DETAIL_ID IS NULL
<if test='company_code != null and company_code != "*"'>
AND (COMPANY_CODE = #{company_code} OR COMPANY_CODE = '*')
</if>
UNION ALL
SELECT
C.CODE_DETAIL_ID
, C.CODE_INFO
, C.PARENT_DETAIL_ID
, C.CODE_VALUE
, C.CODE_NAME
, C.CODE_NAME_ENG
, C.DESCRIPTION
, C.DEPTH
, C.SORT_ORDER
, C.IS_ACTIVE
, C.COMPANY_CODE
, C.CREATED_BY
, C.UPDATED_BY
, C.CREATED_DATE
, C.UPDATED_DATE
, TREE.PATH || ARRAY[C.SORT_ORDER, C.CODE_DETAIL_ID]
FROM CODE_DETAIL C
INNER JOIN TREE ON C.PARENT_DETAIL_ID = TREE.CODE_DETAIL_ID
WHERE C.CODE_INFO = #{code_info}
<if test='company_code != null and company_code != "*"'>
AND (C.COMPANY_CODE = #{company_code} OR C.COMPANY_CODE = '*')
</if>
)
SELECT
CODE_DETAIL_ID
, CODE_INFO
, PARENT_DETAIL_ID
, CODE_VALUE
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, DEPTH
, SORT_ORDER
, IS_ACTIVE
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
FROM TREE
ORDER BY PATH
</select>
<insert id="insertCodeDetail" parameterType="map" useGeneratedKeys="true" keyProperty="code_detail_id" keyColumn="code_detail_id">
INSERT INTO CODE_DETAIL (
CODE_INFO
, PARENT_DETAIL_ID
, CODE_VALUE
, CODE_NAME
, CODE_NAME_ENG
, DESCRIPTION
, DEPTH
, SORT_ORDER
, IS_ACTIVE
, COMPANY_CODE
, CREATED_BY
, UPDATED_BY
, CREATED_DATE
, UPDATED_DATE
) VALUES (
#{code_info}
, #{parent_detail_id}
, #{code_value}
, #{code_name}
, #{code_name_eng}
, #{description}
, #{depth}
, #{sort_order}
, #{is_active}
, #{company_code}
, #{created_by}
, #{updated_by}
, NOW()
, NOW()
)
</insert>
<update id="updateCodeDetail" parameterType="map">
UPDATE CODE_DETAIL
<set>
<if test="code_value != null">CODE_VALUE = #{code_value},</if>
<if test="code_name != null">CODE_NAME = #{code_name},</if>
<if test="code_name_eng != null">CODE_NAME_ENG = #{code_name_eng},</if>
<if test="description != null">DESCRIPTION = #{description},</if>
<if test="sort_order != null">SORT_ORDER = #{sort_order},</if>
<if test="is_active != null">IS_ACTIVE = #{is_active},</if>
<if test="reparent != null and reparent == true">
PARENT_DETAIL_ID = #{parent_detail_id},
DEPTH = #{depth},
</if>
UPDATED_BY = #{updated_by},
UPDATED_DATE = NOW()
</set>
WHERE CODE_DETAIL_ID = #{code_detail_id}
<include refid="common.companyCodeFilter"/>
</update>
<delete id="deleteCodeDetail" parameterType="map">
DELETE FROM CODE_DETAIL
WHERE CODE_DETAIL_ID = #{code_detail_id}
<include refid="common.companyCodeFilter"/>
</delete>
<select id="getCodeDetailDuplicateCnt" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM CODE_DETAIL
WHERE CODE_INFO = #{code_info}
AND CODE_VALUE = #{code_value}
<include refid="common.companyCodeFilter"/>
<if test="exclude_id != null">
AND CODE_DETAIL_ID != #{exclude_id}
</if>
</select>
<select id="getCodeDetailChildrenCnt" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM CODE_DETAIL
WHERE PARENT_DETAIL_ID = #{code_detail_id}
<include refid="common.companyCodeFilter"/>
</select>
<select id="getCodeDetailParentDepth" parameterType="map" resultType="int">
SELECT COALESCE(DEPTH, 1)
FROM CODE_DETAIL
WHERE CODE_DETAIL_ID = #{code_detail_id}
<include refid="common.companyCodeFilter"/>
</select>
</mapper>