feat(base): 添加设备日产量计算相关表和存储过程

master
zangch@mesnac.com 4 weeks ago
parent 8b0cd0fc1c
commit bc50d4a6d1

@ -0,0 +1,29 @@
-- DEVICE_DAILY_PRODUCTION设备日产量权威汇总表
-- 兼容Oracle 11 / Oracle 19
CREATE TABLE DEVICE_DAILY_PRODUCTION (
PROD_DATE DATE NOT NULL,
DEVICE_CODE VARCHAR2(64) NOT NULL,
PARAM_NAME VARCHAR2(128) NOT NULL,
DAILY_PROD NUMBER(18,4) DEFAULT 0 NOT NULL,
RESET_COUNT NUMBER(10) DEFAULT 0 NOT NULL,
CALC_TIME DATE DEFAULT SYSDATE NOT NULL
);
COMMENT ON TABLE DEVICE_DAILY_PRODUCTION IS '设备日产量权威汇总表';
COMMENT ON COLUMN DEVICE_DAILY_PRODUCTION.PROD_DATE IS '生产日期,按自然日';
COMMENT ON COLUMN DEVICE_DAILY_PRODUCTION.DEVICE_CODE IS '设备编码';
COMMENT ON COLUMN DEVICE_DAILY_PRODUCTION.PARAM_NAME IS '产量参数名称';
COMMENT ON COLUMN DEVICE_DAILY_PRODUCTION.DAILY_PROD IS '该设备该日最终日产量';
COMMENT ON COLUMN DEVICE_DAILY_PRODUCTION.RESET_COUNT IS '该设备该日计数器回退次数';
COMMENT ON COLUMN DEVICE_DAILY_PRODUCTION.CALC_TIME IS '汇总计算时间';
ALTER TABLE DEVICE_DAILY_PRODUCTION
ADD CONSTRAINT PK_DEVICE_DAILY_PRODUCTION
PRIMARY KEY (PROD_DATE, DEVICE_CODE, PARAM_NAME);
CREATE INDEX IDX_DEVICE_DAILY_PRODUCTION_MONTH
ON DEVICE_DAILY_PRODUCTION (PROD_DATE, PARAM_NAME);
CREATE INDEX IDX_DEVICE_DAILY_PRODUCTION_DEVICE
ON DEVICE_DAILY_PRODUCTION (DEVICE_CODE, PROD_DATE);

