File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.itn.itnhub.review.ReviewItemMapper">
<!--
web_edited_at/created_at/updated_at을 밀리초 epoch로 내려준다(work_memo와 동일 관례).
web_edited_at은 null이면 extract(epoch from null)도 null이라 그대로 null이 내려간다.
-->
<sql id="columns">
id, org_id, seq, site_name, category, board_path, board_name, post_title, url,
post_registered, produced_date, published_date, has_attachment, kogl_attached, kogl_type, ai_type,
surveyor_note, openable, review_major, review_minor, review_result, judged_kogl_type, judged_ai_type,
opinion, lawyer_note, needs_processing,
(extract(epoch from web_edited_at) * 1000)::bigint as web_edited_at,
(extract(epoch from created_at) * 1000)::bigint as created_at,
(extract(epoch from updated_at) * 1000)::bigint as updated_at
</sql>
<!--
keyword는 세 열을 OR로 훑는 통합검색, site/board/title은 열별 조건이라 서로 AND로 겹친다.
둘을 같이 보내면 (통합검색) AND (열별 조건들)이 된다.
-->
<sql id="keywordFilter">
<if test="keyword != null">
and (site_name ilike concat('%', #{keyword}, '%')
or board_name ilike concat('%', #{keyword}, '%')
or post_title ilike concat('%', #{keyword}, '%'))
</if>
<if test="site != null">
and site_name ilike concat('%', #{site}, '%')
</if>
<if test="board != null">
and board_name ilike concat('%', #{board}, '%')
</if>
<if test="title != null">
and post_title ilike concat('%', #{title}, '%')
</if>
</sql>
<select id="findPage" resultType="kr.itn.itnhub.review.ReviewItem">
select <include refid="columns"/>
from review_item
where org_id = #{orgId}
<include refid="keywordFilter"/>
order by seq asc
limit #{limit} offset #{offset}
</select>
<select id="countByOrg" resultType="int">
select count(*)
from review_item
where org_id = #{orgId}
<include refid="keywordFilter"/>
</select>
<select id="countDone" resultType="int">
select count(*)
from review_item
where org_id = #{orgId}
and review_result is not null
and review_result <> ''
</select>
<select id="findAllByOrg" resultType="kr.itn.itnhub.review.ReviewItem">
select <include refid="columns"/>
from review_item
where org_id = #{orgId}
order by seq asc
</select>
<select id="findSeqsByOrg" resultType="int">
select seq from review_item where org_id = #{orgId}
</select>
<select id="findById" resultType="kr.itn.itnhub.review.ReviewItem">
select <include refid="columns"/>
from review_item
where org_id = #{orgId} and id = #{id}
</select>
<!--
정책(b): 조사원 영역(site_name..surveyor_note)은 재업로드마다 항상 최신 파일값으로
덮어쓴다. 변호사 영역(openable..needs_processing)은 web_edited_at이 null일 때만
(=웹에서 아직 아무도 손대지 않았을 때만) 파일값을 반영한다 - 이미 웹에서 판정을
입력한 행은 재업로드가 절대 덮어쓰지 않는다.
-->
<insert id="upsertFromFile" parameterType="kr.itn.itnhub.review.ReviewItem">
insert into review_item (
org_id, seq, site_name, category, board_path, board_name, post_title, url,
post_registered, produced_date, published_date, has_attachment, kogl_attached, kogl_type, ai_type,
surveyor_note, openable, review_major, review_minor, review_result, judged_kogl_type, judged_ai_type,
opinion, lawyer_note, needs_processing
) values (
#{orgId}, #{seq}, #{siteName}, #{category}, #{boardPath}, #{boardName}, #{postTitle}, #{url},
#{postRegistered}, #{producedDate}, #{publishedDate}, #{hasAttachment}, #{koglAttached}, #{koglType}, #{aiType},
#{surveyorNote}, #{openable}, #{reviewMajor}, #{reviewMinor}, #{reviewResult}, #{judgedKoglType}, #{judgedAiType},
#{opinion}, #{lawyerNote}, #{needsProcessing}
)
on conflict (org_id, seq) do update set
site_name = excluded.site_name,
category = excluded.category,
board_path = excluded.board_path,
board_name = excluded.board_name,
post_title = excluded.post_title,
url = excluded.url,
post_registered = excluded.post_registered,
produced_date = excluded.produced_date,
published_date = excluded.published_date,
has_attachment = case when review_item.web_edited_at is null then excluded.has_attachment else review_item.has_attachment end,
kogl_attached = case when review_item.web_edited_at is null then excluded.kogl_attached else review_item.kogl_attached end,
kogl_type = case when review_item.web_edited_at is null then excluded.kogl_type else review_item.kogl_type end,
ai_type = case when review_item.web_edited_at is null then excluded.ai_type else review_item.ai_type end,
surveyor_note = excluded.surveyor_note,
openable = case when review_item.web_edited_at is null then excluded.openable else review_item.openable end,
review_major = case when review_item.web_edited_at is null then excluded.review_major else review_item.review_major end,
review_minor = case when review_item.web_edited_at is null then excluded.review_minor else review_item.review_minor end,
review_result = case when review_item.web_edited_at is null then excluded.review_result else review_item.review_result end,
judged_kogl_type = case when review_item.web_edited_at is null then excluded.judged_kogl_type else review_item.judged_kogl_type end,
judged_ai_type = case when review_item.web_edited_at is null then excluded.judged_ai_type else review_item.judged_ai_type end,
opinion = case when review_item.web_edited_at is null then excluded.opinion else review_item.opinion end,
lawyer_note = case when review_item.web_edited_at is null then excluded.lawyer_note else review_item.lawyer_note end,
needs_processing = case when review_item.web_edited_at is null then excluded.needs_processing else review_item.needs_processing end,
updated_at = now()
</insert>
<update id="updateJudgment">
update review_item set
has_attachment = #{hasAttachment},
kogl_attached = #{koglAttached},
kogl_type = #{koglType},
ai_type = #{aiType},
openable = #{openable},
review_major = #{reviewMajor},
review_minor = #{reviewMinor},
review_result = #{reviewResult},
judged_kogl_type = #{judgedKoglType},
judged_ai_type = #{judgedAiType},
opinion = #{opinion},
lawyer_note = #{lawyerNote},
needs_processing = #{needsProcessing},
web_edited_at = now(),
updated_at = now()
where org_id = #{orgId} and id = #{id}
</update>
<!--
일괄 등록. null로 온 항목은 coalesce로 기존 값을 유지하므로, 화면에서 채운 항목만 반영된다.
개별 저장과 같이 web_edited_at을 찍어야 엑셀 재업로드가 이 값을 덮지 않는다.
-->
<update id="updateJudgmentBulk">
update review_item set
review_result = coalesce(#{reviewResult}, review_result),
judged_kogl_type = coalesce(#{judgedKoglType}, judged_kogl_type),
opinion = coalesce(#{opinion}, opinion),
web_edited_at = now(),
updated_at = now()
where org_id = #{orgId}
and id in
<foreach item="id" collection="ids" open="(" separator="," close=")">#{id}</foreach>
</update>
<delete id="deleteByIds">
delete from review_item
where org_id = #{orgId}
and id in
<foreach item="id" collection="ids" open="(" separator="," close=")">#{id}</foreach>
</delete>
<delete id="deleteById">
delete from review_item where org_id = #{orgId} and id = #{id}
</delete>
<delete id="deleteByOrg">
delete from review_item where org_id = #{orgId}
</delete>
</mapper>