<?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="com.hzs.bonus.detail.mapper.CuMemberAssessMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="CuMemberAssess" type="com.hzs.common.domain.member.ext.CuMemberAssessExt">
        <id column="PK_ID" property="pkId" />
        <result column="DEL_FLAG" property="delFlag" />
        <result column="PK_CREATOR" property="pkCreator" />
        <result column="CREATION_TIME" property="creationTime" />
        <result column="PK_MODIFIED" property="pkModified" />
        <result column="MODIFIED_TIME" property="modifiedTime" />
        <result column="PK_COUNTRY" property="pkCountry" />
        <result column="PK_MEMBER" property="pkMember" />
        <result column="PERIOD" property="period" />
        <result column="SETTLE_MONTH" property="settleMonth" />
        <result column="ASSESS_TYPE" property="assessType" />
        <result column="PK_ORIGINAL_AWARDS" property="pkOriginalAwards"/>
        <result column="PK_AWARDS" property="pkAwards" />
        <result column="ASSESS_TARGET" property="assessTarget" />
        <result column="IS_EXAMINE" property="isExamine" />
        <result column="ASSESS_STATUS" property="assessStatus" />
        <result column="MONTH_BALANCE" property="monthBalance" />
        <result column="MONTH_ADD" property="monthAdd" />
        <result column="CUR_MONTH_ADD" property="curMonthAdd" />
        <result column="MONTH_USED" property="monthUsed" />
        <result column="MONTH_SURPLUS" property="monthSurplus" />
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="CuMemberAssessColumn">
          pk_id         NUMBER(20) primary key,
          pk_member     NUMBER(20) not null,
          period        NUMBER(6) not null,
          settle_month  VARCHAR2(12) not null,
          assess_type   NUMBER(2) not null,
          pk_awards     NUMBER(6) not null,
          assess_target NUMBER(17,6) default 0 not null,
          is_examine    NUMBER(1) default 1 not null,
          assess_status NUMBER(2) not null,
          month_balance NUMBER(17,6) default 0 not null,
          month_add     NUMBER(17,6) default 0 not null,
          cur_month_add number(17,6) default 0 not null,
          month_used    NUMBER(17,6) default 0 not null,
          month_surplus NUMBER(17,6) default 0 not null,
          del_flag      NUMBER(1) default 0 not null,
          pk_country    NUMBER(4) not null,
          pk_creator    NUMBER(20) not null,
          creation_time DATE default sysdate not null,
          modified_time DATE,
          pk_modified   NUMBER(20)
    </sql>

    <insert id="insertRepCuMemberAssess">
        merge into ${tableName} a
        using(
            select pk_member,#{period} period,#{month} settle_month,0 assess_type,pk_awards,nvl(b.purchase_check,0) ASSESS_TARGET,
                   1 IS_EXAMINE,2 assess_status,ct.pk_settle_country PK_COUNTRY,1 pk_creator
            from ${sourceTableName} ct
                     left join bd_awards b
                               on ct.pk_awards=b.pk_id
            where category=0
            ) b
        on (a.pk_member=b.pk_member and a.period=b.period and a.assess_type=b.assess_type)
        WHEN MATCHED THEN
        update set a.SETTLE_MONTH=b.SETTLE_MONTH,a.PK_AWARDS=b.PK_AWARDS,a.ASSESS_TARGET=b.ASSESS_TARGET,
            a.IS_EXAMINE=b.IS_EXAMINE,a.ASSESS_STATUS=b.ASSESS_STATUS
        when not matched then
        insert (PK_MEMBER,period,SETTLE_MONTH,ASSESS_TYPE,PK_AWARDS,ASSESS_TARGET,
                                 IS_EXAMINE,ASSESS_STATUS,PK_COUNTRY,PK_CREATOR)
        values(b.PK_MEMBER,b.period,b.SETTLE_MONTH,b.ASSESS_TYPE,b.PK_AWARDS,b.ASSESS_TARGET,
               b.IS_EXAMINE,b.ASSESS_STATUS,b.PK_COUNTRY,b.PK_CREATOR)

    </insert>

    <insert id="insertRepCuMemberRangeAssess">
        merge into ${tableName} a
            using(
                select pk_member,#{period} period,#{month} settle_month,0 assess_type,pk_range_awards pk_awards,nvl(b.purchase_check,0) ASSESS_TARGET,
                       1 IS_EXAMINE,2 assess_status,ct.pk_settle_country PK_COUNTRY,1 pk_creator
                from ${sourceTableName} ct
                         left join bd_range_awards b
               on ct.pk_range_awards=b.pk_id
                where category=0
            ) b
            on (a.pk_member=b.pk_member and a.period=b.period and a.assess_type=b.assess_type)
            WHEN MATCHED THEN
                update set a.SETTLE_MONTH=b.SETTLE_MONTH,a.PK_AWARDS=b.PK_AWARDS,a.ASSESS_TARGET=b.ASSESS_TARGET,
                    a.IS_EXAMINE=b.IS_EXAMINE,a.ASSESS_STATUS=b.ASSESS_STATUS
            when not matched then
                insert (PK_MEMBER,period,SETTLE_MONTH,ASSESS_TYPE,PK_AWARDS,ASSESS_TARGET,
                        IS_EXAMINE,ASSESS_STATUS,PK_COUNTRY,PK_CREATOR)
                    values(b.PK_MEMBER,b.period,b.SETTLE_MONTH,b.ASSESS_TYPE,b.PK_AWARDS,b.ASSESS_TARGET,
                           b.IS_EXAMINE,b.ASSESS_STATUS,b.PK_COUNTRY,b.PK_CREATOR)

    </insert>

    <update id="updateAssessPeriodBeginByBeforeMonth">
        merge into ${tableName} a
        using (select pk_member,assess_type,month_surplus from ${beforeTableName} cs
        inner join cu_member cm
        on cs.pk_member=cm.pk_id and cm.del_flag=0
        where period = #{sourcePeriod} and assess_type = #{assessType} and cm.system_type=0) b
        on (a.pk_member = b.pk_member and a.assess_type = b.assess_type)
        when matched then
        update set a.month_balance = b.month_surplus where a.del_flag= 0 and a.period= #{period}
    </update>
    <update id="updateAssessPeriodAddBySaOrder">
        merge into ${tableName} a
        using (select pk_member,#{period} period,#{assessType} assess_type,sum(order_achieve) order_achieve from(
        select pk_member,(case when #{assessType} = 0 then order_achieve else order_ass_achieve end) order_achieve from sa_order
        where del_flag = 0 and order_status = 1 and order_type in
        <foreach collection="orderTypeList" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
        and pay_time >= #{startDate, jdbcType=DATE} and pay_time &lt; #{endDate, jdbcType=DATE}
        )
        group by pk_member
        ) b
        on (a.pk_member = b.pk_member and a.period= b.period and a.assess_type= b.assess_type)
        when matched then
        update set a.MONTH_ADD=b.order_achieve
    </update>

    <update id="updateAssessPeriodExemptBalanceByUsed">
        update ${tableName} set month_surplus = month_balance+month_add
        where del_flag= 0 and period = #{period}
    </update>

    <update id="updateAssessPeriodCheckBalanceByUsed">
        update ${tableName} set assess_status = 0, month_used = assess_target, month_surplus = month_balance+month_add-assess_target
        where del_flag= 0 and assess_status=2 and period = #{period} and assess_target &lt;= month_balance+month_add
    </update>

    <update id="updateAssessCuMemberToRepExempt">
        merge into ${tableName} a
        using (
        select distinct pk_member,#{period} period,0 assess_type from(
        select pk_id pk_member from cu_member where del_flag =0 and category =0
        and pay_status = 1
        and pay_time >= #{startDate, jdbcType=DATE} and pay_time &lt; #{endDate, jdbcType=DATE}
        union
        select pk_member from cu_member_awards
        where del_flag=0 and purchase_status= 0 and
            period >= #{startPeriod} and period &lt; #{endPeriod}
        union
        select pk_member from ${settleTableName} ct
        inner join bd_awards ba
        on ct.pk_awards = ba.pk_id
        where ct.purchase_status=0 and ba.purchase_check >0)
        ) b
        on (a.pk_member = b.pk_member and a.period=b.period and a.assess_type=b.assess_type)
        when matched then
        update set a.is_examine=0
    </update>

    <update id="updateCuMemberSettleToRepExempt">
        merge into ${settleTableName} a
            using ( select distinct pk_id pk_member from cu_member where del_flag =0 and category =0
                     and pay_status = 1
                     and pay_time >= #{startDate, jdbcType=DATE} and pay_time &lt; #{endDate, jdbcType=DATE}
                    <!--union
                    select distinct pk_member from cu_member_awards
                    where del_flag=0 and purchase_status= 0 and
                        period >= #{startPeriod} and period &lt; #{endPeriod}-->
            ) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set a.purchase_status=0
    </update>

    <update id="updateAllCuMemberSettleToRepExempt">
        update ${settleTableName} set purchase_status=0
    </update>

    <delete id="deleteCuMemberAssessByPeriod">
        delete from ${tableName} where period = #{period} and del_flag=0
    </delete>

    <select id="queryCuMemberAssTotal" resultType="com.hzs.common.domain.member.detail.CuMemberAssess">
        select cm.pk_awards pkAwards,count(cm.pk_id) assessStatus from ${settleTable} cm
                                                     inner join bd_awards ba
                                                                on cm.pk_awards = ba.pk_id
        where period= #{period} and cm.pk_country= #{pkCountry} and ASSESS_TYPE=1 and ASSESS_STATUS in(0,1)
          and ba.awards_value >0
        group by cm.pk_awards
        order by pk_awards
    </select>

</mapper>
