You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

293 lines
12 KiB

<?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.techsor.datacenter.business.dao.ex.LevelMapperExt">
<!-- 根据levelType选择对应的表名 -->
<sql id="selectTable">
<choose>
<when test="levelType == 1">dashboard_level_branch</when>
<when test="levelType == 2">dashboard_level_store</when>
<when test="levelType == 3">dashboard_level_area</when>
<when test="levelType == 4">dashboard_level_site</when>
</choose>
</sql>
<sql id="selectParentTable">
<choose>
<when test="levelType == 2">dashboard_level_branch</when>
<when test="levelType == 3">dashboard_level_store</when>
<when test="levelType == 4">dashboard_level_area</when>
</choose>
</sql>
<!-- 检查级别名称是否存在 -->
<select id="checkExist" resultType="java.lang.Long">
SELECT
COUNT(1)
FROM
<include refid="selectTable" />
WHERE `flag` = 0 AND name = #{levelName} AND company_id = #{companyId}
<if test="id != null">
AND id != #{id}
</if>
</select>
<select id="countParentLevel" resultType="java.lang.Long">
SELECT
COUNT(1)
FROM
<include refid="selectParentTable" />
WHERE `flag` = 0 AND company_id = #{companyId}
AND id IN <foreach collection="parentIdList" item="item" open="(" separator="," close=")">#{item}</foreach>
</select>
<!-- 保存级别信息到对应表 -->
<insert id="saveLevel" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO
<include refid="selectTable" />
(company_id, name, remark, created_by, created_at)
VALUES
(#{companyId}, #{name}, #{remark}, #{createdBy}, #{createdAt})
</insert>
<!-- 保存级别信息到对应表 -->
<insert id="saveLevelRelation">
INSERT INTO
${tableName}
(${parentField}, ${childField}, created_by, created_at)
VALUES
(#{parentId}, #{childId}, #{createdBy}, #{createdAt})
</insert>
<delete id="deleteLevelRelation">
delete from ${tableName} WHERE ${childField} = #{childId}
</delete>
<!-- 更新级别信息到对应表 -->
<update id="updateLevel">
UPDATE
<include refid="selectTable" />
SET
name = #{name},
remark = #{remark},
updated_at = #{updatedAt},
updated_by = #{updatedBy}
WHERE id = #{id}
</update>
<select id="checkIfReferencedByChildren" resultType="java.lang.Long">
SELECT
COUNT(1)
FROM
${param.tableName}
WHERE ${param.parentField} IN <foreach collection="idList" item="item" open="(" separator="," close=")">#{item}</foreach>
</select>
<update id="deleteLevelByIdList">
UPDATE
${tableName}
SET
`flag` = 1
WHERE id IN <foreach collection="idList" item="item" open="(" separator="," close=")">#{item}</foreach>
</update>
<delete id="deleteLevelRelationByIdList">
delete from ${param.tableName}
WHERE ${param.childField}
IN <foreach collection="idList" item="item" open="(" separator="," close=")">#{item}</foreach>
</delete>
<sql id="commonField">
base.`id`,
base.company_id,
base.`name` AS levelName,
base.remark,
base.created_by,
base.created_at,
base.updated_by,
base.updated_at
</sql>
<sql id="commonWhere">
base.flag =0
<if test="idList != null and idList.size() > 0">
AND base.`id` IN <foreach collection="idList" item="item" open="(" separator="," close=")">#{item}</foreach>
</if>
<if test="levelName != null and levelName != ''">
AND base.`name` like CONCAT('%',#{levelName},'%')
</if>
<if test="parentIdList != null and parentIdList.size() > 0">
AND pa.id IN <foreach collection="parentIdList" item="item" open="(" separator="," close=")">#{item}</foreach>
</if>
<if test="companyIdList != null and companyIdList.size() > 0">
AND base.company_id IN <foreach collection="companyIdList" item="item" open="(" separator="," close=")">#{item}</foreach>
</if>
</sql>
<!-- 分页查询级别列表 -->
<select id="getListPage" resultType="com.techsor.datacenter.business.vo.level.LevelPageDTO">
<choose>
<when test="levelType == 1">
SELECT
1 AS levelType,
<include refid="commonField" />
FROM
dashboard_level_branch base
WHERE
<include refid="commonWhere" />
</when>
<when test="levelType == 2">
SELECT
2 AS levelType,
GROUP_CONCAT(pa.id) AS parentIds,
GROUP_CONCAT(pa.`name`) AS parentNames,
<include refid="commonField" />
FROM
dashboard_level_store base
LEFT JOIN dashboard_level_relation_branch_store rela ON base.`id` = rela.store_id
LEFT JOIN dashboard_level_branch pa ON rela.branch_id = pa.`id`
WHERE
<include refid="commonWhere" />
GROUP BY base.`id`
</when>
<when test="levelType == 3">
SELECT
3 AS levelType,
GROUP_CONCAT(pa.id) AS parentIds,
GROUP_CONCAT(pa.`name`) AS parentNames,
<include refid="commonField" />
FROM
dashboard_level_area base
LEFT JOIN dashboard_level_relation_store_area rela ON base.`id` = rela.area_id
LEFT JOIN dashboard_level_store pa ON rela.store_id = pa.`id`
WHERE
<include refid="commonWhere" />
GROUP BY base.`id`
</when>
<when test="levelType == 4">
SELECT
4 AS levelType,
GROUP_CONCAT(pa.id) AS parentIds,
GROUP_CONCAT(pa.`name`) AS parentNames,
<include refid="commonField" />
FROM
dashboard_level_site base
LEFT JOIN dashboard_level_relation_area_site rela ON base.`id` = rela.site_id
LEFT JOIN dashboard_level_area pa ON rela.area_id = pa.`id`
WHERE
<include refid="commonWhere" />
GROUP BY base.`id`
</when>
</choose>
order BY base.`id` desc
</select>
<select id="getBoundBuilding" resultType="java.lang.Long">
SELECT DISTINCT building_id
FROM (
-- BUILDING
SELECT b.building_id
FROM dashboard_level_role_user ru
JOIN dashboard_level_role_object ro
ON ru.level_role_id = ro.level_role_id
JOIN basic_building b
ON ro.ref_id = b.building_id
WHERE ru.user_id = #{userId}
AND ro.ref_type = 'BUILDING'
AND b.flag = 0
UNION ALL
-- SITE → BUILDING
SELECT b.building_id
FROM dashboard_level_role_user ru
JOIN dashboard_level_role_object ro
ON ru.level_role_id = ro.level_role_id
JOIN dashboard_level_site s
ON ro.ref_id = s.id AND s.flag = 0
JOIN dashboard_level_relation_site_building rsb
ON s.id = rsb.site_id
JOIN basic_building b
ON rsb.building_id = b.building_id AND b.flag = 0
WHERE ru.user_id = #{userId}
AND ro.ref_type = 'SITE'
UNION ALL
-- AREA → SITE → BUILDING
SELECT b.building_id
FROM dashboard_level_role_user ru
JOIN dashboard_level_role_object ro
ON ru.level_role_id = ro.level_role_id
JOIN dashboard_level_area a
ON ro.ref_id = a.id AND a.flag = 0
JOIN dashboard_level_relation_area_site ras
ON a.id = ras.area_id
JOIN dashboard_level_site s
ON ras.site_id = s.id AND s.flag = 0
JOIN dashboard_level_relation_site_building rsb
ON s.id = rsb.site_id
JOIN basic_building b
ON rsb.building_id = b.building_id AND b.flag = 0
WHERE ru.user_id = #{userId}
AND ro.ref_type = 'AREA'
UNION ALL
-- STORE → AREA → SITE → BUILDING
SELECT b.building_id
FROM dashboard_level_role_user ru
JOIN dashboard_level_role_object ro
ON ru.level_role_id = ro.level_role_id
JOIN dashboard_level_store st
ON ro.ref_id = st.id AND st.flag = 0
JOIN dashboard_level_relation_store_area rsa
ON st.id = rsa.store_id
JOIN dashboard_level_area a
ON rsa.area_id = a.id AND a.flag = 0
JOIN dashboard_level_relation_area_site ras
ON a.id = ras.area_id
JOIN dashboard_level_site s
ON ras.site_id = s.id AND s.flag = 0
JOIN dashboard_level_relation_site_building rsb
ON s.id = rsb.site_id
JOIN basic_building b
ON rsb.building_id = b.building_id AND b.flag = 0
WHERE ru.user_id = #{userId}
AND ro.ref_type = 'STORE'
UNION ALL
-- BRANCH → STORE → AREA → SITE → BUILDING
SELECT b.building_id
FROM dashboard_level_role_user ru
JOIN dashboard_level_role_object ro
ON ru.level_role_id = ro.level_role_id
JOIN dashboard_level_branch br
ON ro.ref_id = br.id AND br.flag = 0
JOIN dashboard_level_relation_branch_store rbs
ON br.id = rbs.branch_id
JOIN dashboard_level_store st
ON rbs.store_id = st.id AND st.flag = 0
JOIN dashboard_level_relation_store_area rsa
ON st.id = rsa.store_id
JOIN dashboard_level_area a
ON rsa.area_id = a.id AND a.flag = 0
JOIN dashboard_level_relation_area_site ras
ON a.id = ras.area_id
JOIN dashboard_level_site s
ON ras.site_id = s.id AND s.flag = 0
JOIN dashboard_level_relation_site_building rsb
ON s.id = rsb.site_id
JOIN basic_building b
ON rsb.building_id = b.building_id AND b.flag = 0
WHERE ru.user_id = #{userId}
AND ro.ref_type = 'BRANCH'
) t;
</select>
</mapper>