CREATE PROCEDURE COPY_OCJ_LIST_TO_SHIPMENT ( IN P_SESSION_ID VARCHAR(40), --当前用户的session ID IN P_IS_REPEAT VARCHAR(20), --如果导入新数据传入值:YES,如果导入全部数据传入值:ALL IN P_IS_SAME VARCHAR(20), --是否保存 IN P_ORDER_TYPE VARCHAR(20), --客户发货入库 IN P_ORDER_ID VARCHAR(20), --入库编号 IN P_ORDER_TIME VARCHAR(30), --入库时间 IN P_VENDOR_ID VARCHAR(20), --发货客户 IN P_WAREHOUSE_ID VARCHAR(20),--分拨中心 IN P_CREATE_BY VARCHAR(20) --创建者 ) MODIFIES SQL DATA --表示存储过程可以执行任何 SQL 语句 LANGUAGE SQL ------------------------------------------------------------------------ -- SQL 存储过程 ------------------------------------------------------------------------ P1: BEGIN ATOMIC --把整段作为一个小的单元,要么都成功提交要么都失败回滚 --声明一个变量,用来保存入库计划明细中未失效运单的数量 DECLARE D_ODRER_COUNT INTEGER; DECLARE D_ORDER_ID VARCHAR(20); DECLARE D_IS_SAME VARCHAR(20); ------------------------- -- 保存OCJ正式表数据 -- ------------------------- MERGE INTO OCJ_SHIPMENT OS USING ( --查询OCJ导入的临时表数据 SELECT SHIPMENT_ID, --ID SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 WAREHOUSE_ID, --原分拨中心 IS_CHECK, --是否审核 CAR_LICENSE_NO, --车辆牌号 DRIVER_NAME, --司机名称 STATE, --状态 CREATE_BY, --创建者 CREATE_DATE, --创建日期 LAST_UPDATE_BY, --修改者 LAST_UPDATE_DATE, --修改日期 SESSION_ID, --用户ID SERIAL_ID, --序列号 IS_REPEAT, --是否重复 FROM_WAREHOUSE_ID, --来源分拨中心 IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT <> P_IS_REPEAT )OST ON ( OST.IS_REPEAT <> P_IS_REPEAT AND OS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO AND OS.VENDOR_ID=OST.VENDOR_ID ) --如果临时表中标记为YS_Yes的,则修改 WHEN MATCHED THEN --如果指定的条件匹配,则执行修改动作 UPDATE SET OS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO, --运单号 OS.RECEIVE_DATE=OST.RECEIVE_DATE, --提货日期 OS.VENDOR_ID=OST.VENDOR_ID, --发货客户 OS.WAREHOUSE_ID =OST.WAREHOUSE_ID, --原分拨中心 OS.FROM_WAREHOUSE_ID=OST.FROM_WAREHOUSE_ID, --来源分拨中心 OS.IS_CHECK=OST.IS_CHECK, --是否审核 OS.CAR_LICENSE_NO=OST.CAR_LICENSE_NO, --车辆编号 OS.DRIVER_NAME=OST.DRIVER_NAME, --司机名称 OS.STATE=OST.STATE, --状态 OS.LAST_UPDATE_BY=OST.LAST_UPDATE_BY, --修改者 OS.LAST_UPDATE_DATE=OST.LAST_UPDATE_DATE --修改日期 WHEN NOT MATCHED THEN --如果指定的条件不匹配,则执行添加动作 INSERT ( SHIPMENT_ID, --ID SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 WAREHOUSE_ID, --原分拨中心 IS_CHECK, --是否审核 CAR_LICENSE_NO, --车辆牌号 DRIVER_NAME, --司机名称 STATE, --状态 CREATE_BY, --创建者 CREATE_DATE, --创建日期 LAST_UPDATE_BY, --修改者 LAST_UPDATE_DATE, --修改日期 FROM_WAREHOUSE_ID --来源分拨中心 ) VALUES ( OST.SHIPMENT_ID, OST.SHIPMENT_PLAN_NO, OST.RECEIVE_DATE, OST.VENDOR_ID, OST.WAREHOUSE_ID, OST.IS_CHECK, OST.CAR_LICENSE_NO, OST.DRIVER_NAME, OST.STATE, OST.CREATE_BY, OST.CREATE_DATE, OST.LAST_UPDATE_BY, OST.LAST_UPDATE_DATE, OST.FROM_WAREHOUSE_ID ); ------------------------------ -- 保存导入数据状态表状态 -- ------------------------------ MERGE INTO SHIPMENT_STATE SS USING ( --查询OCJ导入的临时表数据 SELECT SHIPMENT_ID, --ID SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 WAREHOUSE_ID, --原分拨中心 --IS_CHECK, --是否审核 --CAR_LICENSE_NO, --车辆牌号 --DRIVER_NAME, --司机名称 --STATE, --状态 --CREATE_BY, --创建者 --CREATE_DATE, --创建日期 --LAST_UPDATE_BY, --修改者 --LAST_UPDATE_DATE, --修改日期 --SESSION_ID, --用户ID --SERIAL_ID, --序列号 IS_REPEAT --是否重复 --FROM_WAREHOUSE_ID, --来源分拨中心 --IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT <> P_IS_REPEAT )OST ON ( OST.IS_REPEAT <> P_IS_REPEAT AND SS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO AND SS.VENDOR_ID=OST.VENDOR_ID ) --如果临时表中标记为YS_Yes的,则修改 WHEN MATCHED THEN --如果指定的条件匹配,则执行修改动作 UPDATE SET SS.RECEIVE_DATE=OST.RECEIVE_DATE --提货日期 WHEN NOT MATCHED THEN --如果指定的条件不匹配,则执行添加动作 INSERT ( SHIPMENT_STATE_ID, --状态表ID(唯一的) SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 WAREHOUSE_ID --原分拨中心 --CREATE_BY, --创建者 --CREATE_DATE --创建日期 ) VALUES ( 'SS' || OST.SHIPMENT_ID, OST.SHIPMENT_PLAN_NO, OST.RECEIVE_DATE, OST.VENDOR_ID, OST.WAREHOUSE_ID --OST.CREATE_BY, --创建者 --OST.CREATE_DATE --创建日期 ); ----------------------------------- -- 保存导入数据Other状态表状态 -- ----------------------------------- MERGE INTO SHIPMENT_OTHER_STATE SOS USING ( --查询OCJ导入的临时表数据 SELECT SHIPMENT_ID, --ID SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 --WAREHOUSE_ID, --原分拨中心 --IS_CHECK, --是否审核 --CAR_LICENSE_NO, --车辆牌号 --DRIVER_NAME, --司机名称 --STATE, --状态 --CREATE_BY, --创建者 --CREATE_DATE, --创建日期 --LAST_UPDATE_BY, --修改者 --LAST_UPDATE_DATE, --修改日期 IS_REPEAT, --是否重复 WAREHOUSE_ID, --来源分拨中心 IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT <> P_IS_REPEAT )OST ON ( OST.IS_REPEAT <> P_IS_REPEAT AND SOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO AND SOS.VENDOR_ID=OST.VENDOR_ID ) --如果临时表中标记为YS_Yes的,则修改 WHEN MATCHED THEN --如果指定的条件匹配,则执行修改动作 UPDATE SET SOS.PLAN_WAREHOUSE_ID=OST.WAREHOUSE_ID, --来分拨中心 SOS.PLAN_IMPORT='YS_Yes', --可导入 SOS.OCJ_IMPORT='YS_Yes', --可导入 SOS.OCJ_CHECK='YS_Yes', --可审核 SOS.INCOME_ORDER='YS_Yes', --可入库 SOS.BOOK_LOC='YS_Yes' --可预排库位 --SOS.LAST_UPDATE_BY=OST.LAST_UPDATE_BY, --修改者 --SOS.LAST_UPDATE_DATE=OST.LAST_UPDATE_DATE --修改日期 WHEN NOT MATCHED THEN --如果指定的条件不匹配,则执行添加动作 INSERT ( SHIPMENT_STATE_ID, --状态表ID(唯一的) SHIPMENT_PLAN_NO, --运单号 VENDOR_ID, --发货客户 PLAN_WAREHOUSE_ID, --来源分拨中心 PLAN_IMPORT, --可导入 OCJ_IMPORT, --可导入 OCJ_CHECK, --可审核 INCOME_ORDER, --可入库 BOOK_LOC --可预排库位 --CREATE_BY, --创建者 --CREATE_DATE --创建日期 ) VALUES ( 'SOS' || OST.SHIPMENT_ID, OST.SHIPMENT_PLAN_NO, OST.VENDOR_ID, OST.WAREHOUSE_ID, 'YS_Yes', 'YS_Yes', 'YS_Yes', 'YS_Yes', 'YS_Yes' --OST.CREATE_BY, --创建者 --OST.CREATE_DATE --创建日期 ); -------------------------- -- 保存计划入库头信息 -- -------------------------- SET D_IS_SAME = P_IS_SAME; IF D_IS_SAME <> 'SAME' THEN INSERT INTO WMS_INCOMING_ORDER_PLAN ( ORDER_ID, --入库计划ID ORDER_NO, --入库计划单号 ORDER_TIME, --入库时间 ORDER_TYPE, --类型 ENTER_TYPE, --自动 STATE, --状态 CREATE_BY, --创建者 CREATE_DATE, --创建时间 WAREHOUSE_ID, --分拨中心 VENDOR_ID --发货客户 ) VALUES ( P_ORDER_ID, 'JHRKD' || P_ORDER_ID, P_ORDER_TIME, P_ORDER_TYPE, 'AUTO', 'State_All_Y', P_CREATE_BY, P_ORDER_TIME, P_WAREHOUSE_ID, P_VENDOR_ID ); END IF; ---------------------------- -- 修改计划入库明细信息 -- ---------------------------- MERGE INTO WMS_INCOMING_ORDER_ITEM_PLAN WIOI USING ( --查询OCJ导入的临时表数据 SELECT SHIPMENT_ID, --ID SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 WAREHOUSE_ID, --原分拨中心 --IS_CHECK, --是否审核 --CAR_LICENSE_NO, --车辆牌号 --DRIVER_NAME, --司机名称 --STATE, --状态 --CREATE_BY, --创建者 --CREATE_DATE, --创建日期 --LAST_UPDATE_BY, --修改者 --LAST_UPDATE_DATE, --修改日期 IS_REPEAT, --是否重复 FROM_WAREHOUSE_ID, --来源分拨中心 IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT <> P_IS_REPEAT AND IS_SAME_WAREHOUSE='YS_No' --查询当前用户下不同分拨中心的运单信息 )OST ON ( 1=1 AND OST.IS_SAME_WAREHOUSE = 'YS_No' AND WIOI.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO AND WIOI.VENDOR_ID=OST.VENDOR_ID --指定条件 ) WHEN MATCHED THEN --如果指定的条件匹配,则执行修改动作 UPDATE SET STATE = 'State_All_N'; ---------------------------- -- 保存计划入库明细信息 -- ---------------------------- MERGE INTO WMS_INCOMING_ORDER_ITEM_PLAN WIOI USING ( --查询OCJ导入的临时表数据 SELECT SHIPMENT_ID, --ID SHIPMENT_PLAN_NO, --运单号 RECEIVE_DATE, --提货日期 VENDOR_ID, --发货客户 WAREHOUSE_ID, --原分拨中心 --IS_CHECK, --是否审核 --CAR_LICENSE_NO, --车辆牌号 --DRIVER_NAME, --司机名称 --STATE, --状态 --CREATE_BY, --创建者 --CREATE_DATE, --创建日期 --LAST_UPDATE_BY, --修改者 --LAST_UPDATE_DATE, --修改日期 IS_REPEAT, --是否重复 FROM_WAREHOUSE_ID, --来源分拨中心 IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT <> P_IS_REPEAT AND IS_SAME_WAREHOUSE IS NOT NULL )OST ON ( 1 <> 1 --指定条件 ) WHEN NOT MATCHED THEN --如果指定的条件不匹配,则执行添加动作 INSERT ( ORDER_ITEM_ID, --明细ID ORDER_ID, --头信息ID SHIPMENT_PLAN_ID, --配送计划ID SHIPMENT_PLAN_NO, --运单号 CHECK_STATE, -- VENDOR_ID, --发货客户 WAREHOUSE_ID, --分拨中心 LOC_ID, --库位ID QUANTITY, --数量 STATE, --状态 CREATE_BY, --创建者 CREATE_DATE --创建日期 ) VALUES ( 'WOIO' || SHIPMENT_ID, P_ORDER_ID, '-', OST.SHIPMENT_PLAN_NO, 'YS_No', OST.VENDOR_ID, OST.WAREHOUSE_ID, '-', 1, 'State_All_Y', P_CREATE_BY, P_ORDER_TIME ); ----------------------- -- 修改计划入库信息 -- ----------------------- --如果在入库计划明细中当前ORDER_ID下,不存在状态为State_All_Y,则更新头部信息为State_All_N --查询入库计划表表中有效运单的数据,根据ORDER_ID分组,如果该ORDER_ID下没有有效的入库计划明细,则头部信息失效 FOR V AS SELECT sum(CASE STATE WHEN 'State_All_Y' THEN 1 ELSE 0 END) AS COUNT,order_id FROM WMS_INCOMING_ORDER_ITEM_PLAN WIOIP WHERE 1 = 1 GROUP BY WIOIP.order_id --根据ORDER_ID分组 FOR READ ONLY DO SET D_ORDER_ID = V.order_id; SET D_ODRER_COUNT = V.COUNT; --如果有效运单为0,更新头部信息为失效 IF D_ODRER_COUNT = 0 THEN UPDATE WMS_INCOMING_ORDER_PLAN SET STATE = 'State_All_N' WHERE ORDER_ID = D_ORDER_ID; END IF; END FOR; -------------------------------- -- 添加操作历史初始导入记录 -- -------------------------------- INSERT INTO ACTION_HISTORY (HISTORY_ID --操作历史ID , REFRENCE_ID --引用ID , REFRENCE_TYPE --操作类型 , REFRENCE_OPERATOR -- , WAREHOUSE_ID --分拨中心 , SUB_WAREHOUSE_ID -- , LOC_ID --库位 , BEGIN_TIME --开始时间 , STATE --状态 , COMMENTS --备注 , CREATE_BY --创建者 , CREATE_DATE --创建时间 , LAST_UPDATE_BY --最后修改者 , LAST_UPDATE_DATE --最后修改时间 , DRIVER_NAME --司机名称 , CAR_LICENSE_NO --车辆编号 , SHIPMENT_PLAN_ID --配送计划ID , VENDOR_ID --发货客户 , SHIPMENT_PLAN_NO --运单号 ) SELECT 'AHO' || SHIPMENT_ID --操作历史ID , SHIPMENT_ID --引用ID , 'OPERATOR_SHIPMENT_OCJ_IMPORT' --操作类型 , 'NEW_OCJ_IMPORT' -- , FROM_WAREHOUSE_ID --分拨中心 , WAREHOUSE_ID -- , '-' --库位 , CREATE_DATE --开始时间 , 'State_All_Y' --状态 , '' --备注 , CREATE_BY --创建者 , CREATE_DATE --创建时间 , CREATE_BY --最后修改者 , CREATE_DATE --最后修改时间 , DRIVER_NAME --司机名称 , CAR_LICENSE_NO --车辆编号 , '-' --配送计划ID , VENDOR_ID --发货客户 , SHIPMENT_PLAN_NO --运单号 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT = 'YS_No'; --初始导入 -------------------------------- -- 添加操作历史覆盖导入记录 -- -------------------------------- INSERT INTO ACTION_HISTORY ( HISTORY_ID, --操作历史ID REFRENCE_ID, --引用ID REFRENCE_TYPE, --操作类型 REFRENCE_OPERATOR, -- WAREHOUSE_ID, --分拨中心 SUB_WAREHOUSE_ID, -- LOC_ID, --库位 BEGIN_TIME, --开始时间 STATE, --状态 COMMENTS, --备注 CREATE_BY, --创建者 CREATE_DATE, --创建时间 LAST_UPDATE_BY, --最后修改者 LAST_UPDATE_DATE, --最后修改时间 DRIVER_NAME, --司机名称 CAR_LICENSE_NO, --车辆编号 SHIPMENT_PLAN_ID, --配送计划ID VENDOR_ID, --发货客户 SHIPMENT_PLAN_NO --运单号 ) SELECT 'AHO' || SHIPMENT_ID --操作历史ID , SHIPMENT_ID --引用ID , 'OPERATOR_SHIPMENT_OCJ_IMPORT' --操作类型 , 'AGAIN_OCJ_IMPORT' -- , FROM_WAREHOUSE_ID --分拨中心 , WAREHOUSE_ID -- , '-' --库位 , CREATE_DATE --开始时间 , 'State_All_Y' --状态 , '' --备注 , CREATE_BY --创建者 , CREATE_DATE --创建时间 , CREATE_BY --最后修改者 , CREATE_DATE --最后修改时间 , DRIVER_NAME --司机名称 , CAR_LICENSE_NO --车辆编号 , '-' --配送计划ID , VENDOR_ID --发货客户 , SHIPMENT_PLAN_NO --运单号 FROM OCJ_SHIPMENT_TEMP WHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT = 'YS_Yes'; --覆盖导入 END P1;