<?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.member.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,
                       purchase_status                                   IS_EXAMINE,
                       (case when purchase_status = 0 then 1 else 2 end) 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="insertShareCuMemberAssess">
        merge into ${tableName} a
            using (
                select pk_member,
                       #{period}                                      period,
                       #{month}                                       settle_month,
                       1                                              assess_type,
                       pk_awards,
                       nvl(b.SHARE_CHECK, 0)                          ASSESS_TARGET,
                       share_status                                   IS_EXAMINE,
                       (case when share_status = 0 then 1 else 2 end) 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
                  and awards_value > 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}
                   where period = #{sourcePeriod}
                     and assess_type = #{assessType}) 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,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}
        <if test="assessType == 0">
            union
            select pk_member,order_achieve order_achieve from sa_order
            where del_flag = 0 and order_status = 1 and order_type =21
            and pay_time >= #{startDate, jdbcType=DATE} and pay_time &lt; #{endDate, jdbcType=DATE}
        </if>
        )
        group by pk_member
        ) b
        on (a.pk_member = b.pk_member)
        when matched then
        update set a.MONTH_ADD=b.order_achieve where a.del_flag= 0 and a.period= #{period} and
        a.assess_type= #{assessType}
    </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>

    <!-- 会员-考核明细列表-->
    <select id="selectAssessList"
            resultType="com.hzs.member.detail.vo.CuMemberAssessVO">
        select * from (
        SELECT
        a.PK_ASSESS pkAssess,
        a.PK_MEMBER pkMember,
        a.TRADE_TIME tradeTime,
        a.PK_ORDER pkOrder,
        a.CHANGE_TYPE changeType,
        a.TRADE_ACHIEVE tradeAchieve,
        0 orderAssAchieve,
        0 orderAchieve,
        '' orderCode
        FROM
        CU_MEMBER_ASSESS_DETAIL a
        LEFT JOIN ${tableName} b on b.PK_ID=a.PK_ASSESS
        WHERE
        a.DEL_FLAG = 0
        <if test="pkMember != null ">
            AND a.PK_MEMBER = #{pkMember}
        </if>
        <if test="pkCountry != null ">
            AND a.PK_COUNTRY = #{pkCountry}
        </if>

        <if test="changeType != null ">
            AND a.CHANGE_TYPE = #{changeType}
        </if>
        <if test="assessType != null ">
            AND b.ASSESS_TYPE = #{assessType}
        </if>
        <if test="assessStatus != null and assessStatus!=0 ">
            AND b.ASSESS_STATUS = #{assessStatus}
        </if>
        <if test="assessStatus == 0 ">
            AND (b.ASSESS_STATUS = #{assessStatus} or b.ASSESS_STATUS = 1 )
        </if>
        <if test="startDate != null">
            and a.TRADE_TIME &gt;= #{startDate, jdbcType=DATE}
        </if>
        <if test="endDate != null">
            and a.TRADE_TIME &lt; #{endDate, jdbcType=DATE}
        </if>
        <if test="startTradeTime != null and endDateTradeTime != null ">
            UNION ALL
            select
            null pkAssess,
            PK_MEMBER pkMember,
            PAY_TIME tradeTime,
            null pkOrder,
            null changeType,
            null tradeAchieve,
            ORDER_ASS_ACHIEVE orderAssAchieve,
            ORDER_ACHIEVE orderAchieve,
            ORDER_CODE orderCode
            from SA_ORDER
            WHERE
            DEL_FLAG = 0
            <if test="pkMember != null ">
                AND PK_MEMBER = #{pkMember}
            </if>
            <if test="orderTypeList != null ">
                and ORDER_TYPE in
                <foreach collection="orderTypeList" item="item" open="(" close=")" separator=",">
                    #{item}
                </foreach>
            </if>
            <if test="assessType == 0 ">
                AND order_achieve > 0
            </if>
            <if test="assessType == 1 ">
                AND ORDER_ASS_ACHIEVE > 0
            </if>

            <if test="pkCountry != null ">
                AND PK_COUNTRY = #{pkCountry}
            </if>

            <if test="startTradeTime != null">
                and PAY_TIME &gt;= #{startTradeTime, jdbcType=DATE}
            </if>
            <if test="endDateTradeTime != null">
                and PAY_TIME &lt; #{endDateTradeTime, jdbcType=DATE}
            </if>
        </if>
        )
        order by tradeTime desc
    </select>

    <!--查询会员月度考核-->
    <select id="getMemberAssessMonthList"
            resultType="com.hzs.member.detail.vo.CuMemberAssessVO">
        SELECT
        a.pk_id pkId,
        a.SETTLE_MONTH settleMonth,
        a.ASSESS_STATUS assessStatus,
        a.MONTH_SURPLUS monthSurplus,
        a.CREATION_TIME creationTime
        FROM
        ${tableName} a
        WHERE
        a.DEL_FLAG = 0
        <if test="period != null ">
            AND a.period=#{period}
        </if>
        <if test="pkMember != null ">
            AND a.PK_MEMBER = #{pkMember}
        </if>
        <if test="pkCountry != null ">
            AND a.PK_COUNTRY = #{pkCountry}
        </if>
        <if test="assessType != null ">
            AND a.ASSESS_TYPE = #{assessType}
        </if>
    </select>

    <!--查询会员订单考核积分-->
    <select id="getOrderAssessList" parameterType="com.hzs.member.detail.vo.CuMemberAssessVO"
            resultType="com.hzs.member.detail.vo.CuMemberAssessVO">
        SELECT
        sum (ORDER_ASS_ACHIEVE) orderAssAchieve,
        sum (ORDER_ACHIEVE) orderAchieve
        FROM
        SA_ORDER a
        WHERE
        a.DEL_FLAG = 0
        <if test="orderTypeList != null ">
            AND a.order_type in
            <foreach collection="orderTypeList" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </if>

        <if test="pkMember != null ">
            AND a.PK_MEMBER = #{pkMember}
        </if>
        <if test="pkCountry != null ">
            AND a.PK_COUNTRY = #{pkCountry}
        </if>
        <if test="startDate != null">
            and a.PAY_TIME &gt;= #{startDate, jdbcType=DATE}
        </if>
        <if test="endDate != null">
            and a.PAY_TIME &lt; #{endDate, jdbcType=DATE}
        </if>
    </select>

</mapper>
