<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="${entityPackageName}.dao.ibatis.${entityClassName}DaoImpl">

    <!-- 字段和属性映射 -->
    <resultMap type="${entityClassName}Entity" id="${entityClassName}Entity-Map">
        <#list fields as field>
        <result property="${field.attName}" column="${field.columnName}" />
        </#list>
    </resultMap>
    <#if isSubmeter??>
    <update id="createTable" parameterType="paramDto">
        CREATE TABLE `<#noparse>$</#noparse>{tableName}`(
        <#list fields as field>
        <#if (field.pk)??>
            <#if field.autoInc=='true'>
                `${field.columnName}` ${field.sourceColumnType} NOT NULL  auto_increment  COMMENT '${field.remarks}',
            <#else >
                `${field.columnName}` ${field.sourceColumnType} NOT NULL   COMMENT '${field.remarks}',
            </#if>
        <#else>
            `${field.columnName}` ${field.sourceColumnType} ${ (field.isNotNull == '是') ?string('NOT NULL','DEFAULT NULL')}<#if (field.defaultValue)??> default '${field.defaultValue}'</#if> COMMENT '${field.remarks}',
        </#if>
        </#list>
        PRIMARY KEY  (`${pk}`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='${entityPackageDesc}';

    </update>
    </#if>

    <!-- 表所有列 -->
    <sql id="_columns">
        <trim suffixOverrides="," suffix="">
            <#list fields as field>
                <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('${field.attName}') or colPickMode == 1 and data.containsKey('${field.attName}')))">
                    a.${field.columnName} as ${field.columnName},
                </if>
            </#list>
        </trim>
    </sql>
    <!-- 新增 -->
    <#if auto_inc=="true">
        <insert id="insert" parameterType="${entityClassName}Entity" useGeneratedKeys="true" keyProperty="${pk}">
            insert into ${sourceTableName}
            (<#list fields as field><#if field.columnName != "${pk}">${field.columnName}<#sep>,</#if></#list>)
            VALUES
            (<#list fields as field><#if field.columnName != "${pk}"><#noparse>#</#noparse>{${field.attName}}<#sep>,</#if></#list>)
        </insert>

        <!-- 批量新增 -->
        <insert id="insertBatch" parameterType="paramDto">
            insert into ${sourceTableName}
            (<#list fields as field><#if field.columnName != "${pk}">${field.columnName}<#sep>,</#if></#list>)
            VALUES
            <foreach collection="data.dataList" item="item" index="index" separator="," >
                (<#list fields as field><#if field.columnName != "${pk}"><#noparse>#</#noparse>{item.${field.attName}}<#sep>,</#if></#list>)
            </foreach>
        </insert>
        <#else>
            <insert id="insert" parameterType="${entityClassName}Entity" >
                insert into ${sourceTableName}
                (<#list fields as field>${field.columnName}<#sep>,</#list>)
                VALUES
                (<#list fields as field><#noparse>#</#noparse>{${field.attName}}<#sep>,</#list>)
            </insert>

            <!-- 批量新增 -->
            <insert id="insertBatch" parameterType="paramDto">
                insert into ${sourceTableName}
                (<#list fields as field>${field.columnName}<#sep>,</#list>)
                VALUES
                <foreach collection="data.dataList" item="item" index="index" separator="," >
                    (<#list fields as field><#noparse>#</#noparse>{item.${field.attName}}<#sep>,</#list>)
                </foreach>
            </insert>
    </#if>
    <!-- 根据ParamDto更新 -->
    <update id="update" parameterType="paramDto">
        <#if isSubmeter??>
        update   <#noparse>$</#noparse>{tableName} as a
        <#else>
        update ${sourceTableName} as a
        </#if>
        set
        <trim suffixOverrides="," suffix="">
        <#list fields as field>
        <#if field.columnName != "id">
            <if test="(colPickMode==0 and data.containsKey('${field.attName}')) or (colPickMode==1 and !data.containsKey('${field.attName}'))">
                a.${field.columnName}=<#noparse>#</#noparse>{data.${field.attName}},
            </if>
            <#if field.typeName == "java.lang.Integer"||field.typeName == "java.lang.Long"||field.typeName == "BigDecimal">
            <if test="(colPickMode==0 and data.containsKey('${field.attName}Increment')) or (colPickMode==1 and !data.containsKey('${field.attName}Increment'))">
                a.${field.columnName}=ifnull(a.${field.columnName},0) + <#noparse>#</#noparse>{data.${field.attName}Increment},
            </if>
            </#if>
        </#if>
        </#list>
        </trim>
        <trim suffixOverrides="where" suffix="">
            where
            <trim prefixOverrides="and" prefix="">
                <include refid="_condition_"/>
            </trim>
        </trim>
    </update>
    <!-- 批量更新 -->
    <update id="updateBatch" parameterType="paramDto">
        update ${sourceTableName} as a
        <trim prefix="set" suffixOverrides=",">
            <#list fields as field>

                <#if field.columnName != "id">
                     <#if field.typeName == "String"||field.typeName == "java.util.Date">
                <trim prefix="${field.columnName}=(case" suffix="ELSE ${field.columnName} end),">
                    <foreach collection="data.dataList" item="item" index="index" separator="" >
                        <if test="(colPickMode==0 and item.containsKey('${field.attName}')) or (colPickMode==1 and !item.containsKey('${field.attName}'))">
                            when a.id=<#noparse>#</#noparse>{item.id} then <#noparse>#</#noparse>{item.${field.attName}}
                        </if>
                    </foreach>
                </trim>
                     </#if>
                    <#if field.typeName == "java.lang.Integer"||field.typeName == "java.lang.Long"||field.typeName == "BigDecimal">
                        <trim prefix="${field.columnName}=(case" suffix="ELSE ${field.columnName} end),">
                            <foreach collection="data.dataList" item="item" index="index" separator="" >
                                <choose>
                                    <when test="(colPickMode==0 and item.containsKey('${field.attName}')) or (colPickMode==1 and !item.containsKey('${field.attName}'))">
                                        when a.id=<#noparse>#</#noparse>{item.id} then <#noparse>#</#noparse>{item.${field.attName}}
                                    </when>
                                    <when test="(colPickMode==0 and item.containsKey('${field.attName}Increment')) or (colPickMode==1 and !item.containsKey('${field.attName}Increment'))">
                                        when a.id=<#noparse>#</#noparse>{item.id} then ifnull(a.${field.columnName},0) + <#noparse>#</#noparse>{item.${field.attName}Increment}
                                    </when>
                                </choose>
                            </foreach>
                        </trim>
                    </#if>
                </#if>
            </#list>
        </trim>
        where ${pk} in
        <foreach collection="data.dataList" item="item" index="index" open="(" separator="," close=")">
            <#noparse>#</#noparse>{item.id}
        </foreach>
    </update>
    <!-- 根据主健查询 -->
    <select id="getByKey" parameterType="paramDto" resultMap="${entityClassName}Entity-Map">
        select <include refid="_columns"/>
        from ${sourceTableName} as a
        where a.${pk}=<#noparse>#</#noparse>{condition.id}
    </select>
    <!-- 根据主健删除 -->
    <delete id="deleteByKey" parameterType="paramDto">
        delete a.* from ${sourceTableName} as a where a.${pk}=<#noparse>#</#noparse>{condition.id}
    </delete>
    <!-- 根据主健删除一批,针对单一主健有效 -->
    <delete id="deleteByKeys">
        delete from ${sourceTableName} where ${pk} in
        <foreach collection="array" item="item" index="index" open="(" separator="," close=")">
            <#noparse>#</#noparse>{item}
        </foreach>
    </delete>
    <!-- 根据paramDto删除一批 -->
    <delete id="deleteByMap" parameterType="paramDto">
        delete a.* from ${sourceTableName} as a
        <trim suffixOverrides="where" suffix="">
            where
            <trim prefixOverrides="and" prefix="">
                <include refid="_condition_"/>
            </trim>
        </trim>
    </delete>
    <!-- 获取列表 -->
    <select id="getList" parameterType="paramDto" resultMap="${entityClassName}Entity-Map">
        select <include refid="_columns"/>
        from ${sourceTableName} as a
        <trim suffixOverrides="where" suffix="">
            where
            <trim prefixOverrides="and" prefix="">
                <include refid="_condition_"/>
            </trim>
        </trim>
        <include refid="_orderCols_"/>
    </select>
    <!-- 获取 -->
    <select id="getListCount" parameterType="paramDto" resultType="int">
        select count(1)
        from ${sourceTableName} as a
        <trim suffixOverrides="where" suffix="">
            where
            <trim prefixOverrides="and" prefix="">
                <include refid="_condition_"/>
            </trim>
        </trim>
    </select>
    <!-- 条件映射 -->
    <sql id="_condition_">
        <if test="condition != null and !condition.isEmpty()">
            <!-- 条件映射-普通条件 -->
            <include refid="_condition_param_">
                <property name="_conditionParam_" value="condition"/>
                <property name="_conditionType_" value="and"/>
            </include>
            <!-- 条件映射-集合之间使用AND,集合中元素使用OR-(list[0].1 or list[0].2) and (list[1].3 or list[1].4) -->
            <if test="condition.containsKey('andConditionList') and !condition.andConditionList.isEmpty()">
                and
                <foreach collection="condition.andConditionList" open="(" close=")" index="index" item="andCondition" separator=" and ">
                    <trim prefixOverrides="or" prefix="(" suffix=")">
                        <include refid="_condition_param_">
                            <property name="_conditionParam_" value="andCondition"/>
                            <property name="_conditionType_" value="or"/>
                        </include>
                    </trim>
                </foreach>
            </if>
            <!-- 条件映射-集合之间使用OR,集合中元素使用AND-(list[0].1 and list[0].2) or (list[1].3 and list[1].4) -->
            <if test="condition.containsKey('orConditionList') and !condition.orConditionList.isEmpty()">
                and
                <foreach collection="condition.orConditionList" open="(" close=")" index="index" item="orCondition" separator=" or ">
                    <trim prefixOverrides="and" prefix="(" suffix=")">
                        <include refid="_condition_param_">
                            <property name="_conditionParam_" value="orCondition"/>
                            <property name="_conditionType_" value="and"/>
                        </include>
                    </trim>
                </foreach>
            </if>
        </if>
    </sql>
    <!-- 条件映射-代参数 -->
    <sql id="_condition_param_">
        <bind name="conditionParamRef" value="<#noparse>${_conditionParam_}</#noparse>"/>

        <if test="conditionParamRef.containsKey('id')">
            <if test="conditionParamRef.id != null">
                <#noparse>${_conditionType_}</#noparse> a.${pk}=<#noparse>#{${_conditionParam_}.id}</#noparse>
            </if>
        </if>
    <#list fields as field>
        <#if field.typeName == "java.lang.Long"||field.typeName == "java.lang.Integer"||field.typeName == "BigDecimal">
            <if test="conditionParamRef.containsKey('${field.attName}')">
                <if test="conditionParamRef.${field.attName} != null ">
                    <#noparse>${_conditionType_}</#noparse> a.${field.columnName} = <#noparse>#{${_conditionParam_}</#noparse>.${field.attName}}
                </if>
                <if test="conditionParamRef.${field.attName} == null">
                    <#noparse>${_conditionType_}</#noparse> a.${field.columnName} is null
                </if>
            </if>
            <if test="conditionParamRef.containsKey('${field.attName}List')">
                <#noparse>${_conditionType_}</#noparse> a.${field.columnName} in
                <foreach collection="conditionParamRef.${field.attName}List" open="(" close=")" index="index" item="item" separator=",">
                    <#noparse>#{item}</#noparse>
                </foreach>
            </if>
            <if test="conditionParamRef.containsKey('${field.attName}Start') and conditionParamRef.${field.attName}Start != null">
                <#noparse>${_conditionType_}</#noparse> a.${field.columnName} <![CDATA[ >= ]]> <#noparse>#{${_conditionParam_}</#noparse>.${field.attName}Start}
            </if>
            <if test="conditionParamRef.containsKey('${field.attName}End') and conditionParamRef.${field.attName}End != null">
                <#noparse>${_conditionType_}</#noparse> a.${field.columnName} <![CDATA[ <= ]]> <#noparse>#{${_conditionParam_}</#noparse>.${field.attName}End}
            </if>
        </#if>

        <#if field.typeName == "String">
            <if test="conditionParamRef.containsKey('${field.attName}')">
                <if test="conditionParamRef.${field.attName} != null and conditionParamRef.${field.attName} != ''">
                    <#noparse>${_conditionType_}</#noparse> a.${field.columnName} like <#noparse>#{${_conditionParam_}</#noparse>.${field.attName}}
                </if>
                <if test="conditionParamRef.${field.attName} == null">
                    <#noparse>${_conditionType_}</#noparse> a.${field.columnName} is null
                </if>
            </if>
            <if test="conditionParamRef.containsKey('${field.attName}List')">
                <#noparse>${_conditionType_}</#noparse> a.${field.columnName} in
                <foreach collection="conditionParamRef.${field.attName}List" open="(" close=")" index="index" item="item" separator=",">
                    <#noparse>#</#noparse>{item}
                </foreach>
            </if>
        </#if>
        <#if field.typeName == "java.util.Date">
            <if test="conditionParamRef.containsKey('${field.attName}')">
                <if test="conditionParamRef.${field.attName} != null ">
                    <#noparse>$</#noparse>{_conditionType_} a.${field.columnName} = <#noparse>#{$</#noparse>{_conditionParam_}.${field.attName}}
                </if>
                <if test="conditionParamRef.${field.attName} == null">
                    <#noparse>$</#noparse>{_conditionType_} a.${field.columnName} is null
                </if>
            </if>
            <if test="conditionParamRef.containsKey('${field.attName}Start') and conditionParamRef.${field.attName}Start != null and conditionParamRef.${field.attName}Start!=''">
                <#noparse>$</#noparse>{_conditionType_} a.${field.columnName} <![CDATA[ >= ]]> STR_TO_DATE(left(concat(<#noparse>#{$</#noparse>{_conditionParam_}.${field.attName}Start},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
            </if>
            <if test="conditionParamRef.containsKey('${field.attName}End') and conditionParamRef.${field.attName}End != null and conditionParamRef.${field.attName}End!=''">
                <#noparse>$</#noparse>{_conditionType_} a.${field.columnName} <![CDATA[ <= ]]> STR_TO_DATE(left(concat(<#noparse>#{$</#noparse>{_conditionParam_}.${field.attName}End},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
            </if>
        </#if>
    </#list>
    </sql>
    <sql id="_orderCols_">
        <if test="orderColList != null and !orderColList.isEmpty()">
            order by
            <trim suffixOverrides=","  suffix="">
                <foreach collection="orderColList" open="" close="" index="index" item="item" separator=",">
                    <#noparse> ${item.colName} ${item.sortKind}</#noparse>
                </foreach>
            </trim>
        </if>
        <if test="(orderColList == null or orderColList.isEmpty()) and orderCol != null and !orderCol.isEmpty()">
            order by
            <trim suffixOverrides=","  suffix="">
                <#list fields as field>
                    <if test="orderCol.containsKey('${field.attName}')">
                        a.${field.columnName}
                        <if test='orderCol.${field.attName} != null and "DESC".equalsIgnoreCase(orderCol.${field.attName})'>DESC</if>
                        ,
                    </if>
                </#list>
            </trim>
        </if>
    </sql>
    <sql id="_group_by_">
        <if test="groupList != null and !groupList.isEmpty()">
            GROUP BY
            <trim suffixOverrides=","  suffix="">
                <foreach collection="groupList" open="" close="" index="index" item="item" separator=",">
                    <#noparse>$</#noparse>{item}
                </foreach>
            </trim>
        </if>
    </sql>
</mapper>