<?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>
    <insert id="insertTmpCuMemberAssess">
        insert ALL
        <foreach item="item" index="index" collection="cuMemberAssessesList" separator=" ">
            into tmp_cu_member_assess(pk_id,pk_awards,assess_target,assess_status,month_add,month_used,month_surplus,
            is_examine) values
            (
            #{item.pkId},#{item.pkAwards},#{item.assessTarget},#{item.assessStatus},#{item.monthAdd},#{item.monthUsed},#{item.monthSurplus},
            #{item.isExamine})
        </foreach>
        SELECT 1 FROM dual
    </insert>

    <update id="createCuMemberAssessTable">
        create table ${tableName}
        (
        <include refid="CuMemberAssessColumn"></include>
        )
    </update>
    <update id="createCuMemberTableUniqueIndex">
        create unique index
        ${tableName}_PK_M
        on
        ${tableName}
        (
        PK_MEMBER,
        period,
        assess_type
        )
    </update>

    <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>

    <update id="updateAssessPeriodByRevokeOrder">
        merge into ${tableName} a
            using (select pk_id,
                          pk_awards,
                          assess_target,
                          assess_status,
                          month_add,
                          month_used,
                          month_surplus,
                          is_examine
                   from TMP_CU_MEMBER_ASSESS) b
            on (a.pk_id = b.pk_id)
            when matched then
                update set a.pk_awards = b.pk_awards,a.assess_target = b.assess_target,a.assess_status = b.assess_status,
                    a.month_add = b.month_add,a.month_used = b.month_used,
                    a.month_surplus = b.month_surplus,a.is_examine = b.is_examine
    </update>
    <update id="updateAssessPeriodCheckBalanceByTmp">
        update ${tableName} a set a.assess_status = 0, a.month_used = a.assess_target, a.month_surplus = a.month_balance+a.month_add-a.assess_target
        where a.del_flag= 0 and a.assess_status=2 and a.period = #{period} and a.assess_target &lt;= a.month_balance+a.month_add
        and a.pk_member in
        <foreach collection="cuMemberList" item="item" open="(" close=")" separator=",">
            #{item.pkMember}
        </foreach>
    </update>
    <update id="createCuMemberAssessTableComment">
        comment
        on column CU_MEMBER_ASSESS2022.pk_id is '主键';
        comment
        on column CU_MEMBER_ASSESS2022.pk_member is '会员主键';
        comment
        on column CU_MEMBER_ASSESS2022.period is '期间';
        comment
        on column CU_MEMBER_ASSESS2022.settle_month is '结算月';
        comment
        on column CU_MEMBER_ASSESS2022.assess_type is '考核类型 0=复购考核 1=分红考核';
        comment
        on column CU_MEMBER_ASSESS2022.pk_awards is '奖衔';
        comment
        on column CU_MEMBER_ASSESS2022.assess_target is '考核目标';
        comment
        on column CU_MEMBER_ASSESS2022.is_examine is '是否免考';
        comment
        on column CU_MEMBER_ASSESS2022.assess_status is '考核状态 0=考核通过 1=免考通过 2=考核不通过 3=不考核';
        comment
        on column CU_MEMBER_ASSESS2022.month_balance is '上月结余';
        comment
        on column CU_MEMBER_ASSESS2022.month_add is '考核月新增';
        comment
        on column CU_MEMBER_ASSESS2022.cur_month_add is '本月新增';
        comment
        on column CU_MEMBER_ASSESS2022.month_used is '考核月使用';
        comment
        on column CU_MEMBER_ASSESS2022.month_surplus is '考核月剩余';
        comment
        on column CU_MEMBER_ASSESS2022.del_flag is '逻辑删除 (0=未删除,1已删除)';
        comment
        on column CU_MEMBER_ASSESS2022.creation_time is '创建时间';
        comment
        on column CU_MEMBER_ASSESS2022.modified_time is '修改时间';
        comment
        on column CU_MEMBER_ASSESS2022.pk_country is '国家';
        comment
        on column CU_MEMBER_ASSESS2022.pk_creator is '创建者';
        comment
        on column CU_MEMBER_ASSESS2022.pk_modified is '更新者';
    </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 creation_time >= #{startDate, jdbcType=DATE}
                           and creation_time &lt; #{endDate, jdbcType=DATE}
                         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 creation_time >= #{startDate, jdbcType=DATE}
                     and creation_time &lt; #{endDate, jdbcType=DATE}
            ) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set a.purchase_status = 0
    </update>

    <update id="updateAssessCuMemberToShareExempt">
        merge into ${tableName} a
            using (
                select distinct pk_member
                from ${settleTableName} ct
                         inner join bd_awards ba
                                    on ct.pk_awards = ba.pk_id
                where ct.share_status = 0
                  and ba.share_check > 0
            ) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set a.is_examine = 0 where a.del_flag= 0 and a.period= #{period} and a.assess_type= 1
    </update>

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

    <select id="queryCuMemberAssessCount" resultType="java.lang.Integer">
        select count(pk_id)
        from ${tableName}
        where period = #{period}
          and del_flag = 0
    </select>

    <select id="queryEnoughCuMemberAssess" resultMap="CuMemberAssess">
        select pk_id, pk_member, assess_type
        from ${tableName}
        where del_flag = 0
          and assess_status = 2
          and period = #{period}
          and month_used &lt;= month_balance + month_add
    </select>

    <select id="queryExemptAssessCuMember" resultMap="CuMemberAssess">
        select assess_type, pk_member
        from ${tableName}
        where del_flag = 0
          and is_examine = 0
          and period = #{period}
    </select>

    <select id="queryAssessPeriodByRevokeOrder" resultMap="CuMemberAssess">
        select sa.pk_id,sa.pk_member,sa.assess_type,sa.assess_target,sa.is_examine,sa.assess_status,
        sa.month_balance,sa.month_add,sa.month_used,sa.month_surplus,
        st.pk_awards,sa.pk_awards pk_original_awards,sa.pk_country from ${tableName} sa
        inner join ${settleTableName} st
        on sa.pk_member=st.pk_member
        where sa.del_flag= 0 and sa.is_examine = 0 and sa.period = #{period}
        and sa.pk_member in
        <foreach collection="saOrderList" item="item" open="(" close=")" separator=",">
            #{item.pkMember}
        </foreach>
    </select>

    <select id="queryCuMemberAssessByMember" resultMap="CuMemberAssess">
        select pk_member,assess_status from ${tableName}
        where period= #{period} and assess_type=#{assessType} and assess_status in(0,1)
        and pk_member in
        <foreach collection="cuMemberSettleExtList" item="item" open="(" close=")" separator=",">
            #{item.pkMember}
        </foreach>
    </select>

    <select id="queryCuMemberShareAssess" resultType="com.hzs.common.domain.member.detail.CuMemberAssess">
        select pk_member, PERIOD, PK_AWARDS, assess_status, pk_country
        from ${tableName}
        where period = #{period}
          and assess_type = 1
          and assess_status in (0, 1)
          and pk_country = 1
        union
        select ca.pk_member, ca.PERIOD, ca.PK_AWARDS, ca.assess_status, ca.pk_country
        from ${tableName} ca
                 inner join bd_awards ba
                            on ca.PK_AWARDS = ba.pk_id
        where period = #{period}
          and assess_type = 0
          and assess_status in (0, 1)
          and ca.pk_country > 1
          and ba.awards_value > 0
    </select>

    <!-- 会员-考核明细列表-->
    <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="getOrderByAssessList"
            resultType="com.hzs.member.detail.vo.CuMemberAssessVO">
        select PK_MEMBER pkMember,
        PAY_TIME tradeTime,
        ORDER_ASS_ACHIEVE orderAssAchieve,
        ORDER_ACHIEVE orderAchieve,
        ORDER_TYPE orderType,
        ORDER_CODE orderCode
        from SA_ORDER
        WHERE
        DEL_FLAG = 0
        <if test="pkMember != null ">
            AND PK_MEMBER = #{pkMember}
        </if>
        <if test="pkCountry != null ">
            AND PK_COUNTRY = #{pkCountry}
        </if>
        <if test="orderType != null ">
            AND ORDER_TYPE = #{orderType}
        </if>
        <if test="startDate != null">
            and PAY_TIME &gt;= #{startDate, jdbcType=DATE}
        </if>
        <if test="endDate != null">
            and PAY_TIME &lt; #{endDate, jdbcType=DATE}
        </if>
        order by PAY_TIME desc
    </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>

    <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>
