Bonus-Cloud-Material-Mall/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/lease/MaLeaseInfoMapper.xml

995 lines
44 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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>