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;