DeviceMapper.xml 10.1 KB
<?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="org.thingsboard.server.dao.yunteng.mapper.DeviceMapper">
    <resultMap type="org.thingsboard.server.common.data.yunteng.dto.DeviceDTO" id="deviceMap">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="deviceInfo" column="device_info"
                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
        <result property="profileId" column="profile_id"/>
        <result property="activeTime" column="active_time"/>
        <result property="deviceType" column="device_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="tbDeviceId" column="tb_device_id"/>
        <result property="label" column="label"/>
        <result property="alarmStatus" column="alarm_status"/>
        <result property="deviceState" column="status" />
        <result property="statusTime" column="status_time"/>
        <result property="lastOnlineTime" column="last_online_time"/>
        <result property="lastOfflineTime" column="last_offline_time"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="creator" column="creator"/>
        <result property="updater" column="updater"/>
        <result property="description" column="description"/>
        <result property="customerId" column="customer_id"/>
        <result property="organizationId" column="organization_id"/>
        <result property="gatewayId" column="gateway_id"/>
        <result property="gatewayName" column="gateway_name"/>
        <association property="deviceProfile" javaType="org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO">
            <result property="name" column="profile_name"/>
            <result property="transportType" column="transport_type"/>
        </association>
        <association property="organizationDTO" javaType="org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO">
            <result property="name" column="organization_name"/>
        </association>
    </resultMap>
    <resultMap id="relationDeviceMap" type="org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO">
        <result property="tbDeviceId" column="id"/>
        <result property="tbDeviceName" column="name"/>
        <result property="label" column="label"/>
        <result property="deviceState" column="status" />
        <result property="createdTime" column="created_time"/>
        <result property="lastOnlineTime" column="last_online_time"/>
    </resultMap>

    <sql id="basicColumns">
        ifd.id,ifd.name,ifd.device_info,ifd.profile_id,ifd.active_time,ifd.tenant_id,ifd.description
        ,ifd.tb_device_id,ifd.label,ifd.last_connect_time,ifd.device_type,ifd.device_state,ifd.create_time,ifd.update_time,ifd.creator,
        ifd.updater,ifd.organization_id,ifd.alarm_status
    </sql>
    <sql id="detailColumns">
        <include refid="basicColumns"/>
        ,ifd.gateway_id,idg.name gateway_name
        ,ifdp.name AS profile_name,ifdp.transport_type
        ,io.name AS organization_name
    </sql>
    <sql id="pageColumns">
        <include refid="basicColumns"/>
        ,ifdp.name AS profile_name,ifdp.transport_type
        ,io.name AS organization_name
        ,a.bool_v status,a.last_update_ts status_time,b.long_v last_online_time,c.long_v last_offline_time
    </sql>
    <select id="getDevicePage" resultMap="deviceMap">
        SELECT
        <include refid="pageColumns"/>,d.customer_id::TEXT AS customer_id
        FROM iotfs_device ifd
        LEFT JOIN device_profile ifdp ON ifd.profile_id = ifdp.id::TEXT
        LEFT JOIN iotfs_organization io ON io.id = ifd.organization_id
        LEFT JOIN  attribute_kv a ON ifd.tb_device_id =  a.entity_id::TEXT AND a.entity_type ='DEVICE' AND a.attribute_key='active'
        LEFT JOIN  attribute_kv b ON ifd.tb_device_id =  b.entity_id::TEXT AND b.entity_type ='DEVICE' AND b.attribute_key='lastActivityTime'
        LEFT JOIN  attribute_kv c ON ifd.tb_device_id =  c.entity_id::TEXT AND c.entity_type ='DEVICE' AND c.attribute_key='inactivityAlarmTime'
        LEFT JOIN device d ON d.id::TEXT = ifd.tb_device_id
        <where>
            <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">
                AND ifd.tenant_id = #{queryMap.tenantId}
            </if>
            <if test="queryMap.profileId !=null and queryMap.profileId !=''">
                AND ifd.profile_id = #{queryMap.profileId}
            </if>
            <if test="queryMap.name !=null and queryMap.name !=''">
                AND ifd.name LIKE concat('%',#{queryMap.name}::TEXT,'%')
            </if>
            <if test="queryMap.deviceType !=null and queryMap.deviceType !=''">
                AND ifd.device_type = #{queryMap.deviceType}
            </if>
            <if test="queryMap.deviceState !=null">
                AND a.bool_v = #{queryMap.deviceState}
                AND b.long_v IS NOT NULL
            </if>
            <if test="queryMap.activeState !=null">
                AND b.long_v IS NULL
            </if>
            <if test="queryMap.customerId !=null">
                AND d.customer_id::TEXT =  #{queryMap.customerId}
            </if>
            <if test="queryMap.alarmStatus !=null">
                AND ifd.alarm_status = #{queryMap.alarmStatus}
            </if>
            <if test="queryMap.organizationIds !=null">
                AND ifd.organization_id IN
                <foreach collection="queryMap.organizationIds" item="organizationId" open="(" separator="," close=")">
                    #{organizationId}
                </foreach>
            </if>
        </where>
    </select>


    <select id="selectDetail" resultMap="deviceMap">
        SELECT
        <include refid="detailColumns"/>
        FROM iotfs_device ifd
        LEFT JOIN device_profile ifdp ON ifd.profile_id = CAST (ifdp.id AS VARCHAR)
        LEFT JOIN iotfs_organization io ON io.id = ifd.organization_id
        LEFT JOIN iotfs_device idg ON idg.id = ifd.gateway_id
        <where>
            <if test="tenantId !=null and tenantId !=''">
                AND ifd.tenant_id = #{tenantId}
            </if>
            <if test="id !=null and id !=''">
                AND ifd.id = #{id}
            </if>

        </where>
    </select>
    <select id="findGateWayDeviceByTbDeviceId" resultMap="deviceMap">
        SELECT
        <include refid="basicColumns"/>
        FROM iotfs_device ifd
        LEFT JOIN relation rl ON ifd.tb_device_id = rl.from_id :: TEXT
        WHERE
          rl.to_id ::TEXT = #{tbDeviceId}
          AND rl.relation_type_group = 'COMMON' AND rl.relation_type = 'Created'
          AND rl.from_type = 'DEVICE' AND rl.to_type = 'DEVICE'
    </select>

    <update id="freshAlarmStatus" >
        UPDATE iotfs_device
        SET  alarm_status=#{created}
        WHERE tb_device_id = #{tbDeviceId}
    </update>

    <select id="findDevices" resultMap="deviceMap">
        SELECT
                ifd.ID,
                ifd.NAME,
                ifd.tenant_id,
                ifd.organization_id,
                ifd.create_time,
                ifdp.NAME AS profile_name,
                io.NAME AS organization_name,
                A.bool_v status,
                b.long_v last_online_time,
                d.customer_id :: TEXT AS customer_id
        FROM
                iotfs_device ifd
                        LEFT JOIN device_profile ifdp ON ifd.profile_id = ifdp.ID ::
	TEXT LEFT JOIN iotfs_organization io ON io.ID = ifd.organization_id
                LEFT JOIN attribute_kv A ON ifd.tb_device_id = A.entity_id :: TEXT
                AND A.entity_type = 'DEVICE'
                AND A.attribute_key = 'active'
                LEFT JOIN attribute_kv b ON ifd.tb_device_id = b.entity_id :: TEXT
                AND b.entity_type = 'DEVICE'
                AND b.attribute_key = 'lastActivityTime'
                LEFT JOIN attribute_kv C ON ifd.tb_device_id = C.entity_id :: TEXT
                AND C.entity_type = 'DEVICE'
                AND C.attribute_key = 'inactivityAlarmTime'
                LEFT JOIN device d ON d.ID :: TEXT = ifd.tb_device_id
        <where>
            <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">
                AND ifd.tenant_id = #{queryMap.tenantId}
            </if>
            <if test="queryMap.customerId !=null and queryMap.customerId !=''">
                AND d.customer_id = #{queryMap.customerId}
            </if>
        </where>
    </select>
    <select id="getRelationDevicePage" resultMap="relationDeviceMap">
        SELECT
        de.id,
        de.name,
        de.label,
        de.created_time,
        A.bool_v AS status,
        b.long_v AS last_online_time
        FROM
        device de
        LEFT JOIN relation rt ON de."id" = rt.to_id
        LEFT JOIN attribute_kv A ON de."id" = A.entity_id
        AND A.entity_type = 'DEVICE'
        AND A.attribute_key = 'active'
        LEFT JOIN attribute_kv b ON de."id" = b.entity_id
        AND b.entity_type = 'DEVICE'
        AND b.attribute_key = 'lastActivityTime'
        <where>
           rt.from_id ::TEXT = #{queryMap.fromId}
           AND de.tenant_id ::TEXT = #{queryMap.tenantId}
           <if test="queryMap.customerId !=null and queryMap.customerId !=''">
               AND de.customer_id ::TEXT = #{queryMap.customerId}
           </if>
            <if test="queryMap.name !=null and queryMap.name !=''">
                AND de.name LIKE concat('%',#{queryMap.name}::TEXT,'%')
            </if>
            <if test="queryMap.deviceState !=null">
                AND A.bool_v = #{queryMap.deviceState}
                AND b.long_v IS NOT NULL
            </if>
            <if test="queryMap.activeState !=null">
                AND b.long_v IS NULL
            </if>
        </where>
    </select>
    <select id="findDeviceIdsByCustomerId" resultType="java.lang.String">
        SELECT idi.tb_device_id FROM iotfs_device idi LEFT JOIN device d ON d.id::TEXT = idi.tb_device_id
        WHERE customer_id::TEXT = #{customerId}
    </select>
</mapper>