<?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.psbc.cpsp.eden.mapper.asset.AssetLocationMapper">
    <resultMap id="BaseResultMap" type="com.psbc.cpsp.eden.common.entity.AssetLocation">
        <id column="id" property="id"/>
        <result column="location_code" property="locationCode"/>
        <result column="location_name" property="locationName"/>
        <result column="parent_id" property="parentId"/>
        <result column="status" property="status"/>
        <result column="remark" property="remark"/>
        <result column="create_user_id" property="createUserId"/>
        <result column="create_time" property="createTime"/>
        <result column="del_flag" property="delFlag"/>
        <result column="last_mod_user_id" property="lastModUserId"/>
        <result column="last_mod_time" property="lastModTime"/>
        <result column="tenant_id" property="tenantId"/>
    </resultMap>

    <resultMap id="TreeResultMap" type="com.psbc.cpsp.eden.common.vo.TreeNode">
        <id column="id" property="id"/>
        <result column="location_name" property="label"/>
        <result column="parent_id" property="parentId"/>
        <result column="has_children" property="hasChildren"/>
        <result column="location_code" property="code"/>
    </resultMap>

    <sql id="Base_Column_List">
        "id", "location_code", "location_name", "parent_id", "status", "remark",
        "create_user_id", "create_time", "del_flag", "last_mod_user_id", "last_mod_time", "tenant_id"
    </sql>

    <!-- 新增资产位置 -->
    <insert id="insert" parameterType="com.psbc.cpsp.eden.common.entity.AssetLocation" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO "tb_asset_location" (
            "location_code", "location_name", "parent_id", "status", "remark",
            "create_user_id", "create_time", "del_flag", "last_mod_user_id", "last_mod_time"
        ) VALUES (
            #{locationCode}, #{locationName}, #{parentId}, #{status}, #{remark},
            #{createUserId}, #{createTime}, #{delFlag}, #{lastModUserId}, #{lastModTime}
        )
    </insert>

    <!-- 修改资产位置 -->
    <update id="update" parameterType="com.psbc.cpsp.eden.common.entity.AssetLocation">
        UPDATE "tb_asset_location"
        <set>
            "location_code" = #{locationCode},
            "location_name" = #{locationName},
            "parent_id" = #{parentId},
            "status" = #{status},
            "remark" = #{remark},
            "last_mod_user_id" = #{lastModUserId},
            "last_mod_time" = #{lastModTime}
        </set>
        WHERE "id" = #{id}  AND "del_flag" = '0'
    </update>
    
    <!-- 更新资产位置状态 -->
    <update id="updateStatus">
        UPDATE "tb_asset_location" 
        SET "status" = #{status},
            "last_mod_user_id" = #{lastModUserId},
            "last_mod_time" = #{lastModTime}
        WHERE "id" = #{id} AND "del_flag" = '0'
    </update>

    <!-- 根据ID查询资产位置详情 -->
    <select id="selectById" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List" />
        FROM "tb_asset_location"
        WHERE "id" = #{id} AND "del_flag" = '0'
    </select>

    <!-- 查询资产位置列表 -->
    <select id="selectList" parameterType="com.psbc.cpsp.eden.common.entity.AssetLocation" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List" />
        FROM "tb_asset_location"
        WHERE "del_flag" = '0'
        <if test="locationCode != null and locationCode != ''">
            AND "location_code" LIKE CONCAT('%', #{locationCode}, '%')
        </if>
        <if test="locationName != null and locationName != ''">
            AND "location_name" LIKE CONCAT('%', #{locationName}, '%')
        </if>
        <if test="parentId != null">
            AND "parent_id" = #{parentId}
        </if>
        <if test="status != null and status != ''">
            AND "status" = #{status}
        </if>
        ORDER BY "location_code"
    </select>

    <!-- 逻辑删除资产位置 -->
    <update id="deleteById">
        UPDATE "tb_asset_location"
        SET "del_flag" = '1',
            "last_mod_user_id" = #{lastModUserId},
            "last_mod_time" = NOW()
        WHERE "id" = #{id} AND "del_flag" = '0'
    </update>

    <!-- 批量逻辑删除资产位置 -->
    <update id="deleteBatchIds">
        UPDATE "tb_asset_location"
        SET "del_flag" = '1',
            "last_mod_user_id" = #{lastModUserId},
            "last_mod_time" = NOW()
        WHERE "id" IN
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
        AND "del_flag" = '0'
    </update>

    <!-- 检查位置编码是否唯一 -->
    <select id="checkCodeUnique" resultType="int">
        SELECT COUNT(1)
        FROM "tb_asset_location"
        WHERE "location_code" = #{locationCode}
        AND "del_flag" = '0'
        <if test="id != null">
            AND "id" != #{id}
        </if>
    </select>

    <select id="checkNameUnique" resultType="int">
        SELECT COUNT(1)
        FROM "tb_asset_location"
        WHERE "location_name" = #{locationName}
        AND "del_flag" = '0'
        <if test="id != null">
            AND "id" != #{id}
        </if>
    </select>


    <!-- 查询资产位置树结构 -->
    <select id="selectTree" resultMap="TreeResultMap">
        SELECT 
            a."id",
            a."location_name",
            a."parent_id",
            a."location_code",
            CASE WHEN EXISTS (
                SELECT 1 FROM "tb_asset_location" b 
                WHERE b."parent_id" =a."id"
                AND b."del_flag" = '0'
            ) THEN TRUE ELSE FALSE END AS "has_children"
        FROM "tb_asset_location" a
        WHERE a."del_flag" = '0'
        <if test="locationName != null and locationName != ''">
            AND a."location_name" LIKE CONCAT('%', #{locationName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND a."status" = #{status}
        </if>
        ORDER BY a."parent_id" NULLS FIRST, a."location_code"
    </select>

    <!-- 根据父ID查询所有子节点 -->
    <select id="selectChildrenByParentId" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List" />
        FROM "tb_asset_location"
        WHERE "del_flag" = '0'
        <if test="parentId != null">
            AND "parent_id" = #{parentId}
        </if>
        ORDER BY "location_code"
    </select>

    <!-- 根据位置名称查询位置ID -->
    <select id="selectIdByName" resultType="java.lang.Long">
        SELECT "id"
        FROM "tb_asset_location"
        WHERE "location_name" = #{locationName}
        AND "del_flag" = '0'
    </select>

    <!-- 检查位置名称是否存在 -->
    <select id="checkLocationNameExists" resultType="boolean">
        SELECT COUNT(1) > 0
        FROM "tb_asset_location"
        WHERE "location_name" = #{locationName}
        AND "del_flag" = '0'
    </select>
</mapper>