You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hwmom/ruoyi-modules/hwmom-wms/wms_report_procedures.sql

590 lines
26 KiB
Transact-SQL

-- =============================================
-- WMS报表存储过程
-- 用于定时插入和更新报表数据
-- =============================================
-- 1. 退库原因分析报表数据插入存储过程
CREATE OR ALTER PROCEDURE sp_insert_return_reason_analysis
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 删除当天的数据,重新插入
DELETE FROM wms_report_return_reason_analysis
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id);
-- 插入新数据
INSERT INTO wms_report_return_reason_analysis (
tenant_id, return_reason_category, return_order_count, total_return_amount,
order_count_ratio, amount_ratio, material_name, material_category_name,
material_code, statistics_date
)
SELECT
ro.tenant_id,
CASE
WHEN ro.return_reason LIKE '%质量%' OR ro.return_reason LIKE '%不合格%' THEN '质量问题'
WHEN ro.return_reason LIKE '%订单%' OR ro.return_reason LIKE '%变更%' THEN '订单变更'
WHEN ro.return_reason LIKE '%损坏%' OR ro.return_reason LIKE '%破损%' THEN '物料损坏'
WHEN ro.return_reason LIKE '%过期%' OR ro.return_reason LIKE '%超期%' THEN '过期物料'
ELSE ro.return_reason
END AS returnReasonCategory,
COUNT(*) AS returnOrderCount,
SUM(ro.return_amount) AS totalReturnAmount,
CAST(CASE
WHEN (SELECT COUNT(*) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') = 0 THEN 0
ELSE COUNT(*) * 100.0 / (SELECT COUNT(*) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1')
END AS DECIMAL(10,2)) AS orderCountRatio,
CAST(CASE
WHEN (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') = 0
OR (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') IS NULL THEN 0
ELSE SUM(ro.return_amount) * 100.0 / (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1')
END AS DECIMAL(10,2)) AS amountRatio,
mi.material_name,
mc.material_category_name,
mi.material_code,
CAST(GETDATE() AS DATE)
FROM wms_return_order ro
INNER JOIN base_material_info_copy1 mi ON ro.material_id = mi.material_id
INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id
WHERE ro.order_status = '1'
AND (@tenant_id IS NULL OR ro.tenant_id = @tenant_id)
AND (@material_category_id IS NULL OR mc.material_category_id = @material_category_id)
GROUP BY ro.tenant_id,
CASE
WHEN ro.return_reason LIKE '%质量%' OR ro.return_reason LIKE '%不合格%' THEN '质量问题'
WHEN ro.return_reason LIKE '%订单%' OR ro.return_reason LIKE '%变更%' THEN '订单变更'
WHEN ro.return_reason LIKE '%损坏%' OR ro.return_reason LIKE '%破损%' THEN '物料损坏'
WHEN ro.return_reason LIKE '%过期%' OR ro.return_reason LIKE '%超期%' THEN '过期物料'
ELSE ro.return_reason
END,
mi.material_name,
mc.material_category_name,
mi.material_code;
-- 更新汇总表
MERGE wms_report_summary AS target
USING (
SELECT
@tenant_id AS tenant_id,
'退库原因分析' AS report_type,
CAST(GETDATE() AS DATE) AS report_date,
COUNT(*) AS total_records
FROM wms_report_return_reason_analysis
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id)
) AS source ON target.tenant_id = source.tenant_id
AND target.report_type = source.report_type
AND target.report_date = source.report_date
WHEN MATCHED THEN
UPDATE SET total_records = source.total_records, last_update_time = GETDATE()
WHEN NOT MATCHED THEN
INSERT (tenant_id, report_type, report_date, total_records)
VALUES (source.tenant_id, source.report_type, source.report_date, source.total_records);
END;
GO-- 2. 库
CREATE OR ALTER PROCEDURE sp_insert_inventory_trend_analysis
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 删除当天的数据,重新插入
DELETE FROM wms_report_inventory_trend_analysis
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id);
-- 插入新数据
INSERT INTO wms_report_inventory_trend_analysis (
tenant_id, material_id, material_code, material_name, material_category_name,
statistics_month, statistics_week, current_inventory_qty, week_instock_qty,
week_outstock_qty, last_week_inventory_qty, key_node_mark, statistics_date
)
SELECT
inv.tenant_id,
inv.material_id,
mi.material_code,
mi.material_name,
mc.material_category_name,
CONVERT(VARCHAR(7), GETDATE(), 126) AS statisticsMonth,
DATEPART(WEEK, GETDATE()) AS statisticsWeek,
SUM(inv.inventory_qty) AS currentInventoryQty,
ISNULL(instock_data.weekInstockQty, 0) AS weekInstockQty,
ISNULL(outstock_data.weekOutstockQty, 0) AS weekOutstockQty,
(SUM(inv.inventory_qty) + ISNULL(outstock_data.weekOutstockQty, 0) - ISNULL(instock_data.weekInstockQty, 0)) AS lastWeekInventoryQty,
CASE
WHEN ISNULL(instock_data.weekInstockQty, 0) > 1000 THEN '大额入库'
WHEN ISNULL(outstock_data.weekOutstockQty, 0) > 1000 THEN '大额出库'
ELSE '正常变动'
END AS keyNodeMark,
CAST(GETDATE() AS DATE)
FROM wms_inventory inv
INNER JOIN base_material_info_copy1 mi ON inv.material_id = mi.material_id
INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id
LEFT JOIN (
SELECT material_id, tenant_id, SUM(instock_qty) AS weekInstockQty
FROM wms_instock_record
WHERE create_time >= DATEADD(DAY, -7, GETDATE())
GROUP BY material_id, tenant_id
) instock_data ON inv.material_id = instock_data.material_id AND inv.tenant_id = instock_data.tenant_id
LEFT JOIN (
SELECT material_id, tenant_id, SUM(outstock_qty) AS weekOutstockQty
FROM wms_outstock_record
WHERE create_time >= DATEADD(DAY, -7, GETDATE())
GROUP BY material_id, tenant_id
) outstock_data ON inv.material_id = outstock_data.material_id AND inv.tenant_id = outstock_data.tenant_id
WHERE inv.inventory_status = '1'
AND (@tenant_id IS NULL OR inv.tenant_id = @tenant_id)
AND (@material_category_id IS NULL OR mc.material_category_id = @material_category_id)
GROUP BY inv.tenant_id, inv.material_id, mi.material_code, mi.material_name, mc.material_category_name,
instock_data.weekInstockQty, outstock_data.weekOutstockQty;
-- 更新汇总表
MERGE wms_report_summary AS target
USING (
SELECT
@tenant_id AS tenant_id,
'库存变动趋势分析' AS report_type,
CAST(GETDATE() AS DATE) AS report_date,
COUNT(*) AS total_records
FROM wms_report_inventory_trend_analysis
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id)
) AS source ON target.tenant_id = source.tenant_id
AND target.report_type = source.report_type
AND target.report_date = source.report_date
WHEN MATCHED THEN
UPDATE SET total_records = source.total_records, last_update_time = GETDATE()
WHEN NOT MATCHED THEN
INSERT (tenant_id, report_type, report_date, total_records)
VALUES (source.tenant_id, source.report_type, source.report_date, source.total_records);
END;
GO
-- 3. 安全库存预警报表数据插入存储过程
CREATE OR ALTER PROCEDURE sp_insert_safety_stock_alert
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 删除当天的数据,重新插入
DELETE FROM wms_report_safety_stock_alert
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id);
-- 插入新数据
INSERT INTO wms_report_safety_stock_alert (
tenant_id, material_id, material_code, material_name, material_category_name,
current_inventory_qty, safe_stock_amount, min_stock_amount, max_stock_amount,
alert_status, difference_amount, last_update_time, statistics_date
)
SELECT
inv.tenant_id,
inv.material_id,
mi.material_code,
mi.material_name,
mc.material_category_name,
SUM(inv.inventory_qty) AS currentInventoryQty,
mi.safe_stock_amount,
mi.min_stock_amount,
mi.max_stock_amount,
CASE
WHEN SUM(inv.inventory_qty) < mi.min_stock_amount THEN '短缺预警'
WHEN SUM(inv.inventory_qty) > mi.max_stock_amount THEN '积压预警'
ELSE '正常'
END AS alertStatus,
CASE
WHEN SUM(inv.inventory_qty) < mi.min_stock_amount THEN mi.min_stock_amount - SUM(inv.inventory_qty)
WHEN SUM(inv.inventory_qty) > mi.max_stock_amount THEN SUM(inv.inventory_qty) - mi.max_stock_amount
WHEN SUM(inv.inventory_qty) < mi.safe_stock_amount THEN mi.safe_stock_amount - SUM(inv.inventory_qty)
ELSE 0
END AS differenceAmount,
inv.update_time,
CAST(GETDATE() AS DATE)
FROM wms_inventory inv
INNER JOIN base_material_info_copy1 mi ON inv.material_id = mi.material_id
INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id
WHERE inv.inventory_status = '1'
AND mi.active_flag = '1'
AND (mi.safe_stock_amount IS NOT NULL OR mi.min_stock_amount IS NOT NULL OR mi.max_stock_amount IS NOT NULL)
AND (@tenant_id IS NULL OR inv.tenant_id = @tenant_id)
AND (@material_category_id IS NULL OR mc.material_category_id = @material_category_id)
GROUP BY inv.tenant_id, inv.material_id, mi.material_code, mi.material_name, mc.material_category_name,
mi.safe_stock_amount, mi.min_stock_amount, mi.max_stock_amount, inv.update_time
HAVING SUM(inv.inventory_qty) < mi.safe_stock_amount
OR SUM(inv.inventory_qty) < mi.min_stock_amount
OR SUM(inv.inventory_qty) > mi.max_stock_amount;
-- 更新汇总表
MERGE wms_report_summary AS target
USING (
SELECT
@tenant_id AS tenant_id,
'安全库存预警' AS report_type,
CAST(GETDATE() AS DATE) AS report_date,
COUNT(*) AS total_records
FROM wms_report_safety_stock_alert
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id)
) AS source ON target.tenant_id = source.tenant_id
AND target.report_type = source.report_type
AND target.report_date = source.report_date
WHEN MATCHED THEN
UPDATE SET total_records = source.total_records, last_update_time = GETDATE()
WHEN NOT MATCHED THEN
INSERT (tenant_id, report_type, report_date, total_records)
VALUES (source.tenant_id, source.report_type, source.report_date, source.total_records);
END;
GO-- 4. 呆滞料
CREATE OR ALTER PROCEDURE sp_insert_stagnant_inventory
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 删除当天的数据,重新插入
DELETE FROM wms_report_stagnant_inventory
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id);
-- 插入新数据
INSERT INTO wms_report_stagnant_inventory (
tenant_id, material_id, material_code, material_name, material_category_name,
stagnant_inventory_qty, material_unit, last_outstock_time, stagnant_days,
stagnant_reason, material_spec, warehouse_name, last_activity_time, statistics_date
)
SELECT
inv.tenant_id,
inv.material_id,
mi.material_code,
mi.material_name,
mc.material_category_name,
SUM(inv.inventory_qty) AS stagnantInventoryQty,
mi.material_unit,
CASE
WHEN last_out.lastOutstockTime IS NULL THEN '从未出库'
ELSE CONVERT(VARCHAR(19), last_out.lastOutstockTime, 120)
END AS lastOutstockTime,
CASE
WHEN last_out.lastOutstockTime IS NULL THEN DATEDIFF(DAY, first_in.firstInstockTime, GETDATE())
ELSE DATEDIFF(DAY, last_out.lastOutstockTime, GETDATE())
END AS stagnantDays,
CASE
WHEN last_out.lastOutstockTime IS NULL THEN '从未出库'
WHEN DATEDIFF(DAY, last_out.lastOutstockTime, GETDATE()) > 180 THEN '超过6个月未出库'
ELSE '正常'
END AS stagnantReason,
mi.material_spec,
w.warehouse_name,
CASE
WHEN last_out.lastOutstockTime IS NULL THEN CONVERT(VARCHAR(19), first_in.firstInstockTime, 120)
ELSE CONVERT(VARCHAR(19), last_out.lastOutstockTime, 120)
END AS lastActivityTime,
CAST(GETDATE() AS DATE)
FROM wms_inventory inv
INNER JOIN base_material_info_copy1 mi ON inv.material_id = mi.material_id
INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id
INNER JOIN wms_base_warehouse w ON inv.warehouse_id = w.warehouse_id
LEFT JOIN (
SELECT
material_id,
tenant_id,
MIN(create_time) AS firstInstockTime
FROM wms_instock_record
WHERE create_time IS NOT NULL
GROUP BY material_id, tenant_id
) first_in ON inv.material_id = first_in.material_id AND inv.tenant_id = first_in.tenant_id
LEFT JOIN (
SELECT
material_id,
tenant_id,
MAX(create_time) AS lastOutstockTime
FROM wms_outstock_record
WHERE create_time IS NOT NULL
GROUP BY material_id, tenant_id
) last_out ON inv.material_id = last_out.material_id AND inv.tenant_id = last_out.tenant_id
WHERE inv.inventory_status = '1'
AND inv.inventory_qty > 0
AND mi.active_flag = '1'
AND mi.del_flag = '0'
AND (
last_out.lastOutstockTime IS NULL
OR DATEDIFF(DAY, last_out.lastOutstockTime, GETDATE()) >= 180
)
AND (@tenant_id IS NULL OR inv.tenant_id = @tenant_id)
AND (@material_category_id IS NULL OR mc.material_category_id = @material_category_id)
GROUP BY
inv.tenant_id,
inv.material_id,
mi.material_code,
mi.material_name,
mc.material_category_name,
mi.material_unit,
last_out.lastOutstockTime,
mi.material_spec,
w.warehouse_name,
first_in.firstInstockTime;
-- 更新汇总表
MERGE wms_report_summary AS target
USING (
SELECT
@tenant_id AS tenant_id,
'呆滞料库存' AS report_type,
CAST(GETDATE() AS DATE) AS report_date,
COUNT(*) AS total_records
FROM wms_report_stagnant_inventory
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id)
) AS source ON target.tenant_id = source.tenant_id
AND target.report_type = source.report_type
AND target.report_date = source.report_date
WHEN MATCHED THEN
UPDATE SET total_records = source.total_records, last_update_time = GETDATE()
WHEN NOT MATCHED THEN
INSERT (tenant_id, report_type, report_date, total_records)
VALUES (source.tenant_id, source.report_type, source.report_date, source.total_records);
END;
GO
-- 5. 库存差异报表数据插入存储过程
CREATE OR ALTER PROCEDURE sp_insert_inventory_difference
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 删除当天的数据,重新插入
DELETE FROM wms_report_inventory_difference
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id);
-- 插入新数据
INSERT INTO wms_report_inventory_difference (
tenant_id, check_code, check_type, warehouse_id, warehouse_name,
material_id, material_code, material_name, material_category_name,
book_inventory_qty, actual_inventory_qty, difference_qty, difference_type,
difference_rate, difference_level, check_time, check_by, statistics_date
)
SELECT
ic.tenant_id,
ic.check_code,
CASE ic.check_type
WHEN '0' THEN '抽检'
WHEN '1' THEN '盘点'
WHEN '2' THEN '库位/货架盘点'
ELSE '未知'
END AS checkType,
ic.plan_warehouse_id,
w.warehouse_name,
icr.material_id,
mi.material_code,
mi.material_name,
mc.material_category_name,
icr.inventory_qty AS bookInventoryQty,
icr.check_qty AS actualInventoryQty,
(icr.check_qty - icr.inventory_qty) AS differenceQty,
CASE
WHEN ABS(icr.check_qty - icr.inventory_qty) = 0 THEN '无差异'
WHEN (icr.check_qty - icr.inventory_qty) > 0 THEN '盘盈'
ELSE '盘亏'
END AS differenceType,
CASE
WHEN icr.inventory_qty > 0 THEN
ABS((icr.check_qty - icr.inventory_qty) / icr.inventory_qty * 100)
ELSE 0
END AS differenceRate,
CASE
WHEN ABS(icr.check_qty - icr.inventory_qty) > 10 THEN '重大差异'
WHEN ABS(icr.check_qty - icr.inventory_qty) > 5 THEN '一般差异'
WHEN ABS(icr.check_qty - icr.inventory_qty) > 0 THEN '轻微差异'
ELSE '无差异'
END AS differenceLevel,
ic.create_time,
ic.create_by,
CAST(GETDATE() AS DATE)
FROM wms_inventory_check ic
INNER JOIN wms_base_warehouse w ON ic.plan_warehouse_id = w.warehouse_id
INNER JOIN wms_inventory_check_record icr ON icr.check_code = ic.check_code AND icr.tenant_id = ic.tenant_id
INNER JOIN base_material_info_copy1 mi ON icr.material_id = mi.material_id
INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id
WHERE ic.check_status = '3'
AND (@tenant_id IS NULL OR ic.tenant_id = @tenant_id)
AND (@material_category_id IS NULL OR mc.material_category_id = @material_category_id);
-- 更新汇总表
MERGE wms_report_summary AS target
USING (
SELECT
@tenant_id AS tenant_id,
'库存差异' AS report_type,
CAST(GETDATE() AS DATE) AS report_date,
COUNT(*) AS total_records
FROM wms_report_inventory_difference
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id)
) AS source ON target.tenant_id = source.tenant_id
AND target.report_type = source.report_type
AND target.report_date = source.report_date
WHEN MATCHED THEN
UPDATE SET total_records = source.total_records, last_update_time = GETDATE()
WHEN NOT MATCHED THEN
INSERT (tenant_id, report_type, report_date, total_records)
VALUES (source.tenant_id, source.report_type, source.report_date, source.total_records);
END;
GO--
6.
CREATE OR ALTER PROCEDURE sp_insert_inventory_turnover
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 删除当天的数据,重新插入
DELETE FROM wms_report_inventory_turnover
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id);
-- 插入新数据
INSERT INTO wms_report_inventory_turnover (
tenant_id, material_id, material_code, material_name, material_category_name,
statistics_month, begin_inventory_qty, end_inventory_qty, month_outstock_qty,
inventory_turnover_rate, simple_turnover_rate, turnover_evaluation, statistics_date
)
SELECT
base_data.tenantId,
base_data.materialId,
base_data.materialCode,
base_data.materialName,
base_data.materialCategoryName,
base_data.statisticsMonth,
base_data.beginInventoryQty,
base_data.endInventoryQty,
base_data.monthOutstockQty,
CASE
WHEN (base_data.beginInventoryQty + base_data.endInventoryQty) > 0 THEN
CAST(base_data.monthOutstockQty * 2.0 / (base_data.beginInventoryQty + base_data.endInventoryQty) * 100 AS DECIMAL(10,2))
ELSE 0
END AS inventoryTurnoverRate,
CASE
WHEN base_data.endInventoryQty > 0 THEN
CAST(base_data.monthOutstockQty / base_data.endInventoryQty * 100 AS DECIMAL(10,2))
ELSE 0
END AS simpleTurnoverRate,
CASE
WHEN base_data.monthOutstockQty = 0 THEN '无流动'
WHEN CAST(base_data.monthOutstockQty * 2.0 / (base_data.beginInventoryQty + base_data.endInventoryQty) * 100 AS DECIMAL(10,2)) >= 100 THEN '快速周转'
WHEN CAST(base_data.monthOutstockQty * 2.0 / (base_data.beginInventoryQty + base_data.endInventoryQty) * 100 AS DECIMAL(10,2)) >= 50 THEN '正常周转'
ELSE '缓慢周转'
END AS turnoverEvaluation,
CAST(GETDATE() AS DATE)
FROM (
SELECT
inv.tenant_id AS tenantId,
inv.material_id AS materialId,
mi.material_code AS materialCode,
mi.material_name AS materialName,
mc.material_category_name AS materialCategoryName,
CONVERT(VARCHAR(7), GETDATE(), 126) AS statisticsMonth,
SUM(inv.inventory_qty) AS endInventoryQty,
SUM(inv.inventory_qty) + ISNULL(month_out.monthOutstockQty, 0) - ISNULL(month_in.monthInstockQty, 0) AS beginInventoryQty,
ISNULL(month_out.monthOutstockQty, 0) AS monthOutstockQty
FROM wms_inventory inv
INNER JOIN base_material_info_copy1 mi ON inv.material_id = mi.material_id
INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id
LEFT JOIN (
SELECT material_id, tenant_id, SUM(outstock_qty) AS monthOutstockQty
FROM wms_outstock_record
WHERE create_time >= DATEADD(MONTH, -1, GETDATE())
GROUP BY material_id, tenant_id
) month_out ON inv.material_id = month_out.material_id AND inv.tenant_id = month_out.tenant_id
LEFT JOIN (
SELECT material_id, tenant_id, SUM(instock_qty) AS monthInstockQty
FROM wms_instock_record
WHERE create_time >= DATEADD(MONTH, -1, GETDATE())
GROUP BY material_id, tenant_id
) month_in ON inv.material_id = month_in.material_id AND inv.tenant_id = month_in.tenant_id
WHERE inv.inventory_status = '1'
AND (@tenant_id IS NULL OR inv.tenant_id = @tenant_id)
AND (@material_category_id IS NULL OR mc.material_category_id = @material_category_id)
GROUP BY inv.tenant_id, inv.material_id, mi.material_code, mi.material_name, mc.material_category_name,
month_out.monthOutstockQty, month_in.monthInstockQty
) base_data
WHERE base_data.beginInventoryQty > 0 OR base_data.endInventoryQty > 0 OR base_data.monthOutstockQty > 0;
-- 更新汇总表
MERGE wms_report_summary AS target
USING (
SELECT
@tenant_id AS tenant_id,
'库存周转' AS report_type,
CAST(GETDATE() AS DATE) AS report_date,
COUNT(*) AS total_records
FROM wms_report_inventory_turnover
WHERE statistics_date = CAST(GETDATE() AS DATE)
AND (@tenant_id IS NULL OR tenant_id = @tenant_id)
) AS source ON target.tenant_id = source.tenant_id
AND target.report_type = source.report_type
AND target.report_date = source.report_date
WHEN MATCHED THEN
UPDATE SET total_records = source.total_records, last_update_time = GETDATE()
WHEN NOT MATCHED THEN
INSERT (tenant_id, report_type, report_date, total_records)
VALUES (source.tenant_id, source.report_type, source.report_date, source.total_records);
END;
GO
-- 7. 主存储过程 - 执行所有报表数据更新
CREATE OR ALTER PROCEDURE sp_update_all_wms_reports
@tenant_id NVARCHAR(50) = NULL,
@material_category_id BIGINT = NULL
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
PRINT '开始更新WMS报表数据...'
-- 1. 更新退库原因分析报表
PRINT '更新退库原因分析报表...'
EXEC sp_insert_return_reason_analysis @tenant_id, @material_category_id;
-- 2. 更新库存变动趋势分析报表
PRINT '更新库存变动趋势分析报表...'
EXEC sp_insert_inventory_trend_analysis @tenant_id, @material_category_id;
-- 3. 更新安全库存预警报表
PRINT '更新安全库存预警报表...'
EXEC sp_insert_safety_stock_alert @tenant_id, @material_category_id;
-- 4. 更新呆滞料库存报表
PRINT '更新呆滞料库存报表...'
EXEC sp_insert_stagnant_inventory @tenant_id, @material_category_id;
-- 5. 更新库存差异报表
PRINT '更新库存差异报表...'
EXEC sp_insert_inventory_difference @tenant_id, @material_category_id;
-- 6. 更新库存周转报表
PRINT '更新库存周转报表...'
EXEC sp_insert_inventory_turnover @tenant_id, @material_category_id;
PRINT 'WMS报表数据更新完成!'
END TRY
BEGIN CATCH
PRINT 'WMS报表数据更新失败: ' + ERROR_MESSAGE()
THROW;
END CATCH
END;
GO