<?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">
|
WITH RECURSIVE product_tree AS (SELECT id,
|
parent_id,
|
product_name,
|
id AS root_id,
|
product_name AS root_name
|
FROM product
|
WHERE product_name IN ('原料', '半成品', '成品')
|
UNION ALL
|
SELECT p.id,
|
p.parent_id,
|
p.product_name,
|
pt.root_id,
|
pt.root_name
|
FROM product p
|
INNER JOIN product_tree pt ON p.parent_id = pt.id)
|
SELECT CASE pt.root_name
|
WHEN '原料' THEN 0
|
WHEN '半成品' THEN 1
|
WHEN '成品' THEN 2
|
END AS modelType,
|
|
IFNULL(SUM(qi.quantity), 0) AS totalCount,
|
|
IFNULL(SUM(CASE
|
WHEN qi.inspect_state = 1 THEN qi.quantity
|
ELSE 0
|
END), 0) AS completedCount
|
|
FROM product_tree pt
|
INNER JOIN product_model pm ON pm.product_id = pt.id
|
LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
|
GROUP BY pt.root_id, pt.root_name
|
</select>
|
|
<select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
|
WITH RECURSIVE product_tree AS (SELECT id,
|
product_name,
|
CASE product_name
|
WHEN '原料' THEN 0
|
WHEN '半成品' THEN 1
|
WHEN '成品' THEN 2
|
END AS modelType
|
FROM product
|
WHERE product_name IN ('原料', '半成品', '成品')
|
|
UNION ALL
|
|
SELECT p.id,
|
p.product_name,
|
pt.modelType
|
FROM product p
|
INNER JOIN product_tree pt ON p.parent_id = pt.id)
|
|
SELECT base.modelType,
|
COALESCE(SUM(qi.quantity), 0) AS totalCount,
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '合格' THEN qi.quantity ELSE 0 END),
|
0) AS qualifiedCount,
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '不合格' THEN qi.quantity ELSE 0 END),
|
0) AS unqualifiedCount,
|
|
IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
|
ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END)
|
/ SUM(qi.quantity) * 100, 2)
|
) AS completionRate,
|
|
IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
|
ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '合格' THEN qi.quantity ELSE 0 END)
|
/ SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
|
) AS passRate
|
|
FROM (SELECT 0 AS modelType
|
UNION ALL
|
SELECT 1
|
UNION ALL
|
SELECT 2) base
|
LEFT JOIN product_tree pt ON base.modelType = pt.modelType
|
LEFT JOIN product_model pm ON pm.product_id = pt.id
|
LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
|
|
GROUP BY base.modelType
|
ORDER BY base.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),
|
product_tree AS (SELECT id,
|
product_name,
|
CASE product_name
|
WHEN '原料' THEN 0
|
WHEN '半成品' THEN 1
|
WHEN '成品' THEN 2
|
END AS modelType
|
FROM product
|
WHERE product_name IN ('原料', '半成品', '成品')
|
|
UNION ALL
|
|
SELECT p.id, p.product_name, pt.modelType
|
FROM product p
|
INNER JOIN product_tree pt ON p.parent_id = pt.id),
|
base_matrix AS (SELECT m.month_num, t.modelType
|
FROM months m
|
CROSS JOIN (SELECT 0 AS modelType UNION ALL SELECT 1 UNION ALL SELECT 2) 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(SUM(qi.quantity), 0) AS totalCount,
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '合格' THEN qi.quantity ELSE 0 END),
|
0) AS qualifiedCount,
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '不合格' THEN qi.quantity ELSE 0 END),
|
0) AS unqualifiedCount,
|
|
/* 完成率 */
|
IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
|
ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) / SUM(qi.quantity) * 100, 2)
|
) AS completionRate,
|
|
/* 合格率 */
|
IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
|
ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '合格' THEN qi.quantity ELSE 0 END)
|
/ SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
|
) AS passRate
|
|
FROM base_matrix b
|
LEFT JOIN product_tree pt ON b.modelType = pt.modelType
|
-- 关联产品模型
|
LEFT JOIN product_model pm ON pm.product_id = pt.id
|
-- 关联检验数据,并按年、月、类型过滤
|
LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
|
AND YEAR(qi.check_time) = #{year}
|
AND MONTH(qi.check_time) = b.month_num
|
|
GROUP BY b.month_num, b.modelType
|
ORDER BY b.month_num, b.modelType
|
</select>
|
|
<select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
|
WITH RECURSIVE
|
product_tree AS (SELECT id,
|
product_name,
|
CASE product_name
|
WHEN '原料' THEN 0
|
WHEN '半成品' THEN 1
|
WHEN '成品' THEN 2
|
END AS modelType
|
FROM product
|
WHERE product_name IN ('原料', '半成品', '成品')
|
|
UNION ALL
|
|
SELECT p.id, p.product_name, pt.modelType
|
FROM product p
|
INNER JOIN product_tree pt ON p.parent_id = pt.id),
|
types AS (SELECT 0 AS modelType
|
UNION ALL
|
SELECT 1
|
UNION ALL
|
SELECT 2)
|
|
SELECT t.modelType,
|
COALESCE(SUM(qi.quantity), 0) AS totalCount,
|
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
|
|
COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '合格' THEN qi.quantity ELSE 0 END),
|
0) AS qualifiedCount,
|
|
IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
|
ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '合格' THEN qi.quantity ELSE 0 END)
|
/ SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
|
) AS passRate
|
|
FROM types t
|
LEFT JOIN product_tree pt ON t.modelType = pt.modelType
|
LEFT JOIN product_model pm ON pm.product_id = pt.id
|
LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
|
AND YEAR(qi.check_time) = #{year}
|
|
GROUP BY t.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),
|
product_tree AS (SELECT id, product_name AS root_name
|
FROM product
|
WHERE product_name IN ('原料', '半成品', '成品')
|
|
UNION ALL
|
|
SELECT p.id, pt.root_name
|
FROM product p
|
INNER JOIN product_tree pt ON p.parent_id = pt.id)
|
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,
|
|
COALESCE(SUM(CASE WHEN pt.root_name = '原料' THEN qi.quantity ELSE 0 END), 0) AS rawMaterialCount,
|
|
COALESCE(SUM(CASE WHEN pt.root_name = '半成品' THEN qi.quantity ELSE 0 END), 0) AS processCount,
|
|
COALESCE(SUM(CASE WHEN pt.root_name = '成品' THEN qi.quantity ELSE 0 END), 0) AS outgoingCount
|
|
FROM months m
|
LEFT JOIN product_tree pt ON 1 = 1
|
LEFT JOIN product_model pm ON pm.product_id = pt.id
|
LEFT JOIN quality_inspect qi
|
ON qi.product_model_id = pm.id
|
AND qi.inspect_state = 1
|
AND YEAR(qi.check_time) = #{year}
|
AND MONTH(qi.check_time) = m.month_num
|
|
GROUP BY m.month_num
|
ORDER BY m.month_num
|
</select>
|
|
<select id="getTopParameters" resultType="com.ruoyi.quality.dto.QualityParameterStatDto">
|
WITH RECURSIVE
|
-- 1. 找到对应的根节点
|
root_node AS (SELECT id, product_name
|
FROM product
|
WHERE (
|
(#{modelType} = 1 AND product_name = '原料')
|
OR (#{modelType} = 2 AND product_name = '半成品')
|
OR (#{modelType} = 3 AND product_name = '成品')
|
)),
|
target_ids AS (SELECT id
|
FROM root_node
|
UNION ALL
|
SELECT p.id
|
FROM product p
|
INNER JOIN target_ids ti ON p.parent_id = ti.id),
|
parameter_counts AS (SELECT qip.parameter_item AS name,
|
COUNT(*) AS count
|
FROM quality_inspect_param qip
|
JOIN quality_inspect qi ON qip.inspect_id = qi.id
|
WHERE qi.inspect_state = 1
|
AND qi.product_id IN (SELECT id FROM target_ids)
|
GROUP BY qip.parameter_item),
|
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>
|