<?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.ruoyi.quality.mapper.QualityInspectMapper">
|
<select id="qualityInspectListPage" resultType="com.ruoyi.quality.pojo.QualityInspect">
|
SELECT
|
qi.*,
|
<choose>
|
<when test="qualityInspect.inspectType == 0">
|
pl.purchase_contract_number as purchase_contract_no
|
</when>
|
<otherwise>
|
pwo.work_order_no
|
</otherwise>
|
</choose>
|
FROM
|
quality_inspect qi
|
<choose>
|
<when test="qualityInspect.inspectType == 0 ">
|
LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id
|
</when>
|
<otherwise>
|
LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id
|
LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
|
</otherwise>
|
</choose>
|
WHERE
|
inspect_type=#{qualityInspect.inspectType}
|
<if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
|
AND qi.supplier like concat('%',#{qualityInspect.supplier},'%')
|
</if>
|
<if test="qualityInspect.customer != null and qualityInspect.customer != '' ">
|
AND qi.customer like concat('%',#{qualityInspect.customer},'%')
|
</if>
|
<if test="qualityInspect.process != null and qualityInspect.process != '' ">
|
AND qi.process like concat('%',#{qualityInspect.process},'%')
|
</if>
|
<if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
|
AND qi.product_name like concat('%',#{qualityInspect.productName},'%')
|
</if>
|
<if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">
|
AND qi.check_time >= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
|
</if>
|
<if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
|
AND qi.check_time <= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
|
</if>
|
ORDER BY qi.check_time DESC
|
</select>
|
|
<select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
|
SELECT
|
*
|
FROM quality_inspect
|
where
|
inspect_type=#{qualityInspect.inspectType}
|
<if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
|
AND supplier = #{qualityInspect.supplier}
|
</if>
|
<if test="qualityInspect.customer != null and qualityInspect.customer != '' ">
|
AND customer = #{qualityInspect.customer}
|
</if>
|
<if test="qualityInspect.process != null and qualityInspect.process != '' ">
|
AND process = #{qualityInspect.process}
|
</if>
|
<if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
|
AND product_name = #{qualityInspect.productName}
|
</if>
|
</select>
|
|
<delete id="deleteByProductMainIds">
|
DELETE FROM quality_inspect
|
WHERE product_main_id IN
|
<foreach collection="productMainIds" item="id" open="(" separator="," close=")">
|
#{id}
|
</foreach>
|
</delete>
|
|
<select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto">
|
SELECT
|
rm.check_type AS modelType,
|
COUNT(*) AS totalCount,
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) AS completedCount,
|
SUM(CASE WHEN rm.inspect_state = 0 THEN 1 ELSE 0 END) AS uncommittedCount
|
FROM raw_material rm
|
WHERE rm.inspect_state IN (0, 1)
|
GROUP BY rm.check_type
|
ORDER BY rm.check_type;
|
</select>
|
|
<select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
|
SELECT
|
t.modelType,
|
COALESCE(rm.totalCount, 0) AS totalCount,
|
COALESCE(rm.completedCount, 0) AS completedCount,
|
COALESCE(rm.qualifiedCount, 0) AS qualifiedCount,
|
COALESCE(rm.unqualifiedCount, 0) AS unqualifiedCount,
|
COALESCE(rm.uncommittedCount, 0) AS uncommittedCount,
|
COALESCE(rm.completionRate, 0) AS completionRate,
|
COALESCE(rm.passRate, 0) AS passRate
|
FROM (
|
SELECT 0 AS modelType
|
UNION ALL
|
SELECT 1
|
UNION ALL
|
SELECT 2
|
) t
|
LEFT JOIN (
|
SELECT
|
rm.check_type AS modelType,
|
COUNT(*) AS totalCount,
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) AS completedCount,
|
SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 1 THEN 1 ELSE 0 END) AS qualifiedCount,
|
SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount,
|
SUM(CASE WHEN rm.inspect_state = 0 THEN 1 ELSE 0 END) AS uncommittedCount,
|
IF(COUNT(*) = 0, 0,
|
ROUND(SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2)
|
) AS completionRate,
|
IF(SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) = 0, 0,
|
ROUND(SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 1 THEN 1 ELSE 0 END) /
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) * 100, 2)
|
) AS passRate
|
FROM raw_material rm
|
GROUP BY rm.check_type
|
) rm ON t.modelType = rm.modelType
|
ORDER BY t.modelType;
|
</select>
|
|
|
<select id="getMonthlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityMonthlyPassRateDto">
|
WITH RECURSIVE
|
months AS (
|
SELECT 1 AS month_num
|
UNION ALL
|
SELECT month_num + 1
|
FROM months
|
WHERE month_num < 12
|
),
|
types AS (
|
SELECT 0 AS modelType
|
UNION ALL
|
SELECT 1
|
UNION ALL
|
SELECT 2
|
),
|
base AS (
|
SELECT m.month_num, t.modelType
|
FROM months m
|
CROSS JOIN types t
|
)
|
SELECT
|
CASE b.month_num
|
WHEN 1 THEN '一月'
|
WHEN 2 THEN '二月'
|
WHEN 3 THEN '三月'
|
WHEN 4 THEN '四月'
|
WHEN 5 THEN '五月'
|
WHEN 6 THEN '六月'
|
WHEN 7 THEN '七月'
|
WHEN 8 THEN '八月'
|
WHEN 9 THEN '九月'
|
WHEN 10 THEN '十月'
|
WHEN 11 THEN '十一月'
|
WHEN 12 THEN '十二月'
|
END AS month,
|
b.modelType,
|
COALESCE(rm.totalCount, 0) AS totalCount,
|
COALESCE(rm.completedCount, 0) AS completedCount,
|
COALESCE(rm.qualifiedCount, 0) AS qualifiedCount,
|
COALESCE(rm.unqualifiedCount, 0) AS unqualifiedCount,
|
COALESCE(rm.uncommittedCount, 0) AS uncommittedCount,
|
COALESCE(rm.completionRate, 0) AS completionRate,
|
COALESCE(rm.passRate, 0) AS passRate
|
FROM base b
|
LEFT JOIN (
|
SELECT
|
MONTH(rm.create_time) AS month_num,
|
rm.check_type AS modelType,
|
COUNT(*) AS totalCount,
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) AS completedCount,
|
SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 1 THEN 1 ELSE 0 END) AS qualifiedCount,
|
SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount,
|
SUM(CASE WHEN rm.inspect_state = 0 THEN 1 ELSE 0 END) AS uncommittedCount,
|
IF(COUNT(*) = 0, 0,
|
ROUND(SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2)
|
) AS completionRate,
|
IF(SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) = 0, 0,
|
ROUND(SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 1 THEN 1 ELSE 0 END) /
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) * 100, 2)
|
) AS passRate
|
FROM raw_material rm
|
WHERE YEAR(rm.create_time) = #{year} -- 按年份筛选
|
GROUP BY MONTH(rm.create_time), rm.check_type
|
) rm ON b.month_num = rm.month_num AND b.modelType = rm.modelType
|
ORDER BY b.month_num, b.modelType;
|
</select>
|
|
<select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
|
SELECT
|
t.modelType,
|
COALESCE(rm.totalCount, 0) AS totalCount,
|
COALESCE(rm.completedCount, 0) AS completedCount,
|
COALESCE(rm.uncommittedCount, 0) AS uncommittedCount,
|
COALESCE(rm.qualifiedCount, 0) AS qualifiedCount,
|
COALESCE(rm.unqualifiedCount, 0) AS unqualifiedCount,
|
COALESCE(rm.completionRate, 0) AS completionRate,
|
COALESCE(rm.passRate, 0) AS passRate
|
FROM (
|
SELECT 0 AS modelType
|
UNION ALL
|
SELECT 1
|
UNION ALL
|
SELECT 2
|
) t
|
LEFT JOIN (
|
SELECT
|
rm.check_type AS modelType,
|
COUNT(*) AS totalCount,
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) AS completedCount,
|
SUM(CASE WHEN rm.inspect_state = 0 THEN 1 ELSE 0 END) AS uncommittedCount,
|
SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 1 THEN 1 ELSE 0 END) AS qualifiedCount,
|
SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount,
|
-- 完成率 = 已提交数量 / 总数量 * 100
|
IF(COUNT(*) = 0, 0,
|
ROUND(SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2)
|
) AS completionRate,
|
-- 合格率 = 合格数量 / 已提交数量 * 100
|
IF(SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) = 0, 0,
|
ROUND(SUM(CASE WHEN rm.inspect_state = 1 AND rm.check_result = 1 THEN 1 ELSE 0 END) /
|
SUM(CASE WHEN rm.inspect_state = 1 THEN 1 ELSE 0 END) * 100, 2)
|
) AS passRate
|
FROM raw_material rm
|
WHERE rm.inspect_state IN (0, 1)
|
AND YEAR(rm.create_time) = #{year} -- 按年份筛选,假设有时间字段
|
GROUP BY rm.check_type
|
) rm ON t.modelType = rm.modelType
|
ORDER BY t.modelType;
|
</select>
|
|
|
|
<select id="getMonthlyCompletionDetails" resultType="com.ruoyi.quality.dto.QualityMonthlyDetailDto">
|
WITH RECURSIVE months AS (
|
SELECT 1 AS month_num
|
UNION ALL
|
SELECT month_num + 1
|
FROM months
|
WHERE month_num < 12
|
)
|
SELECT
|
CASE m.month_num
|
WHEN 1 THEN '一月'
|
WHEN 2 THEN '二月'
|
WHEN 3 THEN '三月'
|
WHEN 4 THEN '四月'
|
WHEN 5 THEN '五月'
|
WHEN 6 THEN '六月'
|
WHEN 7 THEN '七月'
|
WHEN 8 THEN '八月'
|
WHEN 9 THEN '九月'
|
WHEN 10 THEN '十月'
|
WHEN 11 THEN '十一月'
|
WHEN 12 THEN '十二月'
|
END AS month,
|
/* 入场检 (check_type = 0) */
|
COALESCE(SUM(
|
CASE
|
WHEN rm.check_type = 0
|
THEN 1 -- 统计记录数,因为原SQL用的是quantity字段
|
ELSE 0
|
END
|
), 0) AS rawMaterialCount,
|
/* 车间检 (check_type = 1) */
|
COALESCE(SUM(
|
CASE
|
WHEN rm.check_type = 1
|
THEN 1
|
ELSE 0
|
END
|
), 0) AS processCount,
|
/* 出厂检 (check_type = 2) */
|
COALESCE(SUM(
|
CASE
|
WHEN rm.check_type = 2
|
THEN 1
|
ELSE 0
|
END
|
), 0) AS outgoingCount
|
FROM months m
|
LEFT JOIN raw_material rm
|
ON YEAR(rm.create_time) = #{year}
|
AND MONTH(rm.create_time) = m.month_num
|
AND rm.inspect_state = 1 -- 已提交
|
AND rm.check_result = 1 -- 合格
|
GROUP BY m.month_num
|
ORDER BY m.month_num;
|
</select>
|
|
<select id="getTopParameters" resultType="com.ruoyi.quality.dto.QualityParameterStatDto">
|
WITH parameter_counts AS (
|
SELECT
|
qii.name,
|
COUNT(*) AS count
|
FROM raw_material rm
|
LEFT JOIN raw_material_quality_inspect_item rmqi
|
ON rmqi.raw_material_id = rm.id
|
LEFT JOIN quality_inspect_item qii
|
ON qii.id = rmqi.quality_inspect_item_id
|
WHERE qii.name IS NOT NULL
|
AND rm.check_type = CASE
|
WHEN #{modelType} = 1 THEN 0 -- 前端1 → 数据库0
|
WHEN #{modelType} = 2 THEN 1 -- 前端2 → 数据库1
|
WHEN #{modelType} = 3 THEN 2 -- 前端3 → 数据库2
|
END
|
GROUP BY qii.name
|
),
|
ranked AS (
|
SELECT
|
name,
|
count,
|
ROW_NUMBER() OVER (ORDER BY count DESC) AS rn
|
FROM parameter_counts
|
),
|
total AS (
|
SELECT SUM(count) AS total_count
|
FROM parameter_counts
|
)
|
|
SELECT
|
name,
|
count,
|
CASE
|
WHEN (SELECT total_count FROM total) = 0 THEN 0
|
ELSE ROUND(count / (SELECT total_count FROM total) * 100, 2)
|
END AS percentage
|
FROM (
|
SELECT name, count, rn
|
FROM ranked
|
WHERE rn <= 4
|
UNION ALL
|
-- 其他合并
|
SELECT
|
'其他检测' AS name,
|
SUM(count) AS count,
|
5 AS rn
|
FROM ranked
|
WHERE rn > 4
|
HAVING SUM(count) > 0
|
) t
|
ORDER BY rn;
|
</select>
|
|
|
</mapper>
|