<?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.ym.mec.biz.dal.dao.StudentPaymentOrderDao">

    <resultMap type="com.ym.mec.biz.dal.entity.StudentPaymentOrder" id="StudentPaymentOrder">
        <result column="id_" property="id"/>
        <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
        <result column="user_id_" property="userId"/>
        <result column="organ_id_" property="organId"/>
        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
        <result column="expect_amount_" property="expectAmount"/>
        <result column="actual_amount_" property="actualAmount"/>
        <result column="com_amount_" property="comAmount"/>
        <result column="per_amount_" property="perAmount"/>
        <result column="balance_payment_amount_" property="balancePaymentAmount"/>
        <result column="remit_fee_" property="remitFee"/>
        <result column="trans_no_" property="transNo"/>
        <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
        <result column="memo_" property="memo"/>
        <result column="create_time_" property="createTime"/>
        <result column="update_time_" property="updateTime"/>
        <result column="payment_channel_" property="paymentChannel"/>
        <result column="payment_business_channel_" property="paymentBusinessChannel"/>
        <result column="payment_account_no_" property="paymentAccountNo"/>
        <result column="mer_nos_" property="merNos"/>
        <result column="order_no_" property="orderNo"/>
        <result column="music_group_id_" property="musicGroupId"/>
        <result column="class_group_id_" property="classGroupId"/>
        <result column="pay_time_" property="payTime"/>
        <result column="version_" property="version"/>
    </resultMap>

    <resultMap type="com.ym.mec.biz.dal.entity.StudentPaymentOrder" extends="StudentPaymentOrder"
               id="PaymentOrderAndStudentInfo">
        <result column="username_" property="user.username"/>
        <result column="phone_" property="user.phone"/>
    </resultMap>

    <resultMap type="com.ym.mec.biz.dal.entity.Goods" id="Goods">
        <result column="id_" property="id"/>
        <result column="goods_category_id_" property="goodsCategoryId"/>
        <result column="sn_" property="sn"/>
        <result column="name_" property="name"/>
        <result column="brand_" property="brand"/>
        <result column="specification_" property="specification"/>
        <result column="image_" property="image"/>
        <result column="stock_count_" property="stockCount"/>
        <result column="sell_count_" property="sellCount"/>
        <result column="market_price_" property="marketPrice"/>
        <result column="discount_price_" property="discountPrice"/>
        <result column="group_purchase_price_" property="groupPurchasePrice"/>
        <result column="brief_" property="brief"/>
        <result column="desc_" property="desc"/>
        <result column="is_new_" property="isNew" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
        <result column="is_top_" property="isTop" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
        <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
        <result column="memo_" property="memo"/>
        <result column="publish_time_" property="publishTime"/>
        <result column="create_time_" property="createTime"/>
        <result column="update_time_" property="updateTime"/>
        <result column="complement_goods_id_list_" property="complementGoodsIdList"/>
    </resultMap>

    <!-- 根据主键查询一条记录 -->
    <select id="get" resultMap="StudentPaymentOrder">
        SELECT *
        FROM student_payment_order
        WHERE id_ = #{id}
    </select>

    <!-- 全查询 -->
    <select id="findAll" resultMap="StudentPaymentOrder">
        SELECT *
        FROM student_payment_order
        ORDER BY id_
    </select>

    <!-- 向数据库增加一条记录 -->
    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder" useGeneratedKeys="true"
            keyColumn="id" keyProperty="id">
        INSERT INTO student_payment_order
        (id_, group_type_, user_id_,organ_id_, type_, expect_amount_, actual_amount_, com_amount_, per_amount_,
         balance_payment_amount_, trans_no_,
         status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
         payment_account_no_, order_no_, music_group_id_, class_group_id_)
        VALUES (#{id}, #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                #{userId},#{organId}, #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                #{expectAmount}, #{actualAmount}, #{comAmount}, #{perAmount}, #{balancePaymentAmount}, #{transNo},
                #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, now(), now(),
                #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{orderNo}, #{musicGroupId},
                #{classGroupId})
    </insert>

    <!-- 根据主键查询一条记录 -->
    <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder">
        UPDATE student_payment_order
        <set>
            <if test="status != null">
                status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
            </if>
            <if test="groupType != null">
                group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
            </if>
            <if test="orderNo != null">
                order_no_ = #{orderNo},
            </if>
            <if test="classGroupId != null">
                class_group_id_ = #{classGroupId},
            </if>
            <if test="expectAmount != null">
                expect_amount_ = #{expectAmount},
            </if>
            <if test="memo != null">
                memo_ = #{memo},
            </if>
            <if test="paymentChannel != null">
                payment_channel_ = #{paymentChannel},
            </if>
            <if test="userId != null">
                user_id_ = #{userId},
            </if>
            <if test="paymentAccountNo != null">
                payment_account_no_ = #{paymentAccountNo},
            </if>
            <if test="merNos != null">
                mer_nos_ = #{merNos},
            </if>
            <if test="updateTime != null">
                update_time_ = NOW(),
            </if>
            <if test="paymentBusinessChannel != null">
                payment_business_channel_ = #{paymentBusinessChannel},
            </if>
            <if test="transNo != null">
                trans_no_ = #{transNo},
            </if>
            <if test="actualAmount != null">
                actual_amount_ = #{actualAmount},
            </if>
            <if test="comAmount != null">
                com_amount_ = #{comAmount},
            </if>
            <if test="perAmount != null">
                per_amount_ = #{perAmount},
            </if>
            <if test="balancePaymentAmount != null">
                balance_payment_amount_ = #{balancePaymentAmount},
            </if>
            <if test="remitFee != null">
                remit_fee_ = #{remitFee},
            </if>
            <if test="type != null">
                type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
            </if>
            <if test="musicGroupId != null">
                music_group_id_ = #{musicGroupId},
            </if>
            <if test="organId != null">
                organ_id_ = #{organId},
            </if>
            <if test="payTime != null">
                pay_time_ = #{payTime},
            </if>
            <if test="version != null">
                version_ = version_+1,
            </if>
        </set>
        WHERE id_ = #{id} AND version_ = #{version}
    </update>

    <!-- 根据主键删除一条记录 -->
    <delete id="delete">
        DELETE
        FROM student_payment_order
        WHERE id_ = #{id}
    </delete>

    <!-- 分页查询 -->
    <select id="queryPage" resultMap="PaymentOrderAndStudentInfo" parameterType="map">
        SELECT spo.*,u.username_,u.phone_ FROM student_payment_order spo
        left join sys_user u on spo.user_id_ = u.id_
        <include refid="queryPaymentOrder"/>
        ORDER BY spo.id_ DESC
        <include refid="global.limit"/>
    </select>

    <!-- 查询当前表的总记录数 -->
    <select id="queryCount" resultType="int" parameterType="map">
        SELECT COUNT(spo.id_) FROM student_payment_order spo
        left join sys_user u on spo.user_id_ = u.id_
        <include refid="queryPaymentOrder"/>
    </select>

    <sql id="queryPaymentOrder">
        <where>
            <if test="organId != null">
                AND FIND_IN_SET(spo.organ_id_,#{organId})
            </if>
            <if test="orderStartDate != null">
                AND DATE_FORMAT(spo.create_time_,'%Y-%m-%d') &gt;= #{orderStartDate}
            </if>
            <if test="orderEndDate != null">
                AND DATE_FORMAT(spo.create_time_,'%Y-%m-%d') &lt;= #{orderEndDate}
            </if>
            <if test="paymentType != null">
                AND spo.type_ = #{paymentType}
            </if>
            <if test="remark != null">
                AND spo.memo_ LIKE CONCAT('%',#{remark},'%')
            </if>
            <if test="studentId != null">
                AND spo.user_id_ = #{studentId}
            </if>
            <if test="paymentStatus != null">
                AND spo.status_ = #{paymentStatus}
            </if>
            <if test="paymentChannel != null">
                AND spo.payment_channel_ NOT IN (#{paymentChannel})
            </if>
            <if test='orderType != null and orderType.toString()=="1".toString()'>
                AND spo.com_amount_ > 0
            </if>
            <if test='orderType != null and orderType.toString()=="2".toString()'>
                AND spo.per_amount_ > 0
            </if>
        </where>
    </sql>

    <select id="queryApplyGoodsList" resultMap="Goods" parameterType="map">
        select g.*
        from goods g
        where g.id_ in (SELECT spod.goods_id_list_
                        FROM student_payment_order spo
                                 left join
                             student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
                        where spo.music_group_id_ =
                              #{musicGroupId}
                          and spo.type_ = 'APPLY'
                          and spod.type_ =
                              #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
    </select>
    <select id="queryByCondition" resultMap="StudentPaymentOrder" parameterType="map">
        SELECT
        spo.*
        FROM
        student_payment_order spo
        WHERE spo.user_id_=#{userId}
        AND spo.music_group_id_=#{musicGroupId}
        AND spo.status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
        AND spo.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
        and spo.type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
    </select>
    <select id="findByStudentVipGroup" resultMap="StudentPaymentOrder">
        SELECT
        spo.*
        FROM
        student_payment_order spo
        WHERE spo.user_id_=#{userId}
        AND spo.music_group_id_=#{vipGroupId}
        <if test="status!=null and status!=''">
            AND spo.status_=#{status}
        </if>
        AND spo.type_ = 'SMALL_CLASS_TO_BUY'
    </select>
    <select id="sumSurplusCourseFee" resultType="java.math.BigDecimal">
        SELECT SUM(cssp.expect_price_)
        FROM course_schedule_student_payment cssp
                 LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
        WHERE cssp.user_id_ = #{userId}
          AND cssp.music_group_id_ = #{vipGroupId}
          AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW()
    </select>
    <select id="findNotFailedOrderByStudentVipGroup" resultMap="StudentPaymentOrder">
        SELECT spo.*
        FROM student_payment_order spo
        WHERE spo.user_id_ = #{userId}
          AND spo.music_group_id_ = #{vipGroupId}
          AND spo.status_ != 'FAILED'
          AND spo.type_ = 'SMALL_CLASS_TO_BUY'
    </select>
    <!-- 查询报名订单 -->
    <select id="findMusicGroupApplyOrderByStatus" resultMap="StudentPaymentOrder">
        SELECT *
        FROM student_payment_order
        WHERE music_group_id_ = #{musicGroupId}
          AND user_id_ = #{userId}
          AND type_ =
              'APPLY'
          AND status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
        ORDER BY id_ DESC
        LIMIT 1
    </select>

    <!-- 根据订单号查询订单 -->
    <select id="findOrderByOrderNo" resultMap="StudentPaymentOrder">
        SELECT *
        FROM student_payment_order
        WHERE order_no_ = #{orderNo}
    </select>

    <select id="queryByDealStatus" resultMap="StudentPaymentOrder" parameterType="map">
        SELECT *
        FROM student_payment_order
        WHERE music_group_id_ = #{musicGroupId}
          AND type_ =
              #{type}
          AND status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
    </select>

    <!-- 查找支付成功和支付中订单 -->
    <select id="findPayOrderNum" resultType="int">
        <![CDATA[
        SELECT COUNT(*)
        FROM student_payment_order
        WHERE FIND_IN_SET(status_, 'SUCCESS,ING,WAIT_PAY')
        ]]>
    </select>

    <resultMap type="com.ym.mec.biz.dal.dto.UserGoodsDto" id="userGoodsDto">
        <result column="goods_id_" property="goodsId"/>
        <collection property="goodsName" ofType="string">
            <result column="goods_name_"/>
        </collection>
    </resultMap>

    <select id="findGoodsIds" resultMap="userGoodsDto">
        SELECT g.id_ goods_id_, g.name_ goods_name_
        FROM student_payment_order spo
                 LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
                 LEFT JOIN goods g ON FIND_IN_SET(g.id_, spod.goods_id_list_)
        WHERE spo.type_ = 'APPLY'
          AND spo.status_ = 'SUCCESS'
          AND spod.goods_id_list_ IS NOT NULL
          AND spo.music_group_id_ = #{musicGroupId}
          AND spo.user_id_ = #{userId}
    </select>

    <select id="findOrdersByStatus" resultMap="StudentPaymentOrder">
        SELECT * FROM student_payment_order
        WHERE status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
        AND payment_channel_ = #{paymentChannel} LIMIT 100
    </select>

    <!-- 查询支付中超时订单 -->
    <select id="findOrdersOverTime" resultMap="StudentPaymentOrder">
        SELECT * FROM student_payment_order WHERE order_no_ IN
        <foreach collection="orderNoList" item="orderNo" index="index" open="(" close=")" separator=",">
            #{orderNo}
        </foreach>
        AND status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
        <![CDATA[ AND create_time_ <= ]]> #{beforeTime}
    </select>
    <select id="countStudentPaymentNum" resultType="int">
        select count(1)
        from student_payment_order
        where music_group_id_ = #{musicGroupId}
          AND status_ = 'SUCCESS'
          AND type_ = 'SMALL_CLASS_TO_BUY'
    </select>

    <select id="countSurplusCourseByMusicGroupAndUser" resultType="int">
        SELECT COUNT(*)
        FROM course_schedule_student_payment cssp
                 LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
        WHERE cssp.user_id_ = #{userId}
          AND cssp.music_group_id_ = #{musicGroupId}
          AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW()
    </select>
    <select id="sumGroupIncomeFee" resultType="java.math.BigDecimal">
        SELECT SUM(expect_amount_)
        FROM student_payment_order
        WHERE group_type_ = #{groupType}
          AND music_group_id_ = #{musicGroupId}
          AND status_='SUCCESS'
    </select>
    <select id="findStudentPaymentOrder" resultMap="StudentPaymentOrder">
        SELECT *
        FROM student_payment_order
        WHERE id_ IN (SELECT MAX(sp.id_)
                      FROM (SELECT *
                            FROM student_payment_order
                            WHERE group_type_ = #{groupType}
                              AND type_ = 'APPLY'
                              AND music_group_id_ = #{musicGroupId}
                              AND status_ = 'SUCCESS'
                            ORDER BY id_ DESC) sp
                      GROUP BY sp.user_id_)
    </select>
    <select id="findOrderByGroupType" resultType="int">
        SELECT COUNT(id_) FROM student_payment_order
        WHERE group_type_ = #{groupType}
        AND user_id_ = #{userId}
        AND music_group_id_ = #{sporadicId}
        <if test="status != null">
            AND status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
        </if>
    </select>
    <select id="queryActualAmount" resultType="java.util.Map">
        SELECT spo.actual_amount_ 'value',spo.id_ 'key'
        FROM student_payment_order spo
        WHERE spo.id_ IN
        <foreach collection="paymentOrderNo" open="(" close=")" separator="," item="item">
            #{item}
        </foreach>
    </select>

    <select id="findFixOrder" resultMap="StudentPaymentOrder">
        SELECT * FROM student_payment_order where status_ ='SUCCESS' AND type_='APPLY' AND actual_amount_> 0 and mer_nos_ IS NULL LIMIT 100
    </select>


    <resultMap type="com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto" id="orderAndDetail"
               extends="StudentPaymentOrder">
        <result column="organ_name" property="organName"/>
        <result column="username_" property="user.username"/>
        <result column="charge_type_" property="chargeType"/>
        <collection property="orderDetailList" ofType="com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail">
            <result column="detail_id_" property="id"/>
            <result column="detail_type_" property="type"/>
            <result column="detail_price_" property="price"/>
            <result column="detail_kit_group_purchase_type_" property="kitGroupPurchaseType"/>
        </collection>
        <collection property="goodsList" ofType="com.ym.mec.biz.dal.entity.Goods">
            <result column="goods_id" property="id"/>
            <result column="goods_name" property="name"/>
        </collection>
    </resultMap>

    <!-- 分页查询 -->
    <select id="ExportQueryPage" resultMap="orderAndDetail" parameterType="map">
        SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_ detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
        o.name_ organ_name,sci.charge_type_,g.id_ goods_id, g.name_ goods_name FROM student_payment_order spo
        LEFT JOIN sys_user u on spo.user_id_ = u.id_
        LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
        LEFT JOIN organization o on spo.organ_id_ = o.id_
        LEFT JOIN sporadic_charge_info sci on spo.music_group_id_ = sci.id_
        LEFT JOIN goods g on FIND_IN_SET(g.id_,spod.goods_id_list_)
        <include refid="queryPaymentOrder"/>
        ORDER BY spo.id_ ASC
    </select>
    <resultMap id="SporadicChargeInfoDtoMap" type="com.ym.mec.biz.dal.dto.SporadicChargeInfoDto">
        <result property="organName" column="organ_name_"/>
        <result property="title" column="title_"/>
        <result property="type" column="type_"/>
        <result property="amount" column="amount_"/>
        <result property="createTime" column="create_time_"/>
        <result property="payTime" column="pay_time_"/>
        <result property="username" column="username_"/>
        <result property="payStatus" column="pay_status_"/>
    </resultMap>
    <select id="sporadicQueryPage" resultMap="SporadicChargeInfoDtoMap">
        SELECT o.name_ organ_name_,sci.title_,sci.charge_type_ type_,
        spo.actual_amount_ amount_,spo.create_time_,spo.pay_time_,su.username_,spo.status_ pay_status_
        FROM student_payment_order spo
        LEFT JOIN sys_user su ON spo.user_id_ = su.id_
        LEFT JOIN organization o ON o.id_ = spo.organ_id_
        LEFT JOIN sporadic_charge_info sci ON sci.id_ = spo.music_group_id_
        WHERE spo.type_ = 'SPORADIC'
        <include refid="sporadicQueryPageSql"/>
        ORDER BY spo.id_ DESC
        <include refid="global.limit"/>
    </select>
    <select id="countSporadicPage" resultType="java.lang.Integer">
        SELECT COUNT(spo.id_)
        FROM student_payment_order spo
        LEFT JOIN sys_user su ON spo.user_id_ = su.id_
        LEFT JOIN sporadic_charge_info sci ON sci.id_ = spo.music_group_id_
        WHERE spo.type_ = 'SPORADIC'
        <include refid="sporadicQueryPageSql"/>
    </select>
    <sql id="sporadicQueryPageSql">
        <if test="organId != null">
            AND FIND_IN_SET(spo.organ_id_,#{organId})
        </if>
        <if test="search != null">
            AND (sci.title_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
        </if>
        <if test="chargeType != null">
            AND sci.charge_type_ = #{chargeType}
        </if>
        <if test="payStatus != null">
            AND spo.status_ = #{payStatus}
        </if>
    </sql>

    <resultMap id="luckStatis" type="com.ym.mec.biz.dal.dto.OrderStatisDto">
        <result property="organName" column="organName"/>
        <result property="nums" column="nums"/>
        <result property="money" column="money"/>
    </resultMap>
    <select id="getLuckStatis" resultMap="luckStatis">
        SELECT o.name_ organName, SUM(spo.actual_amount_) money ,COUNT(spo.id_) nums FROM student_payment_order spo LEFT JOIN organization o ON o.id_=spo.organ_id_
        WHERE spo.type_='LUCK' AND spo.status_='SUCCESS' GROUP BY spo.organ_id_ ORDER BY nums DESC;
    </select>
    
    <select id="queryIncomeStatisticsWithCurrentMonth" resultType="map">
    	select count(*) total,sum(actual_amount_) total_num_ from student_payment_order
    	where actual_amount_ &gt; 0 and DATE_FORMAT(create_time_, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )  AND status_ = 'SUCCESS'
   		<if test="organId != null">
   			and FIND_IN_SET(organ_id_,#{organId})
   		</if>
  	</select>
    <select id="countUserBuyVipGroupSuccessOrder" resultType="int">
      select count(*) from student_payment_order where  user_id_=#{userId} and music_group_id_=#{vipGroupId} and group_type_='VIP' and status_='SUCCESS'
    </select>
    <select id="findUserBuyVipGroupOrder" resultMap="StudentPaymentOrder">
      select * from student_payment_order where  user_id_=#{userId} and music_group_id_=#{vipGroupId} and group_type_='VIP'
    </select>
</mapper>
