CREATE OR REPLACE PACKAGE BODY Pk_If_Epg_Bss IS
/********************************************************************************
* 包体名称:
PK_IF_EPG_BSS
* 功能描述:
实现IPTV EPG_与 BSS 的一些接口功能
* 作
者:
* 编写日期:
2005.11.19
* 说
明:
* (1) 本过程包中的P_QUERY_AUTH, P_QUERY_ORDER, P_QUERY_BILL 是返回字符串结果的,目前(P_QUERY_BILL)暂没有用,留待对性能要求更高时备用.
* 实现同样功能的还有返回结果集的另一个版本,包含在过程包 PG_IO_EPG 中, 是目前在用的版本.
*
* 修改历史:
* 修 改 人
日
期
修改说明
* -------- -------- ----------------------------------------------------------
* 遗留问题:
* (3)有些表都没有判断生效/失效日期(等相关数据完整、严密之后加上)。
* (4)验证和实际扣费可能需要分离,也就是说,先验证返回结果给IPTV平台,用户实际点播使用成功后IPTV平台再发扣费请求。
********************************************************************************/
PROCEDURE p_User_Login_Authen -- 用户登录时认证
(
Pi_Stbid IN VARCHAR2, -- 机顶盒编号
Pi_Userid IN VARCHAR2, -- 用户帐号
Pi_Password IN VARCHAR2, -- 用户密码
Pi_Ipaddr IN VARCHAR2, -- 机顶盒IP地址
Po_Usertoken OUT VARCHAR2, -- 用户令牌
Po_Userid_Out OUT VARCHAR2, -- 用户帐号 (输入参数中用户帐号为空时需要返回用户帐号)
Po_Nickname OUT VARCHAR2, -- 用户名称
Po_Accountno OUT VARCHAR2, -- 宽带接入帐号
Po_Detailparams OUT VARCHAR2, -- 扩展信息
Po_Returncode OUT VARCHAR2, -- 认证结果 0-认证成功,1-认证失败
Po_Message OUT VARCHAR2 -- 返回消息, 认证失败时返回具体的失败原因
) IS
/********************************************************************************
* 过程名称:
P_USER_LOGIN_AUTHEN
* 功能描述:
用户登录时认证
* 作
者: 王占通
* 编写日期:
2005.11.19
* 修改历史:
* 修 改 人
日
期
修改说明
* -------- -------- --------------------------------------------------------------
********************************************************************************/
Vc_Query_Pwd Serv.Query_Pwd%TYPE;
Vc_Width_Type Serv.Width_Type%TYPE;
Vc_Serv_Id Serv.Serv_Id%TYPE;
Vc_State Serv.State%TYPE;
Vc_State1 Serv_Terminal.State%TYPE;
Vc_Area_Id Serv.Area_Id%TYPE;
Vc_Acc_Nbr Serv.Acc_Nbr%TYPE;
Vc_Acc_Nbr Serv.Acc_Nbr%TYPE;
Vc_Remark Serv.Remark%TYPE;
Vc_Width_Flux Serv.Width_Flux%TYPE;
Vc_Area_Name Area.NAME%TYPE;
Vc_Found CHAR(1);
Vc_Stpmsg VARCHAR2(2000);
BEGIN
Po_Returncode := '1';
Po_Userid_Out := Pi_Userid;
Vc_Found := '0';
Vc_State := 'F0A';
Vc_State1 := '1';
-- 若输入参数中用户帐号及密码为空,表明用户是首次登录认证,则需到用户表中根据机顶盒编号查找用户帐号。
-- 否则根据用户帐号查询。
IF Pi_Userid IS NULL THEN
Vc_Stpmsg := ' 根据输入机顶盒编号查找/验证用户信息';
BEGIN
SELECT User_Name,
Query_Pwd,
Nvl(Width_Type, ' '),
Width_Id,
Area_Id,
a.Serv_Id,
Width_Flux,
Acc_Nbr,
a.State,
Nvl(b.State, '1'),
Remark
INTO Po_Nickname,
Vc_Query_Pwd,
Vc_Width_Type,
Po_Accountno,
Vc_Area_Id,
Vc_Serv_Id,
Vc_Width_Flux,
Po_Userid_Out,
Vc_State,
Vc_State1,
Vc_Remark
FROM Serv a, Serv_Terminal b
WHERE a.Serv_Id = b.Serv_Id
AND b.Terminal_Id = Pi_Stbid;
EXCEPTION
WHEN OTHERS THEN
Vc_Found := '1';
END;
ELSE
Vc_Stpmsg := ' 根据输入用户帐号查找/验证用户信息';
BEGIN
SELECT User_Name,
Query_Pwd,
Nvl(Width_Type, ' '),
Width_Id,
Area_Id,
Serv_Id,
State,
Width_Flux
INTO Po_Nickname,
Vc_Query_Pwd,
Vc_Width_Type,
Po_Accountno,
Vc_Area_Id,
Vc_Serv_Id,
Vc_State,
Vc_Width_Flux
FROM Serv
WHERE Acc_Nbr = Pi_Userid;
EXCEPTION
WHEN OTHERS THEN
Vc_Found := '2';
END;
END IF;
IF Vc_Found <> '0' THEN
IF Vc_Found = '2' THEN
Po_Message := ' 用户帐号不存在.';
ELSE
Po_Message := ' 机顶盒编号不存在.';
END IF;
RETURN;
END IF;
IF Vc_State NOT IN ('F0A', 'F0B') THEN
Po_Message := ' 用户状态为非可用状态:' || Vc_Remark;
RETURN;
END IF;
IF Vc_State1 <> '1' THEN
Po_Message := ' 机顶盒状态为暂停状态';
RETURN;
END IF;
IF Vc_Query_Pwd <> Pi_Password Or Pi_Password IS NULL THEN
Po_Message := ' 用户密码不符.';
RETURN;
END IF;
SELECT 'RZ_' || To_Char(SYSDATE, 'yyyymmddhh24miss') || '_' ||
To_Char(Vc_Serv_Id)
INTO Po_Usertoken
FROM Dual;
SELECT NAME
INTO Vc_Area_Name
FROM Area
WHERE Area_Id = Vc_Area_Id;
Vc_Stpmsg := ' 得到扩展信息.';
Po_Detailparams := '' || To_Char(Vc_Area_Id) || '' ||
'' || Vc_Area_Name || '' || '' ||
'123' || '' || '' || '123' || '' ||
'' || To_Char(Vc_Width_Flux) || '';
IF Vc_State = 'F0B' THEN
-- 机顶盒第一次使用,自动激活
UPDATE Serv
SET State = 'F0A'
WHERE Serv_Id = Vc_Serv_Id;
END IF;
Vc_Stpmsg := ' 记录登录认证日志';
INSERT INTO t_If_Login_Log
(Usertoken, Acc_Nbr, Serv_Id, Login_Time, Stb_Id, Flag)
VALUES
(Po_Usertoken, Po_Userid_Out, Vc_Serv_Id, SYSDATE, Pi_Stbid, '1');
COMMIT;
Po_Returncode := '0';
RETURN;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
Vc_Stpmsg := Vc_Stpmsg || ' 错误号:' || SQLCODE || ' 错误信息:' || SQLERRM;
INSERT INTO Ut_Err_Log
(Proc, Errmsg, Err_Date)
VALUES
('P_USER_LOGIN_AUTHEN', Vc_Stpmsg, SYSDATE);
COMMIT;
Po_Message := ' 认证处理失败; ' || Vc_Stpmsg;
Po_Returncode := '1';
--vi_return := PG_SYS_MANAGER.F_SYS_ERROR_LOG(0,0,0,0,vc_stpmsg );
END p_User_Login_Authen;