lanan-system/dl-module-repair/src/main/resources/mapper/base/RepairStatisticsMapper.xml
2025-09-19 10:20:42 +08:00

223 lines
8.5 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="cn.iocoder.yudao.module.base.mapper.RepairStatisticsMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="customerSource" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
COALESCE(sdd.label, '未知') AS name,
COUNT(bcm.id) AS value
FROM
base_customer_main bcm
LEFT JOIN system_dict_data sdd ON bcm.data_from = sdd.value AND sdd.dict_type = 'cus_data_from' AND sdd.deleted = 0
WHERE
bcm.deleted = 0
GROUP BY
bcm.data_from
ORDER BY
bcm.create_time
</select>
<select id="ticketCountTrend" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS name,
COUNT(*) AS value
FROM
dl_repair_tickets
WHERE
create_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY
name
ORDER BY
name
</select>
<select id="ticketAmountTrend" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS name,
SUM(total_price) AS value
FROM
dl_repair_tickets
WHERE
create_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY
name
ORDER BY
name
</select>
<select id="paymentWay" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
COALESCE(sdd.label, '未知') AS name,
COUNT(roi.id) AS value
FROM
repair_order_info roi
LEFT JOIN system_dict_data sdd ON roi.pay_type = sdd.value AND sdd.dict_type = 'repair_pay_type' AND sdd.deleted = 0
WHERE
roi.deleted = 0
GROUP BY roi.pay_type
ORDER BY roi.create_time
</select>
<select id="repairTypeStatistics" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
COALESCE(sdd.label, '未知') AS `name`,
COUNT( drt.id ) AS `value`
FROM
dl_repair_tickets drt
LEFT JOIN system_dict_data sdd ON drt.repair_type = sdd.value AND sdd.dict_type = 'repair_type' AND sdd.deleted = 0
WHERE
drt.deleted = 0
GROUP BY
drt.repair_type
ORDER BY
drt.create_time
</select>
<select id="ticketStatistics" resultType="cn.iocoder.yudao.module.base.vo.RepairTicketStatisticsVO">
SELECT
COUNT( drt.id ) AS totalCount,
SUM( drt.total_price ) AS totalAmount,
COUNT( CASE WHEN DATE ( drt.create_time ) = CURDATE() THEN 1 END ) AS todayCount,
SUM( CASE WHEN DATE ( drt.create_time ) = CURDATE() THEN drt.total_price ELSE 0 END ) AS todayAmount
FROM
dl_repair_tickets drt
WHERE
drt.deleted = 0
</select>
<select id="ticketStatusCount" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
sdd.label AS `name`,
COUNT(drt.id) AS `value`
FROM
system_dict_data sdd
LEFT JOIN
dl_repair_tickets drt ON drt.tickets_status = sdd.`value`
WHERE
sdd.dict_type = 'repair_tickets_status'
AND sdd.deleted = 0
GROUP BY
sdd.value
ORDER BY
sdd.value
</select>
<select id="listTicketToday" resultType="cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO">
SELECT
drt.*
FROM
dl_repair_tickets drt
WHERE
drt.deleted = 0
AND DATE ( drt.create_time ) = CURDATE()
ORDER BY
drt.create_time DESC
</select>
<select id="listWorks" resultType="cn.iocoder.yudao.module.base.vo.RepairStatisticsVO">
SELECT
drw.user_name AS `name`,
COUNT(drr.id) AS `value`
FROM
dl_repair_worker drw
LEFT JOIN dl_repair_records drr ON drw.user_id = drr.deal_user_id AND drr.deleted = 0
WHERE drr.type = 'sgwczj'
GROUP BY drw.user_id,drr.ticket_id
ORDER BY value DESC
</select>
<select id="listBusinessByCustomer"
resultType="cn.iocoder.yudao.module.base.vo.QueryBusinessResp"
parameterType="cn.iocoder.yudao.module.base.vo.QueryBusinessReqVO">
SELECT t.*
FROM (
SELECT
c.id AS customerId,
c.cus_name AS customerName,
c.phone_number AS customerPhone,
r.id AS bizId,
r.ticket_no AS bizNo,
r.repair_type AS bizType,
r.in_time AS bizTime,
r.handle_name AS handleName,
'repair' AS source,
'维修' AS sourceStr,
ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY r.in_time DESC) AS rn,
COUNT(*) OVER (PARTITION BY c.id) AS consumeCount -- 新增字段:消费次数
FROM base_customer_main c
JOIN dl_repair_tickets r ON c.id = r.user_id
LEFT JOIN dl_repair_titem t ON r.id = t.ticket_id
WHERE
1 = 1
AND c.deleted = 0
<if test="reqVO.dateRange != null">
AND r.in_time BETWEEN CONCAT(#{reqVO.dateRange[0]}, ' 00:00:00')
AND CONCAT(#{reqVO.dateRange[1]}, ' 23:59:59')
</if>
<if test="reqVO.search != null and reqVO.search != ''">
AND (
c.cus_name LIKE CONCAT('%', #{reqVO.search}, '%')
OR c.phone_number LIKE CONCAT('%', #{reqVO.search}, '%')
OR r.ticket_no LIKE CONCAT('%', #{reqVO.search}, '%')
OR t.item_name LIKE CONCAT('%', #{reqVO.search}, '%')
)
</if>
ORDER BY r.in_time DESC
) t
WHERE t.rn = 1;
</select>
<select id="listBusinessByCar"
resultType="cn.iocoder.yudao.module.base.vo.QueryBusinessResp"
parameterType="cn.iocoder.yudao.module.base.vo.QueryBusinessReqVO">
SELECT t.*
FROM (
-- 维修工单
SELECT
car.id AS carId,
car.license_number AS carNum,
c.id AS customerId,
c.cus_name AS customerName,
c.phone_number AS customerPhone,
r.id AS bizId,
r.ticket_no AS bizNo,
r.repair_type AS bizType,
r.create_time AS bizTime,
'repair' AS source,
'维修' AS sourceStr,
ROW_NUMBER() OVER (PARTITION BY car.id ORDER BY r.in_time DESC) AS rn,
COUNT(*) OVER (PARTITION BY car.id) AS consumeCount -- 新增字段:该车辆来过的次数
FROM base_car_main car
INNER JOIN base_customer_car cc ON car.id = cc.car_id
LEFT JOIN base_customer_main c ON cc.cus_id = c.id
INNER JOIN dl_repair_tickets r ON car.license_number = r.car_no
) t
WHERE t.rn = 1
<if test="reqVO.dateRange != null">
AND t.bizTime BETWEEN CONCAT(#{reqVO.dateRange[0]}, ' 00:00:00')
AND CONCAT(#{reqVO.dateRange[1]}, ' 23:59:59')
</if>
<if test="reqVO.search != null and reqVO.search != ''">
AND (
t.customerName LIKE CONCAT('%', #{reqVO.search}, '%')
OR t.customerPhone LIKE CONCAT('%', #{reqVO.search}, '%')
OR t.carNum LIKE CONCAT('%', #{reqVO.search}, '%')
)
</if>
GROUP BY t.carNum
ORDER BY t.bizTime DESC
</select>
<select id="pageByCustomerOrCar" resultType="cn.iocoder.yudao.module.base.vo.QueryTableResp">
SELECT drt.*, '维修' AS sourceStr
FROM dl_repair_tickets drt
WHERE 1=1
<if test="reqVO.dateRange != null">
AND DATE(drt.create_time) BETWEEN #{reqVO.dateRange[0]} AND #{reqVO.dateRange[1]}
</if>
<if test="reqVO.phone != null and reqVO.phone != ''">
AND drt.user_mobile LIKE CONCAT('%', #{reqVO.phone}, '%')
</if>
<if test="reqVO.carNo != null and reqVO.carNo != ''">
AND drt.car_no LIKE CONCAT('%', #{reqVO.carNo}, '%')
</if>
</select>
</mapper>