|
|
@@ -0,0 +1,479 @@
|
|
|
+<?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.dtm.supply.mapper.SupplyMonitorMapper">
|
|
|
+
|
|
|
+ <select id="countPurchaseOrders" resultType="java.lang.Long">
|
|
|
+ SELECT COUNT(1) FROM dtm_supply_purchase_order
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="countPurchaseReceipts" resultType="java.lang.Long">
|
|
|
+ SELECT COUNT(1) FROM dtm_supply_purchase_receipt
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="countSupplierTerms" resultType="java.lang.Long">
|
|
|
+ SELECT COUNT(1) FROM dtm_supply_supplier_term
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="countOrderReceiptMatches" resultType="java.lang.Long">
|
|
|
+ SELECT COUNT(1) FROM dtm_supply_order_receipt_match
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="countQaInspections" resultType="java.lang.Long">
|
|
|
+ SELECT COUNT(1) FROM dtm_supply_qa_inspection
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectPurchaseOrders" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ business_date AS businessDate,
|
|
|
+ delivery_date AS deliveryDate,
|
|
|
+ document_id AS documentId,
|
|
|
+ supplier_code AS supplierCode,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ IFNULL(order_qty, 0) AS orderQty,
|
|
|
+ IFNULL(completed_qty, 0) AS completedQty,
|
|
|
+ IFNULL(uncompleted_qty, 0) AS uncompletedQty,
|
|
|
+ IFNULL(amount, 0) AS amount
|
|
|
+ FROM dtm_supply_purchase_order
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectPurchaseReceipts" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ business_date AS businessDate,
|
|
|
+ acceptance_date AS acceptanceDate,
|
|
|
+ receipt_id AS receiptId,
|
|
|
+ supplier_code AS supplierCode,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ sku AS sku,
|
|
|
+ IFNULL(quantity, 0) AS quantity,
|
|
|
+ IFNULL(amount, 0) AS amount
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectSupplierTerms" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ supplier_code AS supplierCode,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ payment_terms AS paymentTerms,
|
|
|
+ term_days AS termDays
|
|
|
+ FROM dtm_supply_supplier_term
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectOrderReceiptMatches" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ acceptance_date AS acceptanceDate,
|
|
|
+ plan_delivery_date AS planDeliveryDate,
|
|
|
+ supplier_code AS supplierCode,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ sku AS sku,
|
|
|
+ product_name AS productName,
|
|
|
+ IFNULL(receipt_qty, 0) AS receiptQty,
|
|
|
+ IFNULL(plan_qty, 0) AS planQty
|
|
|
+ FROM dtm_supply_order_receipt_match
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectQaInspections" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ inspect_date AS inspectDate,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ IFNULL(incoming_qty, 0) AS incomingQty,
|
|
|
+ IFNULL(sample_qty, 0) AS sampleQty,
|
|
|
+ IFNULL(defect_qty, 0) AS defectQty
|
|
|
+ FROM dtm_supply_qa_inspection
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ AND inspect_date IS NOT NULL
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectSupplierMonitorSummary" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ base.supplierCode AS supplierCode,
|
|
|
+ base.supplierName AS supplierName,
|
|
|
+ IFNULL(o.orderCount, 0) AS orderCount,
|
|
|
+ IFNULL(o.orderLines, 0) AS orderLines,
|
|
|
+ IFNULL(o.orderQty, 0) AS orderQty,
|
|
|
+ IFNULL(o.completedQty, 0) AS completedQty,
|
|
|
+ IFNULL(o.uncompletedQty, 0) AS uncompletedQty,
|
|
|
+ IFNULL(o.orderAmount, 0) AS orderAmount,
|
|
|
+ IFNULL(r.receiptQty, 0) AS receiptQty,
|
|
|
+ IFNULL(r.receiptAmount, 0) AS receiptAmount,
|
|
|
+ IFNULL(r.receiptLines, 0) AS receiptLines,
|
|
|
+ IFNULL(m.matchedLines, 0) AS matchedLines,
|
|
|
+ IFNULL(m.onTimeLines, 0) AS onTimeLines,
|
|
|
+ IFNULL(m.matchedPlanQty, 0) AS matchedPlanQty,
|
|
|
+ IFNULL(m.matchedReceiptQty, 0) AS matchedReceiptQty,
|
|
|
+ IFNULL(t.term_days, 0) AS termDays
|
|
|
+ FROM (
|
|
|
+ SELECT supplier_code AS supplierCode, supplier_name AS supplierName
|
|
|
+ FROM dtm_supply_purchase_order
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND business_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND business_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ UNION
|
|
|
+ SELECT supplier_code AS supplierCode, supplier_name AS supplierName
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND business_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND business_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ UNION
|
|
|
+ SELECT supplier_code AS supplierCode, supplier_name AS supplierName
|
|
|
+ FROM dtm_supply_order_receipt_match
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND acceptance_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND acceptance_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ ) base
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ COUNT(DISTINCT document_id) AS orderCount,
|
|
|
+ COUNT(1) AS orderLines,
|
|
|
+ SUM(IFNULL(order_qty, 0)) AS orderQty,
|
|
|
+ SUM(IFNULL(completed_qty, 0)) AS completedQty,
|
|
|
+ SUM(IFNULL(uncompleted_qty, 0)) AS uncompletedQty,
|
|
|
+ SUM(IFNULL(amount, 0)) AS orderAmount
|
|
|
+ FROM dtm_supply_purchase_order
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND business_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND business_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ GROUP BY supplier_name
|
|
|
+ ) o ON o.supplierName = base.supplierName
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ SUM(IFNULL(quantity, 0)) AS receiptQty,
|
|
|
+ SUM(IFNULL(amount, 0)) AS receiptAmount,
|
|
|
+ COUNT(1) AS receiptLines
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND business_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND business_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ GROUP BY supplier_name
|
|
|
+ ) r ON r.supplierName = base.supplierName
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ COUNT(1) AS matchedLines,
|
|
|
+ SUM(CASE
|
|
|
+ WHEN acceptance_date IS NOT NULL
|
|
|
+ AND plan_delivery_date IS NOT NULL
|
|
|
+ AND acceptance_date <= plan_delivery_date THEN 1
|
|
|
+ ELSE 0
|
|
|
+ END) AS onTimeLines,
|
|
|
+ SUM(IFNULL(plan_qty, 0)) AS matchedPlanQty,
|
|
|
+ SUM(IFNULL(receipt_qty, 0)) AS matchedReceiptQty
|
|
|
+ FROM dtm_supply_order_receipt_match
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND acceptance_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND acceptance_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ GROUP BY supplier_name
|
|
|
+ ) m ON m.supplierName = base.supplierName
|
|
|
+ LEFT JOIN dtm_supply_supplier_term t ON t.supplier_name = base.supplierName
|
|
|
+ ORDER BY IFNULL(r.receiptAmount, 0) DESC
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectSupplierSkuCosts" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ sku AS sku,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ SUM(IFNULL(quantity, 0)) AS receiptQty,
|
|
|
+ SUM(IFNULL(amount, 0)) AS receiptAmount
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ AND sku IS NOT NULL
|
|
|
+ AND sku != ''
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND business_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND business_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ GROUP BY sku, supplier_name
|
|
|
+ HAVING SUM(IFNULL(quantity, 0)) > 0
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectPaymentPlanRows" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ plan.supplierCode,
|
|
|
+ plan.supplierName,
|
|
|
+ plan.termDays,
|
|
|
+ DATE_FORMAT(plan.dueDate, '%Y-%m-%d') AS dueDate,
|
|
|
+ plan.estimatedPayAmount,
|
|
|
+ plan.receiptQty,
|
|
|
+ plan.receiptLines
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ r.supplier_code AS supplierCode,
|
|
|
+ r.supplier_name AS supplierName,
|
|
|
+ IFNULL(t.termDays, 0) AS termDays,
|
|
|
+ DATE_ADD(r.acceptance_date, INTERVAL IFNULL(t.termDays, 0) DAY) AS dueDate,
|
|
|
+ SUM(IFNULL(r.amount, 0)) AS estimatedPayAmount,
|
|
|
+ SUM(IFNULL(r.quantity, 0)) AS receiptQty,
|
|
|
+ COUNT(1) AS receiptLines
|
|
|
+ FROM dtm_supply_purchase_receipt r
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT supplier_name, MAX(IFNULL(term_days, 0)) AS termDays
|
|
|
+ FROM dtm_supply_supplier_term
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ GROUP BY supplier_name
|
|
|
+ ) t ON t.supplier_name = r.supplier_name
|
|
|
+ WHERE r.supplier_name IS NOT NULL
|
|
|
+ AND r.supplier_name != ''
|
|
|
+ AND r.acceptance_date IS NOT NULL
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND r.supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND r.acceptance_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND r.acceptance_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ GROUP BY r.supplier_code, r.supplier_name, IFNULL(t.termDays, 0), DATE_ADD(r.acceptance_date, INTERVAL IFNULL(t.termDays, 0) DAY)
|
|
|
+ ) plan
|
|
|
+ ORDER BY
|
|
|
+ CASE
|
|
|
+ WHEN plan.dueDate < CURRENT_DATE THEN 0
|
|
|
+ WHEN plan.dueDate <= DATE_ADD(CURRENT_DATE, INTERVAL 7 DAY) THEN 1
|
|
|
+ ELSE 2
|
|
|
+ END,
|
|
|
+ plan.dueDate DESC,
|
|
|
+ plan.estimatedPayAmount DESC
|
|
|
+ LIMIT 500
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectReceiptReconciliationRows" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ DATE_FORMAT(business_date, '%Y-%m') AS month,
|
|
|
+ supplier_code AS supplierCode,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ SUM(IFNULL(quantity, 0)) AS receiptQty,
|
|
|
+ SUM(IFNULL(amount, 0)) AS receiptAmount,
|
|
|
+ COUNT(1) AS receiptLines,
|
|
|
+ COUNT(DISTINCT receipt_id) AS receiptCount,
|
|
|
+ ROUND(SUM(IFNULL(amount, 0)) / NULLIF(SUM(IFNULL(quantity, 0)), 0), 2) AS avgReceiptPrice
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ AND business_date IS NOT NULL
|
|
|
+ <if test="supplierName != null and supplierName != ''">
|
|
|
+ AND supplier_name LIKE CONCAT('%', #{supplierName}, '%')
|
|
|
+ </if>
|
|
|
+ <if test="startDate != null and startDate != ''">
|
|
|
+ AND business_date >= #{startDate}
|
|
|
+ </if>
|
|
|
+ <if test="endDate != null and endDate != ''">
|
|
|
+ AND business_date <= #{endDate}
|
|
|
+ </if>
|
|
|
+ GROUP BY DATE_FORMAT(business_date, '%Y-%m'), supplier_code, supplier_name
|
|
|
+ ORDER BY DATE_FORMAT(business_date, '%Y-%m') DESC, supplier_name
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectProductCost" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ supplier_code AS supplierCode,
|
|
|
+ supplier_name AS supplierName,
|
|
|
+ ROUND(SUM(IFNULL(amount, 0)) / NULLIF(SUM(IFNULL(quantity, 0)), 0), 6) AS referencePrice,
|
|
|
+ SUM(IFNULL(quantity, 0)) AS receiptQty,
|
|
|
+ SUM(IFNULL(amount, 0)) AS receiptAmount,
|
|
|
+ COUNT(1) AS receiptLines,
|
|
|
+ MIN(acceptance_date) AS firstAcceptanceDate,
|
|
|
+ MAX(acceptance_date) AS latestAcceptanceDate
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE sku = #{sku}
|
|
|
+ AND supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ GROUP BY supplier_code, supplier_name
|
|
|
+ HAVING SUM(IFNULL(quantity, 0)) > 0
|
|
|
+ ORDER BY referencePrice ASC
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectProductDelivery" resultType="java.util.HashMap">
|
|
|
+ SELECT
|
|
|
+ m.supplier_code AS supplierCode,
|
|
|
+ m.supplier_name AS supplierName,
|
|
|
+ MAX(m.product_name) AS productName,
|
|
|
+ COUNT(1) AS matchedLines,
|
|
|
+ SUM(CASE
|
|
|
+ WHEN m.acceptance_date IS NOT NULL
|
|
|
+ AND m.plan_delivery_date IS NOT NULL
|
|
|
+ AND m.acceptance_date <= m.plan_delivery_date THEN 1
|
|
|
+ ELSE 0
|
|
|
+ END) AS onTimeLines,
|
|
|
+ SUM(CASE
|
|
|
+ WHEN m.acceptance_date IS NOT NULL
|
|
|
+ AND m.plan_delivery_date IS NOT NULL
|
|
|
+ AND m.acceptance_date > m.plan_delivery_date THEN 1
|
|
|
+ ELSE 0
|
|
|
+ END) AS delayedLines,
|
|
|
+ SUM(IFNULL(m.receipt_qty, 0)) AS receiptQtyForDelivery,
|
|
|
+ SUM(IFNULL(m.plan_qty, 0)) AS planQty,
|
|
|
+ AVG(CASE
|
|
|
+ WHEN m.acceptance_date IS NOT NULL
|
|
|
+ AND m.plan_delivery_date IS NOT NULL
|
|
|
+ THEN DATEDIFF(m.acceptance_date, m.plan_delivery_date)
|
|
|
+ ELSE 0
|
|
|
+ END) AS avgDeviationDays,
|
|
|
+ MAX(CASE
|
|
|
+ WHEN m.acceptance_date IS NOT NULL
|
|
|
+ AND m.plan_delivery_date IS NOT NULL
|
|
|
+ AND m.acceptance_date > m.plan_delivery_date
|
|
|
+ THEN DATEDIFF(m.acceptance_date, m.plan_delivery_date)
|
|
|
+ ELSE 0
|
|
|
+ END) AS maxDelayDays,
|
|
|
+ IFNULL(MAX(t.term_days), 0) AS termDays
|
|
|
+ FROM dtm_supply_order_receipt_match m
|
|
|
+ LEFT JOIN dtm_supply_supplier_term t
|
|
|
+ ON t.supplier_name = m.supplier_name
|
|
|
+ WHERE m.sku = #{sku}
|
|
|
+ AND m.supplier_name IS NOT NULL
|
|
|
+ AND m.supplier_name != ''
|
|
|
+ GROUP BY m.supplier_code, m.supplier_name
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="selectOverviewStats" resultType="java.util.HashMap">
|
|
|
+ WITH supplier_base AS (
|
|
|
+ SELECT supplier_name FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ UNION
|
|
|
+ SELECT supplier_name FROM dtm_supply_order_receipt_match
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ UNION
|
|
|
+ SELECT supplier_name FROM dtm_supply_supplier_term
|
|
|
+ WHERE supplier_name IS NOT NULL AND supplier_name != ''
|
|
|
+ ),
|
|
|
+ cost_rank AS (
|
|
|
+ SELECT
|
|
|
+ supplier_name,
|
|
|
+ sku,
|
|
|
+ RANK() OVER (
|
|
|
+ PARTITION BY sku
|
|
|
+ ORDER BY SUM(IFNULL(amount, 0)) / NULLIF(SUM(IFNULL(quantity, 0)), 0)
|
|
|
+ ) AS cost_rank
|
|
|
+ FROM dtm_supply_purchase_receipt
|
|
|
+ WHERE sku IS NOT NULL
|
|
|
+ AND sku != ''
|
|
|
+ AND supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ GROUP BY supplier_name, sku
|
|
|
+ HAVING SUM(IFNULL(quantity, 0)) > 0
|
|
|
+ ),
|
|
|
+ cost_score AS (
|
|
|
+ SELECT
|
|
|
+ supplier_name,
|
|
|
+ AVG(CASE
|
|
|
+ WHEN cost_rank = 1 THEN 100
|
|
|
+ WHEN cost_rank = 2 THEN 90
|
|
|
+ WHEN cost_rank = 3 THEN 80
|
|
|
+ WHEN cost_rank = 4 THEN 60
|
|
|
+ ELSE 0
|
|
|
+ END) AS cost_score
|
|
|
+ FROM cost_rank
|
|
|
+ GROUP BY supplier_name
|
|
|
+ ),
|
|
|
+ delivery_score AS (
|
|
|
+ SELECT
|
|
|
+ supplier_name,
|
|
|
+ (
|
|
|
+ SUM(CASE
|
|
|
+ WHEN acceptance_date IS NOT NULL
|
|
|
+ AND plan_delivery_date IS NOT NULL
|
|
|
+ AND acceptance_date <= plan_delivery_date THEN 1
|
|
|
+ ELSE 0
|
|
|
+ END) / NULLIF(COUNT(1), 0) * 70
|
|
|
+ +
|
|
|
+ LEAST(1, SUM(IFNULL(receipt_qty, 0)) / NULLIF(SUM(IFNULL(plan_qty, 0)), 0)) * 30
|
|
|
+ ) AS delivery_score
|
|
|
+ FROM dtm_supply_order_receipt_match
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ GROUP BY supplier_name
|
|
|
+ ),
|
|
|
+ term_score AS (
|
|
|
+ SELECT
|
|
|
+ supplier_name,
|
|
|
+ CASE
|
|
|
+ WHEN IFNULL(term_days, 0) >= 90 THEN 100
|
|
|
+ WHEN IFNULL(term_days, 0) >= 60 THEN 90
|
|
|
+ WHEN IFNULL(term_days, 0) >= 45 THEN 80
|
|
|
+ WHEN IFNULL(term_days, 0) >= 30 THEN 60
|
|
|
+ ELSE 40
|
|
|
+ END AS term_score
|
|
|
+ FROM dtm_supply_supplier_term
|
|
|
+ WHERE supplier_name IS NOT NULL
|
|
|
+ AND supplier_name != ''
|
|
|
+ ),
|
|
|
+ supplier_score AS (
|
|
|
+ SELECT
|
|
|
+ b.supplier_name,
|
|
|
+ IFNULL(c.cost_score, 0) * 0.4
|
|
|
+ + IFNULL(d.delivery_score, 0) * 0.4
|
|
|
+ + IFNULL(t.term_score, 40) * 0.2 AS total_score
|
|
|
+ FROM supplier_base b
|
|
|
+ LEFT JOIN cost_score c ON c.supplier_name = b.supplier_name
|
|
|
+ LEFT JOIN delivery_score d ON d.supplier_name = b.supplier_name
|
|
|
+ LEFT JOIN term_score t ON t.supplier_name = b.supplier_name
|
|
|
+ )
|
|
|
+ SELECT
|
|
|
+ COUNT(1) AS supplierTotal,
|
|
|
+ ROUND(IFNULL(AVG(total_score), 0), 1) AS averageScore,
|
|
|
+ SUM(CASE WHEN total_score < 60 THEN 1 ELSE 0 END) AS warningSupplierCount,
|
|
|
+ SUM(CASE WHEN total_score >= 85 THEN 1 ELSE 0 END) AS excellentSupplierCount
|
|
|
+ FROM supplier_score
|
|
|
+ </select>
|
|
|
+</mapper>
|