@ -0,0 +1,80 @@
-- 设备产量夜间搬迁过程
-- 兼容Oracle 11 / Oracle 19
-- 说明:
-- 1. 只做 RT -> DAY 搬迁,不再夜间重扫明细表。
-- 2. 搬迁完成后删除目标日期 RT 数据,等待新一天自然重建。
CREATE OR REPLACE PACKAGE PKG_DEVICE_PROD_CALC AS
PROCEDURE FLUSH_RT_TO_DAY(
P_PROD_DATE IN DATE DEFAULT TRUNC(SYSDATE) - 1,
P_PARAM_NAME IN VARCHAR2 DEFAULT '机台状态-实际产出数量'
);
END PKG_DEVICE_PROD_CALC;
/
CREATE OR REPLACE PACKAGE BODY PKG_DEVICE_PROD_CALC AS
PROCEDURE FLUSH_RT_TO_DAY(
P_PROD_DATE IN DATE DEFAULT TRUNC(SYSDATE) - 1,
P_PARAM_NAME IN VARCHAR2 DEFAULT '机台状态-实际产出数量'
) IS
V_TARGET_DATE DATE := TRUNC(P_PROD_DATE);
BEGIN
MERGE INTO DEVICE_DAILY_PRODUCTION D
USING (
SELECT PROD_DATE,
DEVICE_CODE,
PARAM_NAME,
CURRENT_TOTAL,
RESET_COUNT
FROM RT_DAILY_PROD_STATE
WHERE PROD_DATE = V_TARGET_DATE
AND PARAM_NAME = P_PARAM_NAME
) S
ON (
D.PROD_DATE = S.PROD_DATE
AND D.DEVICE_CODE = S.DEVICE_CODE
AND D.PARAM_NAME = S.PARAM_NAME
)
WHEN MATCHED THEN
UPDATE SET
D.DAILY_PROD = S.CURRENT_TOTAL,
D.RESET_COUNT = S.RESET_COUNT,
D.CALC_TIME = SYSDATE
WHEN NOT MATCHED THEN
INSERT (
PROD_DATE, DEVICE_CODE, PARAM_NAME, DAILY_PROD, RESET_COUNT, CALC_TIME
) VALUES (
S.PROD_DATE, S.DEVICE_CODE, S.PARAM_NAME, S.CURRENT_TOTAL, S.RESET_COUNT, SYSDATE
);
-- 为什么这样做:搬迁完成后清掉昨日 RT避免月累计在窗口期之外重复计入已入 DAY 的历史数据。
DELETE FROM RT_DAILY_PROD_STATE
WHERE PROD_DATE = V_TARGET_DATE
AND PARAM_NAME = P_PARAM_NAME;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END FLUSH_RT_TO_DAY;
END PKG_DEVICE_PROD_CALC;
/
-- 如需数据库自动定时执行,可按现场窗口时间创建调度任务:
-- BEGIN
-- DBMS_SCHEDULER.CREATE_JOB(
-- JOB_NAME => 'JOB_FLUSH_RT_TO_DAY',
-- JOB_TYPE => 'STORED_PROCEDURE',
-- JOB_ACTION => 'PKG_DEVICE_PROD_CALC.FLUSH_RT_TO_DAY',
-- START_DATE => SYSTIMESTAMP,
-- REPEAT_INTERVAL => 'FREQ=DAILY;BYHOUR=0;BYMINUTE=10;BYSECOND=0',
-- ENABLED => TRUE,
-- COMMENTS => '设备产量 RT->DAY 夜间搬迁'
-- );
-- END;
-- /

@ -0,0 +1,35 @@
-- RT_DAILY_PROD_STATE设备当日实时产量状态表
-- 兼容Oracle 11 / Oracle 19
CREATE TABLE RT_DAILY_PROD_STATE (
PROD_DATE DATE NOT NULL,
DEVICE_CODE VARCHAR2(64) NOT NULL,
PARAM_NAME VARCHAR2(128) NOT NULL,
LAST_PARAM_VAL NUMBER(18,4) DEFAULT 0 NOT NULL,
CURRENT_TOTAL NUMBER(18,4) DEFAULT 0 NOT NULL,
RESET_COUNT NUMBER(10) DEFAULT 0 NOT NULL,
DIRTY_FLAG NUMBER(1) DEFAULT 0 NOT NULL,
LAST_COLLECT_TIME DATE,
UPDATE_TIME DATE DEFAULT SYSDATE NOT NULL
);
COMMENT ON TABLE RT_DAILY_PROD_STATE IS '设备当日实时产量状态表';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.PROD_DATE IS '生产日期,按自然日截断';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.DEVICE_CODE IS '设备编码';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.PARAM_NAME IS '产量参数名称,当前固定为机台状态-实际产出数量';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.LAST_PARAM_VAL IS '最近一次采集到的参数值';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.CURRENT_TOTAL IS '当日累计产量';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.RESET_COUNT IS '当天计数器回退/清零次数';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.DIRTY_FLAG IS '脏标记,预留给人工修正/对账';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.LAST_COLLECT_TIME IS '最近一次参与累计的采集时间';
COMMENT ON COLUMN RT_DAILY_PROD_STATE.UPDATE_TIME IS '最近更新时间';
ALTER TABLE RT_DAILY_PROD_STATE
ADD CONSTRAINT PK_RT_DAILY_PROD_STATE
PRIMARY KEY (PROD_DATE, DEVICE_CODE, PARAM_NAME);
CREATE INDEX IDX_RT_DAILY_PROD_STATE_COLLECT
ON RT_DAILY_PROD_STATE (LAST_COLLECT_TIME);
CREATE INDEX IDX_RT_DAILY_PROD_STATE_DEVICE
ON RT_DAILY_PROD_STATE (DEVICE_CODE, PROD_DATE);
Loading…
Cancel
Save