<?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.zg.project.wisdom.mapper.RkBillMapper">

    <!-- ==================== ResultMap ==================== -->
    <resultMap type="RkBill" id="RkBillResult">
        <result property="id" column="id"/>

        <result property="wlType" column="wl_type"/>
        <result property="wlTypeName" column="wl_type_name"/>

        <result property="cangku" column="cangku"/>
        <result property="warehouseName" column="warehouse_name"/>
        <result property="parentWarehouseName" column="parent_warehouse_name"/>

        <result property="billNo" column="bill_no"/>

        <result property="operationType" column="operation_type"/>
        <result property="operationTypeName" column="operation_type_name"/>

        <result property="bizType" column="biz_type"/>
        <result property="operationTime" column="operation_time"/>
        <result property="execStatus" column="exec_status"/>

        <result property="operator" column="operator"/>
        <result property="operatorName" column="operator_name"/>

        <result property="teamCode" column="team_code"/>
        <result property="teamName" column="team_name"/>

        <result property="borrowTime" column="borrow_time"/>
        <result property="returnTime" column="return_time"/>

        <result property="xmNoCk" column="xm_no_ck"/>
        <result property="xmMsCk" column="xm_ms_ck"/>

        <result property="remark" column="remark"/>
        <result property="isDelivery" column="is_delivery"/>
        <result property="isDelete" column="is_delete"/>

        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>

    <!-- ==================== Base Select ==================== -->
    <sql id="selectRkBillVo">
        SELECT
            rb.id,
            rb.wl_type,
            rb.cangku,
            rb.bill_no,
            rb.operation_type,
            rb.biz_type,
            rb.operation_time,
            rb.exec_status,
            rb.operator,
            rb.team_code,

            rb.borrow_time,
            rb.return_time,
            rb.xm_no_ck,
            rb.xm_ms_ck,

            rb.remark,
            rb.is_delivery,
            rb.is_delete,
            rb.create_by,
            rb.create_time,
            rb.update_by,
            rb.update_time,

            mt.type_name AS wl_type_name,
            COALESCE(sit.type_name, sot.type_name) AS operation_type_name,
            su.nick_name AS operator_name,
            wh.warehouse_name AS warehouse_name,
            wh.parent_warehouse_name AS parent_warehouse_name,
            ct.team_name AS team_name

        FROM rk_bill rb
                 LEFT JOIN warehouse_info wh
                           ON rb.cangku = wh.warehouse_code
                               AND wh.status = 1
                 LEFT JOIN material_type mt
                           ON rb.wl_type = mt.type_code
                               AND mt.status = 1
                 LEFT JOIN stock_in_type sit
                           ON rb.operation_type = sit.type_code
                               AND sit.status = 1
                 LEFT JOIN stock_out_type sot
                           ON rb.operation_type = sot.type_code
                               AND (sot.is_delete = '0' OR sot.is_delete IS NULL)
                 LEFT JOIN sys_user su
                           ON rb.operator = su.user_id
                 LEFT JOIN construction_team ct
                           ON rb.team_code = ct.team_code
                               AND ct.is_delete = '0'
    </sql>

    <!-- ==================== List ==================== -->
    <select id="selectRkBillList" parameterType="RkBill" resultMap="RkBillResult">
        <include refid="selectRkBillVo"/>
        <where>

            <if test="wlType != null and wlType != ''">
                AND rb.wl_type = #{wlType}
            </if>

            <if test="cangku != null and cangku != ''">
                AND rb.cangku = #{cangku}
            </if>

            <if test="billNo != null and billNo != ''">
                AND rb.bill_no = #{billNo}
            </if>

            <if test="operationType != null and operationType != ''">
                AND rb.operation_type = #{operationType}
            </if>

            <if test="bizTypeList != null and bizTypeList.size > 0">
                AND rb.biz_type IN
                <foreach collection="bizTypeList" item="bt" open="(" separator="," close=")">
                    #{bt}
                </foreach>
            </if>

            <if test="borrowTime != null">
                AND rb.borrow_time = #{borrowTime}
            </if>

            <if test="returnTime != null">
                AND rb.return_time = #{returnTime}
            </if>

            <if test="xmNoCk != null and xmNoCk != ''">
                AND rb.xm_no_ck = #{xmNoCk}
            </if>

            <if test="startDate != null">
                AND rb.operation_time &gt;= #{startDate}
            </if>

            <if test="endDate != null">
                AND rb.operation_time &lt;= #{endDate}
            </if>

            <if test="execStatus != null and execStatus != ''">
                AND rb.exec_status = #{execStatus}
            </if>

            <if test="operator != null">
                AND rb.operator = #{operator}
            </if>

            <if test="teamCode != null and teamCode != ''">
                AND rb.team_code = #{teamCode}
            </if>

            <if test="isDelivery != null and isDelivery != ''">
                AND rb.is_delivery = #{isDelivery}
            </if>

            <if test="isDelete != null and isDelete != ''">
                AND rb.is_delete = #{isDelete}
            </if>

        </where>
        ORDER BY rb.exec_status ASC, rb.operation_time DESC
    </select>

    <!-- ==================== Detail ==================== -->
    <select id="selectRkBillById" parameterType="Long" resultMap="RkBillResult">
        <include refid="selectRkBillVo"/>
        WHERE rb.id = #{id}
    </select>

    <select id="selectByBillNo" parameterType="String" resultMap="RkBillResult">
        SELECT
            id,
            wl_type,
            cangku,
            bill_no,
            operation_type,
            biz_type,
            operation_time,
            exec_status,
            operator,
            team_code,
            borrow_time,
            return_time,
            xm_no_ck,
            xm_ms_ck,
            is_delivery,
            remark,
            create_by,
            create_time,
            update_by,
            update_time,
            is_delete
        FROM rk_bill
        WHERE bill_no = #{billNo}
          AND (is_delete = '0' OR is_delete IS NULL)
            LIMIT 1
    </select>

    <!-- ==================== Insert ==================== -->
    <insert id="insertRkBill"
            parameterType="com.zg.project.wisdom.domain.RkBill"
            useGeneratedKeys="true"
            keyProperty="id">
        INSERT INTO rk_bill (
            bill_no,
            biz_type,
            wl_type,
            cangku,
            operation_type,
            operation_time,
            operator,
            team_code,
            borrow_time,
            return_time,
            xm_no_ck,
            xm_ms_ck,
            exec_status,
            is_delivery,
            remark,
            create_by,
            create_time,
            is_delete
        ) VALUES (
                     #{billNo},
                     #{bizType},
                     #{wlType},
                     #{cangku},
                     #{operationType},
                     #{operationTime},
                     #{operator},
                     #{teamCode},
                     #{borrowTime},
                     #{returnTime},
                     #{xmNoCk},
                     #{xmMsCk},
                     #{execStatus},
                     #{isDelivery},
                     #{remark},
                     #{createBy},
                     #{createTime},
                     #{isDelete}
                 )
    </insert>

    <!-- ==================== Update ==================== -->
    <update id="updateRkBill" parameterType="RkBill">
        UPDATE rk_bill
        <trim prefix="SET" suffixOverrides=",">
            <if test="wlType != null and wlType != ''">wl_type = #{wlType},</if>
            <if test="cangku != null and cangku != ''">cangku = #{cangku},</if>
            <if test="billNo != null and billNo != ''">bill_no = #{billNo},</if>
            <if test="operationType != null and operationType != ''">operation_type = #{operationType},</if>
            <if test="bizType != null and bizType != ''">biz_type = #{bizType},</if>
            <if test="operationTime != null">operation_time = #{operationTime},</if>
            <if test="borrowTime != null">borrow_time = #{borrowTime},</if>
            <if test="returnTime != null">return_time = #{returnTime},</if>
            <if test="xmNoCk != null and xmNoCk != ''">xm_no_ck = #{xmNoCk},</if>
            <if test="xmMsCk != null and xmMsCk != ''">xm_ms_ck = #{xmMsCk},</if>
            <if test="execStatus != null and execStatus != ''">exec_status = #{execStatus},</if>
            <if test="operator != null">operator = #{operator},</if>
            <if test="teamCode != null and teamCode != ''">team_code = #{teamCode},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="isDelivery != null and isDelivery != ''">is_delivery = #{isDelivery},</if>
            <if test="isDelete != null and isDelete != ''">is_delete = #{isDelete},</if>
        </trim>
        WHERE id = #{id}
    </update>

    <!-- ==================== ExecStatus ==================== -->
    <update id="updateExecStatusByBillNo">
        UPDATE rk_bill
        SET exec_status = #{execStatus}
        WHERE bill_no = #{billNo}
    </update>

    <update id="updateExecStatus">
        UPDATE rk_bill
        SET exec_status = #{execStatus}
        WHERE bill_no = #{billNo}
    </update>

    <!-- ==================== Delete ==================== -->
    <delete id="deleteRkBillById" parameterType="Long">
        DELETE FROM rk_bill WHERE id = #{id}
    </delete>

    <delete id="deleteRkBillByIds">
        DELETE FROM rk_bill
        WHERE id IN
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

</mapper>
