From bc50d4a6d1b313df2d87338a8f8db844696c9fb1 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Mon, 16 Mar 2026 16:23:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(base):=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=97=A5=E4=BA=A7=E9=87=8F=E8=AE=A1=E7=AE=97=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=A1=A8=E5=92=8C=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/device_daily_production.sql | 29 +++++++ .../main/resources/device_prod_calc_pkg.sql | 80 +++++++++++++++++++ .../main/resources/rt_daily_prod_state.sql | 35 ++++++++ 3 files changed, 144 insertions(+) create mode 100644 aucma-base/src/main/resources/device_daily_production.sql create mode 100644 aucma-base/src/main/resources/device_prod_calc_pkg.sql create mode 100644 aucma-base/src/main/resources/rt_daily_prod_state.sql diff --git a/aucma-base/src/main/resources/device_daily_production.sql b/aucma-base/src/main/resources/device_daily_production.sql new file mode 100644 index 0000000..3a5a013 --- /dev/null +++ b/aucma-base/src/main/resources/device_daily_production.sql @@ -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); diff --git a/aucma-base/src/main/resources/device_prod_calc_pkg.sql b/aucma-base/src/main/resources/device_prod_calc_pkg.sql new file mode 100644 index 0000000..4e3af18 --- /dev/null +++ b/aucma-base/src/main/resources/device_prod_calc_pkg.sql @@ -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; +-- / diff --git a/aucma-base/src/main/resources/rt_daily_prod_state.sql b/aucma-base/src/main/resources/rt_daily_prod_state.sql new file mode 100644 index 0000000..e7f26e3 --- /dev/null +++ b/aucma-base/src/main/resources/rt_daily_prod_state.sql @@ -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);