<?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.AuditSignatureMapper">

    <!-- 主记录映射 -->
    <resultMap type="com.zg.project.wisdom.domain.AuditSignature" id="AuditSignatureResult">
        <result property="id" column="id" />
        <result property="billNo" column="bill_no" />
        <result property="rkId" column="rk_id" />
        <result property="billType" column="bill_type" />
        <result property="signerId" column="signer_id" />
        <result property="signerRole" column="signer_role" />
        <result property="signUrl" column="sign_url" />
        <result property="signTime" column="sign_time" />
        <result property="pcode" column="pcode" />
        <result property="trayCode" column="tray_code" />
        <result property="approverId" column="approver_id" />
        <result property="approverSignUrl" column="approver_sign_url" />
        <result property="auditResult" column="audit_result" />
        <result property="imageType" column="image_type" />
        <result property="isCurrent" column="is_current" />
        <result property="remark" column="remark" />
        <result property="createBy" column="create_by" />
        <result property="createTime" column="create_time" />
        <result property="updateBy" column="update_by" />
        <result property="updateTime" column="update_time" />
        <result property="isDelete" column="is_delete" />
    </resultMap>

    <!-- VO对象映射（带扩展字段） -->
    <resultMap id="AuditSignatureVoResult"
               type="com.zg.project.wisdom.domain.vo.AuditSignatureVo"
               extends="AuditSignatureResult">
        <result column="xmNo" property="xmNo"/>
        <result column="xmMs" property="xmMs"/>
        <result column="wlMs" property="wlMs"/>
        <result column="gysMc" property="gysMc"/>
        <result column="wlNo" property="wlNo"/>
        <result column="realQty" property="realQty"/>
        <result column="dw" property="dw"/>
        <result column="pcode" property="pcode"/>
        <result column="rkRemark" property="rkRemark"/>
    </resultMap>

    <sql id="selectAuditSignatureVo">
        select id, bill_no,rk_id, bill_type, signer_id, signer_role, sign_url, sign_time, pcode, tray_code, approver_id, approver_sign_url, audit_result, image_type, is_current, remark, create_by, create_time, update_by, update_time, is_delete from audit_signature
    </sql>

    <select id="selectAuditSignatureList" parameterType="AuditSignature" resultMap="AuditSignatureResult">
        <include refid="selectAuditSignatureVo"/>
        <where>  
            <if test="billNo != null  and billNo != ''"> and bill_no = #{billNo}</if>
            <if test="billType != null  and billType != ''"> and bill_type = #{billType}</if>
            <if test="signerId != null  and signerId != ''"> and signer_id = #{signerId}</if>
            <if test="signerRole != null  and signerRole != ''"> and signer_role = #{signerRole}</if>
            <if test="signUrl != null  and signUrl != ''"> and sign_url = #{signUrl}</if>
            <if test="signTime != null "> and sign_time = #{signTime}</if>
            <if test="pcode != null  and pcode != ''"> and pcode = #{pcode}</if>
            <if test="trayCode != null  and trayCode != ''"> and tray_code = #{trayCode}</if>
            <if test="approverId != null  and approverId != ''"> and approver_id = #{approverId}</if>
            <if test="approverSignUrl != null  and approverSignUrl != ''"> and approver_sign_url = #{approverSignUrl}</if>
            <if test="auditResult != null  and auditResult != ''"> and audit_result = #{auditResult}</if>
            <if test="imageType != null  and imageType != ''"> and image_type = #{imageType}</if>
            <if test="isCurrent != null  and isCurrent != ''"> and is_current = #{isCurrent}</if>
            <if test="isDelete != null  and isDelete != ''"> and is_delete = #{isDelete}</if>
        </where>
    </select>
    
    <select id="selectAuditSignatureById" parameterType="Long" resultMap="AuditSignatureResult">
        <include refid="selectAuditSignatureVo"/>
        where id = #{id}
    </select>

    <select id="countPendingByUser" resultType="int">
        SELECT COUNT(1)
        FROM audit_signature
        WHERE is_delete = '0'
          AND approver_id = #{approverId}
          AND audit_result = '2'
          AND signer_role = '0'
    </select>

    <select id="existsCurrentSigner" resultType="boolean">
        SELECT COUNT(1)
        FROM audit_signature
        WHERE bill_no = #{billNo}
          AND signer_role = #{signerRole}
          AND is_current = '1'
          AND is_delete = '0'
    </select>

    <select id="selectPhotoUrlByRkId" resultMap="AuditSignatureResult" parameterType="java.lang.Long">
        SELECT sign_url, audit_result
        FROM audit_signature
        WHERE is_delete = '0'
        AND rk_id = #{rkId}
        AND image_type = '1'
        AND audit_result = '1'
        AND is_current = '1'
        ORDER BY create_time DESC
        LIMIT 1
    </select>

    <!-- 查询主记录列表（审批记录） signer_role=1 image_type=0 -->
    <select id="selectAuditMainList" parameterType="com.zg.project.wisdom.domain.AuditSignature" resultMap="AuditSignatureResult">
        SELECT * FROM audit_signature
        <where>
            AND signer_role = '0'
            AND image_type = '0'
            <if test="billNo != null and billNo != ''">AND bill_no = #{billNo}</if>
            <if test="billType != null and billType != ''">AND bill_type = #{billType}</if>
            <if test="auditResult != null and auditResult != ''">AND audit_result = #{auditResult}</if>
            <if test="approverId != null and approverId != ''">AND approver_id = #{approverId}</if>
            <if test="isDelete != null and isDelete != ''">AND is_delete = #{isDelete}</if>
        </where>
    </select>

    <!-- 查询关联入库信息的现场照片 -->
    <select id="selectScenePhotosWithGoodsByBillNo"
            parameterType="String"
            resultMap="AuditSignatureVoResult">
        SELECT
            a.id,
            a.rk_id,
            a.bill_no,
            a.sign_url,
            a.sign_time,
            a.signer_role,
            a.image_type,
            a.tray_code,
            a.is_delete,
            a.remark AS remark,

            r.xm_no    AS xmNo,
            r.xm_ms    AS xmMs,
            r.wl_ms    AS wlMs,
            r.gys_mc   AS gysMc,
            r.wl_no    AS wlNo,
            r.real_qty AS realQty,
            r.dw       AS dw,
            r.pcode    AS pcode,
            r.remark   AS rkRemark
        FROM audit_signature a
                 LEFT JOIN rk_info r ON a.rk_id = r.id
        WHERE a.bill_no = #{billNo}
          AND a.signer_role = '2'
          AND a.image_type = '1'
          AND a.is_delete = '0'
    </select>

    <select id="selectAuditMainListBySubmitter" parameterType="AuditSignature" resultMap="AuditSignatureResult">
        <include refid="selectAuditSignatureVo"/>
        <where>
            and signer_id = #{signerId}
            and signer_role in ('0', '2')
            and image_type = '0'
            and is_delete = '0'
            <if test="billNo != null and billNo != ''"> and bill_no = #{billNo}</if>
            <if test="billType != null and billType != ''"> and bill_type = #{billType}</if>
        </where>
    </select>

    <insert id="batchInsert" parameterType="java.util.List">
        INSERT INTO audit_signature (
        bill_no,
        bill_type,
        signer_id,
        signer_role,
        sign_url,
        sign_time,
        image_type,
        approver_id,
        audit_result,
        is_current,
        is_delete,
        create_by,
        create_time,
        rk_id,
        pcode,
        tray_code
        )
        VALUES
        <foreach collection="list" item="item" separator=",">
            (
            #{item.billNo},
            #{item.billType},
            #{item.signerId},
            #{item.signerRole},
            #{item.signUrl},
            #{item.signTime},
            #{item.imageType},
            #{item.approverId},
            #{item.auditResult},
            #{item.isCurrent},
            #{item.isDelete},
            #{item.createBy},
            #{item.createTime},
            #{item.rkId},
            #{item.pcode},
            #{item.trayCode}
            )
        </foreach>
    </insert>

    <update id="updateAuditSignature" parameterType="AuditSignature">
        UPDATE audit_signature
        <set>
            <if test="auditResult != null">audit_result = #{auditResult},</if>
            <if test="approverSignUrl != null">approver_sign_url = #{approverSignUrl},</if>
            <if test="approverId != null">approver_id = #{approverId},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="isCurrent != null">is_current = #{isCurrent},</if>
        </set>
        WHERE bill_no = #{billNo}
        AND is_current = '1'
        AND is_delete = '0'
    </update>

    <update id="updateIsCurrentToZero">
        UPDATE audit_signature
        SET is_current = '0',
            update_time = NOW()
        WHERE bill_no = #{billNo}
          AND signer_role = #{signerRole}
          AND is_current = '1'
          AND is_delete = '0'
    </update>

    <update id="approveAuditByBillNo" parameterType="AuditSignature">
        UPDATE audit_signature
        <set>
            <if test="auditResult != null"> audit_result = #{auditResult},</if>
            <if test="approverSignUrl != null"> approver_sign_url = #{approverSignUrl},</if>
            <if test="remark != null"> remark = #{remark},</if>
            <if test="updateBy != null"> update_by = #{updateBy},</if>
            <if test="updateTime != null"> update_time = #{updateTime},</if>
        </set>
        WHERE bill_no = #{billNo}
        AND signer_role = '1'
        AND is_delete = '0'
        AND is_current = '1'
    </update>

    <delete id="deleteAuditSignatureById" parameterType="Long">
        delete from audit_signature where id = #{id}
    </delete>

    <delete id="deleteAuditSignatureByIds" parameterType="String">
        delete from audit_signature where id in 
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>