<?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="cn.timer.api.dao.insure.InsurePolicyMapper">

    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="cn.timer.api.bean.insure.InsurePolicy" id="insurePolicyMap">
        <result property="id" column="id"/>
        <result property="schemeName" column="scheme_name"/>
        <result property="policyDateStart" column="policy_date_start"/>
        <result property="policyDateEnd" column="policy_date_end"/>
        <result property="productCodeId" column="product_code_id"/>
        <result property="planCodeId" column="plan_code_id"/>
        <result property="partnerPid" column="partner_pid"/>
        <result property="policyNo" column="policy_no"/>
        <result property="type" column="type"/>
        <result property="currency" column="currency"/>
        <result property="totalPremium" column="total_premium"/>
        <result property="status" column="status"/>
        <result property="policyFile" column="policy_file"/>
        <result property="kitUrl" column="kit_url"/>
        <result property="insureApplicantId" column="insure_applicant_id"/>
        <result property="orgCode" column="org_code"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="policyPayType" column="policy_pay_type"/>
        <result property="payId" column="pa_id"/>
        <result property="serialNumber" column="serial_number"/>
    </resultMap>

    <select id="queryObject" resultType="cn.timer.api.bean.insure.InsurePolicy">
        select *
        from insure_policy
        where id = #{value}
    </select>

    <select id="queryList" resultType="cn.timer.api.bean.insure.InsurePolicy">
        select * from insure_policy
        <where>
            <if test="schemeName != null and schemeName != ''">AND `scheme_name` = #{schemeName}</if>
            <if test="policyDateStart != null and policyDateStart != ''">AND `policy_date_start` = #{policyDateStart}
            </if>
            <if test="policyDateEnd != null and policyDateEnd != ''">AND `policy_date_end` = #{policyDateEnd}</if>
            <if test="productCodeId != null and productCodeId != ''">AND `product_code_id` = #{productCodeId}</if>
            <if test="planCodeId != null and planCodeId != ''">AND `plan_code_id` = #{planCodeId}</if>
            <if test="partnerPid != null and partnerPid != ''">AND `partner_pid` = #{partnerPid}</if>
            <if test="policyNo != null and policyNo != ''">AND `policy_no` = #{policyNo}</if>
            <if test="type != null and type != ''">AND `type` = #{type}</if>
            <if test="currency != null and currency != ''">AND `currency` = #{currency}</if>
            <if test="totalPremium != null and totalPremium != ''">AND `total_premium` = #{totalPremium}</if>
            <if test="status != null and status != ''">AND `status` = #{status}</if>
            <if test="policyFile != null and policyFile != ''">AND `policy_file` = #{policyFile}</if>
            <if test="kitUrl != null and kitUrl != ''">AND `kit_url` = #{kitUrl}</if>
            <if test="insureApplicantId != null and insureApplicantId != ''">AND `insure_applicant_id` =
                #{insureApplicantId}
            </if>
            <if test="orgCode != null and orgCode != ''">AND `org_code` = #{orgCode}</if>
            <if test="createTime != null and createTime != ''">AND `create_time` = #{createTime}</if>
            <if test="updateTime != null and updateTime != ''">AND `update_time` = #{updateTime}</if>
            <if test="serialNumber != null and serialNumber != ''">AND `serial_number` = #{serialNumber}</if>
        </where>
        <choose>
            <when test="sidx != null and sidx.trim() != ''">
                order by ${sidx} ${order}
            </when>
            <otherwise>
                order by id desc
            </otherwise>
        </choose>
        <if test="offset != null and limit != null">
            limit #{offset}, #{limit}
        </if>
    </select>

    <select id="queryTotal" resultType="int">
        select count(*) from insure_policy
        <where>
            <if test="schemeName != null and schemeName != ''">AND `scheme_name` = #{schemeName}</if>
            <if test="policyDateStart != null and policyDateStart != ''">AND `policy_date_start` = #{policyDateStart}
            </if>
            <if test="policyDateEnd != null and policyDateEnd != ''">AND `policy_date_end` = #{policyDateEnd}</if>
            <if test="productCodeId != null and productCodeId != ''">AND `product_code_id` = #{productCodeId}</if>
            <if test="planCodeId != null and planCodeId != ''">AND `plan_code_id` = #{planCodeId}</if>
            <if test="partnerPid != null and partnerPid != ''">AND `partner_pid` = #{partnerPid}</if>
            <if test="policyNo != null and policyNo != ''">AND `policy_no` = #{policyNo}</if>
            <if test="type != null and type != ''">AND `type` = #{type}</if>
            <if test="currency != null and currency != ''">AND `currency` = #{currency}</if>
            <if test="totalPremium != null and totalPremium != ''">AND `total_premium` = #{totalPremium}</if>
            <if test="status != null and status != ''">AND `status` = #{status}</if>
            <if test="policyFile != null and policyFile != ''">AND `policy_file` = #{policyFile}</if>
            <if test="kitUrl != null and kitUrl != ''">AND `kit_url` = #{kitUrl}</if>
            <if test="insureApplicantId != null and insureApplicantId != ''">AND `insure_applicant_id` =
                #{insureApplicantId}
            </if>
            <if test="orgCode != null and orgCode != ''">AND `org_code` = #{orgCode}</if>
            <if test="createTime != null and createTime != ''">AND `create_time` = #{createTime}</if>
            <if test="updateTime != null and updateTime != ''">AND `update_time` = #{updateTime}</if>
            <if test="serialNumber != null and serialNumber != ''">AND `serial_number` = #{serialNumber}</if>
        </where>
    </select>

    <insert id="save" parameterType="cn.timer.api.bean.insure.InsurePolicy" useGeneratedKeys="true" keyProperty="id">
        insert into insure_policy
        (`scheme_name`,
         `policy_date_start`,
         `policy_date_end`,
         `product_code_id`,
         `plan_code_id`,
         `partner_pid`,
         `policy_no`,
         `type`,
         `currency`,
         `total_premium`,
         `status`,
         `policy_file`,
         `kit_url`,
         `insure_applicant_id`,
         `org_code`,
         `create_time`,
         `update_time`,
         `serial_number`)
        values (#{schemeName},
                #{policyDateStart},
                #{policyDateEnd},
                #{productCodeId},
                #{planCodeId},
                #{partnerPid},
                #{policyNo},
                #{type},
                #{currency},
                #{totalPremium},
                #{status},
                #{policyFile},
                #{kitUrl},
                #{insureApplicantId},
                #{orgCode},
                #{createTime},
                #{updateTime},
                #{serialNumber})
    </insert>

    <insert id="saveSelective" parameterType="cn.timer.api.bean.insure.InsurePolicy" useGeneratedKeys="true"
            keyProperty="id">
        insert into insure_policy
        (
        <if test="schemeName != null">,`scheme_name`</if>
        <if test="policyDateStart != null">,`policy_date_start`</if>
        <if test="policyDateEnd != null">,`policy_date_end`</if>
        <if test="productCodeId != null">,`product_code_id`</if>
        <if test="planCodeId != null">,`plan_code_id`</if>
        <if test="partnerPid != null">,`partner_pid`</if>
        <if test="policyNo != null">,`policy_no`</if>
        <if test="type != null">,`type`</if>
        <if test="currency != null">,`currency`</if>
        <if test="totalPremium != null">,`total_premium`</if>
        <if test="status != null">,`status`</if>
        <if test="policyFile != null">,`policy_file`</if>
        <if test="kitUrl != null">,`kit_url`</if>
        <if test="insureApplicantId != null">,`insure_applicant_id`</if>
        <if test="orgCode != null">,`org_code`</if>
        <if test="createTime != null">,`create_time`</if>
        <if test="updateTime != null">,`update_time`</if>
        <if test="serialNumber != null">,`serial_number`</if>
        )
        values
        (
        <if test="schemeName != null">,#{schemeName}</if>
        <if test="policyDateStart != null">,#{policyDateStart}</if>
        <if test="policyDateEnd != null">,#{policyDateEnd}</if>
        <if test="productCodeId != null">,#{productCodeId}</if>
        <if test="planCodeId != null">,#{planCodeId}</if>
        <if test="partnerPid != null">,#{partnerPid}</if>
        <if test="policyNo != null">,#{policyNo}</if>
        <if test="type != null">,#{type}</if>
        <if test="currency != null">,#{currency}</if>
        <if test="totalPremium != null">,#{totalPremium}</if>
        <if test="status != null">,#{status}</if>
        <if test="policyFile != null">,#{policyFile}</if>
        <if test="kitUrl != null">,#{kitUrl}</if>
        <if test="insureApplicantId != null">,#{insureApplicantId}</if>
        <if test="orgCode != null">,#{orgCode}</if>
        <if test="createTime != null">,#{createTime}</if>
        <if test="updateTime != null">,#{update_time}</if>
        <if test="serialNumber != null">,#{serialNumber}</if>
        )
    </insert>


    <insert id="saveList" parameterType="cn.timer.api.bean.insure.InsurePolicy" useGeneratedKeys="true"
            keyProperty="id">
        insert into insure_policy
        (
        `scheme_name`,
        `policy_date_start`,
        `policy_date_end`,
        `product_code_id`,
        `plan_code_id`,
        `partner_pid`,
        `policy_no`,
        `type`,
        `currency`,
        `total_premium`,
        `status`,
        `policy_file`,
        `kit_url`,
        `insure_applicant_id`,
        `org_code`,
        `create_time`,
        `update_time`,
         `serial_number`
        )
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (
            #{item.schemeName},
            #{item.policyDateStart},
            #{item.policyDateEnd},
            #{item.productCodeId},
            #{item.planCodeId},
            #{item.partnerPid},
            #{item.policyNo},
            #{item.type},
            #{item.currency},
            #{item.totalPremium},
            #{item.status},
            #{item.policyFile},
            #{item.kitUrl},
            #{item.insureApplicantId},
            #{item.orgCode},
            #{item.createTime},
            #{item.updateTime},
            #{item.serialNumber}
            )
        </foreach>
    </insert>


    <delete id="deleteBatch">
        delete from insure_policy where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

    <select id="policyList" resultType="cn.timer.api.dto.insure.PolicyDto">
        SELECT
        ip.id AS id,
        ip.policy_no AS policyNo,
        ip.create_time as createTime,
        ipp.name AS schemeName,
        qy.`name` as `name`,
        count( iu.id ) AS totalUser,
        ip.policy_date_start as policyDateStart,
        ip.policy_date_end as policyDateEnd,
        sum(iu.price) AS totalPremium,
        ip.update_time AS updateTime,
        ip.`status` as `status`,
        ip.org_code as orgCode,
        ip.pay_id   as payId,
        ip.serial_number   as serialNumber,
               ip.policy_file as policyFile
        FROM
        insure_policy ip
        LEFT JOIN insure_user iu ON iu.policy_id = ip.id
        LEFT JOIN qyzx_ent_info_m qy on qy.id=ip.org_code
        LEFT JOIN insure_product_plan ipp ON iu.product_plan_id = ipp.id
        <where>
            <if test="policy.productId!=null and policy.productId!=''">
                and ip.product_id = #{policy.productId}
            </if>
            <if test="policy.status!=null and policy.status!=''">
                and ip.status = #{policy.status}
            </if>
            <if test="policy.orgCode!=null and policy.orgCode!=''">
                and ip.org_code = #{policy.orgCode}
            </if>
            <if test="policy.benefitBasicPlan!=null and policy.benefitBasicPlan!=''">
                and iu.product_plan_id = #{policy.benefitBasicPlan}
            </if>
            <if test="policy.policyDateStart!=null and policy.policyDateStart!=''">
                and ip.policy_date_start <![CDATA[ >= ]]> #{policy.policyDateStart}
            </if>
            <if test="policy.companyName!=null and policy.companyName!=''">
                and qy.name like CONCAT('%',#{policy.companyName},'%')
            </if>
            <if test="policy.policyNo!=null and policy.policyNo!=''">
                and ip.policy_no like CONCAT('%',#{policy.policyNo},'%')
            </if>
        </where>
        GROUP BY ip.id
        order by ip.create_time desc
        <if test="policy.page.offset != null and policy.page.totalPage !=null">
            limit #{policy.page.offset},#{policy.page.totalPage}
        </if>
    </select>

    <select id="totalPolicy" resultType="java.lang.Integer">
        select count(ip.id)
        from insure_policy ip
        <where>
            <if test="policy.productId!=null and policy.productId!=''">
                and ip.product_id = #{policy.productId}
            </if>
            <if test="policy.status!=null and policy.status!=''">
                and ip.status = #{policy.status}
            </if>
            <if test="policy.orgCode!=null and policy.orgCode!=''">
                and ip.org_code = #{policy.orgCode}
            </if>
            <if test="policy.policyDateStart!=null and policy.policyDateStart!=''">
                and ip.policy_date_start <![CDATA[ >= ]]> #{policy.policyDateStart}
            </if>
            <if test="policy.companyName!=null and policy.companyName!=''">
                and qy.name like CONCAT('%',#{policy.companyName},'%')
            </if>
            <if test="policy.policyNo!=null and policy.policyNo!=''">
                and ip.policy_no like CONCAT('%',#{policy.policyNo},'%')
            </if>
        </where>

    </select>

    <select id="getPolicyDetail" resultType="cn.timer.api.dto.insure.PolicyDto">
        SELECT
            ip.id as id,
            ip.scheme_name as schemeName,
            ip.policy_date_start as policyDateStart,
            ip.policy_date_end as policyDateEnd,
            ip.policy_no as policyNo,
            ip.org_code as orgCode,
            iu.insured_name as insuredName,
            iu.product_plan_id as benefitBasicPlan,
            iu.benefit_occupation_category as  benefitOccupationCategory,
            iu.product_plan_id as productPlanId,
            ip.policy_pay_type as policyPayType,
            ip.product_id as productId,
            iu.product_plan_id as productPlanId,
            ipp.name as name
        FROM
            insure_policy ip
                LEFT JOIN insure_user iu ON iu.policy_id = ip.id
                left join insure_product_plan ipp on ipp.id=iu.product_plan_id
        WHERE
            ip.id = #{id}
            LIMIT 1
    </select>

    <select id="policyTotalList" resultType="cn.timer.api.dto.insure.PolicyDto">
        SELECT
            ip.id AS id,
            ip.NAME AS schemeName,
            ip.type AS type,
            (select count(id) from insure_policy WHERE product_id=ip.id ) AS totaPolicy,
            (select count(org_code) from insure_policy WHERE product_id=ip.id) as totalCompany,
            count( iu.id ) AS totalUser,
            sum( iu.price ) AS totalPremium,
            ipp.update_time AS updateTime,
               ip.tmp_url as tmpUrl
        FROM
            insure_product ip
                LEFT JOIN insure_policy ipp ON ipp.product_id = ip.id and ipp.`status`=1
                LEFT JOIN insure_user iu ON iu.policy_id = ipp.id
        WHERE
            ip.is_del = 0
        GROUP BY
            ip.id
    </select>

    <select id="selectPolicyListByorgCode" resultType="cn.timer.api.dto.insure.InsureUserDto">
        SELECT
            ip.product_id as productId,
            ip.id as id,
            ip.policy_no as policyNo,
            ir.name,
            ip.update_time as updateTime
        FROM
            insure_policy ip
                LEFT JOIN insure_product ir on ir.id=ip.product_id
        WHERE ip.org_code=#{orgCode}
        <if test="policy.policyNo !=null and policy.policyNo!=''">
                and ip.policy_no = #{policy.policyNo}
        </if>
        order by ip.update_time desc
        <if test="policy.page.offset != null and policy.page.totalPage != null">
            limit #{policy.page.offset}, #{policy.page.totalPage}
        </if>
    </select>

    <select id="selectPolicyTotalByorgCode" resultType="java.lang.Integer">
        SELECT
           count(ip.id)
        FROM
            insure_policy ip
                LEFT JOIN insure_product ir on ir.id=ip.product_id
        WHERE ip.org_code=#{orgCode}
        <if test="policy.policyNo !=null and policy.policyNo!=''">
            and ip.policy_no = #{policy.policyNo}
        </if>
    </select>


    <select id="selectPlansTotalByorgCode" resultType="java.lang.Integer">
        SELECT
            count(ip.id)
        FROM
            insure_policy ip
                LEFT JOIN insure_user iu ON iu.policy_id = ip.id
        WHERE ip.org_code=#{orgCode}
    </select>

    <select id="selectPolicyListByStatus" resultType="cn.timer.api.bean.insure.InsurePolicy">
        select * from insure_policy
        where status = 1 and
        policy_date_end <![CDATA[ < ]]> #{date}
    </select>
</mapper>