<?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.achieve.mapper.CuMemberTreeMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="CuMemberSettleExt" type="com.hzs.common.domain.member.ext.CuMemberSettleExt">
        <id column="PK_ID" property="pkId"/>
        <result column="PERIOD" property="period"/>
        <result column="PK_MEMBER" property="pkMember"/>
        <result column="PK_PARENT" property="pkParent"/>
        <result column="PK_PLACE_PARENT" property="pkPlaceParent"/>
        <result column="PLACE_DEPT" property="placeDept"/>
        <result column="MEMBER_CODE" property="memberCode"/>
        <result column="MEMBER_NAME" property="memberName"/>
        <result column="CUSTOMER_TYPE" property="customerType"/>
        <result column="PHONE" property="phone"/>
        <result column="PK_GRADE" property="pkGrade"/>
        <result column="PK_ORI_AWARDS" property="pkOriAwards"/>
        <result column="PK_AWARDS" property="pkAwards"/>
        <result column="ACCOUNT_STATUS" property="accountStatus"/>
        <result column="PAY_STATUS" property="payStatus"/>
        <result column="REGISTER_AUTHORITY" property="registerAuthority"/>
        <result column="CATEGORY" property="category"/>
        <result column="PURCHASE_TYPE" property="purchaseType"/>
        <result column="PURCHASE_STATUS" property="purchaseStatus"/>
        <result column="SHARE_STATUS" property="shareStatus"/>
        <result column="INCOME_STATUS" property="incomeStatus"/>
        <result column="PK_TEAM_CODE" property="pkTeamCode"/>
        <result column="PK_CENTER_CODE" property="pkCenterCode"/>
        <result column="PK_VERTEX" property="pkVertex"/>
        <result column="PK_SETTLE_COUNTRY" property="pkSettleCountry"/>
        <result column="IS_REAL_NAME" property="isRealName"/>
        <result column="IS_BUS_LICENSE" property="isBusLicense"/>
        <result column="PK_COUNTRY" property="pkCountry"/>
        <result column="PK_RATE" property="pkRate"/>
        <result column="A_BALANCE" property="aBalance"/>
        <result column="B_BALANCE" property="bBalance"/>
        <result column="R_A_BALANCE" property="rABalance"/>
        <result column="R_B_BALANCE" property="rBBalance"/>
        <result column="A_SUM_AMOUNT" property="aSumAmount"/>
        <result column="B_SUM_AMOUNT" property="bSumAmount"/>
        <result column="A_SUM_PV" property="aSumPv"/>
        <result column="B_SUM_PV" property="bSumPv"/>
        <result column="A_NEW_AMOUNT" property="aNewAmount"/>
        <result column="B_NEW_AMOUNT" property="bNewAmount"/>
        <result column="A_NEW_PV" property="aNewPv"/>
        <result column="B_NEW_PV" property="bNewPv"/>
        <result column="A_SUM_REAL_AMOUNT" property="aSumRealAmount"/>
        <result column="B_SUM_REAL_AMOUNT" property="bSumRealAmount"/>
        <result column="A_SUM_REAL_PV" property="aSumRealPv"/>
        <result column="B_SUM_REAL_PV" property="bSumRealPv"/>
        <result column="REP_A_BALANCE" property="repABalance"/>
        <result column="REP_B_BALANCE" property="repBBalance"/>
        <result column="R_REP_A_BALANCE" property="rRepABalance"/>
        <result column="R_REP_B_BALANCE" property="rRepBBalance"/>
        <result column="REP_A_NEW_AMOUNT" property="repANewAmount"/>
        <result column="REP_B_NEW_AMOUNT" property="repBNewAmount"/>
        <result column="REP_A_NEW_PV" property="repANewPv"/>
        <result column="REP_B_NEW_PV" property="repBNewPv"/>
        <result column="REP_A_SUM_AMOUNT" property="repASumAmount"/>
        <result column="REP_B_SUM_AMOUNT" property="repBSumAmount"/>
        <result column="REP_A_SUM_PV" property="repASumPv"/>
        <result column="REP_B_SUM_PV" property="repBSumPv"/>
        <result column="REGISTER_AMOUNT" property="registerAmount"/>
        <result column="REGISTER_PV" property="registerPv"/>
        <result column="REGISTER_NEW_PV" property="registerNewPv"/>
        <result column="UPGRADE_AMOUNT" property="upgradeAmount"/>
        <result column="UPGRADE_PV" property="upgradePv"/>
        <result column="UPGRADE_NEW_PV" property="upgradeNewPv"/>
        <result column="REPURCHASE_AMOUNT" property="repurchaseAmount"/>
        <result column="REPURCHASE_PV" property="repurchasePv"/>
        <result column="REPURCHASE_NEW_PV" property="repurchaseNewPv"/>
        <result column="HI_FUN_AMOUNT" property="hiFunAmount"/>
        <result column="HI_FUN_PV" property="hiFunPv"/>
        <result column="HI_FUN_NEW_PV" property="hiFunNewPv"/>
        <result column="MALL_AMOUNT" property="mallAmount"/>
        <result column="MALL_PV" property="mallPv"/>
        <result column="MALL_NEW_PV" property="mallNewPv"/>
        <result column="MIN_ACHIEVE" property="minAchieve"/>
        <result column="REGISTER_Blo_NEW_PV" property="registerBloNewPv"/>
        <result column="UPGRADE_Blo_NEW_PV" property="upgradeBloNewPv"/>
        <result column="REPURCHASE_Blo_NEW_PV" property="repurchaseBloNewPv"/>
        <result column="HI_FUN_Blo_NEW_PV" property="hiFunBloNewPv"/>
        <result column="MALL_Blo_NEW_PV" property="mallBloNewPv"/>
        <result column="ROUND" property="round"/>
        <result column="SECOND" property="second"/>
        <result column="ASSESS_TYPE" property="assessType"/>
        <result column="PK_ORDER" property="pkOrder"/>
        <result column="LEVEL" property="level"/>
        <result column="GRADE_VALUE" property="gradeValue"/>
        <result column="parentMemberCode" property="parentMemberCode"/>
        <result column="AP_PK_ID" property="apPkId"/>
        <result column="USABLE_QUANTITY" property="usableQuantity"/>
        <result column="RETAIL_PRICE" property="retailPrice"/>
        <result column="PK_DATA_ID" property="pkDataId"/>
        <result column="directPushNumber" property="directPushNumber"/>
        <result column="historyPerformancePv" property="historyPerformancePv"/>
        <result column="STORE_LEVEL" property="storeLevel"/>
        <result column="EXPIRE_STATUS" property="expireStatus"/>
        <result column="IS_PAY_REG" property="isPayReg"/>
        <result column="UN_GRANT_INCOME" property="unGrantIncome"/>
    </resultMap>

    <!-- 会员网体月表数据，用于查询 网体跟业绩分开 横向分表-->
    <sql id="CuMemberTreeColumn">
        period
        NUMBER(6) default 0 not null,
        pk_member         NUMBER(20) not null,
        pk_parent         NUMBER(20) not null,
        pk_place_parent   NUMBER(20),
        place_dept        NUMBER(3),
        member_code       VARCHAR2(30) not null,
        member_name       VARCHAR2(100) not null,
        customer_type     NUMBER(2) not null,
        phone             VARCHAR2(40) not null,
        pk_grade          NUMBER(4) not null,
        pk_awards          NUMBER(4) not null,
        account_status   number(1) default 0 not null,
        pay_status         NUMBER(2) default 0 not null,
        register_authority number(2) default 0 not null,
        category        number(2)  default 0 not null,
        purchase_type    number(2)  default 0 not null,
        purchase_status number(2)  default 0 not null,
        share_status  number(2)  default 0 not null,
        income_status number(2) default 0 not null,
        pk_team_code number(20),
        pk_center_code number(20),
        pk_vertex    number(20),
        pk_settle_country number(4) not null,
        is_real_name    NUMBER(1) default 1 not null,
        is_bus_license     NUMBER(1) default 1 not null,
        is_maker_space     NUMBER(1) default 1 not null,
        pk_country        number(4) default 1 not null,
        store_level       NUMBER(2) default 0,
        is_maker_gift     NUMBER(1) default 1,
        expire_status     number(1) default 1
    </sql>

    <!-- 结算数据会员网体+业绩数据，用于结算 网体跟业绩冗余在一起-->
    <sql id="CuMemberSettleColumn">
        <include refid="CuMemberTreeColumn"></include>,
        <include refid="CuMemberSettleDetailColumn"></include>,
        <include refid="CuMemberBackColumn"></include>
    </sql>

    <sql id="CuMemberSettleDetailColumn">
        pk_rate
        NUMBER(6) ,
            a_balance         NUMBER(17,6) default 0 not null,
            b_balance         NUMBER(17,6) default 0 not null,
            a_sum_amount      NUMBER(17,6) default 0 not null,
            b_sum_amount      NUMBER(17,6) default 0 not null,
            a_sum_pv          NUMBER(17,6) default 0 not null,
            b_sum_pv          NUMBER(17,6) default 0 not null,
            a_new_amount      NUMBER(17,6) default 0 not null,
            b_new_amount      NUMBER(17,6) default 0 not null,
            a_new_pv          NUMBER(17,6) default 0 not null,
            b_new_pv          NUMBER(17,6) default 0 not null,
            a_sum_real_amount NUMBER(17,6) default 0 not null,
            b_sum_real_amount NUMBER(17,6) default 0 not null,
            a_sum_real_pv     NUMBER(17,6) default 0 not null,
            b_sum_real_pv     NUMBER(17,6) default 0 not null,
            rep_a_balance     NUMBER(17,6) default 0 not null,
            rep_b_balance     NUMBER(17,6) default 0 not null,
            rep_a_new_amount  NUMBER(17,6) default 0 not null,
            rep_b_new_amount  NUMBER(17,6) default 0 not null,
            rep_a_new_pv      NUMBER(17,6) default 0 not null,
            rep_b_new_pv      NUMBER(17,6) default 0 not null,
            rep_a_sum_amount  NUMBER(17,6) default 0 not null,
            rep_b_sum_amount  NUMBER(17,6) default 0 not null,
            rep_a_sum_pv      NUMBER(17,6) default 0 not null,
            rep_b_sum_pv      NUMBER(17,6) default 0 not null,
            register_amount  NUMBER(17,6) default 0 not null,
            register_pv     NUMBER(17,6) default 0 not null,
            register_new_amount     NUMBER(17,6) default 0 not null,
            register_new_pv NUMBER(17,6) default 0 not null,
            upgrade_amount  NUMBER(17,6) default 0 not null,
            upgrade_pv      NUMBER(17,6) default 0 not null,
            upgrade_new_amount       NUMBER(17,6) default 0 not null,
            upgrade_new_pv NUMBER(17,6) default 0 not null,
            repurchase_amount NUMBER(17,6) default 0 not null,
            repurchase_pv   NUMBER(17,6) default 0 not null,
            repurchase_new_amount    NUMBER(17,6) default 0 not null,
            repurchase_new_pv NUMBER(17,6) default 0 not null,
            hi_fun_amount NUMBER(17,6) default 0 not null,
            hi_fun_pv   NUMBER(17,6) default 0 not null,
            hi_fun_new_amount        NUMBER(17,6) default 0 not null,
            hi_fun_new_pv NUMBER(17,6) default 0 not null,
            mall_amount NUMBER(17,6) default 0 not null,
            mall_pv     NUMBER(17,6) default 0 not null,
            mall_new_amount          NUMBER(17,6) default 0 not null,
            mall_new_pv NUMBER(17,6) default 0 not null,
            REGISTER_Blo_NEW_PV  NUMBER(17,6) default 0 not null,
            UPGRADE_Blo_NEW_PV    NUMBER(17,6) default 0 not null,
            REPURCHASE_Blo_NEW_PV    NUMBER(17,6) default 0 not null,
            HI_FUN_Blo_NEW_PV    NUMBER(17,6) default 0 not null,
            MALL_Blo_NEW_PV    NUMBER(17,6) default 0 not null,
            min_achieve       number(17,6) default 0 not null,
            round             NUMBER(6) default 0 not null,
            second            NUMBER(4) default 1 not null,
            A_NEW_BOX         NUMBER(8) default 0 not null,
            B_NEW_BOX         NUMBER(8) default 0 not null,
            A_SUM_BOX         NUMBER(12) default 0 not null,
            B_SUM_BOX         NUMBER(12) default 0 not null,
            TOTAL_NEW_BOX     NUMBER(8) default 0 not null,
            TOTAL_SUM_BOX     NUMBER(12) default 0 not null
    </sql>

    <sql id="memberParent">
        select
        pk_member, pk_parent, member_code, member_name, a.pk_awards, account_status, a.register_authority,
        customer_type, income_status, pk_settle_country, purchase_status, share_status, is_maker_space,
        a_balance, b_balance, r_a_balance, r_b_balance, rep_a_balance, rep_b_balance, r_rep_a_balance, r_rep_b_balance,
        register_amount, register_pv, upgrade_amount, upgrade_pv, repurchase_amount, repurchase_pv,
        hi_fun_amount, hi_fun_pv, mall_amount, mall_pv, category, pk_grade, pk_center_code,
        min_achieve, round, second, bg.grade_value, store_level, expire_status
        from (
        <include refid="QueryMemberParent"></include>
        ) a
        inner join bd_grade bg
        on a.pk_grade = bg.pk_id
    </sql>

    <sql id="CuMemberBackColumn">
        net_first_achieve
        NUMBER(17,6) default 0 not null,
            net_repurchase_achieve  NUMBER(17,6) default 0 not null,
            r_a_balance         NUMBER(17,6) default 0 not null,
            r_b_balance         NUMBER(17,6) default 0 not null,
            r_a_sum_amount      NUMBER(17,6) default 0 not null,
            r_b_sum_amount      NUMBER(17,6) default 0 not null,
            r_a_sum_pv          NUMBER(17,6) default 0 not null,
            r_b_sum_pv          NUMBER(17,6) default 0 not null,
            r_a_sum_real_amount NUMBER(17,6) default 0 not null,
            r_b_sum_real_amount NUMBER(17,6) default 0 not null,
            r_a_sum_real_pv     NUMBER(17,6) default 0 not null,
            r_b_sum_real_pv     NUMBER(17,6) default 0 not null,
            r_rep_a_balance     NUMBER(17,6) default 0 not null,
            r_rep_b_balance     NUMBER(17,6) default 0 not null,
            r_rep_a_sum_amount  NUMBER(17,6) default 0 not null,
            r_rep_b_sum_amount  NUMBER(17,6) default 0 not null,
            r_rep_a_sum_pv      NUMBER(17,6) default 0 not null,
            r_rep_b_sum_pv      NUMBER(17,6) default 0 not null
    </sql>

    <sql id="CuMemberTableTrig">
        CREATE
        OR REPLACE TRIGGER
        ${tableName}_TRIG
        BEFORE
        INSERT
        OR
        UPDATE ON ${tableName}
            FOR EACH ROW
        DECLARE
        v_newVal NUMBER(12) := 0;
        v_incval
        NUMBER(12) := 0;
        BEGIN
            IF
        INSERTING AND :new.pk_id IS NULL THEN
        SELECT ${tableNameSeq}.NEXTVAL
        INTO v_newVal
        FROM DUAL;
        IF
        v_newVal = 1 THEN
        SELECT NVL(max(pk_id), 0)
        INTO v_newVal
        FROM ${tableName};
        v_newVal
        := v_newVal + 1;
        LOOP
        EXIT WHEN v_incval >= v_newVal;
        SELECT ${tableNameSeq}.nextval
        INTO v_incval
        FROM dual;
        END LOOP;
        END IF;
        :new.pk_id := v_newVal;
        END IF;
        END;
    </sql>

    <sql id="QueryMemberParent">
        <foreach collection="pkMemberList" item="item" open=" " close=" " separator=" union ">
            select pk_member, pk_parent, member_code, member_name, pk_awards, register_authority, customer_type,
            account_status, income_status, pk_settle_country, purchase_status, share_status, is_maker_space,
            a_balance, b_balance, r_a_balance, r_b_balance, rep_a_balance, rep_b_balance, r_rep_a_balance, r_rep_b_balance,
            register_amount, register_pv, upgrade_amount, upgrade_pv, repurchase_amount, repurchase_pv,
            hi_fun_amount,hi_fun_pv,mall_amount,mall_pv, pk_center_code, category,pk_grade,
            min_achieve, round, second, store_level, expire_status
            from ${settleTableName}
            where pay_status = 1
            start with pk_member = #{item}
            connect by pk_member = prior pk_parent
        </foreach>
    </sql>

    <insert id="insertCuMemberSettleByMember">
        insert into ${settleTableName}(pk_member, pk_parent, pk_place_parent, place_dept, member_code, member_name,
                                       customer_type, phone, pk_grade, pk_awards, account_status, pay_status,
                                       register_authority, category, purchase_type, purchase_status, share_status,
                                       income_status, pk_team_code, is_maker_space,
                                       pk_center_code, pk_vertex, pk_settle_country, is_real_name, pk_country, pk_rate,
                                       store_level, is_maker_gift, expire_status)
        select cm.pk_id,
               pk_parent,
               pk_place_parent,
               place_dept,
               member_code,
               member_name,
               customer_type,
               phone,
               pk_settle_grade,
               pk_awards,
               account_status,
               pay_status,
               register_authority,
               category,
               (case when purchase_status = 0 then 1 else 0 end) purchase_type,
               purchase_status,
               share_status,
               income_status,
               pk_team_code,
               is_maker_space,
               pk_center_code,
               pk_vertex,
               pk_settle_country,
               is_real_name,
               cm.pk_country,
               nvl(bc.pk_id, -1)                                 pk_rate,
               nvl(b.store_level, 0)                             store_level,
               cm.is_maker_gift,
               cm.expire_status
        from cu_member cm
                 left join (
            select pk_country, max(pk_id) pk_id
            from bd_currency
            where del_flag = 0
              and pk_country = 1
              and enable_state = 0
              and effective_date &lt;= sysdate
            group by pk_country) bc
                           on cm.pk_settle_country = bc.pk_country
                 left join(
            select pk_member, store_level
            from cu_maker_space
            where del_flag = 0
              and approve_status = 5
              and apply_status = 5
              and store_type = 1
        ) b
                          on cm.pk_id = b.pk_member
        where cm.del_flag = 0
          and cm.system_type = 0
    </insert>

    <update id="createCuMemberTreeTable">
        create table ${tableName}
        (
        pk_id NUMBER(20) primary key,
        <include refid="CuMemberTreeColumn"></include>
        )
    </update>

    <update id="createCuMemberSettleTable">
        create table ${tableName}
        (
        <include refid="CuMemberSettleColumn"></include>
        )
    </update>

    <update id="createCuMemberSecondTable">
        create table ${tableName}
        (
        pk_member NUMBER(20) not null,
        pk_country number(4) default 1 not null,
        expire_status number(1) default 1,
        <include refid="CuMemberSettleDetailColumn"></include>
        )
    </update>

    <update id="createCuMemberTreeParentIndex">
        create index ${tableName}_parent
        on ${tableName} ( pk_parent )
    </update>

    <update id="createCuMemberTreePlaceIndex">
        create index ${tableName}_place
        on ${tableName} ( pk_place_parent, place_dept )
    </update>

    <update id="createCuMemberTableUniqueIndex">
        create unique index ${tableName}_PK_M
        on ${tableName} ( PK_MEMBER, period )
    </update>

    <update id="createCuMemberTreeDayOnlyIndex">
        create unique index
        ${tableName}_PK_M on ${tableName} ( PK_MEMBER )
    </update>

    <update id="updateCuMemberTreeByCancelOrder">
        update ${settleTableName} set customer_type = 2, category = 1
        where pk_member in
        <foreach collection="saOrderExtList" item="item" open="(" close=")" separator=",">
            #{item.pkMember}
        </foreach>
    </update>

    <!-- 更新会员网体奖衔数据，更新月表、结算表 -->
    <update id="updateCuMemberSettleByPeriod">
        merge into ${updateTableName} a
            using (
                select pk_member, max(new_level) pk_awards
                from cu_member_awards
                where period = #{period}
                  and del_flag = 0
                group by pk_member) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set
                    a.pk_awards = b.pk_awards
    </update>

    <update id="createCuMemberTableSequence" statementType="STATEMENT">
        <include refid="CuMemberTableTrig"></include>
    </update>

    <update id="updateCuMemberSettle">
        merge into ${settleTableName} a
        using(
        select * from (
        <foreach collection="cuMemberTreeList" item="item" open=" " separator=" union " close=" ">
            select #{item.pkMember} pk_member,
            #{item.aBalance} a_balance, #{item.bBalance} b_balance,
            #{item.aNewAmount} a_new_amount, #{item.bNewAmount} b_new_amount,
            #{item.aNewPv} a_new_pv, #{item.bNewPv} b_new_pv,
            #{item.repABalance} rep_a_balance, #{item.repBBalance} rep_b_balance,
            #{item.repANewAmount} rep_a_new_amount, #{item.repBNewAmount} rep_b_new_amount,
            #{item.repANewPv} rep_a_new_pv, #{item.repBNewPv} rep_b_new_pv,
            #{item.registerAmount} register_amount, #{item.registerPv} register_pv,
            #{item.registerNewAmount} register_new_amount, #{item.registerNewPv} register_new_pv,
            #{item.upgradeAmount} upgrade_amount, #{item.upgradePv} upgrade_pv,
            #{item.upgradeNewAmount} upgrade_new_amount ,#{item.upgradeNewPv} upgrade_new_pv,
            #{item.repurchaseAmount} repurchase_amount, #{item.repurchasePv} repurchase_pv,
            #{item.repurchaseNewAmount} repurchase_new_amount, #{item.repurchaseNewPv} repurchase_new_pV,
            #{item.hiFunAmount} hi_fun_amount, #{item.hiFunPv} hi_fun_pv,
            #{item.hiFunNewAmount} hi_fun_new_amount, #{item.hiFunNewPv} hi_fun_new_pv,
            #{item.mallAmount} mall_amount, #{item.mallPv} mall_pv,
            #{item.mallNewAmount} mall_new_amount, #{item.mallNewPv} mall_new_pv,
            #{item.registerBloNewPv} register_blo_new_pv, #{item.upgradeBloNewPv} upgrade_blo_new_pv,
            #{item.repurchaseBloNewPv} repurchase_blo_new_pv, #{item.hiFunBloNewPv} hi_fun_blo_new_pv,
            #{item.mallBloNewPv} mall_blo_new_pv,
            #{item.rABalance} r_a_balance, #{item.rBBalance} r_b_balance,
            #{item.rRepABalance} r_rep_a_balance, #{item.rRepBBalance} r_rep_b_balance,
            #{item.minAchieve} min_achieve,
            #{item.round} round, #{item.second} second
            from dual
        </foreach>)
        ) b
        on (a.pk_member = b.pk_member)
        when matched then
        update set
        a.a_balance = b.a_balance, a.b_balance = b.b_balance,
        a.a_new_amount = b.a_new_amount, a.b_new_amount = b.b_new_amount,
        a.a_new_pv = b.a_new_pv, a.b_new_pv = b.b_new_pv,
        a.rep_a_balance = b.rep_a_balance, a.rep_b_balance = b.rep_b_balance,
        a.rep_a_new_amount = b.rep_a_new_amount, a.rep_b_new_amount = b.rep_b_new_amount,
        a.rep_a_new_pv = b.rep_a_new_pv, a.rep_b_new_pv = b.rep_b_new_pv,
        a.register_amount = b.register_amount, a.register_pv = b.register_pv,
        a.register_new_amount = b.register_new_amount, a.register_new_pv = b.register_new_pv,
        a.upgrade_amount = b.upgrade_amount, a.upgrade_pv = b.upgrade_pv,
        a.upgrade_new_amount = b.upgrade_new_amount, a.upgrade_new_pv = b.upgrade_new_pv,
        a.repurchase_amount = b.repurchase_amount, a.repurchase_pv = b.repurchase_pv,
        a.repurchase_new_amount = b.repurchase_new_amount, a.repurchase_new_pv = b.repurchase_new_pv,
        a.hi_fun_amount = b.hi_fun_amount, a.hi_fun_pv = b.hi_fun_pv,
        a.hi_fun_new_amount = b.hi_fun_new_amount, a.hi_fun_new_pv = b.hi_fun_new_pv,
        a.mall_amount = b.mall_amount, a.mall_pv = b.mall_pv,
        a.mall_new_amount = b.mall_new_amount,a.mall_new_pv = b.mall_new_pv,
        a.register_blo_new_pv = b.register_blo_new_pv, a.upgrade_blo_new_pv = b.upgrade_blo_new_pv,
        a.repurchase_blo_new_pv = b.repurchase_blo_new_pv,
        a.hi_fun_blo_new_pv = b.hi_fun_blo_new_pv, a.mall_blo_new_pv = b.mall_blo_new_pv,
        a.r_a_balance = b.r_a_balance, a.r_b_balance = b.r_b_balance,
        a.r_rep_a_balance = b.r_rep_a_balance, a.r_rep_b_balance = b.r_rep_b_balance,
        a.min_achieve = b.min_achieve, a.round = b.round, a.second = b.second,
        a.a_sum_amount = a.a_sum_amount + b.a_new_amount,
        a.b_sum_amount = a.b_sum_amount + b.b_new_amount,
        a.a_sum_pv = a.a_sum_pv + b.a_new_pv,
        a.b_sum_pv = a.b_sum_pv + b.b_new_pv,
        a.rep_a_sum_amount = a.rep_a_sum_amount + b.rep_a_new_amount,
        a.rep_b_sum_amount = a.rep_b_sum_amount + b.rep_b_new_amount,
        a.rep_a_sum_pv = a.rep_a_sum_pv + b.rep_a_new_pv,
        a.rep_b_sum_pv = a.rep_b_sum_pv + b.rep_b_new_pv,
        a.a_sum_real_amount = a.a_sum_real_amount + b.a_new_amount + b.rep_a_new_amount,
        a.b_sum_real_amount = a.b_sum_real_amount + b.b_new_amount + b.rep_b_new_amount,
        a.a_sum_real_pv = a.a_sum_real_pv + b.a_new_pv + b.rep_a_new_pv,
        a.b_sum_real_pv = a.b_sum_real_pv + b.b_new_pv + b.rep_b_new_pv
    </update>

    <update id="updateCuMemberSecond">
        merge into ${settleTableName} a
        using(
        <foreach collection="cuMemberTreeList" item="item" open=" " separator=" union all " close=" ">
            select #{item.pkMember} pk_member,
            #{item.aBalance} a_balance, #{item.bBalance} b_balance,
            #{item.aNewAmount} a_new_amount,#{item.bNewAmount} b_new_amount,
            #{item.aNewPv} a_new_pv, #{item.bNewPv} b_new_pv,
            #{item.repABalance} rep_a_balance, #{item.repBBalance} rep_b_balance,
            #{item.repANewAmount} rep_a_new_amount, #{item.repBNewAmount} rep_b_new_amount,
            #{item.repANewPv} rep_a_new_pv, #{item.repBNewPv} rep_b_new_pv,
            #{item.registerAmount} register_amount, #{item.registerPv} register_pv, #{item.registerNewPv} register_new_pv,
            #{item.upgradeAmount} upgrade_amount ,#{item.upgradePv} upgrade_pv, #{item.upgradeNewPv} upgrade_new_pv,
            #{item.repurchaseAmount} repurchase_amount, #{item.repurchasePv} repurchase_pv, #{item.repurchaseNewPv} repurchase_new_pv,
            #{item.hiFunAmount} hi_fun_amount, #{item.hiFunPv} hi_fun_pv, #{item.hiFunNewPv} hi_fun_new_pv,
            #{item.mallAmount} mall_amount, #{item.mallPv} mall_pv, #{item.mallNewPv} mall_new_pv,
            #{item.minAchieve} min_achieve, #{item.round} round, #{item.second} second ,
            #{item.aNewBox} a_new_box, #{item.bNewBox} b_new_box
            from dual
        </foreach>
        ) b
        on (a.pk_member = b.pk_member)
        when matched then
        update set
        a.a_balance = b.a_balance, a.b_balance = b.b_balance,
        a.a_new_amount = b.a_new_amount, a.b_new_amount = b.b_new_amount,
        a.a_new_pv = b.a_new_pv, a.b_new_pv = b.b_new_pv,
        a.rep_a_balance = b.rep_a_balance, a.rep_b_balance = b.rep_b_balance,
        a.rep_a_new_amount = b.rep_a_new_amount, a.rep_b_new_amount = b.rep_b_new_amount,
        a.rep_a_new_pv = b.rep_a_new_pv, a.rep_b_new_pv = b.rep_b_new_pv,
        a.register_amount = b.register_amount, a.register_pv = b.register_pv, a.register_new_pv = b.register_new_pv,
        a.upgrade_amount = b.upgrade_amount, a.upgrade_pv = b.upgrade_pv, a.upgrade_new_pv = b.upgrade_new_pv,
        a.repurchase_amount = b.repurchase_amount, a.repurchase_pv = b.repurchase_pv, a.repurchase_new_pv = b.repurchase_new_pv,
        a.hi_fun_amount = b.hi_fun_amount, a.hi_fun_pv = b.hi_fun_pv, a.hi_fun_new_pv = b.hi_fun_new_pv,
        a.mall_amount = b.mall_amount, a.mall_pv = b.mall_pv, a.mall_new_pv = b.mall_new_pv,
        a.min_achieve = b.min_achieve, a.round = b.round, a.second = b.second,
        a.a_sum_amount = a.a_sum_amount + b.a_new_amount,
        a.b_sum_amount = a.b_sum_amount + b.b_new_amount,
        a.a_sum_pv = a.a_sum_pv + b.a_new_pv,
        a.b_sum_pv = a.b_sum_pv + b.b_new_pv,
        a.rep_a_sum_amount = a.rep_a_sum_amount + b.rep_a_new_amount,
        a.rep_b_sum_amount = a.rep_b_sum_amount + b.rep_b_new_amount,
        a.rep_a_sum_pv = a.rep_a_sum_pv + b.rep_a_new_pv,
        a.rep_b_sum_pv = a.rep_b_sum_pv + b.rep_b_new_pv,
        a.a_sum_real_amount = a.a_sum_real_amount + b.a_new_amount + b.rep_a_new_amount,
        a.b_sum_real_amount = a.b_sum_real_amount + b.b_new_amount + b.rep_b_new_amount,
        a.a_sum_real_pv = a.a_sum_real_pv + b.a_new_pv + b.rep_a_new_pv,
        a.b_sum_real_pv = a.b_sum_real_pv + b.b_new_pv + b.rep_b_new_pv,
        a.a_new_box = b.a_new_box, a.b_new_box = b.b_new_box,
        a.a_sum_box = a.a_sum_box + b.a_new_box, a.b_sum_box = a.b_sum_box + b.b_new_box
    </update>

    <update id="updateCuMemberSecondPlaceParent">
        merge into ${secondTableName} a
        using (
        select B.pk_id,b.pk_settle_country pk_country,nvl(st.A_BALANCE,0) A_BALANCE,nvl(st.B_BALANCE,0) B_BALANCE,
        nvl(yt.A_SUM_AMOUNT,0) A_SUM_AMOUNT,nvl(yt.B_SUM_AMOUNT,0) B_SUM_AMOUNT,
        nvl(yt.A_SUM_PV,0) A_SUM_PV,nvl(yt.b_SUM_PV,0) b_SUM_PV,nvl(st.A_NEW_AMOUNT,0) A_NEW_AMOUNT,
        nvl(st.B_NEW_AMOUNT,0) B_NEW_AMOUNT,nvl(st.A_NEW_PV,0) A_NEW_PV,
        nvl(ST.B_NEW_PV,0) B_NEW_PV,nvl(yt.A_SUM_REAL_AMOUNT,0) A_SUM_REAL_AMOUNT,
        nvl(yt.B_SUM_REAL_AMOUNT,0) B_SUM_REAL_AMOUNT,
        nvl(yt.A_SUM_REAL_PV,0) A_SUM_REAL_PV,
        nvl(yt.B_SUM_REAL_PV,0) B_SUM_REAL_PV,
        nvl(ST.REP_A_BALANCE,0) REP_A_BALANCE,nvl(ST.REP_B_BALANCE,0) REP_B_BALANCE,
        nvl(ST.REP_A_NEW_AMOUNT,0) REP_A_NEW_AMOUNT,
        nvl(ST.REP_B_NEW_AMOUNT,0) REP_B_NEW_AMOUNT,nvl(ST.REP_A_NEW_PV,0) REP_A_NEW_PV,
        nvl(ST.REP_B_NEW_PV,0) REP_B_NEW_PV,nvl(yt.REP_A_SUM_AMOUNT,0) REP_A_SUM_AMOUNT,
        nvl(yt.REP_B_SUM_AMOUNT,0) REP_B_SUM_AMOUNT,nvl(yt.REP_A_SUM_PV,0) REP_A_SUM_PV,
        nvl(yt.REP_B_SUM_PV,0) REP_B_SUM_PV,
        nvl(ST.ROUND,0) ROUND,nvl(nvl(ST.SECOND,yt.second),1) SECOND,nvl(ST.MIN_ACHIEVE,0) MIN_ACHIEVE,b.expire_status
        from
        (select t.pk_id,t.pk_settle_country,t.expire_status from cu_member t
        where t.del_flag = 0 start with t.pk_id = #{pkMember}
        connect by t.pk_id = prior
        <choose>
            <when test="isPlace == 0">t.pk_place_parent</when>
            <otherwise>t.pk_parent</otherwise>
        </choose>
        <if test="cuMemberTreeList != null and cuMemberTreeList.size >0">
            union
            select pk_id,t.pk_settle_country,t.expire_status from cu_member t
            where t.del_flag= 0 and pk_id in
            <foreach collection="cuMemberTreeList" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </if>
        ) b
        left join ${secondTableName} st
        on b.pk_id = st.pk_member
        left join ${settleTableName} yt
        on b.pk_id=yt.pk_member
        ) b
        on (a.pk_member = b.pk_id)
        when matched then
        update set a.a_sum_amount=b.a_sum_amount,a.b_sum_amount=b.b_sum_amount,
        a.a_sum_pv=b.a_sum_pv,a.b_sum_pv=b.b_sum_pv,
        a.a_sum_real_amount=b.a_sum_real_amount,
        a.b_sum_real_amount=b.b_sum_real_amount,
        a.a_sum_real_pv=b.a_sum_real_pv,
        a.b_sum_real_pv=b.b_sum_real_pv,
        a.rep_a_sum_amount=b.rep_a_sum_amount,a.rep_b_sum_amount=b.rep_b_sum_amount,
        a.rep_a_sum_pv=b.rep_a_sum_pv,a.rep_b_sum_pv=b.rep_b_sum_pv
        when not matched then
        insert (pk_member,pk_country,a_balance,b_balance,a_sum_amount,b_sum_amount,a_sum_pv,b_sum_pv,
        a_new_amount,b_new_amount,a_new_pv,b_new_pv,a_sum_real_amount,b_sum_real_amount,
        a_sum_real_pv,b_sum_real_pv,rep_a_balance,rep_b_balance,rep_a_new_amount,
        rep_b_new_amount,rep_a_new_pv,rep_b_new_pv,rep_a_sum_amount,rep_b_sum_amount,
        rep_a_sum_pv,rep_b_sum_pv,round,second,min_achieve,expire_status)
        values(b.pk_id,b.pk_country,b.a_balance,b.b_balance,b.a_sum_amount, b.b_sum_amount,b.a_sum_pv,b.b_sum_pv,
        b.a_new_amount,b.b_new_amount,b.a_new_pv,b.b_new_pv,b.a_sum_real_amount,b.b_sum_real_amount,
        b.a_sum_real_pv,b.b_sum_real_pv,b.rep_a_balance,b.rep_b_balance,b.rep_a_new_amount,
        b.rep_b_new_amount,b.rep_a_new_pv,b.rep_b_new_pv,b.rep_a_sum_amount,b.rep_b_sum_amount,
        b.rep_a_sum_pv,b.rep_b_sum_pv,b.round,b.second,b.min_achieve,b.expire_status)
    </update>

    <update id="dropCuMemberSettleTable">
        drop table ${tableName}
    </update>

    <update id="updateCuMemberTreeGradeByCancelOrder">
        merge into ${settleTableName} a
        using (select cl.pk_id,cl.pk_member, cl.new_level from cu_member_level cl
        inner join (
        select pk_member, max(pk_id) pk_id from cu_member_level
        where del_flag = 0 and upgrade_time &lt; #{currentDate, jdbcType=DATE}
        and pk_member in
        <foreach collection="saOrderExtList" item="item" open="(" close=")" separator=",">
            #{item.pkMember}
        </foreach>
        group by pk_member) ce
        on cl.pk_id = ce.pk_id
        ) b
        on (a.pk_member = b.pk_member)
        when matched then
        update set a.pk_grade = b.new_level
    </update>

    <update id="mergeCuMemberTreeBySettleDate">
        merge into ${targetTableName} a
            using (
                select #{period} period,
                       pk_member,
                       pk_parent,
                       pk_place_parent,
                       place_dept,
                       member_code,
                       member_name,
                       customer_type,
                       phone,
                       pk_grade,
                       pk_awards,
                       account_status,
                       pay_status,
                       register_authority,
                       category,
                       purchase_type,
                       purchase_status,
                       share_status,
                       income_status,
                       pk_team_code,
                       pk_center_code,
                       pk_vertex,
                       pk_settle_country,
                       is_real_name,
                       is_bus_license,
                       is_maker_space,
                       pk_country
                from ${sourceTableName}
            ) b
            on (a.pk_member = b.pk_member and a.period = b.period)
            WHEN MATCHED THEN
                update set a.pk_parent = b.pk_parent,a.pk_place_parent = b.pk_place_parent,a.place_dept = b.place_dept,
                    a.member_code = b.member_code,a.member_name = b.member_name,a.customer_type = b.customer_type,a.phone = b.phone,
                    a.pk_grade = b.pk_grade,a.pk_awards = b.pk_awards,a.account_status = b.account_status,a.pay_status = b.pay_status,
                    a.register_authority = b.register_authority,a.category = b.category,a.purchase_type = b.purchase_type,
                    a.purchase_status = b.purchase_status,a.share_status = b.share_status,a.income_status = b.income_status,
                    a.pk_team_code = b.pk_team_code,a.pk_center_code = b.pk_center_code,a.pk_vertex = b.pk_vertex,
                    a.pk_settle_country = b.pk_settle_country,a.is_real_name = b.is_real_name,
                    a.is_bus_license = b.is_bus_license,a.is_maker_space = b.is_maker_space,a.pk_country = b.pk_country
            WHEN NOT MATCHED THEN
                insert (period, pk_member, pk_parent, pk_place_parent, place_dept, member_code,
                        member_name, customer_type, phone, pk_grade, pk_awards, account_status, pay_status,
                        register_authority, category, purchase_type, purchase_status,
                        share_status, income_status, pk_team_code, pk_center_code, pk_vertex,
                        pk_settle_country, is_real_name, is_bus_license, is_maker_space, pk_country)
                    values (b.period, b.pk_member, b.pk_parent, b.pk_place_parent, b.place_dept, b.member_code,
                            b.member_name, b.customer_type, b.phone, b.pk_grade, b.pk_awards, b.account_status,
                            b.pay_status,
                            b.register_authority, b.category, b.purchase_type, b.purchase_status,
                            b.share_status, b.income_status, b.pk_team_code, b.pk_center_code, b.pk_vertex,
                            b.pk_settle_country, b.is_real_name, b.is_bus_license, b.is_maker_space, b.pk_country)
    </update>

    <update id="updateBackCuMemberSettleAward">
        merge into ${settleTableName} a
            using (select pk_member, max(old_level) old_level
                   from cu_member_awards
                   where period = #{period}
                     and del_flag = 0
                   group by pk_member) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set
                    a.pk_awards = b.old_level
    </update>

    <update id="updateCuMemberExpandSettle">
        merge into ${settleTableName} a
        using(
        select * from (
        <foreach collection="cuMemberTreeList" item="item" open=" " separator=" union " close=" ">
            select #{item.pkMember} pk_member,#{item.aBalance} a_balance, #{item.bBalance} b_balance,
            #{item.minAchieve} min_achieve,#{item.round} round,#{item.second} second from dual
        </foreach>)
        ) b
        on (a.pk_member = b.pk_member)
        when matched then
        update set a.a_balance = b.a_balance, a.b_balance=b.b_balance,
        a.min_achieve=b.min_achieve,a.round = b.round,a.second=b.second
    </update>

    <delete id="truncateCuMemberTreeTable">
        truncate table ${tableName}
    </delete>

    <select id="queryExistOracleTable" resultType="java.lang.Integer">
        select 1
        from user_tables
        where table_name = upper(#{tableName})
    </select>

    <select id="queryExistOrderTableCount" resultType="java.lang.Integer">
        select count(1)
        from ${tableName}
    </select>

    <select id="queryCuMemberSettleEnoughAwardAchieve" resultMap="CuMemberSettleExt">
        select a.pk_member,
               a.pk_parent,
               a.pk_place_parent,
               a.a_sum_real_pv,
               a.b_sum_real_pv,
               a.pk_country,
               a.pk_settle_country,
               bw.pk_id  pk_awards,
               bdw.pk_id pk_ori_awards
        from (select ct.pk_member,
                     ct.pk_parent,
                     ct.pk_place_parent,
                     (ba.awards_value + 5) awards_value,
                     ba.awards_value       ori_awards_value,
                     ct.a_sum_real_pv,
                     ct.b_sum_real_pv,
                     ct.pk_country,
                     ct.pk_settle_country
              from ${settleTableName} ct
                       inner join bd_awards ba
                                  on ct.pk_awards = ba.pk_id
              where ct.category = 0
                and ct.income_status = 0
                and ba.del_flag = 0) a
                 inner join bd_awards bw
                            on a.awards_value = bw.awards_value and a.pk_settle_country = bw.pk_country
                 inner join bd_awards bdw
                            on a.ori_awards_value = bdw.awards_value and a.pk_settle_country = bdw.pk_country
        where bw.del_flag = 0
          and bw.community_check &lt;= a.a_sum_real_pv
          and bw.community_check &lt;= a.b_sum_real_pv
        order by pk_member desc
    </select>

    <select id="queryCuMemberSettlePlaceUnderUmbrella" resultType="java.lang.Integer">
        select count(a.pk_member)
        from (select a.*, b.pk_awards
              from (select pk_member, pk_parent, pk_place_parent, place_dept
                    from ${settleTableName} start with pk_place_parent = #{pkMember} and place_dept=#{placeDept}
                    connect by pk_place_parent = prior pk_member) a
                       inner join (select cw.pk_member, cw.new_level pk_awards
                                   from cu_member_awards cw
                                            inner join(select pk_member, max(pk_id) pk_id
                                                       from cu_member_awards
                                                       where del_flag = 0
                                                         and UP_TYPE in (1, 3)
                                                       group by pk_member) ca
                                                      on cw.pk_id = ca.pk_id) b
                                  on a.pk_member = b.pk_member) a
                 inner join bd_awards ba
                            on a.pk_awards = ba.pk_id
        where ba.awards_value >= (select awards_value from bd_awards where pk_id = #{awardsValue})
    </select>

    <select id="queryCuMemberSettleBloodUnderUmbrella" resultType="java.lang.Integer">
        select count(pk_member)
        from (
                 select pk_member
                 from ${settleTableName} start with pk_parent = #{pkMember}
                 connect by pk_parent = prior pk_member) a
        where a.pk_member in (
            select x.pk_member
            from (
                     select a.*, b.pk_awards
                     from (
                              select pk_member, pk_parent, pk_place_parent, place_dept
                              from ${settleTableName} start with pk_place_parent = #{pkMember} and place_dept=#{placeDept}
                              connect by pk_place_parent = prior pk_member) a
                              inner join (select cw.pk_member, cw.new_level pk_awards
                                          from cu_member_awards cw
                                                   inner join(select pk_member, max(pk_id) pk_id
                                                              from cu_member_awards
                                                              where del_flag = 0
                                                                and UP_TYPE in (1, 3)
                                                              group by pk_member) ca
                                                             on cw.pk_id = ca.pk_id) b
                                         on a.pk_member = b.pk_member
                 ) x
                     inner join bd_awards ba
                                on x.pk_awards = ba.pk_id
            where ba.awards_value >= (select awards_value from bd_awards where pk_id = #{awardsValue}))
    </select>

    <select id="queryMemberSettleBySaOrder" resultMap="CuMemberSettleExt">
        select
        pk_member,member_code,member_name,
        c.pk_awards,c.pk_grade,
        account_status,category,income_status,
        pk_settle_country, is_maker_space,
        purchase_status, share_status,
        bg.grade_value,pk_parent,
        a_balance,b_balance,
        r_a_balance,r_b_balance,
        rep_a_balance,rep_b_balance,
        r_rep_a_balance,r_rep_b_balance,
        register_amount,register_pv,
        upgrade_amount,upgrade_pv,
        repurchase_amount,repurchase_pv,
        pk_center_code,c.pk_vertex,
        hi_fun_amount,hi_fun_pv,
        mall_amount,mall_pv,
        min_achieve,
        round,second,store_level,
        c.register_authority, c.is_maker_gift,c.expire_status
        from ${settleTableName} c
        left join bd_grade bg
        on c.pk_grade = bg.pk_id
        where pk_member in
        <foreach collection="memberPkList" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>

    <select id="batchQueryCuMemberSettlePlaceParent" resultMap="CuMemberSettleExt">
        select
        a.pk_order, a.pk_member, a.member_code, a.member_name,
        a.pk_place_parent, a.place_dept, a.pk_grade, a.pk_awards,
        a.bg.grade_value, a.account_status, a.income_status, a.pk_settle_country,
        a.purchase_status, a.share_status, a.register_authority,
        a.a_balance, a.b_balance, a.r_a_balance, a.r_b_balance,
        a.rep_a_balance, a.rep_b_balance, a.r_rep_a_balance, a.r_rep_b_balance,
        a.register_amount, a.register_pv, a.upgrade_amount, a.upgrade_pv,
        a.repurchase_amount, a.repurchase_pv,
        a.hi_fun_amount, a.hi_fun_pv,
        a.mall_amount, a.mall_pv,
        a.pk_center_code, a.pk_vertex, a.category,
        a.min_achieve, a.round, a.second,
        a.store_level, a.expire_status,
        nvl(cmb.after_grant_income, 0) un_grant_income
        from (
        <foreach collection="firPurchaseOrderList" item="item" open=" " close=" " separator=" union all ">
            select #{item.pkId} pk_order, pk_member, member_code, member_name, pk_place_parent, place_dept,
            pk_grade, pk_awards, account_status, income_status, pk_settle_country, purchase_status, share_status, register_authority,
            a_balance, b_balance, r_a_balance, r_b_balance, rep_a_balance, rep_b_balance, r_rep_a_balance, r_rep_b_balance,
            register_amount, register_pv, upgrade_amount, upgrade_pv, repurchase_amount, repurchase_pv, hi_fun_amount, hi_fun_pv,
            mall_amount, mall_pv, category, pk_vertex, pk_center_code,
            min_achieve, round, second, store_level, expire_status, level sort
            from ${settleTableName}
            start with pk_member = #{item.pkMember}
            connect by pk_member = prior pk_place_parent
        </foreach>
        ) a
        left join bd_grade bg
        on a.pk_grade = bg.pk_id
        left join (
        select cmbd.pk_member, cmbd.after_grant_income
        from CU_MEMBER_BONUS_DELAY cmbd
        where exists (select 1
        from (select cmbd.pk_member, max(cmbd.period) period
        from cu_member_bonus_delay cmbd
        where cmbd.del_flag = 0
        and #{period} > cmbd.period
        group by cmbd.pk_member) t
        where t.pk_member = cmbd.pk_member
        and t.period = cmbd.period)
        ) cmb
        on cmb.pk_member = a.pk_member
        order by a.pk_order, a.sort
    </select>

    <select id="batchQueryCuMemberSettleParent" resultMap="CuMemberSettleExt">
        <include refid="memberParent"></include>
    </select>

    <select id="batchQuerySpecialCuMemberSettleParent" resultMap="CuMemberSettleExt">
        select a.*, (case when nvl(so.order_achieve,0)>0 then 0 else 1 end ) is_pay_reg from (
        <include refid="memberParent"></include>
        ) a
        left join (select pk_member, max(order_achieve) order_achieve from sa_order
        where del_flag = 0 and order_status = 1
        and order_type = 24
        group by pk_member) so
        on so.pk_member = a.pk_member
    </select>

    <select id="batchQueryCuMemberSettleParentForSpecial" resultMap="CuMemberSettleExt">
        select
        a.pk_member,a.pk_parent,a.member_code,a.member_name,a.pk_awards,a.account_status,a.register_authority,a.customer_type,
        a.income_status,a.pk_settle_country,a.purchase_status,a.share_status,a.is_maker_space,
        a.a_balance,a.b_balance,a.r_a_balance,a.r_b_balance,a.rep_a_balance,a.rep_b_balance,a.r_rep_a_balance,a.r_rep_b_balance,
        a.register_amount,a.register_pv,a.upgrade_amount,a.upgrade_pv,a.repurchase_amount,a.pk_center_code,
        a.repurchase_pv,a.hi_fun_amount,a.hi_fun_pv,a.mall_amount,a.mall_pv,a.category,a.pk_grade,bg.grade_value,
        a.min_achieve,a.round,second,ap.pk_id ap_pk_id,nvl(ap.usable_quantity,0) usable_quantity,
        nvl(bp.retail_price,0) retail_price,ap.pk_data_id from (
        <include refid="QueryMemberParent"></include>
        ) a
        inner join bd_grade bg
        on a.pk_grade = bg.pk_id
        left join ac_pick ap
        on ap.pk_member = a.pk_member and ap.pick_type = 8 and ap.del_flag=0
        left join bd_product bp
        on ap.pk_data_id = bp.pk_id
    </select>

    <select id="queryCuMemberSecondPlaceParent" resultMap="CuMemberSettleExt">
        select b.pk_id pk_member,
               b.pk_parent,
               b.pk_place_parent,
               b.place_dept,
               b.pk_center_code,
               b.member_code,
               b.member_name,
               b.pk_grade,
               b.pk_awards,
               b.account_status,
               b.register_authority,
               b.customer_type,
               b.income_status,
               b.pk_settle_country,
               b.is_maker_space,
               b.purchase_status,
               b.share_status,
               bg.grade_value,
               b.category,
               st.a_balance,
               st.b_balance,
               0       r_a_balance,
               0       r_b_balance,
               st.a_sum_amount,
               st.b_sum_amount,
               st.a_sum_pv,
               st.b_sum_pv,
               st.a_new_amount,
               st.b_new_amount,
               st.a_new_pv,
               st.b_new_pv,
               st.a_sum_real_amount,
               st.b_sum_real_amount,
               st.a_sum_real_pv,
               st.b_sum_real_pv,
               st.rep_a_balance,
               st.rep_b_balance,
               0       r_rep_a_balance,
               0       r_rep_b_balance,
               st.rep_a_new_amount,
               st.rep_b_new_amount,
               st.rep_a_new_pv,
               st.rep_b_new_pv,
               st.rep_a_sum_amount,
               st.rep_b_sum_amount,
               st.rep_a_sum_pv,
               st.rep_b_sum_pv,
               st.register_amount,
               st.register_pv,
               st.register_new_amount,
               st.register_new_pv,
               st.upgrade_amount,
               st.upgrade_pv,
               st.upgrade_new_amount,
               st.upgrade_new_pv,
               st.repurchase_amount,
               st.repurchase_pv,
               st.repurchase_new_amount,
               st.repurchase_new_pv,
               st.hi_fun_amount,
               st.hi_fun_pv,
               st.hi_fun_new_amount,
               st.hi_fun_new_pv,
               st.mall_amount,
               st.mall_pv,
               st.mall_new_amount,
               st.mall_new_pv,
               st.round,
               st.second,
               st.min_achieve,
               st.expire_status
        from ${secondTableName} st
                 inner join
             (select pk_id,
                     pk_parent,
                     pk_place_parent,
                     place_dept,
                     member_code,
                     member_name,
                     pk_center_code,
                     pk_settle_grade pk_grade,
                     pk_awards,
                     account_status,
                     register_authority,
                     customer_type,
                     income_status,
                     pk_settle_country,
                     purchase_status,
                     share_status,
                     category,
                     is_maker_space,
                     0               orders
              from cu_member
              where del_flag = 0 start
              with pk_id = #{pkMember}
              connect by pk_id = prior pk_place_parent
             ) b
             on b.pk_id = st.pk_member
                 left join bd_grade bg
                           on b.pk_grade = bg.pk_id
        order by b.orders
    </select>

    <select id="queryCuMemberSecondParent" resultMap="CuMemberSettleExt">
        select b.pk_id
        pk_member,b.pk_parent,b.pk_place_parent,b.place_dept,b.pk_center_code,b.member_code,b.member_name,b.pk_grade,b.pk_awards,b.account_status,
        b.register_authority,b.customer_type,b.income_status,b.pk_settle_country,b.is_maker_space,b.purchase_status,
        b.share_status,bg.grade_value,b.category,st.a_balance,st.b_balance,0 r_a_balance,0 r_b_balance,
        st.a_sum_amount,st.b_sum_amount,st.a_sum_pv,st.b_sum_pv,st.a_new_amount,st.b_new_amount,st.a_new_pv,
        st.b_new_pv,st.a_sum_real_amount,st.b_sum_real_amount,st.a_sum_real_pv,
        st.b_sum_real_pv,st.rep_a_balance,st.rep_b_balance,0 r_rep_a_balance,0 r_rep_b_balance,st.rep_a_new_amount,
        st.rep_b_new_amount,st.rep_a_new_pv,st.rep_b_new_pv,st.rep_a_sum_amount,
        st.rep_b_sum_amount,st.rep_a_sum_pv,st.rep_b_sum_pv,
        st.register_amount,st.register_pv,st.register_new_amount,st.register_new_pv,
        st.upgrade_amount,st.upgrade_pv,st.upgrade_new_amount,st.upgrade_new_pv,
        st.repurchase_amount,st.repurchase_pv,st.repurchase_new_amount,st.repurchase_new_pv,
        st.hi_fun_amount,st.hi_fun_pv,st.hi_fun_new_amount,st.hi_fun_new_pv,
        st.mall_amount,st.mall_pv,st.mall_new_amount,st.mall_new_pv,
        st.round,st.second,st.min_achieve,st.expire_status
        from
        (
        select pk_id,pk_parent,pk_place_parent,place_dept,member_code,member_name,pk_center_code,pk_settle_grade
        pk_grade,pk_awards,account_status,register_authority,customer_type,
        income_status,pk_settle_country,purchase_status,share_status,category,is_maker_space
        from cu_member
        where del_flag= 0 and pk_id in
        <foreach collection="cuMemberTreeList" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
        ) b
        inner join ${secondTableName} st
        on b.pk_id = st.pk_member
        left join bd_grade bg
        on b.pk_grade = bg.pk_id
    </select>

    <select id="batchQueryMemberSettleParentByMemberPk" resultMap="CuMemberSettleExt">
        select
        cl.pk_member,cl.member_code,cl.member_name,cl.pk_awards,cl.pk_grade,cl.account_status,cl.category,cl.income_status,cl.pk_settle_country,
        cl.is_maker_space,cl.purchase_status,cl.share_status,
        cl.a_balance,cl.b_balance,cl.r_a_balance,cl.r_b_balance,cl.rep_a_balance,cl.rep_b_balance,cl.r_rep_a_balance,cl.r_rep_b_balance,
        cl.register_amount,cl.register_pv,cl.upgrade_amount,cl.upgrade_pv,cl.repurchase_amount,cl.pk_center_code,cl.register_authority,
        cl.repurchase_pv,cl.hi_fun_amount,cl.hi_fun_pv,cl.mall_amount,cl.mall_pv,cl.min_achieve,cl.round,cl.second from
        ${settleTableName} ct
        inner join ${settleTableName} cl
        on ct.pk_parent = cl.pk_member
        where ct.pk_member in
        <foreach collection="memberPkList" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
        union
        select
        pk_member,member_code,member_name,pk_awards,pk_grade,account_status,category,income_status,pk_settle_country,
        is_maker_space,purchase_status,share_status,
        a_balance,b_balance,r_a_balance,r_b_balance,rep_a_balance,rep_b_balance,r_rep_a_balance,r_rep_b_balance,
        register_amount,register_pv,upgrade_amount,upgrade_pv,repurchase_amount,pk_center_code,register_authority,
        repurchase_pv,hi_fun_amount,hi_fun_pv,mall_amount,mall_pv,min_achieve,round,second from ${settleTableName}
        where pk_member in
        <foreach collection="memberPkList" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>

    <select id="queryMemberSettleByAwards" resultType="com.hzs.common.domain.member.ext.CuMemberSettleExt">
        select a.pk_settle_country,
               a.income_status,
               a.pk_member,
               a.expire_status,
               a.purchase_status,
               ba.abonus_ratio,
               c.real_income_total
        from ${settleTableName} a
                 inner join bd_awards ba
                            on a.pk_awards = ba.pk_id
                 inner join (
            select pk_member, sum(real_income_total - global_points) real_income_total
            from cu_member_bonus
            where del_flag = 0
              and period between #{startPeriod} and #{endPeriod}
              and real_income_total > 0
            group by pk_member) c
                            on a.pk_member = c.pk_member
        where ba.del_flag = 0
          and ba.awards_value >= 5
          and ba.abonus_ratio > 0
          and a.pk_settle_country = 1
        union
        select a.pk_settle_country,
               a.income_status,
               a.pk_member,
               1 expire_status,
               a.purchase_status,
               ba.abonus_ratio,
               c.real_income_total
        from ${rangeTableName} a
                 inner join bd_awards ba
                            on a.pk_benefit_awards = ba.pk_id
                 inner join (
            select pk_member, sum(real_income_total) real_income_total
            from cu_member_bonus
            where del_flag = 0
              and period between #{startPeriod} and #{endPeriod}
              and real_income_total > 0
            group by pk_member
        ) c
                            on a.pk_member = c.pk_member
        where ba.del_flag = 0
          and ba.awards_value >= 5
          and ba.abonus_ratio > 0
          and a.pk_settle_country = 1
    </select>

    <!-- 回退会员等级 -->
    <update id="updateBackCuMemberSettleGrade">
        merge into ${settleTableName} a
            using (select pk_member, max(old_level) old_level
                   from cu_member_level
                   where period = #{period}
                     and del_flag = 0
                   group by pk_member) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set
                    a.pk_grade = b.old_level
    </update>

    <!-- 更新会员网体等级数据，更新结算表 -->
    <update id="updateCuMemberSettleGradeByPeriod">
        merge into ${updateTableName} a
            using (
                select t.*, bg.register_authority
                from (select pk_member, max(new_level) pk_grade
                      from cu_member_level
                      where period = #{period}
                        and del_flag = 0
                      group by pk_member) t
                         left join bd_grade bg
                                   on bg.pk_id = t.pk_grade
            ) b
            on (a.pk_member = b.pk_member)
            when matched then
                update set
                    a.pk_grade = b.pk_grade,
                    a.register_authority =
                            (select case
                                        when b.register_authority > a.register_authority then
                                            b.register_authority
                                        else
                                            a.register_authority
                                        end
                             from dual)
    </update>

    <!-- 查询左右区足够可以升级的会员 -->
    <select id="listUpgradeAwards" resultMap="CuMemberSettleExt">
        select t.pk_member, ct.pk_awards
        from (select ct.pk_place_parent pk_member
              from ${settleTableName} ct
                       inner join bd_awards ba
                                  on ba.pk_id = ct.pk_awards
                                      and ba.del_flag = 0
              where ct.category = 0
                and ct.income_status = 0
                and ba.awards_value >= #{awardsValue}
              group by ct.pk_place_parent
              having count(ct.pk_place_parent) = 2) t
                 left join ${settleTableName} ct
                           on ct.pk_member = t.pk_member
        order by t.pk_member
    </select>

    <!-- 有奖衔的会员，上月最后一期左右区结余，本月左右区新増 -->
    <!-- 当期的 首购累计 + 复购累计 - 上月最后一期首购累计 - 上月最后一期复购累计 -->
    <select id="listMemberMonthAssess" resultType="com.hzs.common.domain.member.ext.CuMemberSettleExt">
        select t.*,
        nvl(cms.a_balance, 0) a_balance,
        nvl(cms.b_balance, 0) b_balance,
        nvl(t.r_a_sum_pv, 0) + nvl(t.r_rep_a_sum_pv, 0) - nvl(cms.a_sum_pv, 0) - nvl(cms.rep_a_sum_pv, 0) a_sum_pv,
        nvl(t.r_b_sum_pv, 0) + nvl(t.r_rep_b_sum_pv, 0) - nvl(cms.b_sum_pv, 0) - nvl(cms.rep_b_sum_pv, 0) b_sum_pv
        from (
        select cms.*, ba.awards_value
        from (
        select cms.pk_member, cms.pk_awards, cms.purchase_status,
        cms.r_a_sum_pv, cms.r_b_sum_pv, cms.r_rep_a_sum_pv, cms.r_rep_b_sum_pv
        from ${settleTableName} cms
        where cms.pk_member in
        <foreach collection="pkMemberList" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
        ) cms
        left join bd_awards ba
        on ba.pk_id = cms.pk_awards
        where ba.awards_value > 0
        ) t
        left join ${settleTableNameMonthLast} cms
        on cms.pk_member = t.pk_member
    </select>

</mapper>
