995 lines
44 KiB
XML
995 lines
44 KiB
XML
<?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.bonus.material.lease.mapper.MaLeaseInfoMapper">
|
||
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
|
||
insert into ma_lease_info
|
||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||
<if test="leaseName != null and leaseName != ''">lease_name,</if>
|
||
<if test="leaseCode != null and leaseCode != ''">lease_code,</if>
|
||
<if test="provinceCode != null">province_code,</if>
|
||
<if test="cityCode != null">city_code,</if>
|
||
<if test="address != null and address != ''">address,</if>
|
||
<if test="areaCode != null">area_code,</if>
|
||
<if test="leaseStatus != null">lease_status,</if>
|
||
<if test="leaseStartTime != null">lease_start_time,</if>
|
||
<if test="leaseEndTime != null ">lease_end_time,</if>
|
||
<if test="startTime != null">start_time,</if>
|
||
<if test="publishUser != null">publish_user,</if>
|
||
<if test="publishCompany != null">publish_company,</if>
|
||
<if test="endTime != null">end_time,</if>
|
||
<if test="person != null">person,</if>
|
||
<if test="personPhone != null">person_phone,</if>
|
||
<if test="description != null and description != ''">description,</if>
|
||
<if test="createBy != null">create_by,</if>
|
||
<if test="createTime != null">create_time,</if>
|
||
</trim>
|
||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||
<if test="leaseName != null and leaseName != ''">#{leaseName},</if>
|
||
<if test="leaseCode != null and leaseCode != ''">#{leaseCode},</if>
|
||
<if test="provinceCode != null">#{provinceCode},</if>
|
||
<if test="cityCode != null">#{cityCode},</if>
|
||
<if test="address != null and address != ''">#{address},</if>
|
||
<if test="areaCode != null">#{areaCode},</if>
|
||
<if test="leaseStatus != null">#{leaseStatus},</if>
|
||
<if test="leaseStartTime != null">#{leaseStartTime},</if>
|
||
<if test="leaseEndTime != null ">#{leaseEndTime},</if>
|
||
<if test="startTime != null">#{startTime},</if>
|
||
<if test="publishUser != null">#{publishUser},</if>
|
||
<if test="publishCompany != null">#{publishCompany},</if>
|
||
<if test="endTime != null">#{endTime},</if>
|
||
<if test="person != null">#{person},</if>
|
||
<if test="personPhone != null">#{personPhone},</if>
|
||
<if test="description != null and description != ''">#{description},</if>
|
||
<if test="createBy != null">#{createBy},</if>
|
||
<if test="createTime != null">#{createTime},</if>
|
||
</trim>
|
||
</insert>
|
||
|
||
<insert id="insertHotSearch">
|
||
insert into ma_hot_search(lease_id, lease_num, create_time)
|
||
values (#{id}, 1, now())
|
||
</insert>
|
||
|
||
<insert id="insertDetails" useGeneratedKeys="true" keyProperty="id">
|
||
insert into ma_lease_details
|
||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||
<if test="leaseId != null">lease_id,</if>
|
||
<if test="typeId != null">type_id,</if>
|
||
<if test="ids != null and ids != ''">type_ids,</if>
|
||
<if test="leaseNum != null">lease_num,</if>
|
||
<if test="description != null and description != ''">description,</if>
|
||
</trim>
|
||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||
<if test="leaseId != null">#{leaseId},</if>
|
||
<if test="typeId != null">#{typeId},</if>
|
||
<if test="ids != null and ids != ''">#{ids},</if>
|
||
<if test="leaseNum != null ">#{leaseNum},</if>
|
||
<if test="description != null and description != ''">#{description},</if>
|
||
</trim>
|
||
</insert>
|
||
|
||
<update id="updateDevInfo">
|
||
update ma_lease_info
|
||
<trim prefix="SET" suffixOverrides=",">
|
||
<if test="leaseName != null and leaseName != ''">lease_name = #{leaseName},</if>
|
||
<if test="provinceCode != null">province_code = #{provinceCode},</if>
|
||
<if test="cityCode != null">city_code = #{cityCode},</if>
|
||
<if test="areaCode != null">area_code = #{areaCode},</if>
|
||
<if test="address != null and address != ''">address = #{address},</if>
|
||
<if test="leaseStartTime != null ">lease_start_time = #{leaseStartTime},</if>
|
||
<if test="leaseEndTime != null ">lease_end_time = #{leaseEndTime},</if>
|
||
<if test="leaseStatus != null ">lease_status = #{leaseStatus},</if>
|
||
<if test="startTime != null">start_time = #{startTime},</if>
|
||
<if test="publishUser != null and publishUser != ''">publish_user = #{publishUser},</if>
|
||
<if test="endTime != null">end_time = #{endTime},</if>
|
||
<if test="person != null">person = #{person},</if>
|
||
<if test="personPhone != null">person_phone = #{personPhone},</if>
|
||
<if test="description != null and description != ''">description = #{description},</if>
|
||
<if test="updateBy != null">update_by = #{updateBy},</if>
|
||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||
<if test="orderUser != null and orderUser != ''">order_user = #{orderUser},</if>
|
||
<if test="orderCompany != null and orderCompany != ''">order_company = #{orderCompany},</if>
|
||
<if test="orderTime != null">order_time = #{orderTime},</if>
|
||
<if test="agreeUser != null">agree_user = #{agreeUser},</if>
|
||
<if test="rejectUser != null">reject_user = #{rejectUser},</if>
|
||
</trim>
|
||
where id = #{id}
|
||
</update>
|
||
|
||
<update id="updateHotSearchByLeaseId">
|
||
update ma_hot_search
|
||
set lease_num = lease_num + 1,
|
||
update_time = now()
|
||
where lease_id = #{id}
|
||
</update>
|
||
|
||
<update id="updateRejectDevInfo">
|
||
update ma_lease_info
|
||
<trim prefix="SET" suffixOverrides=",">
|
||
<if test="leaseName != null and leaseName != ''">lease_name = #{leaseName},</if>
|
||
<if test="provinceCode != null">province_code = #{provinceCode},</if>
|
||
<if test="cityCode != null">city_code = #{cityCode},</if>
|
||
<if test="areaCode != null">area_code = #{areaCode},</if>
|
||
<if test="address != null and address != ''">address = #{address},</if>
|
||
<if test="leaseStartTime != null ">lease_start_time = #{leaseStartTime},</if>
|
||
<if test="leaseEndTime != null ">lease_end_time = #{leaseEndTime},</if>
|
||
<if test="leaseStatus != null ">lease_status = #{leaseStatus},</if>
|
||
<if test="startTime != null">start_time = #{startTime},</if>
|
||
<if test="publishUser != null and publishUser != ''">publish_user = #{publishUser},</if>
|
||
<if test="endTime != null">end_time = #{endTime},</if>
|
||
<if test="person != null">person = #{person},</if>
|
||
<if test="personPhone != null">person_phone = #{personPhone},</if>
|
||
<if test="description != null and description != ''">description = #{description},</if>
|
||
<if test="updateBy != null">update_by = #{updateBy},</if>
|
||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||
order_user = NULL,
|
||
order_company = NULL,
|
||
order_time = NULL,
|
||
<if test="agreeUser != null">agree_user = #{agreeUser},</if>
|
||
<if test="rejectUser != null">reject_user = #{rejectUser},</if>
|
||
</trim>
|
||
where id = #{id}
|
||
</update>
|
||
|
||
<delete id="deleteById">
|
||
delete
|
||
from ma_lease_info
|
||
where id = #{id}
|
||
</delete>
|
||
|
||
<delete id="deleteDetailsById">
|
||
delete
|
||
from ma_lease_details
|
||
where lease_id = #{id}
|
||
</delete>
|
||
|
||
<select id="selectByName" resultType="com.bonus.material.lease.domain.vo.MaLeaseVo">
|
||
SELECT
|
||
m.id as id,
|
||
m.lease_name as leaseName,
|
||
m.lease_code as leaseCode,
|
||
m.lease_status as leaseStatus,
|
||
m.lease_start_time as leaseStartTime,
|
||
m.lease_end_time as leaseEndTime,
|
||
m.start_time as startTime,
|
||
m.end_time as endTime,
|
||
m.order_time as orderTime,
|
||
su.nick_name as orderUser,
|
||
su.phonenumber as orderPhone,
|
||
m.order_company as orderCompany,
|
||
sd2.dept_name as orderCompanyName,
|
||
m.person as person,
|
||
m.person_phone as personPhone,
|
||
m.description as description,
|
||
IFNULL(h.lease_num, 0) AS searchNum,
|
||
m.publish_user as publishUser,
|
||
m.publish_company as publishCompany,
|
||
m.province_code as provinceCode,
|
||
b1.name as provinceName,
|
||
m.city_code as cityCode,
|
||
b2.name as cityName,
|
||
m.area_code as areaCode,
|
||
b.name as areaName,
|
||
m.address as address,
|
||
sd.dept_name as companyName,
|
||
CASE
|
||
WHEN DATE(m.lease_end_time) = DATE(m.lease_start_time) THEN 1
|
||
ELSE TIMESTAMPDIFF(DAY, m.lease_start_time, m.lease_end_time) + 1
|
||
END AS leaseDay
|
||
FROM
|
||
ma_lease_info m
|
||
LEFT JOIN sys_cnarea b ON b.area_code = m.area_code
|
||
LEFT JOIN sys_cnarea b1 on m.province_code = b1.area_code
|
||
LEFT JOIN sys_cnarea b2 on m.city_code = b2.area_code
|
||
LEFT JOIN ma_hot_search h ON h.lease_id = m.id
|
||
LEFT JOIN sys_dept sd on m.publish_company = sd.dept_id
|
||
LEFT JOIN sys_dept sd2 on m.order_company = sd2.dept_id
|
||
LEFT JOIN sys_user su on m.order_user = su.user_id
|
||
WHERE 1 = 1
|
||
<if test="id != null">
|
||
and m.id = #{id}
|
||
</if>
|
||
<if test="leaseCode != null and leaseCode != ''">
|
||
and m.lease_code = #{leaseCode}
|
||
</if>
|
||
<if test="leaseName != null and leaseName != ''">
|
||
and m.lease_name = #{leaseName}
|
||
</if>
|
||
</select>
|
||
|
||
<select id="selectTaskNumByMonth" resultType="java.lang.String">
|
||
SELECT SUBSTRING(lease_code, - 4) as code
|
||
FROM ma_lease_info
|
||
WHERE DATE_FORMAT(create_time, '%y%m') = DATE_FORMAT(#{date}, '%y%m')
|
||
ORDER BY create_time DESC
|
||
LIMIT 1
|
||
</select>
|
||
|
||
<select id="list" resultType="com.bonus.material.lease.domain.vo.MaLeaseVo">
|
||
SELECT
|
||
m.id as id,
|
||
m.lease_name as leaseName,
|
||
m.lease_code as leaseCode,
|
||
m.lease_status as leaseStatus,
|
||
m.start_time as startTime,
|
||
m.end_time as endTime,
|
||
CASE
|
||
WHEN lease_status = 0 THEN '待接单'
|
||
WHEN lease_status = 1 THEN '已接单'
|
||
WHEN lease_status = 2 THEN '已过期'
|
||
WHEN lease_status = 3 THEN '接单待审核'
|
||
WHEN lease_status = 4 THEN '驳回'
|
||
ELSE '未知'
|
||
END
|
||
AS leaseStatusName,
|
||
su.nick_name as publishUser,
|
||
su1.nick_name as orderUser,
|
||
su1.phonenumber as orderPhone,
|
||
m.province_code as provinceCode,
|
||
b1.name as provinceName,
|
||
m.city_code as cityCode,
|
||
b2.name as cityName,
|
||
m.area_code as areaCode,
|
||
b.name as areaName,
|
||
m.address as address,
|
||
m.publish_company as publishCompany
|
||
FROM
|
||
ma_lease_info m
|
||
LEFT JOIN sys_cnarea b ON b.area_code = m.area_code
|
||
LEFT JOIN sys_cnarea b1 on m.province_code = b1.area_code
|
||
LEFT JOIN sys_cnarea b2 on m.city_code = b2.area_code
|
||
LEFT JOIN sys_user su ON m.publish_user = su.user_id
|
||
LEFT JOIN sys_user su1 ON m.order_user = su1.user_id
|
||
WHERE 1 = 1 and m.publish_company = #{publishCompany}
|
||
<if test="leaseCode != null and leaseCode != ''">
|
||
and m.lease_code like concat('%',#{leaseCode},'%')
|
||
</if>
|
||
<if test="leaseName != null and leaseName != ''">
|
||
and m.lease_name like concat('%',#{leaseName},'%')
|
||
</if>
|
||
<if test="leaseStatus != null">
|
||
and m.lease_status = #{leaseStatus}
|
||
</if>
|
||
<if test="publishStartTime != null and publishStartTime != '' and publishEndTime != null and publishEndTime != ''">
|
||
and DATE_FORMAT(m.start_time,'%Y-%m-%d') between #{publishStartTime} and #{publishEndTime}
|
||
</if>
|
||
<if test="finishStartTime != null and finishStartTime != '' and finishEndTime != null and finishEndTime != ''">
|
||
and DATE_FORMAT(m.end_time,'%Y-%m-%d') between #{finishStartTime} and #{finishEndTime}
|
||
</if>
|
||
GROUP BY m.lease_code
|
||
ORDER BY m.start_time DESC
|
||
</select>
|
||
|
||
<select id="getHotSearchCountByLeaseId" resultType="java.lang.Integer">
|
||
select count(1)
|
||
from ma_hot_search
|
||
where lease_id = #{leaseId}
|
||
</select>
|
||
|
||
<select id="leaseList" resultType="com.bonus.material.lease.domain.vo.MaLeaseVo">
|
||
SELECT
|
||
m.id AS id,
|
||
m.lease_name AS leaseName,
|
||
m.lease_code AS leaseCode,
|
||
m.lease_status AS leaseStatus,
|
||
m.lease_start_time AS leaseStartTime,
|
||
m.lease_end_time AS leaseEndTime,
|
||
m.start_time AS startTime,
|
||
m.end_time AS endTime,
|
||
m.person AS person,
|
||
m.person_phone AS personPhone,
|
||
m.description AS description,
|
||
m.publish_user AS publishUser,
|
||
m.publish_company as publishCompany,
|
||
sd.dept_name AS companyName,
|
||
SUM(m1.lease_num) AS leaseTotalNum,
|
||
m.province_code as provinceCode,
|
||
b1.name as provinceName,
|
||
m.city_code as cityCode,
|
||
b2.name as cityName,
|
||
m.area_code as areaCode,
|
||
b.name as areaName,
|
||
m.address as address,
|
||
CASE
|
||
WHEN DATE(m.lease_end_time) = DATE(m.lease_start_time) THEN 1
|
||
ELSE TIMESTAMPDIFF(DAY, m.lease_start_time, m.lease_end_time) + 1
|
||
END AS leaseDay
|
||
FROM
|
||
ma_lease_info m
|
||
LEFT JOIN sys_cnarea b ON b.area_code = m.area_code
|
||
LEFT JOIN sys_cnarea b1 on m.province_code = b1.area_code
|
||
LEFT JOIN sys_cnarea b2 on m.city_code = b2.area_code
|
||
LEFT JOIN ma_lease_details m1 ON m.id = m1.lease_id
|
||
LEFT JOIN sys_user su ON m.publish_user = su.user_id
|
||
LEFT JOIN sys_dept sd ON m.publish_company = sd.dept_id
|
||
WHERE m.lease_status = '0'
|
||
<if test="companyId != null and companyId != ''">and m.publish_company = #{companyId}</if>
|
||
<if test="cityCode != null">and m.city_code = #{cityCode}</if>
|
||
<if test="typeId != null and typeId != ''">
|
||
and FIND_IN_SET(#{typeId}, type_ids) > 0
|
||
</if>
|
||
<if test="keyWord != null and keyWord != ''">
|
||
and (
|
||
locate(#{keyWord},m.lease_name) > 0
|
||
)
|
||
</if>
|
||
GROUP BY m.lease_code
|
||
ORDER BY
|
||
m.lease_status
|
||
<if test="startTime != '' and startTime == 'ASC'">
|
||
,m.start_time
|
||
</if>
|
||
<if test="startTime != '' and startTime == 'DESC'">
|
||
,m.start_time DESC
|
||
</if>
|
||
<if test="rentDay != null and rentDay == 'ASC'">
|
||
,leaseDay
|
||
</if>
|
||
<if test="rentDay != null and rentDay == 'DESC'">
|
||
,leaseDay DESC
|
||
</if>
|
||
<if test="endTime != '' and endTime == 'ASC'">
|
||
,m.end_time
|
||
</if>
|
||
<if test="endTime != '' and endTime == 'DESC'">
|
||
,m.end_time DESC
|
||
</if>
|
||
<if test="rentNum != null and rentNum == 'ASC'">
|
||
,SUM(m1.lease_num)
|
||
</if>
|
||
<if test="rentNum != null and rentNum == 'DESC'">
|
||
,SUM(m1.lease_num) DESC
|
||
</if>
|
||
</select>
|
||
|
||
<select id="rentList" resultType="com.bonus.material.lease.domain.vo.MaLeaseVo">
|
||
SELECT
|
||
m.id as id,
|
||
m.lease_name as leaseName,
|
||
m.lease_code as leaseCode,
|
||
m.lease_status as leaseStatus,
|
||
m.lease_start_time as leaseStartTime,
|
||
m.lease_end_time as leaseEndTime,
|
||
m.start_time as startTime,
|
||
m.end_time as endTime,
|
||
m.person as person,
|
||
m.person_phone as personPhone,
|
||
m.description as description,
|
||
su.nick_name as publishUser,
|
||
su1.nick_name as orderUser,
|
||
m.order_time as orderTime,
|
||
m.province_code as provinceCode,
|
||
b1.name as provinceName,
|
||
m.city_code as cityCode,
|
||
b2.name as cityName,
|
||
m.area_code as areaCode,
|
||
b.name as areaName,
|
||
m.address as address,
|
||
CASE
|
||
WHEN m.lease_status = 0 THEN '待接单'
|
||
WHEN m.lease_status = 1 THEN '已接单'
|
||
WHEN m.lease_status = 2 THEN '已过期'
|
||
WHEN m.lease_status = 3 THEN '接单待审核'
|
||
WHEN m.lease_status = 4 THEN '驳回'
|
||
ELSE '未知'
|
||
END
|
||
AS leaseStatusName
|
||
FROM
|
||
ma_lease_info m
|
||
LEFT JOIN sys_cnarea b ON b.area_code = m.area_code
|
||
LEFT JOIN sys_cnarea b1 on m.province_code = b1.area_code
|
||
LEFT JOIN sys_cnarea b2 on m.city_code = b2.area_code
|
||
LEFT JOIN sys_user su ON m.publish_user = su.user_id
|
||
LEFT JOIN sys_user su1 ON m.order_user = su1.user_id
|
||
WHERE 1 = 1 and m.order_company = #{orderCompany}
|
||
<if test="leaseCode != null and leaseCode != ''">
|
||
and m.lease_code like concat('%',#{leaseCode},'%')
|
||
</if>
|
||
<if test="leaseName != null and leaseName != ''">
|
||
and m.lease_name like concat('%',#{leaseName},'%')
|
||
</if>
|
||
<if test="finishStartTime != null and finishStartTime != '' and finishEndTime != null and finishEndTime != ''">
|
||
and DATE_FORMAT(m.end_time,'%Y-%m-%d') between #{finishStartTime} and #{finishEndTime}
|
||
</if>
|
||
<if test="orderStartTime != null and orderStartTime != '' and orderEndTime != null and orderEndTime != ''">
|
||
and DATE_FORMAT(m.order_time,'%Y-%m-%d') between #{orderStartTime} and #{orderEndTime}
|
||
</if>
|
||
GROUP BY m.lease_code
|
||
</select>
|
||
|
||
<select id="selectDetailsById" resultType="com.bonus.material.lease.domain.MaLeaseDetails">
|
||
select m.id as id,
|
||
m.type_id as typeId,
|
||
mt4.type_name as typeName,
|
||
m.type_ids as ids,
|
||
m.lease_num as leaseNum,
|
||
m.description as description,
|
||
mt3.type_id as thirdId,
|
||
mt3.type_name as thirdName,
|
||
mt2.type_id as secondId,
|
||
mt2.type_name as secondName,
|
||
mt1.type_id as firstId,
|
||
mt1.type_name as firstName,
|
||
CASE
|
||
-- 第一级
|
||
WHEN mt1.type_id IS NULL
|
||
AND mt2.type_id IS NULL
|
||
AND mt3.type_id IS NULL
|
||
AND mt4.type_id IS NOT NULL THEN
|
||
mt4.type_name
|
||
-- 第二级
|
||
WHEN mt1.type_id IS NULL
|
||
AND mt2.type_id IS NULL
|
||
AND mt3.type_id IS NOT NULL
|
||
AND mt4.type_id IS NOT NULL THEN
|
||
CONCAT(mt3.type_name, '/', mt4.type_name)
|
||
-- 第三级
|
||
WHEN mt1.type_id IS NULL
|
||
AND mt2.type_id IS NOT NULL
|
||
AND mt3.type_id IS NOT NULL
|
||
AND mt4.type_id IS NOT NULL THEN
|
||
CONCAT(mt2.type_name, '/', mt3.type_name, '/', mt4.type_name)
|
||
-- 第四级
|
||
WHEN mt1.type_id IS NOT NULL
|
||
AND mt2.type_id IS NOT NULL
|
||
AND mt3.type_id IS NOT NULL
|
||
AND mt4.type_id IS NOT NULL THEN
|
||
CONCAT(mt1.type_name, '/', mt2.type_name, '/', mt3.type_name, '/', mt4.type_name)
|
||
ELSE NULL
|
||
END AS groupName
|
||
from ma_lease_details m
|
||
LEFT JOIN ma_type mt4 ON mt4.type_id = m.type_id and mt4.del_flag = '0'
|
||
LEFT JOIN ma_type mt3 ON mt3.type_id = mt4.parent_id and mt3.del_flag = '0'
|
||
LEFT JOIN ma_type mt2 ON mt2.type_id = mt3.parent_id and mt2.del_flag = '0'
|
||
LEFT JOIN ma_type mt1 ON mt1.type_id = mt2.parent_id and mt1.del_flag = '0'
|
||
where m.lease_id = #{id}
|
||
</select>
|
||
<select id="getTodayLeaseCount" resultType="java.lang.Integer">
|
||
SELECT COUNT(1) as leaseNum
|
||
FROM ma_lease_info
|
||
WHERE DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')
|
||
</select>
|
||
|
||
<select id="getTodayLeaseOrderCount" resultType="java.lang.Integer">
|
||
SELECT COUNT(1) as leaseOrderNum
|
||
FROM ma_lease_info
|
||
WHERE DATE_FORMAT(order_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')
|
||
and lease_status in (1, 3)
|
||
</select>
|
||
|
||
<select id="getLeaseCount" resultType="java.lang.Integer">
|
||
SELECT COUNT(1) as leaseNum
|
||
FROM ma_lease_info
|
||
</select>
|
||
|
||
<select id="getLeaseOrderCount" resultType="java.lang.Integer">
|
||
SELECT COUNT(1) as leaseOrderNum
|
||
FROM ma_lease_info
|
||
WHERE lease_status in (1, 3)
|
||
</select>
|
||
|
||
<select id="getMaTypeCountFromLease" resultType="Integer">
|
||
SELECT COUNT(DISTINCT (type_id))
|
||
FROM ma_lease_details
|
||
where type_id is not null
|
||
</select>
|
||
|
||
<select id="getTopPopularTypeName" resultType="java.lang.String">
|
||
select mt.type_name
|
||
from (SELECT type_id
|
||
FROM ma_lease_details
|
||
where type_id is not null
|
||
group by type_id
|
||
order by count(type_id) desc
|
||
limit 1) a
|
||
left join ma_type mt on mt.type_id = a.type_id
|
||
</select>
|
||
|
||
<select id="getDevInfoById" resultType="com.bonus.material.lease.domain.MaLeaseInfo">
|
||
SELECT mli.*,
|
||
sd.dept_id AS publishCompany,
|
||
sd.dept_name as publishCompanyName,
|
||
sd2.dept_name as orderCompanyName
|
||
FROM ma_lease_info mli
|
||
LEFT JOIN sys_dept sd ON mli.publish_company = sd.dept_id
|
||
LEFT JOIN sys_dept sd2 ON mli.order_company = sd2.dept_id
|
||
WHERE mli.id = #{id}
|
||
</select>
|
||
|
||
<select id="getLeaseStatusCount" resultType="com.bonus.material.lease.domain.MaLeaseInfo">
|
||
select a.lease_status as leaseStatus, count(a.lease_status) as leaseCount from
|
||
(
|
||
SELECT
|
||
mli.id,
|
||
min(mli.lease_status) as lease_status
|
||
FROM
|
||
ma_lease_info mli
|
||
WHERE
|
||
1=1
|
||
<if test="orderCompany != null">
|
||
AND mli.order_company = #{orderCompany}
|
||
</if>
|
||
<if test="publishCompany != null">
|
||
AND mli.publish_company = #{publishCompany}
|
||
</if>
|
||
GROUP BY id
|
||
) a
|
||
group by a.lease_status
|
||
</select>
|
||
|
||
<select id="getLeaseCountByPublishCompany" resultType="com.bonus.material.lease.domain.MaLeaseInfo">
|
||
SELECT sd.dept_name as publish_company,
|
||
/* COUNT( 1 ) AS lease_count*/
|
||
COUNT(mld.lease_num) AS lease_count
|
||
FROM ma_lease_info mli
|
||
LEFT JOIN sys_dept sd on sd.dept_id = mli.publish_company
|
||
LEFT JOIN ma_lease_details mld on mld.lease_id = mli.id
|
||
GROUP BY mli.publish_company
|
||
ORDER BY lease_count DESC
|
||
</select>
|
||
|
||
<select id="getLeaseAnswerRate" resultType="com.bonus.material.largeScreen.entity.MaLeaseAnswerInfo">
|
||
SELECT ml.lease_name AS deviceName,
|
||
COUNT(ml.lease_name) AS publishCount,
|
||
SUM(CASE WHEN ml.lease_status in (1, 3) THEN 1 ELSE 0 END) AS orderCount,
|
||
GROUP_CONCAT(DISTINCT a.type_id) as typeId,
|
||
-- 计算百分比,避免除零错误
|
||
CASE
|
||
WHEN COUNT(1) = 0 THEN NULL
|
||
ELSE ROUND((SUM(CASE WHEN ml.lease_status in (1, 3) THEN 1 ELSE 0 END) / COUNT(1)) * 100, 2)
|
||
END AS answerRate
|
||
FROM ma_lease_info ml
|
||
LEFT JOIN (SELECT lease_id, GROUP_CONCAT(type_id) as type_id from ma_lease_details GROUP BY lease_id) a
|
||
ON ml.id = a.lease_id
|
||
GROUP BY ml.lease_name
|
||
</select>
|
||
|
||
<select id="selectMaTypeList" resultType="java.lang.String">
|
||
SELECT
|
||
GROUP_CONCAT(mt.type_name)
|
||
FROM
|
||
ma_type mt
|
||
WHERE
|
||
mt.type_id IN
|
||
<foreach collection="list" item="typeId" open="(" separator="," close=")">
|
||
#{typeId}
|
||
</foreach>
|
||
</select>
|
||
|
||
<select id="getLeaseOnlyInfo" resultType="com.bonus.material.largeScreen.entity.MaLeaseOnlyInfo">
|
||
SELECT
|
||
ml.lease_name AS deviceName,
|
||
sd.dept_name AS publishCompany,
|
||
ml.person AS person,
|
||
ml.person_phone AS phoneNumber,
|
||
COUNT( md.lease_num ) AS estimateCount,
|
||
ml.start_time AS startTime,
|
||
ml.end_time AS endTime
|
||
FROM
|
||
ma_lease_info ml
|
||
LEFT JOIN sys_dept sd ON ml.publish_company = sd.dept_id
|
||
LEFT JOIN ma_lease_details md ON ml.id = md.lease_id
|
||
WHERE 1 =1
|
||
<if test="keyWord != null and keyWord != ''">
|
||
and ml.lease_name like concat('%', #{keyWord}, '%') or
|
||
sd.dept_name like concat('%', #{keyWord}, '%') or
|
||
ml.person like concat('%', #{keyWord}, '%') or
|
||
ml.person_phone like concat('%', #{keyWord}, '%')
|
||
</if>
|
||
GROUP BY
|
||
ml.id
|
||
ORDER BY
|
||
COUNT( md.lease_num ) DESC
|
||
</select>
|
||
|
||
<select id="getLeaseTypeList" resultType="com.bonus.material.largeScreen.entity.MaLeaseOnlyInfo">
|
||
/* SELECT
|
||
ml.lease_name AS deviceName,
|
||
COUNT( md.lease_num ) AS estimateCount,
|
||
GROUP_CONCAT( md.type_id ) AS typeId,
|
||
ml.lease_start_time as startTime,
|
||
ml.lease_end_time as endTime
|
||
FROM
|
||
ma_lease_info ml
|
||
LEFT JOIN ma_lease_details md ON ml.id = md.lease_id
|
||
GROUP BY
|
||
ml.id*/
|
||
|
||
SELECT ml.lease_name AS deviceName,
|
||
COUNT(md.lease_num) AS estimateCount,
|
||
md.type_id AS typeId,
|
||
ml.lease_start_time AS startTime,
|
||
ml.lease_end_time AS endTime
|
||
FROM ma_lease_details md
|
||
LEFT JOIN ma_lease_info ml ON ml.id = md.lease_id
|
||
GROUP BY md.type_id
|
||
|
||
</select>
|
||
|
||
<select id="getDevRate" resultType="com.bonus.material.largeScreen.entity.MaDevRateInfo">
|
||
SELECT
|
||
mt1.type_name AS typeName,
|
||
md.device_name AS deviceName,
|
||
mt.type_name AS modelCode,
|
||
IFNULL(SUM(md.total_up_day), 0) AS upTotal,
|
||
IFNULL(SUM(md.total_lease_day), 0) AS leaseTotal,
|
||
-- 计算利用率,保留两位小数,处理除零错误
|
||
CASE
|
||
WHEN IFNULL(SUM(md.total_lease_day), 0) + IFNULL(SUM(md.total_up_day), 0) = 0 THEN 0.00
|
||
ELSE ROUND(IFNULL(SUM(md.total_lease_day), 0) / (IFNULL(SUM(md.total_lease_day), 0) +
|
||
IFNULL(SUM(md.total_up_day), 0)), 2)
|
||
END AS rate
|
||
FROM
|
||
ma_dev_info md
|
||
LEFT JOIN ma_type mt ON md.type_id = mt.type_id
|
||
AND mt.`level` = '4'
|
||
LEFT JOIN ma_type mt1 ON mt.parent_id = mt1.type_id
|
||
AND mt1.`level` = '3'
|
||
WHERE
|
||
md.is_active = '1'
|
||
<if test="keyWord != null and keyWord != ''">
|
||
and mt1.type_name like concat('%', #{keyWord}, '%') or
|
||
md.device_name like concat('%', #{keyWord}, '%') or
|
||
mt.type_name like concat('%', #{keyWord}, '%')
|
||
</if>
|
||
GROUP BY
|
||
md.device_name
|
||
</select>
|
||
|
||
<select id="getReturnDev" resultType="com.bonus.material.largeScreen.entity.MaDevRateInfo">
|
||
SELECT
|
||
mdi.device_name AS deviceName,
|
||
mt.type_name AS modelCode,
|
||
mdi.identify_code AS identifyCode,
|
||
mi.`code` AS orderCode,
|
||
md.rent_over_user AS returnUser,
|
||
md.rent_over_time AS returnTime
|
||
FROM
|
||
ma_order_details md
|
||
LEFT JOIN ma_dev_info mdi ON md.ma_id = mdi.ma_id
|
||
LEFT JOIN ma_type mt ON mdi.type_id = mt.type_id
|
||
LEFT JOIN ma_order_info mi ON md.order_id = mi.order_id
|
||
AND mt.`level` = '4'
|
||
WHERE
|
||
md.order_status = '5'
|
||
<if test="keyWord != null and keyWord != ''">
|
||
and mdi.device_name like concat('%', #{keyWord}, '%') or
|
||
mt.type_name like concat('%', #{keyWord}, '%') or
|
||
mdi.identify_code like concat('%', #{keyWord}, '%') or
|
||
mi.`code` like concat('%', #{keyWord}, '%') or
|
||
md.rent_over_user like concat('%', #{keyWord}, '%')
|
||
</if>
|
||
GROUP BY
|
||
md.ma_id
|
||
ORDER BY
|
||
md.rent_over_time DESC
|
||
</select>
|
||
<select id="getDemandUnit" resultType="java.lang.Integer">
|
||
SELECT COUNT(DISTINCT publish_company)
|
||
FROM ma_lease_info
|
||
</select>
|
||
|
||
<select id="getDevNumList" resultType="com.bonus.material.device.domain.DevInfo">
|
||
SELECT mdi.on_company AS ownCo,
|
||
sd.dept_name AS comName,
|
||
count(mdi.device_count) AS deviceCount
|
||
FROM ma_dev_info mdi
|
||
LEFT JOIN sys_dept sd ON sd.dept_id = mdi.on_company
|
||
WHERE mdi.is_active = '1'
|
||
AND mdi.ma_status IN (1, 2, 3)
|
||
GROUP BY mdi.on_company
|
||
ORDER BY deviceCount DESC
|
||
</select>
|
||
|
||
<select id="getDevNumDetailsList" resultType="com.bonus.material.device.domain.DevInfoDt">
|
||
SELECT mdi.device_name AS deviceName,
|
||
CONCAT(mt1.type_name, '/', mt2.type_name, '/', mt3.type_name) AS categoryName,
|
||
mt4.unit_name AS unitName,
|
||
mdi.brand AS brand,
|
||
mdi.production_date AS productionDate,
|
||
mdi.person AS person,
|
||
mdi.person_phone AS personPhone,
|
||
mdi.device_count AS deviceCount,
|
||
su.nick_name AS creatorName,
|
||
mdi.create_time AS createTime,
|
||
sd.dept_name AS comName
|
||
FROM ma_dev_info mdi
|
||
LEFT JOIN ma_type mt4 ON mt4.type_id = mdi.type_id
|
||
AND mt4.del_flag = '0'
|
||
LEFT JOIN ma_type mt3 ON mt3.type_id = mt4.parent_id
|
||
AND mt3.del_flag = '0'
|
||
LEFT JOIN ma_type mt2 ON mt2.type_id = mt3.parent_id
|
||
AND mt2.del_flag = '0'
|
||
LEFT JOIN ma_type mt1 ON mt1.type_id = mt2.parent_id
|
||
AND mt1.del_flag = '0'
|
||
LEFT JOIN sys_user su ON mdi.creator = su.user_id
|
||
LEFT JOIN sys_dept sd ON sd.dept_id = mdi.on_company
|
||
WHERE mdi.is_active = '1'
|
||
AND mdi.ma_status IN (1, 2, 3)
|
||
AND mdi.entry_status = '1'
|
||
AND mdi.on_company = #{ownCo}
|
||
</select>
|
||
<select id="getAddress" resultType="java.util.Map">
|
||
SELECT area_code, name
|
||
from sys_cnarea
|
||
where level = 1
|
||
</select>
|
||
<select id="getDept" resultType="java.util.Map">
|
||
SELECT dept_id AS deptId, dept_name AS deptName
|
||
from sys_dept
|
||
where del_flag = 0
|
||
and province = #{code}
|
||
</select>
|
||
<select id="getMaType" resultType="java.util.Map">
|
||
-- 保持原结构,查询一级类型下的二、三、四、五级类型
|
||
SELECT
|
||
t2.type_id AS value,
|
||
t2.level,
|
||
t2.type_name AS label,
|
||
t2.parent_id AS parentId
|
||
FROM ma_type t1
|
||
-- 修正关联条件,覆盖二至五级类型
|
||
JOIN ma_type t2 ON
|
||
-- 二级:t2的父节点是一级类型
|
||
t1.type_id = t2.parent_id
|
||
-- 三级:t2的父节点是二级类型(二级的父节点是一级)
|
||
OR t1.type_id = (SELECT parent_id FROM ma_type WHERE type_id = t2.parent_id)
|
||
-- 四级:t2的父节点是三级类型(三级的父节点是二级,二级的父节点是一级)
|
||
OR t1.type_id = (SELECT parent_id FROM ma_type WHERE type_id = (
|
||
SELECT parent_id FROM ma_type WHERE type_id = t2.parent_id
|
||
))
|
||
-- 五级:t2的父节点是四级类型(四级的父节点是三级,以此类推)
|
||
OR t1.type_id = (SELECT parent_id FROM ma_type WHERE type_id = (
|
||
SELECT parent_id FROM ma_type WHERE type_id = (
|
||
SELECT parent_id FROM ma_type WHERE type_id = t2.parent_id
|
||
)
|
||
))
|
||
WHERE
|
||
t1.type_id = #{firstLevelId} -- 一级类型ID
|
||
AND t1.parent_id IS NULL -- 确保t1是一级类型
|
||
AND t2.del_flag = '0' -- t2未删除
|
||
ORDER BY t2.level, t2.parent_id, t2.type_id;
|
||
</select>
|
||
|
||
<!-- 按设备类型和使用年限统计 -->
|
||
<select id="statByTypeAndAge" resultType="java.util.Map"> <!-- 替换为实际DTO路径 -->
|
||
-- 直接在MySQL中处理proType映射并统计,返回目标格式所需数据
|
||
SELECT
|
||
-- 按映射关系转换为目标类型(line/substation/cable)
|
||
CASE
|
||
WHEN mtv.maxTypeId = '2' THEN 'line'
|
||
WHEN mtv.maxTypeId = '3' THEN 'substation'
|
||
WHEN mtv.maxTypeId = '1' THEN 'cable'
|
||
END AS targetType,
|
||
|
||
-- 统计各指标
|
||
SUM(mdi.buy_price) AS price,
|
||
COUNT(1) AS num,
|
||
-- 10年及以上数量(11年+)
|
||
SUM(CASE
|
||
WHEN TIMESTAMPDIFF(YEAR, mdi.production_date, CURDATE()) >= 11
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS ten,
|
||
-- 0-5年数量
|
||
SUM(CASE
|
||
WHEN TIMESTAMPDIFF(YEAR, mdi.production_date, CURDATE()) BETWEEN 0 AND 5
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS five,
|
||
-- 5-10年数量(6-10年)
|
||
SUM(CASE
|
||
WHEN TIMESTAMPDIFF(YEAR, mdi.production_date, CURDATE()) BETWEEN 6 AND 10
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS fiveOrTen
|
||
FROM
|
||
ma_dev_info mdi
|
||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
|
||
WHERE
|
||
-- 过滤目标proType,只处理需要的三类
|
||
mtv.maxTypeId IN ('1', '2', '3')
|
||
and mdi.change_status != '4'
|
||
and mdi.is_active = '1'
|
||
AND mdi.entry_status = '1'
|
||
AND mdi.production_date IS NOT NULL -- 排除无效出厂日期
|
||
<if test="deptId != null">
|
||
AND mdi.on_company = #{deptId}
|
||
</if>
|
||
GROUP BY
|
||
-- 按映射后的目标类型分组(确保结果按line/substation/cable聚合)
|
||
CASE
|
||
WHEN mtv.maxTypeId = '2' THEN 'line'
|
||
WHEN mtv.maxTypeId = '3' THEN 'substation'
|
||
WHEN mtv.maxTypeId = '1' THEN 'cable'
|
||
END
|
||
ORDER BY
|
||
targetType;
|
||
</select>
|
||
<select id="statByTypeAndAgeDetails" resultType="java.util.Map">
|
||
-- 直接在MySQL中处理proType映射并统计,返回目标格式所需数据
|
||
SELECT
|
||
-- 统计各指标
|
||
SUM(mdi.buy_price) AS price,
|
||
COUNT(1) AS num,
|
||
-- 10年及以上数量(11年+)
|
||
SUM(CASE
|
||
WHEN TIMESTAMPDIFF(YEAR, mdi.production_date, CURDATE()) >= 11
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS ten,
|
||
-- 0-5年数量
|
||
SUM(CASE
|
||
WHEN TIMESTAMPDIFF(YEAR, mdi.production_date, CURDATE()) BETWEEN 0 AND 5
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS five,
|
||
-- 5-10年数量(6-10年)
|
||
SUM(CASE
|
||
WHEN TIMESTAMPDIFF(YEAR, mdi.production_date, CURDATE()) BETWEEN 6 AND 10
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS fiveOrTen
|
||
FROM ma_dev_info mdi
|
||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
|
||
WHERE mdi.change_status != '4'
|
||
AND mdi.is_active = '1'
|
||
AND mdi.entry_status = '1'
|
||
and
|
||
-- 过滤目标proType,只处理需要的三类
|
||
mtv.maxTypeId IN (#{type})
|
||
</select>
|
||
<select id="statByTypeAndAgeByEquipment" resultType="java.util.Map">
|
||
-- 直接在MySQL中处理proType映射并统计,返回目标格式所需数据
|
||
SELECT
|
||
-- 统计各指标
|
||
sum(mdi.buy_price) AS price,
|
||
mtv.devSubcategory AS name
|
||
FROM ma_dev_info mdi
|
||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id AND mdi.change_status != '4'
|
||
AND mdi.is_active = '1'
|
||
AND mdi.entry_status = '1'
|
||
WHERE
|
||
-- 过滤目标proType,只处理需要的三类
|
||
mtv.maxTypeId IN (#{type})
|
||
|
||
GROUP BY mtv.devSubcategory
|
||
|
||
ORDER BY price DESC
|
||
Limit 10
|
||
</select>
|
||
<select id="statByTypeAndAgeByCity" resultType="java.util.Map">
|
||
SELECT sd.dept_name AS name,
|
||
-- 统计关联了mdi且mtv.maxTypeId=5080的总数量
|
||
SUM(CASE
|
||
WHEN mtv.maxTypeId = #{type} THEN 1 -- 仅当类型符合时计数
|
||
ELSE 0
|
||
END) AS count,
|
||
-- 统计状态为2/3且类型符合的数量
|
||
SUM(CASE
|
||
WHEN mtv.maxTypeId = #{type} AND mdi.change_status IN (2, 3)
|
||
THEN 1
|
||
ELSE 0
|
||
END) AS useCount
|
||
FROM sys_dept sd
|
||
-- 左连接设备表(过滤有效数据)
|
||
LEFT JOIN ma_dev_info mdi
|
||
ON mdi.on_company = sd.dept_id
|
||
AND mdi.change_status != '4'
|
||
AND mdi.is_active = '1'
|
||
AND mdi.entry_status = '1'
|
||
-- 左连接类型表(不在这里加maxTypeId条件,避免过滤主表)
|
||
INNER JOIN ma_type_view mtv
|
||
ON mtv.typeId = mdi.type_id
|
||
GROUP BY sd.dept_id, sd.dept_name -- 按部门分组,确保所有部门都被列出
|
||
ORDER BY count DESC
|
||
</select>
|
||
<select id="statByTypeAndAgeByConfiguration" resultType="java.util.Map">
|
||
SELECT sd.dept_name AS name,
|
||
-- 统计关联了mdi且mtv.maxTypeId=5080的总数量
|
||
sum(mdi.buy_price) AS price,
|
||
SUM(CASE
|
||
WHEN sd.dept_id = mdi.on_company THEN 1 -- 仅当类型符合时计数
|
||
ELSE 0
|
||
END) AS count,
|
||
SUM(CASE
|
||
WHEN mtv.maxTypeId = 1 THEN 1 -- 仅当类型符合时计数
|
||
ELSE 0
|
||
END) AS cableCount,
|
||
SUM(CASE
|
||
WHEN mtv.maxTypeId = 3 THEN 1 -- 仅当类型符合时计数
|
||
ELSE 0
|
||
END) AS substationCount,
|
||
SUM(CASE
|
||
WHEN mtv.maxTypeId = 2 THEN 1 -- 仅当类型符合时计数
|
||
ELSE 0
|
||
END) AS lineCount
|
||
FROM sys_dept sd
|
||
-- 左连接设备表(过滤有效数据)
|
||
LEFT JOIN ma_dev_info mdi
|
||
ON mdi.on_company = sd.dept_id
|
||
AND mdi.change_status != '4'
|
||
AND mdi.is_active = '1'
|
||
AND mdi.entry_status = '1'
|
||
-- 左连接类型表(不在这里加maxTypeId条件,避免过滤主表)
|
||
INNER JOIN ma_type_view mtv
|
||
ON mtv.typeId = mdi.type_id
|
||
GROUP BY sd.dept_id, sd.dept_name -- 按部门分组,确保所有部门都被列出
|
||
ORDER BY count DESC
|
||
</select>
|
||
<select id="statByTypeAndAgeByTurnoverRate" resultType="java.util.Map">
|
||
SELECT DATE_FORMAT(cdcd.use_time, '%Y/%m') AS month,-- 月份
|
||
-- 统计不同类型设备的有效使用次数(status为2/3)
|
||
SUM(CASE WHEN mtv.maxTypeId = 1 THEN 1 ELSE 0 END) AS cableCount,
|
||
SUM(CASE WHEN mtv.maxTypeId = 3 THEN 1 ELSE 0 END) AS substationCount,
|
||
SUM(CASE WHEN mtv.maxTypeId = 2 THEN 1 ELSE 0 END) AS lineCount
|
||
FROM cs_device_change_details cdcd -- 左连接设备表(过滤有效设备)
|
||
LEFT JOIN ma_dev_info mdi ON cdcd.dev_code = mdi.code -- 关联设备ID
|
||
AND mdi.change_status != '4'
|
||
AND mdi.is_active = '1'
|
||
AND mdi.entry_status = '1'
|
||
LEFT JOIN cs_device_change cdc ON cdc.id = cdcd.change_id AND cdc.type = '2'
|
||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id -- 过滤无效的使用时间(可选,避免NULL的月份)
|
||
WHERE cdcd.use_time IS NOT NULL
|
||
AND cdcd.del_flag = '0'
|
||
AND mdi.ma_id IS NOT NULL -- 按「设备ID+月份」分组(核心修正)
|
||
|
||
GROUP BY DATE_FORMAT(cdcd.use_time, '%Y/%m') -- 按月份和设备ID排序,结果更清晰
|
||
ORDER BY month;
|
||
</select>
|
||
|
||
<select id="statByTypeAndAgeByUsageRate" resultType="java.util.Map">
|
||
-- 统计每月各类型设备的平均在用率(优化性能版)
|
||
SELECT DATE_FORMAT(stat_date, '%Y-%m') AS month,
|
||
COUNT(stat_date) AS validDays,
|
||
ROUND(AVG(cable_total), 2) AS cableCount, -- 明确字段含义:5080类型月均在用率
|
||
ROUND(AVG(substation_total), 2) AS substationCount, -- 5010类型月均在用率
|
||
ROUND(AVG(line_total), 2) AS lineCount -- 5474类型月均在用率
|
||
FROM (
|
||
-- 子查询:按日计算各类型在用率(简化逻辑+减少重复计算)
|
||
SELECT dt.stat_date,
|
||
-- 计算5080类型当日在用率(复用总设备数变量)
|
||
ROUND(
|
||
IF(dt.total_devs = 0, 0, dt.cable_use / dt.total_devs * 100),
|
||
2
|
||
) AS cable_total,
|
||
-- 计算5010类型当日在用率
|
||
ROUND(
|
||
IF(dt.total_devs = 0, 0, dt.substation_use / dt.total_devs * 100),
|
||
2
|
||
) AS substation_total,
|
||
-- 计算5474类型当日在用率
|
||
ROUND(
|
||
IF(dt.total_devs = 0, 0, dt.line_use / dt.total_devs * 100),
|
||
2
|
||
) AS line_total
|
||
FROM (
|
||
-- 子查询2:预计算每日总设备数和各类型在用设备数(减少函数调用)
|
||
SELECT DATE(mddu.create_time) AS stat_date,
|
||
COUNT(DISTINCT mddu.ma_id) AS total_devs, -- 当日总设备数(去重)
|
||
-- 5080类型当日在用设备数(status=1且类型=5080)
|
||
COUNT(DISTINCT CASE
|
||
WHEN mddu.status = 1 AND mtv.maxTypeId = 1
|
||
THEN mddu.ma_id END) AS cable_use,
|
||
-- 5010类型当日在用设备数
|
||
COUNT(DISTINCT CASE
|
||
WHEN mddu.status = 1 AND mtv.maxTypeId = 3
|
||
THEN mddu.ma_id END) AS substation_use,
|
||
-- 5474类型当日在用设备数
|
||
COUNT(DISTINCT CASE
|
||
WHEN mddu.status = 1 AND mtv.maxTypeId = 2
|
||
THEN mddu.ma_id END) AS line_use
|
||
FROM ma_dev_daily_use mddu
|
||
-- 关联类型表时过滤目标类型,减少关联数据量(核心优化)
|
||
INNER JOIN ma_type_view mtv
|
||
ON mtv.typeId = mddu.type_id
|
||
AND mtv.maxTypeId IN (1, 3, 2) -- 只关联需要的类型
|
||
GROUP BY DATE(mddu.create_time)) AS dt -- dt = daily_total(每日统计基础数据)
|
||
) AS daily_stats
|
||
GROUP BY DATE_FORMAT(stat_date, '%Y-%m')
|
||
ORDER BY month DESC; -- 按月份倒序,便于查看最新数据
|
||
</select>
|
||
</mapper>
|