表结构: 1、deal_countdeal_ip默认为0,取消非空限制 2、表中新增delive_code字段; 代码 3、conf中新增trmsCarTaskSwitch开关 #4、conf中新增kafka开关 5、新增mapp.xml配置; select * from a; -- 分中心数据下发接收表 drop table tt_trms_car_task; CREATE TABLE tt_trms_car_task( id NUMBER(18) PRIMARY KEY , original_id NUMBER(18) not null, -- 版本号id send_car_tm DATE , require_id VARCHAR(50), task_id VARCHAR(100) , -- 任务id position_no VARCHAR(10) , line_code VARCHAR(200) , batch_code VARCHAR(50) , -- 卡口编码 plan_start_tm DATE , zone_code VARCHAR(50) , -- 中转场代码(网点) plate_num VARCHAR(50) , del_flag VARCHAR(1) , send_tm DATE, deal_tm DATE , -- 处理时间 deal_flg number(2) default 0, -- 处理标记 deal_ip varchar2(30) , deal_count number(2) , insert_tm timestamp(6) default SYSDATE, --入库时间 delive_code VARCHAR2(50) -- 分中心代码 ); -- 序列 CREATE SEQUENCE SEQ_TT_TRMS_CAR_TASK START WITH 1 INCREMENT BY 1 NOMAXVALUE MINVALUE 1 NOCYCLE NOCACHE -- 中间表 drop table tt_trms_car_task_mid; CREATE TABLE tt_trms_car_task_mid( id NUMBER(18) PRIMARY KEY , original_id NUMBER(18) not null, -- 版本号id send_car_tm DATE , require_id VARCHAR(50), task_id VARCHAR(100) , -- 任务id position_no VARCHAR(10) , line_code VARCHAR(200) , batch_code VARCHAR(50) , -- 卡口编码 plan_start_tm DATE , zone_code VARCHAR(50) , -- 中转场代码(网点) plate_num VARCHAR(50) , del_flag VARCHAR(1) , send_tm DATE, deal_tm DATE , -- 处理时间 deal_flg number(2) default 0, -- 处理标记 deal_ip varchar2(30) , deal_count number(2) , insert_tm timestamp(6) default SYSDATE, --入库时间 delive_code VARCHAR2(50) -- 分中心代码 ); CREATE SEQUENCE SEQ_TT_TRMS_CAR_TASK_MID START WITH 1 INCREMENT BY 1 NOMAXVALUE MINVALUE 1 NOCYCLE NOCACHE -- 下发表 drop table tt_trms_car_task_dist; CREATE TABLE tt_trms_car_task_dist( id NUMBER(18) PRIMARY KEY , original_id NUMBER(18) not null, -- 版本号id send_car_tm DATE , require_id VARCHAR(50), task_id VARCHAR(100) , -- 任务id position_no VARCHAR(10) , line_code VARCHAR(200) , batch_code VARCHAR(50) , -- 卡口编码 plan_start_tm DATE , zone_code VARCHAR(50) , -- 中转场代码(网点) plate_num VARCHAR(50) , del_flag VARCHAR(1) , send_tm DATE, deal_tm DATE , -- 处理时间 deal_flg number(2) default 0, -- 处理标记 deal_ip varchar2(30) , deal_count number(2) , insert_tm timestamp(6) default SYSDATE, --入库时间 delive_code VARCHAR2(50) -- 分中心代码 ); CREATE SEQUENCE SEQ_TT_TRMS_CAR_TASK_DIST START WITH 1 INCREMENT BY 1 NOMAXVALUE MINVALUE 1 NOCYCLE NOCACHE INSERT INTO tt_trms_car_task_mid SELECT * FROM tt_trms_car_task; SELECT M.* ,ROWID AS rid FROM tt_trms_car_task_mid M WHERE ROWNUM=1 SELECT t.*,ROWID FROM tt_trms_car_task t 逻辑: 根据“任务ID+网点+卡口编码”为主键判断,如果该记录不存在,则新增该记录; 根据“任务ID+网点+卡口编码”为主键判断,如果该记录存在,则判断“版本号ID”是否比现有的版本号 ID大,如果大则根据“任务ID+网点+卡口编码”覆盖,否则该数据抛弃。 CREATE OR REPLACE PROCEDURE PROC_TT_AS_OUT_IDENT_MID ( P_HASH_NUM IN NUMBER, --hash并发数量 P_HASH_VALUE IN NUMBER, --hash并发值 P_BATCH_NUM IN NUMBER DEFAULT 5000, --处理数据量 P_COMMIT_NUM IN NUMBER DEFAULT 500 --批次提交数据量 ) AS V_COUNT INT DEFAULT 0; --定义参数以"V_"开头定义 V_BATCH INT DEFAULT 0; --是否需要跟新:0->新增,1->跟新BA,生产出港,99->抛弃 V_BA_RID VARCHAR2(500); V_S_ID NUMBER; V_BATCH_OUT INT DEFAULT -1; --99->抛弃,0—>新增 V_AS_OUT_ID NUMBER; V_SQL_NUM NUMBER; /* CREATE DATE:2016-10-20 CREATE BY:674051 DESC :TT_AS_OUT_IDENT_MID中间表数据关联tm_zno_transit表数据生产出港数据 业务逻辑:首先同TT_AS_OUT_IDENT_BA表进行比较, i :MID中数据比ba表中数据级别高,生产新下发数据 II:MID和BA中级别一致,但是mid中数据较新且weight+des_zno+product不一致,生产新下发数据 III:其他状态数据:抛弃 REMARK:记录修改日志(修改人 修改版本号 修改时间,修改内容) */ BEGIN FOR RX IN ( SELECT T.*,ROWID as rid FROM TT_AS_OUT_IDENT_MID T WHERE T.DEAL_FLG = 0 AND DBMS_UTILITY.GET_HASH_VALUE(T.WAYBILL_NO,0,P_HASH_NUM)=P_HASH_VALUE AND ROWNUM <= P_BATCH_NUM ) LOOP V_BATCH:=0 ; --默认新增ba数据 V_BATCH_OUT :=0; --默认新生成出港数据 --从BA表中抓取基准数据 FOR R0 IN ( SELECT T.ROWID AS RID ,T.* FROM TT_AS_OUT_IDENT_BA T WHERE T.WAYBILL_NO = RX.WAYBILL_NO ) LOOP V_BA_RID:=R0.RID; IF(RX.SRC=R0.SRC AND RX.INPUT_TM> R0.INPUT_TM AND (RX.DES_ZNO||RX.PRODUCT_TYPE<>R0.DES_ZNO||R0.PRODUCT_TYPE OR RX.WEIGHT<>R0.WEIGHT) ) THEN --BA与MID均且清单数据,且mid数据有变更且比ba中数据要新,更新BA数据,需生成出港数据 V_BATCH:=1; V_BATCH_OUT:=0; ELSIF(RX.SRC<>R0.SRC AND RX.SRC=‘D-‘ AND (RX.DES_ZNO||RX.PRODUCT_TYPE<>R0.DES_ZNO||R0.PRODUCT_TYPE OR RX.WEIGHT<>R0.WEIGHT) ) THEN --BA为hht,MID为清单,且MID与BA表数据不一致,更新BA数据,需生成出港数据 V_BATCH:=1; V_BATCH_OUT:=0; ELSIF(RX.SRC<>R0.SRC AND RX.SRC=‘D-‘ AND (RX.DES_ZNO||RX.PRODUCT_TYPE=R0.DES_ZNO||R0.PRODUCT_TYPE OR RX.WEIGHT=R0.WEIGHT) ) THEN --BA为hht,MID为清单,但是MID与BA表数据不一致,更新BA数据,不生成出港数据 V_BATCH:=1; V_BATCH_OUT:=99; ELSE V_BATCH:=99; V_BATCH_OUT:=99; END IF; END LOOP; --生产BA数据数据 IF(V_BATCH=0) THEN INSERT INTO TT_AS_OUT_IDENT_BA( ID , S_ID , WAYBILL_NO , SRC_ZNO , DES_ZNO , INSERT_TM , OTHER_NODE_FLG , SRC , INPUT_TM , PRODUCT_TYPE , WEIGHT , SRC_CITY , DES_CITY , BATCH_TM )VALUES( SEQ_TT_AS_OUT_IDENT_BA.NEXTVAL, RX.ID , RX.WAYBILL_NO , RX.SRC_ZNO , RX.DES_ZNO , CURRENT_TIMESTAMP , RX.OTHER_NODE_FLG , RX.SRC , RX.INPUT_TM , RX.PRODUCT_TYPE , RX.WEIGHT , RX.SRC_CITY , RX.DES_CITY , CURRENT_TIMESTAMP ); ELSIF(V_BATCH=1)THEN UPDATE TT_AS_OUT_IDENT_BA T SET T.S_ID = RX.ID ,T.WAYBILL_NO = RX.WAYBILL_NO ,T.SRC_ZNO = RX.SRC_ZNO ,T.DES_ZNO = RX.DES_ZNO ,T.BATCH_TM = CURRENT_TIMESTAMP ,T.OTHER_NODE_FLG = RX.OTHER_NODE_FLG ,T.SRC = RX.SRC ,T.INPUT_TM = RX.INPUT_TM ,T.PRODUCT_TYPE = RX.PRODUCT_TYPE ,T.WEIGHT = RX.WEIGHT ,T.SRC_CITY = RX.SRC_CITY ,T.DES_CITY = RX.DES_CITY WHERE T.ROWID = V_BA_RID; END IF; V_AS_OUT_ID:=seq_tt_as_out_ident.nextval; --生产出港数据 IF(V_BATCH_OUT=0) THEN V_AS_OUT_ID:=seq_tt_as_out_ident.nextval; insert into tt_as_out_ident( id, waybill_no, src_zno, des_zno, insert_tm, deal_flg, transit_zno, other_node_flg, src, scan_tm, PRODUCT_TYPE, weight, SRC_CITY, DES_CITY, THREAD_ID )select seq_tt_as_out_ident.nextval, rx.waybill_no, rx.src_zno, rx.des_zno, current_timestamp, 0, t.transit_code, rx.other_node_flg, rx.src, rx.input_tm , rx.PRODUCT_TYPE, rx.weight, rx.SRC_CITY, rx.DES_CITY, V_AS_OUT_ID from tm_zno_transit t WHERE instr(‘,‘||t.out_znos||‘,‘,‘,‘||rx.SRC_CITY||‘,‘)>0 and instr(‘,‘||t.in_znos||‘,‘,‘,‘||rx.DES_CITY||‘,‘)=0; V_SQL_NUM :=sql%rowcount ; END IF; --UPDATE 状态 UPDATE TT_AS_OUT_IDENT_MID T SET T.DEAL_FLG = 2 ,T.REMARK= DECODE( V_BATCH_OUT, 0, DECODE(V_SQL_NUM,0,‘NO TRANSIT CONFIG OUTS_ZNOS‘,‘INSERT INTO TT_AS_OUT_IDENT SUCCESCCD ,ID=‘||V_AS_OUT_ID), ‘discard‘) ,T.DEAL_TM = CURRENT_TIMESTAMP WHERE T.ROWID = RX.RID; --批次提交控制 V_COUNT:=V_COUNT+1 ; IF(MOD(V_COUNT,P_COMMIT_NUM)=0)THEN COMMIT; END IF; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; PKG_SYS_LOG.ERROR_LOG(NULL, ‘PROC_TT_AS_OUT_IDENT_MID‘, SYSDATE, SQLCODE, SQLERRM, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE,NULL ); END PROC_TT_AS_OUT_IDENT_MID; -- 建序列 SEQ_TT_TRMS_CAR_TASK
时间: 2024-12-27 23:44:40