关于sql:oralce-存储过程自备样例

6次阅读

共计 332848 个字符,预计需要花费 833 分钟才能阅读完成。

clear buffer
set define off
set sqlblanklines on
spool m_200_sproc.log
–connect
–ISMP V4 Order 通用鉴权批价(电信版本)实现性能:订购鉴权批价
– 订购入库、退订入库、产品收费期揭示鉴权、暂停 / 激活产品订购关系鉴权
– 暂停 / 激活产品订购关系更新

– 订购鉴权批价
prompt zxdbm_200.slp_200_telicomsubreq
create or replace procedure zxdbm_200.slp_200_telicomsubreq
(

i_oa                    in          varchar2,            -- 发起方 / 赠送方用户号码
i_ua                    in          varchar2,            -- 应用方 / 受赠方用户号码
i_oatype                in          number,              -- 发起方地址类型
i_datype                in          number,              -- 应用方地址类型
i_servicetype           in          number,              -- 业务能力类型
i_serviceflowtype       in          number,              -- 业务流程类型
i_srvprodid             in          varchar2,            -- 业务 / 产品代码
i_actiontype            in          number,              -- 动作类型
i_cmdchannel            in          number,              -- 动作起源
i_countrycode           in          varchar2,            -- 国家码
i_spaccesscode          in          varchar2,            --antuprice 音讯中的 SP 接入码
i_isthird               in          number,              --0: 一般订购 1: 赠送
i_silent                in          number,              -- 缄默去激活开关
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_direct                in          number,              -- 订购方向 0: 正向订购 1:SP 反向定购
i_supportproductid      in          number,              -- 同步 SP、SP 下发应用 service 还是 productid 0-serviceid 1-productid
i_prepaidtype           in          number,              -- 预付费接口类型 1-OCS 2- 非 OCS 3- 依据号段抉择是 OCS 或者非 OCS
i_monthconsumedlimit    in          number,              -- 零碎级月生产限度金额
i_isnondreplay          in          number,              -- 是否须要二次确认,1- 不须要,0- 须要
i_checkpseudocode       in          number,              -- 零碎开关: 是否反对伪码   0- 不反对   1- 反对
i_provinceorder         in          number,              -- 零碎开关: 是否反对跨省赠送   0- 不反对   1- 反对
i_rentday               in          number,              -- 账期截止日期
i_mutidbmode            in          number,              -- 是否多 DB 环境 0: 否 1: 是
i_isfromnmsc            in          number,              -- 是否 nmsc 过去的音讯 0: 否 1:是
i_spordernoticeuser     in          number,              --sp 反向订购是否与用户交互(告诉用户,二次确认)0: 否 1:是
i_freemodule            in          number,              -- 收费期计费形式:0:失常形式  1:优惠形式
i_eventid               in          varchar2,            -- 事件 ID
i_channelid             in          varchar2,            -- 渠道商 ID
--added by youqunxia 20130805  Order3.02.01
i_webgwcnfmswitch       in          number,              -- 用来管制来自 WEBGW 的申请,是否进行二次确认,0- 不须要 1- 须要
i_startcmdchannel       in          number,              -- 二次确认时的最后起源动作起源
i_isexperience          in          number,              -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
i_fullmonthmode         in          number,              -- 退订应用足月模式 0- 可用到订购日 1- 可用到订购日前一天
i_effectiveswitch       in          number,              --VSOP 发动的订购退订立刻失效开关是否关上,0- 敞开,1- 关上

o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos              out         number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_srcmsisdn             out         varchar2,            -- 去掉前缀的发起方 / 赠送方用户号码
o_usemsisdn             out         varchar2,            -- 去掉前缀的应用方 / 受赠方用户号码
o_paymsisdn             out         varchar2,            -- 去掉前缀的计费方号码
o_srcmsisdntype         out         number,              -- 发起方号码类型,1:msisdn,2:phs,3:pstn
o_usemsisdntype         out         number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
o_userindex             out         number,              -- 应用方号码序号
o_payuserindex          out         number,              -- 付费方号码序号
o_needreplay            out         number,              -- 产品订购是否须要用户二次确认,0- 不须要,1- 须要
o_paytype               out         number,              -- 计费号码的付费类型 0: 后付费 1: 预付费 2: 准预付费
o_oppaytype             out         number,              -- 话单专用付费类型
o_scptype               out         number,              -- 对预付费扣费的设施类型 1:OCS;2:非 OCS
o_subfee                out         number,              -- 本次订购须要扣取的费用
o_colortype             out         number,              -- 应用方号码名单类型   0- 普通用户,1- 黑名单,2- 白名单,3- 灰名单,4- 红名单
o_usertype              out         number,              -- 应用方类型  1- 普通用户  2- 运营商测试用户  3-SP 测试用户
o_producttype           out         number,              -- 产品类型   1- 失常产品 2- 测试产品
o_cpid                  out         varchar2,            --CP/SP 代码
o_cpindex               out         number,              --CP/SP 序号
o_cpcnshortname         out         varchar2,            --CP/SP 名称
o_cpsubscribeurl        out         varchar2,            --CP/SP 订购 URL
o_cptype                out         number,              --CP/SP 类型 0: 本省 1:是全国业务
o_protocoltype          out         number,              -- 定购同步协定类型 0 -ismp(wbs 形式),1-smgp2.0(cngp1.0),2-smgp3.0
o_msgtosp               out         varchar2,            --SMGP/CNGP 同步 sp 的音讯内容
o_cnfmmsgtosp           out         varchar2,            --SMGP2.0/CNGP1.0 向 sp 发送同步确认音讯内容
o_customersrvtel        out         varchar2,            --CP/SP 客服电话
o_serviceid             out         varchar2,            -- 业务代码
o_serviceindex          out         number,              -- 业务序号
o_servicename           out         varchar2,            -- 业务名称
o_productid             out         varchar2,            -- 产品代码
o_productindex          out         number,              -- 产品序号
o_productname           out         varchar2,            -- 产品名称
o_smschargingcn         out         varchar2,            -- 产品资费短信形容
o_autocontinue          out         number,              -- 周期性订购是否主动续订
o_servicetype           out         number,              -- 产品业务能力类型
o_subcapability         out         number,              -- 产品业务能力子类型
o_srvtypeid             out         varchar2,            -- 业务能力编码,对应 ssys_service_type 表中的 srvtypeid
o_corpid                out         varchar2,            -- 团体代码
o_corpindex             out         number,              -- 团体序号
o_corpcnshortname       out         varchar2,            -- 团体名称
o_paymode               out         varchar2,            -- 团体付费模式 团体付费 / 集体付费
o_freetime              out         varchar2,            -- 产品订购关系收费期
o_nextrentdate          out         varchar2,            -- 产品订购关系下次扣租日期
o_substarttime          out         varchar2,            -- 产品订购关系失效工夫
o_subendtime            out         varchar2,            -- 产品订购关系生效工夫
o_substatus             out         number,              -- 产品订购关系状态
o_lastrenttime          out         varchar2,            -- 产品订购关系上次扣租工夫
o_payfordate            out         varchar2,            -- 月租已付日期
o_fixusetimes           out         number,              -- 产品包量值
o_chargetype            out         number,              -- 产品计费类型
o_cyctype               out         number,              -- 产品周期类型
o_linknum               out         varchar2,            -- 业务话单中同一个流程中二次确认前后话单的关联
o_maxlimitfee           out         varchar2,            -- 用户月生产限额
o_pseudocode            out         varchar2,            -- 伪码
o_pcodemsisdnswitch     out         number,              -- 伪码和实在号码之间是否有转换:  0 否   1 实在号码转化伪码 2 伪码转化为实在号码
o_chanelplayerstate     out         number,              --cp/sp 状态,0- 申请,1- 失常,2- 暂停(暂停代收费),3- 预登记,4- 登记,5- 解冻,21- 暂停端口
o_eventstate            out         number,              --0, 失常 1, 登记
o_ordertype             out         number,              -- 定购类型,1- 定购,2- 点播,3- 不须要定购点播
o_spaccesscode          out         varchar2,            --SP 接入码
o_cancelaccesscode      out         varchar2,            -- 产品退订接入码
o_maincapability        out         number,              -- 组合业务主业务能力类型
o_submaincapability     out         number,              -- 组合业务主业务能力子类型
o_cpsrvtype             out         number,              --CP 服务类型:0:CP+SP,1:CP,2:SP ;3:自营业务 SP
o_cancelproductid       out         varchar2,            -- 被 189 替换的产品代码
o_issecondproduct       out         number,              -- 订购流程子类型 0: 一般订购 1: 业务订购 2: 待生效订购关系订购 3: 纯包量反复订购 6: 可变价的反复订购 7: 体验转正式的反复订购
o_cancelfeaturecode     out         varchar2,            -- 短信, 彩信退订指令
o_provincesend          out         number,              -- 是否跨省赠送  0. 否 1. 跨省赠送  2. 跨省受增
o_cdrbegintime          out         varchar2,            -- 话单计费开始工夫
o_cdrendtime            out         varchar2,            -- 话单计费完结工夫
o_cnfmtype              out         number,               -- 产品二次确认类型 0: 一般  1:0 资费  2: 收费期
o_validmode             out         number,               -- 产品属性:订购失效形式:0- 立刻失效,1- 下一帐期失效,2- N 周期后失效,3- 指定日期失效
o_mutiluserexit         out         number,               -- 用户存在状况:0 多 DB 分库用户不存在  1 多 DB 分库用户存在或者单 DB 用户存在
o_popustop              out         varchar2,             -- 推广期完结工夫
o_popuexist             out         number,               -- 长期寄存订购时是否存在推广期:0 目前存在收费推广期  1. 目前存在计费推广期  2. 目前不在推广期或无推广期 3. 订购工夫在推广期,失效工夫在推广期之外;o_freenoticenow         out         number,               -- 长期寄存收费期揭示短信立即下发(首次订购收费期为 1 天的产品):0 否  1 是
o_freedays              out         number,               -- 长期寄存收费期揭示短信立即下发(首次订购收费期为 1 天的产品):0 否  1 是
o_productpkgname        out         varchar2,             -- 套餐名称
o_freenotitype          out         number,               -- 收费期揭示形式 dwFreeNotiType 0:调用收费 n 天的短息模板,1: 收费到月底 2:收费 n 小时 3:试用到足月  默认为 0
o_needcharge            out         number,               -- 是否须要扣费 0 否  1 是(只用于赠送状况下的替换)o_cityid                out         varchar2,             -- 用户表中的 cityid

--added by youqunxia 2013.02.18
o_freenotify            out         number,                -- 收费试用期到解决形式,0- 到期主动免费,1- 到期需用户确认订购,2- 到期主动勾销,3- 到期用户确认退订
--added by youqunxia 20130818  Order3.02.01
o_hassubscription       out         number,                -- 可变价订购时,是否有订购关系,0- 否,1- 是
o_rentfee               out         number,                -- 周期性费用金额,0- 无此类费用
o_haswebgw              out         number,                -- 是否是签约 WEBGW 业务能力的 SP,0- 否,1- 是
o_lastvarifee           out         number,                --WEBGW 可变价时,当存在订购关系时,保留上次订购关系表中的可变价格
o_issynctooidd          out         number,                -- 是否同步订购关系给 OIDD,0- 否,1- 是
o_isexperience          out         varchar2,              -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
o_chargetime            out         varchar2               -- 首次扣费时间

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)    := to_char(sysdate ,'yyyymmddhh24miss');
v_sysdate8              char(8)     := substr(v_sysdate14,1,8);
v_sysmonth6             char(6)     := substr(v_sysdate14,1,6);
v_curmonth              number(2)   := to_number(substr(v_sysdate14,5,2));        -- 长期寄存以后月份
v_curstrmonth           char(2)     := lpad(to_char(v_curmonth),2,'0');           -- 长期寄存以后月份, 字符型
v_curmonthendtime       char(14)    := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')),'yyyymmdd')||'235959';
v_freenoticetime        char(14)    := '00000000000000';
v_unsubenddate          char(8)     := substr(v_sysdate14,1,8);

v_maincapability        number(10)                                          := 0;                                       -- 长期寄存组合业务主业务能力类型
v_submaincapability     number(10)                                          := 0;                                       -- 长期寄存组合业务主业务能力子类型
v_countrycode           varchar2(5)                                         := i_countrycode;                           -- 长期寄存国家码
v_tempitem              number(10)                                          := 0;                                       -- 长期寄存 0 或者推广期的计费子序号
v_devexist              number(3)                                           := 1;                                       -- 长期寄存是否存在对应设施
v_isservicesub          number(3)                                           := 0;                                       -- 长期寄存是否业务订购(189 邮箱),是否依据 serviceid 查找定购关系,0:否,1:是
v_hasrecord             number(3)                                           := 0;                                       -- 长期寄存产品订购关系是否存在
v_leftdays              number(3)                                           := 0;                                       -- 长期寄存当月所剩天数
v_monthdays             number(3)                                           := 30;                                      -- 当月总天数
v_subfee                number(10)                                          := 0;                                       -- 长期寄存本次订购须要扣除的费用
v_sql                   varchar2(3072)                                      := ' ';                                     -- 长期寄存动静 sql
v_usedamounts           number(10)                                          := 0;                                       -- 长期寄存累计金额
v_tmpint                number(10)                                          := 0;                                       -- 长期寄存长期数值
v_spaccesscode          varchar2(40)                                        := ' ';                                     -- 长期寄存 sp 接入码
v_nextrentfee           number(10)                                          := 0;                                       -- 长期寄存待失效包月费
v_rentfeevalidate       char(6)                                             := ' ';                                     -- 长期寄存待失效包月费率失效月
v_tag                   number(3)                                           := 0;                                       -- 长期寄存标记位 , 退订补款产品本月订购过  0: 否 1: 是
v_totaldctemplate       varchar2(500)                                       :=' ';                                      -- 长期寄存解析模板:产品分档费率
v_dealtemplate          varchar2(500)                                       :=' ';                                      -- 长期寄存解析模板:待解析的分档段
v_totaldclength         number(3)                                           := 0;                                       -- 长期寄存解析模板: 分档字符串的长度
v_totaldcsum            number(10)                                          := 0;                                       -- 长期寄存解析模板: 分档总费用
v_index0                number(3)                                           := 0;                                       -- 长期寄存解析模板: 分档字符串中 & 的地位
v_index1                number(3)                                           := 0;                                       -- 长期寄存解析模板: 分档字符串中; 的地位
v_popuexist             number(3)                                           := 2;                                       -- 长期寄存订购时是否存在推广期:0 目前存在收费推广期  1. 目前存在计费推广期  2. 目前不在推广期或无推广期 3. 订购工夫在推广期,失效工夫在推广期之外;v_testuser              number(3)                                           := 0;                                       -- 长期寄存产品属性:是否试用,0- 否,1- 是   仅 400 用户应用
v_freeuseflag           number(3)                                           := 0;                                       --sms,mms,wap,mvs 产品含有该字段,收费体验标识 0:无试用期 1:有,试用到月底,2:依照 freedays 取值,单位为小时,3: 依照 freedays 取值,单位为月,4:依照 freedays 取值,单位为天。其余不含改字段的产品只示意收费天数
v_freenotitype          number(3)                                           := 0;                                       -- 寄存流媒体产品收费期告诉类型
v_rentday               number(3)                                           := i_rentday;                               -- 长期寄存帐期工夫,因为要转换,所以申请长期变量
v_ismutidb              number(3,0)                                         := 0;                                        --- 0 示意为单 DB 模式 1 示意为多 DB 模式
v_dblink                varchar2(40)                                        := ' ';                                      --- 仅在多 DB 模式下,返回对应号码的无效 DBLINK

v_oa                    zxdbm_ismp.susr_basic.usercode%type                 := ' ';                                     -- 长期寄存发起方 / 赠送方用户号码
v_ua                    zxdbm_ismp.susr_basic.usercode%type                 := i_ua;                                     -- 长期寄存应用方 / 受赠方用户号码
v_srcmsisdn             zxdbm_ismp.susr_basic.usercode%type                 := ' ';                                     -- 长期寄存发起方 / 赠送方用户号码
v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                 := ' ';                                     -- 长期寄存应用方 / 受赠方用户号码
v_srcuserindex          zxdbm_ismp.susr_basic.userindex%type                := 0;                                       -- 长期寄存发起方用户序号
v_srcusertype           zxdbm_ismp.susr_basic.usertype%type                 := 1;                                       -- 长期寄存发起方用户类型
v_srcpaytype            zxdbm_ismp.susr_basic.paytype%type                  := 0;                                       -- 长期寄存发起方用户付费类型
v_srcblacklist          zxdbm_ismp.susr_basic.blacklist%type                := 0;                                       -- 长期寄存发起方是否进入黑名单
v_srcwhitelist          zxdbm_ismp.susr_basic.whitelist%type                := 0;                                       -- 长期寄存发起方是否进入白名单
v_srcredlist            zxdbm_ismp.susr_basic.redlist%type                  := 0;                                       -- 长期寄存发起方是否进入红名单
v_srcblacklevel         zxdbm_ismp.susr_basic.blacklevel%type               := 0;                                       -- 长期寄存发起方黑名单级别
v_srcwhitelevel         zxdbm_ismp.susr_basic.whitelevel%type               := 0;                                       -- 长期寄存发起方白名单级别
v_srcmsisdntype         zxdbm_ismp.susr_basic.msisdntype%type               := 1;                                       -- 长期寄存发起方号码类型
v_srcuserstatus         zxdbm_ismp.susr_basic.status%type                   := 0;                                       -- 长期寄存发起方状态
v_srcactivestatus       zxdbm_ismp.susr_basic.activestatus%type             := 0;                                       -- 长期寄存发起方激活状态
v_srcoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                := 0;                                       -- 长期寄存发起方话单专用付费类型
v_srccorpindex          zxdbm_ismp.susr_basic.corpindex%type                := 0;                                       -- 长期寄存发起方团体序号
v_srcusetime            zxdbm_ismp.susr_basic.lastusetime%type              := '00000000000000';                        -- 长期寄存发起方上次应用工夫
v_srcmaxlimitfee        zxdbm_ismp.susr_basic.maxlimitfee%type              := 0;                                       -- 长期寄存发起方最大生产限额
v_srcgraylist           zxdbm_ismp.susr_basic.graylist%type                 := 0;                                       -- 长期寄存发起方是否进入灰名单
v_srcgraylevel          zxdbm_ismp.susr_basic.graylevel%type                := 0;                                       -- 长期寄存发起方灰名单级别
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                := 0;                                       -- 长期寄存应用方用户序号
v_useusertype           zxdbm_ismp.susr_basic.usertype%type                 := 1;                                       -- 长期寄存应用方用户类型
v_usepaytype            zxdbm_ismp.susr_basic.paytype%type                  := 0;                                       -- 长期寄存应用方用户付费类型
v_useblacklist          zxdbm_ismp.susr_basic.blacklist%type                := 0;                                       -- 长期寄存应用方是否进入黑名单
v_usewhitelist          zxdbm_ismp.susr_basic.whitelist%type                := 0;                                       -- 长期寄存应用方是否进入白名单
v_useredlist            zxdbm_ismp.susr_basic.redlist%type                  := 0;                                       -- 长期寄存应用方是否进入红名单
v_useblacklevel         zxdbm_ismp.susr_basic.blacklevel%type               := 0;                                       -- 长期寄存应用方黑名单级别
v_usewhitelevel         zxdbm_ismp.susr_basic.whitelevel%type               := 0;                                       -- 长期寄存应用方白名单级别
v_usemsisdntype         zxdbm_ismp.susr_basic.msisdntype%type               := 1;                                       -- 长期寄存应用方号码类型
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                   := 0;                                       -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type             := 0;                                       -- 长期寄存应用方激活状态
v_useoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                := 0;                                       -- 长期寄存应用方话单专用付费类型
v_usecorpindex          zxdbm_ismp.susr_basic.corpindex%type                := 0;                                       -- 长期寄存应用方团体序号
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type              := '00000000000000';                        -- 长期寄存应用方上次应用工夫
v_usemaxlimitfee        zxdbm_ismp.susr_basic.maxlimitfee%type              := 0;                                       -- 长期寄存应用方最大生产限额
v_usegraylist           zxdbm_ismp.susr_basic.graylist%type                 := 0;                                       -- 长期寄存应用方是否进入灰名单
v_usegraylevel          zxdbm_ismp.susr_basic.graylevel%type                := 0;                                       -- 长期寄存应用方灰名单级别
v_paymsisdn             zxdbm_ismp.susr_basic.usercode%type                 := ' ';                                     -- 长期寄存计费方
v_paymsisdntype         zxdbm_ismp.susr_basic.msisdntype%type               := 1;                                       -- 长期寄存计费方号码类型
v_cardtype              zxdbm_ismp.susr_basic.paytype%type                  := 0;                                       -- 长期寄存用户付费类型 0 - 后付费,1- 预付费,2- 准预付费
v_srcusercityid         zxdbm_ismp.susr_basic.cityid%type                   := ' ';                                       -- 长期寄存计费方号码类型
v_useusercityid         zxdbm_ismp.susr_basic.cityid%type                   := ' ';                                       -- 长期寄存计费方号码类型

v_srctestcpindex        zxdbm_ismp.susr_testgroup_member.cpindex%type       := 0;                                       -- 长期寄存 CP/SP 序号
v_usetestcpindex        zxdbm_ismp.susr_testgroup_member.cpindex%type       := 0;                                       -- 长期寄存 CP/SP 序号
v_srccorpid             zxdbm_ismp.susr_corp.corpid%type                    := ' ';                                     -- 长期寄存团体代码
v_srccorpstatus         zxdbm_ismp.susr_corp.status%type                    := 0;                                       -- 长期寄存团体状态
v_srccorppaymsisdn      zxdbm_ismp.susr_corp.paymsisdn%type                 := ' ';                                     -- 长期寄存团体付费号码
v_corpname              zxdbm_ismp.susr_corp.corpcnshortname%type           := ' ';                                     -- 长期寄存团体中文名简写

v_productindex          zxdbm_200.s200_product.productindex%type            := 0;                                       -- 长期寄存产品序号
v_cancelproductindex    zxdbm_200.s200_product.productindex%type            := 0;                                       -- 长期寄存被 189 替换的产品序号
v_needreplay            zxdbm_200.s200_product.needreplay%type              := 0;                                       -- 长期寄存是否须要二次确认,0- 不须要,1- 须要
v_validmode             zxdbm_200.s200_product.validmode%type               := 0;                                       -- 长期寄存定购失效形式,0- 立刻失效,1- 下一帐期失效,2- n 周期后失效,3- 指定日期失效
v_validcyctype          zxdbm_200.s200_product.validcyctype%type            := 0;                                       -- 长期寄存周期形式 0 - 非周期,1- 天,2- 周,3- 月,定购失效形式为 2 时失效
v_validcycparam         zxdbm_200.s200_product.validcycparam%type           := 0;                                       -- 长期寄存周期参数,定购失效形式为 2 时失效
v_validdate             zxdbm_200.s200_product.validdate%type               := v_sysdate14;                             -- 长期寄存指定失效日期
v_subfeemode            zxdbm_200.s200_product.subfeemode%type              := 1;                                       -- 长期寄存定购当月免费形式
v_cancelsubfeemode      zxdbm_200.s200_product.subfeemode%type              := 1;                                       -- 长期寄存被替换定购当月免费形式
v_subfeedays            zxdbm_200.s200_product.subfeedays%type              := 0;                                       -- 长期寄存免费日期取值范畴为 0~28,0 示意本月全副收费,其余示意 n 号之后收费。v_freedays              zxdbm_200.s200_product.freedays%type                := 0;                                       -- 长期寄存收费试用天数
v_freenotify            zxdbm_200.s200_product.freenotify%type              := 0;                                       -- 长期寄存收费试用期到解决形式,0- 到期主动免费,1- 到期需用户确认,2- 到期主动勾销
v_popustart             zxdbm_200.s200_product.popularizestart%type         := v_sysdate8;                              -- 长期寄存推广期开始工夫
v_popustop              zxdbm_200.s200_product.popularizestop%type          := v_sysdate8;                              -- 长期寄存推广期完结工夫
v_popuitem              zxdbm_200.s200_product.popularizeitem%type          := 0;                                       -- 长期寄存推广期计费计划,0 示意收费,1- 推广期计划
v_cancelpopustart       zxdbm_200.s200_product.popularizestart%type         := v_sysdate8;                              -- 长期寄存被替换产品推广期开始工夫
v_cancelpopustop        zxdbm_200.s200_product.popularizestop%type          := v_sysdate8;                              -- 长期寄存被替换产品推广期完结工夫
v_cancelpopuitem        zxdbm_200.s200_product.popularizeitem%type          := 0;                                       -- 长期寄存被替换产品推广期计费计划,0 示意收费,1- 推广期计划
v_needcharge            zxdbm_200.s200_product.needcharge%type              := 1;                                       -- 长期寄存是否须要计费,0- 收费,1- 须要计费
v_cancelneedcharge      zxdbm_200.s200_product.needcharge%type              := 1;                                       -- 长期寄存是否须要计费,0- 收费,1- 须要计费
v_productname           zxdbm_200.s200_product.productname%type             := ' ';                                     -- 长期寄存产品名称
v_productstatus         zxdbm_200.s200_product.status%type                  := 0;                                       -- 长期寄存产品状态
v_onlyforcorp           zxdbm_200.s200_product.onlyforcorp%type             := 0;                                       -- 长期寄存是否团体专用产品 0:个人用户专用 1:团体专用
v_productstarttime      zxdbm_200.s200_product.starttime%type               := v_sysdate14;                             -- 长期寄存产品失效工夫
v_productendtime        zxdbm_200.s200_product.endtime%type                 := '99991231235959';                        -- 长期寄存产品终止工夫
v_workflow              zxdbm_200.s200_product.workflow%type                := 0;                                       -- 长期寄存工作流状态
v_workflowlife          zxdbm_200.s200_product.workflowlife%type            := 0;                                       -- 长期寄存工作流流程状态
v_cpindex               zxdbm_200.s200_product.cpindex%type                 := 0;                                       -- 长期寄存 CP/SP 序号
v_serviceindex          zxdbm_200.s200_product.serviceindex%type            := 0;                                       -- 长期寄存业务序号
v_smschargingcn         zxdbm_200.s200_product.smschargingcn%type           := ' ';                                     -- 长期寄存产品资费短信形容
v_canbepresent          zxdbm_200.s200_product.canbepresent%type            := 0;                                       -- 长期寄存是否可赠送,0- 不可赠送,1- 可赠送
v_servicetype           zxdbm_200.s200_product.servicetype%type             := 0;                                       -- 长期寄存业务能力类型
v_subcapability         zxdbm_200.s200_product.subcapability%type           := 1;                                       -- 长期寄存业务能力子类型 1 -3G,2-PHS,3-ISAG, 默认为 3g 业务能力(仅电信应用,其余营运商皆默认为 1)v_srvprodid             zxdbm_200.s200_product.productid%type               := i_srvprodid;                             -- 长期寄存业务产品代码
v_productid             zxdbm_200.s200_product.productid%type               := ' ';                                     -- 长期寄存产品代码
v_cancelproductid       zxdbm_200.s200_product.productid%type               := ' ';                                     -- 长期寄存被 189 替换的产品代码
v_onlyforpkg            zxdbm_200.s200_product.onlyforpkg%type              := 0;                                       -- 长期寄存是否套餐专用产品
v_ordertype             zxdbm_200.s200_product.ordertype%type               := 1;                                       -- 长期寄存产品订购类型
v_backfeemode           zxdbm_200.s200_product.backfeemode%type             := 0;                                       -- 长期寄存退定补款形式,0- 不补款,1- 按帐期残余理论天数补款
v_productsource         zxdbm_200.s200_product.productsource%type           := 0;                                       -- 产品起源 0:ISMP 公布的产品 1:同步自全国 SPMS 的产品 2:提供给漫游用户的产品
v_invalidmode           zxdbm_200.s200_product.invalidmode%type             := 0;                                       -- 长期寄存退订失效形式,0 立刻失效,1- 下一帐期失效 2- 退定后可应用足月

v_chargetype            zxdbm_200.s200_product_fee.chargetype%type          := 0;                                       -- 长期寄存计费类型
v_cancelchargetype      zxdbm_200.s200_product_fee.chargetype%type          := 0;                                       -- 长期寄存被替换产品计费类型
v_jbchargetype          zxdbm_200.s200_product_fee.chargetype%type          := 0;                                       -- 长期寄存推广期产品的根本计费费率的计费类型
v_subchargetype         zxdbm_200.s200_product_fee.subchargetype%type       := 0;                                       -- 长期寄存计费子类型
v_cyctype               zxdbm_200.s200_product_fee.cyctype%type             := 0;                                       -- 长期寄存周期类型 0 - 非周期,1- 周期性
v_cycunit               zxdbm_200.s200_product_fee.cycunit%type             := 0;                                       -- 长期寄存周期单位 0- 无,1- 天,2- 周,3- 月,4- 半年,5- 年,6- 小时,7- 分钟,8- 秒
v_cycparam              zxdbm_200.s200_product_fee.cycparam%type            := 0;                                       -- 长期寄存周期参数
v_jbcyctype             zxdbm_200.s200_product_fee.cyctype%type             := 0;                                       -- 长期寄存推广期产品的根本计费费率的周期类型 0 - 非周期,1- 周期性
v_jbcycunit             zxdbm_200.s200_product_fee.cycunit%type             := 0;                                       -- 长期寄存推广期产品的根本计费费率的周期单位 0- 无,1- 天,2- 周,3- 月,4- 半年,5- 年,6- 小时,7- 分钟,8- 秒
v_jbcycparam            zxdbm_200.s200_product_fee.cycparam%type            := 0;                                       -- 长期寄存推广期产品的根本计费费率的周期参数
v_rentfee               zxdbm_200.s200_product_fee.rentfee%type             := 0;                                       -- 长期寄存周期性费用金额
v_fixfee                zxdbm_200.s200_product_fee.fixfee%type              := 0;                                       -- 长期寄存包量费用
v_cancelfixfee          zxdbm_200.s200_product_fee.fixfee%type              := 0;                                       -- 长期寄存被替换产品包量费用
v_fixusetimes           zxdbm_200.s200_product_fee.fixusetimes%type         := 0;                                       -- 长期寄存包量应用值,0- 无限度
v_autocontinue          zxdbm_200.s200_product_fee.autocontinue%type        := 0;                                       -- 长期寄存周期性定购,是否主动续订
v_minlimitfee           zxdbm_200.s200_product_fee.minlimitfee%type         := 0;                                       -- 长期寄存保底费用,0- 无保底费
v_usecomfee             zxdbm_200.s200_product_fee.usecomfee%type           := 1;                                       -- 长期寄存限度(量、工夫)外应用形式,1- 应用根本费率,0- 不容许持续应用
v_totaldiscount         zxdbm_200.s200_product_fee.totaldiscount%type       := ' ';                                     -- 长期寄存限度(量、工夫)外应用形式,1- 应用根本费率,0- 不容许持续应用
v_cancelrentfee         zxdbm_200.s200_product_fee.rentfee%type             := 0;                                       -- 长期寄存业务订购原产品的周期性费用金额
v_cancelminlimitfee     zxdbm_200.s200_product_fee.minlimitfee%type         := 0;                                       -- 长期寄存业务订购原产品的保底费用,0- 无保底费
v_description           zxdbm_200.s200_product_fee.description%type         := 0;                                       -- 产品费率形容
v_serviceid             zxdbm_200.s200_service.serviceid%type               := ' ';                                     -- 长期寄存业务代码
v_servicestatus         zxdbm_200.s200_service.status%type                  := 0;                                       -- 长期寄存业务状态
v_srvcolorlist          zxdbm_200.s200_service.colorlist%type               := 0;                                       -- 长期寄存是否有色彩列表,0- 无,1- 黑名单,2- 白名单
v_servicename           zxdbm_200.s200_service.servicename%type             := ' ';                                     -- 长期寄存业务名称
v_subsrvtype            zxdbm_200.s200_service.subsrvtype%type              := 0;                                       -- 长期寄存业务子类型
v_orderupdateurl        zxdbm_200.s200_service.orderupdateurl%type          := ' ';                                     -- 长期寄存业务表中订购关系更新告诉 URL
v_srcopenstatus         zxdbm_200.s200_service_useropen.status%type         := 1;                                       -- 长期寄存发起方集体能力开明,0- 敞开,1- 开明
v_useopenstatus         zxdbm_200.s200_service_useropen.status%type         := 1;                                       -- 长期寄存应用方集体能力开明,0- 敞开,1- 开明
v_protocoltype          zxdbm_200.s200_sp_service_type.protocoltype%type    := 0;                                       -- 长期寄存定购同步协定类型 0 -ismp(wbs 形式),1-smgp2.0(cngp1.0),2-smgp3.0(cngp1.0 扩大)--added by youqunxia 20130817  Order3.02.01
v_spsrvstatus           zxdbm_200.s200_sp_service_type.status%type          := 1;                                       -- 长期寄存 SP 业务能力状态
v_spsrvstarttime        zxdbm_200.s200_sp_service_type.starttime%type       := '00000000000000';                        -- 长期寄存业务能力签约失效工夫
v_spsrvendtime          zxdbm_200.s200_sp_service_type.endtime%type         := '99991231235959';                        -- 长期寄存业务能力签约生效工夫
v_servicesort           zxdbm_200.s200_service.servicesort%type             := 0;                                       -- 业务归属 0:一般业务、1:属于 OIDD 2:属于定位
v_isexperience          zxdbm_200.s200_user_subscription.isexperience%type  := to_char(i_isexperience);                 -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
v_chargetime            zxdbm_200.s200_user_subscription.chargetime%type;                                               -- 首次扣费时间
v_isexperience1         zxdbm_200.s200_user_subscription.isexperience%type  := '0';                                     -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0

v_freetime              zxdbm_200.s200_user_subscription.freetime%type      := '00000000000000';                        -- 长期寄存订购关系收费截止期
v_substarttime          zxdbm_200.s200_user_subscription.starttime%type     := v_sysdate14;                             -- 长期寄存订购关系失效工夫
v_subendtime            zxdbm_200.s200_user_subscription.endtime%type       := '99991231235959';                        -- 长期寄存订购关系生效工夫
v_substatus             zxdbm_200.s200_user_subscription.status%type        := 0;                                       -- 长期寄存订购关系状态
v_cursubstatus          zxdbm_200.s200_user_subscription.status%type        := 0;                                       -- 长期寄存以后订购关系状态
v_lastrenttime          zxdbm_200.s200_user_subscription.lastrenttime%type  := '00000000000000';                        -- 长期寄存上次扣租工夫
v_cancellastrenttime    zxdbm_200.s200_user_subscription.lastrenttime%type  := '00000000000000';                        -- 长期寄存被 189 替换的产品上次扣租工夫
v_cancelnextrentdate    zxdbm_200.s200_user_subscription.lastrenttime%type  := '99991231';                              -- 长期寄存被 189 替换的产品下次扣租日期
v_payfordate            zxdbm_200.s200_user_subscription.payfordate%type    := '00000000';                              -- 长期寄存月租已付日期
v_cancelpayfordate      zxdbm_200.s200_user_subscription.payfordate%type    := '00000000';                              -- 长期寄存月租已付日期
v_productpkgindex       zxdbm_200.s200_user_subscription.productpkgindex%type   := 0;                                   -- 长期寄存套餐序号
v_cancelfreetime        zxdbm_200.s200_user_subscription.freetime%type      := '00000000000000';                        -- 长期寄存订购关系收费截止期
--added by youqunxia20130907 order3.02.01
v_lastvarifee           zxdbm_200.s200_user_subscription.varifee%type       := '';                                      -- 长期寄存以后订购关系中的前一次可变价格                                                                                                             
v_nextrentdate          zxdbm_200.s200_user_subscription.nextrentdate%type  := '99991231';                              -- 长期寄存下次扣租日期
v_cancelisexperience    zxdbm_200.s200_user_subscription.isexperience%type  := '0';                                     -- 长期寄存被替换的产品订购类型  

v_cpid                  zxdbm_ismp.scp_basic.cpid%type                      := ' ';                                     -- 长期寄存 CP/SP 代码
v_cpstatus              zxdbm_ismp.scp_basic.status%type                    := 0;                                       -- 长期寄存 CP/SP 代码
v_cpsubscribeurl        zxdbm_ismp.scp_basic.cpsubscribeurl%type            := ' ';                                     -- 长期寄存 CP/SP 订购 URL
v_hasblacklist          zxdbm_ismp.scp_basic.hasblacklist%type              := 0;                                       -- 长期寄存是否有黑名单管制 0-无,1-有
v_cptype                zxdbm_ismp.scp_basic.cptype%type                    := 2;                                       -- 长期寄存 CP/SP 类型
v_cpsrvtype             zxdbm_ismp.scp_basic.cpsrvtype%type                 := 0;                                       -- 长期寄存 CP 服务类型
v_insubblacklist        zxdbm_ismp.scp_basic.insubblacklist%type            := 0;                                      -- 长期寄存限度订购 SP 黑名单标识
v_cpcnshortname         zxdbm_ismp.scp_basic.cpcnshortname%type             := ' ';                                     -- 长期寄存 CP/SP 中文名简写
v_customersrvtel        zxdbm_ismp.scp_basic.customersrvtel%type            := ' ';                                     -- 长期寄存 CP/SP 客服电话

v_perssrvopen           zxdbm_ismp.ssys_service_type.perssrvopen%type       := 1;                                       -- 长期寄存集体能力缺省开明,0- 敞开,1- 开明
v_srvtypeid             zxdbm_ismp.ssys_service_type.srvtypeid%type         := ' ';                                     -- 长期寄存话单中的 srvtypeid

v_productsubmode        zxdbm_ismp.ssrv_corp_product.subscribemode%type     := 0;                                       -- 长期寄存定购形式,0- 必须团体管理员定购,1- 团体管理员与团体成员均可定购
v_productpayparty       zxdbm_ismp.ssrv_corp_product.payparty%type          := 2;                                       -- 长期寄存团体专用产品付费方 1- 团体付费 2- 集体付费
v_corpproductstatus     zxdbm_ismp.ssrv_corp_product.status%type            := 0;                                       -- 长期寄存团体与产品关联状态 0- 失常;1- 删除
v_phoneindex            zxdbm_ismp.ssys_phone.phoneindex%type               := 0;                                       -- 长期寄存号段序号
v_phoneindexa           zxdbm_ismp.ssys_phone.phoneindex%type               := 0;                                       -- 长期寄存 A 省号段序号, 跨省赠送
v_phoneindexb           zxdbm_ismp.ssys_phone.phoneindex%type               := 0;                                       -- 长期寄存 B 省号段序号, 跨省赠送
v_attach                zxdbm_ismp.ssys_phone.attach%type                   := 0;                                       -- 长期寄存预付费归属,0- 未知,1-OCS,2-RTBP
v_expiredate            zxdbm_ismp.ssrv_user_totalamount.expiredate%type    := to_number(substr(v_curmonthendtime,1,8));-- 长期寄存过期日期

v_srctypesrvopen        zxdbm_ismp.ssrv_user_perssrvopen.perssrvopen%type   := 1;                                       -- 长期寄存发起方集体能力开明,0- 敞开,1- 开明
v_usetypesrvopen        zxdbm_ismp.ssrv_user_perssrvopen.perssrvopen%type   := 1;                                       -- 长期寄存应用方集体能力开明,0- 敞开,1- 开明

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos              := 0;
o_debuginfo             := ' ';
o_srcmsisdn             := ' ';
o_usemsisdn             := ' ';
o_paymsisdn             := ' ';
o_srcmsisdntype         := 1;
o_usemsisdntype         := 1;
o_userindex             := 0;
o_payuserindex          := 0;
o_needreplay            := 0;
o_paytype               := 0;
o_oppaytype             := 0;
o_scptype               := 2;
o_subfee                := 0;
o_colortype             := 0;
o_usertype              := 0;
o_producttype           := 1;
o_cpid                  := ' ';
o_cpindex               := 0;
o_cpcnshortname         := ' ';
o_cpsubscribeurl        := ' ';
o_cptype                := 0;
o_protocoltype          := 0;
o_msgtosp               := ' ';
o_cnfmmsgtosp           := ' ';
o_customersrvtel        := ' ';
o_serviceid             := ' ';
o_serviceindex          := 0;
o_servicename           := ' ';
o_productid             := ' ';
o_productindex          := 0;
o_productname           := ' ';
o_smschargingcn         := ' ';
o_autocontinue          := 0;
o_servicetype           := 0;
o_subcapability         := 0;
o_srvtypeid             := ' ';
o_corpid                := ' ';
o_corpindex             := 0;
o_corpcnshortname       := ' ';
o_paymode               := '集体付费';
o_freetime              := v_sysdate14;
o_nextrentdate          := '99991231';
o_substarttime          := v_sysdate14;
o_subendtime            := '99991231235959';
o_substatus             := 0;
o_lastrenttime          := '00000000000000';
o_payfordate            := '00000000';
o_fixusetimes           := 0;
o_chargetype            := 0;
o_cyctype               := 0;
o_linknum               := ' ';
o_maxlimitfee           := '0';
o_pseudocode            := '';
o_pcodemsisdnswitch     := 0;
o_chanelplayerstate     := 0;
o_eventstate            := 1;
o_ordertype             := 1;
o_spaccesscode          := i_spaccesscode;
o_maincapability        := 0;
o_submaincapability     := 0;
o_cpsrvtype             := 0;
o_cancelproductid       := ' ';
o_issecondproduct       := 0;
o_cancelfeaturecode     := ' ';
o_cancelaccesscode      := ' ';
o_provincesend          := 0;
o_cdrbegintime          := v_sysdate14;
o_cdrendtime            := v_curmonthendtime;
o_cnfmtype              := 0;
o_validmode             := 0;
o_mutiluserexit         := 1;
o_popustop              := v_popustop;
o_popuexist             := v_popuexist;
o_freenoticenow         := 0;
o_freedays              := 0;
o_productpkgname        := ' ';
o_freenotitype          := 0;
o_needcharge            := 0;
o_cityid                := '';

--added by youqunxia 2013.02.18
o_freenotify            := 1;
--added by youqunxia 20130818  Order3.02.01
o_hassubscription       := 0;
o_rentfee               := 0;
o_haswebgw              := 1;
o_lastvarifee           := '';
o_issynctooidd          := 0;
o_isexperience          := '0';
o_chargetime            := '';

/
–part– – 订购 – 预处理
*/

-- 批量操作不进行鉴权, 由业务从用户表中查询处理
--modied by youqunxia20130530 order2.07.10
if i_oatype not in (1,2,3,4) then
    o_retcode   := 107;
    o_debugpos := 1;
    o_debuginfo := 'i_oatype is not valid.';
    return;
end if;

if v_rentday = 0 then
    v_rentday := to_number(substr(v_sysdate8,7,2));
    if v_rentday >= 27 then
        v_rentday := v_rentday - 18;
    end if;
end if;

-- 发起方、应用方用户号码去前缀
v_oa := ltrim(rtrim(nvl(i_oa,'0')));
v_ua := ltrim(rtrim(nvl(i_ua,'0')));
if v_oa like ('+' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 2);
elsif v_oa like ('00' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 3);
elsif v_oa like (v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 1);
end if;
if (substr(v_oa,1,1) <> '0') and (i_oatype = 4) then
    v_oa := '0' || v_oa;
end if;
if v_ua like ('+' || v_countrycode || '%') then
    v_ua := substr(v_ua, length(v_countrycode) + 2);
elsif v_ua like ('00' || v_countrycode || '%') then
    v_ua := substr(v_ua, length(v_countrycode) + 3);
elsif v_ua like (v_countrycode || '%') then
    v_ua := substr(v_ua, length(v_countrycode) + 1);
end if;
v_srcmsisdn := v_oa;
if (i_isthird = 1) then
    v_usemsisdn  := v_ua;
else
    v_usemsisdn  := v_oa;
end if;
o_srcmsisdn  := v_srcmsisdn;
o_usemsisdn  := v_usemsisdn;
o_paymsisdn  := v_srcmsisdn;
if (v_srcmsisdn = '0') or (v_usemsisdn = '0') then
    o_retcode   := 1001;
    o_debugpos := 2;
    o_debuginfo := 'v_srcmsisdn or v_usemsisdn is not valid.';
    return;
end if;

/
–part– – 订购 – 是否跨省赠送的鉴权(依据号段鉴权是否本省用户)

-- 赠送他省不对 DA 鉴权, 来自他省赠送不对 OA 鉴权

/

if i_provinceorder = 1 then
    if i_actiontype in (1,17) and (i_isfromnmsc = 1) then
        begin
            select phoneindex
            into   v_phoneindexa
            from   zxdbm_ismp.ssys_phone
            where  startprefix <= substr(v_srcmsisdn,1,length(startprefix))
            and    endprefix >= substr(v_srcmsisdn,1,length(endprefix));
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 3;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        begin
            select phoneindex
            into   v_phoneindexb
            from   zxdbm_ismp.ssys_phone
            where  startprefix <= substr(v_usemsisdn,1,length(startprefix))
            and    endprefix >= substr(v_usemsisdn,1,length(endprefix));
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 4;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if v_phoneindexa <> 0 and v_phoneindexb = 0 then
            o_provincesend := 1;
            v_usemsisdn := v_srcmsisdn;
        elsif v_phoneindexa = 0 and v_phoneindexb <> 0 then
            o_provincesend := 2;
            v_srcmsisdn := v_usemsisdn;
        end if;
    end if;
end if;

/
–part– – 订购 – 发起方和应用方鉴权
/

if (i_needauthuser = 1) then
    if (i_isthird = 1) and (v_srcmsisdn <> v_usemsisdn) then
        --OA 鉴权
        begin
            select userindex,usertype,paytype,blacklist,whitelist,
                   redlist,blacklevel,whitelevel,msisdntype,status,
                   activestatus,oppaytype,corpindex,lastusetime,maxlimitfee,
                   graylist,graylevel,cityid
            into   v_srcuserindex,v_srcusertype,v_srcpaytype,v_srcblacklist,v_srcwhitelist,
                   v_srcredlist,v_srcblacklevel,v_srcwhitelevel,v_srcmsisdntype,v_srcuserstatus,
                   v_srcactivestatus,v_srcoppaytype,v_srccorpindex,v_srcusetime,v_srcmaxlimitfee,
                   v_srcgraylist,v_srcgraylevel,v_srcusercityid
            from   zxdbm_ismp.susr_basic
            where  usercode = v_srcmsisdn;
        exception when no_data_found then
            o_retcode   := 1001;    -- 用户不存在
            o_debugpos := 5;
            o_debuginfo := 'v_srcmsisdn do not exist;';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := 1;
            return;
        when others then
            o_retcode   := 506; -- 数据库谬误
            o_debugpos := 6;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := 1;
            return;
        end;
        o_srcmsisdntype := v_srcmsisdntype;

— o_usemsisdntype := v_usemsisdntype;
— o_userindex := v_useuserindex;

        o_payuserindex  := v_srcuserindex;
        o_paytype       := v_srcpaytype;
        o_oppaytype     := v_srcoppaytype;
        o_cityid        := trim(v_srcusercityid);

— o_usertype := v_useusertype;

        if (i_cmdchannel in (7,32)) then
            if v_srcmsisdntype not in (1,2,3) then
                o_retcode   := 100;
                o_debugpos := 7;
                o_debuginfo := 'v_srcmsisdntype is not valid in database.';
                return;
            end if;
        end if;
        --OA 更新用户表字段
        if (v_srcactivestatus = 0) then
        -- 待激活用户激活操作
            begin
                update  zxdbm_ismp.susr_basic
                set     activestatus = 1,
                        activetime = v_sysdate14
                where   userindex = v_srcuserindex;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 8;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end if;
                commit;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 9;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        else
        -- 已激活用户更新最近一次应用工夫
            if (i_silent = 1) then
                if (substr(v_srcusetime,1,8) <> v_sysdate8) then
                    begin
                        update  zxdbm_ismp.susr_basic
                        set     lastusetime = v_sysdate14
                        where   userindex = v_srcuserindex;
                        if (sql%rowcount = 0) then
                            o_retcode   := 506;
                            o_debugpos := 10;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            rollback;
                            return;
                        end if;
                        commit;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 11;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                end if;
            end if;
        end if;
        --OA 用户装他鉴权
        if v_srcuserstatus in (1,3) then
            o_retcode   := 1002;
            o_debugpos := 12;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', The subscriber status is 1 or 3.';
            return;
        elsif v_srcuserstatus = 4 then
            o_retcode   := 1008;
            o_debugpos := 13;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', The subscriber status is 4.';
            return;
        end if;

        --DA 鉴权
        --******************************************************
        begin
            select userindex,usertype,paytype,blacklist,whitelist,
                   redlist,blacklevel,whitelevel,msisdntype,status,
                   activestatus,oppaytype,corpindex,lastusetime,maxlimitfee,
                   graylist,graylevel,cityid
            into   v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,
                   v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,
                   v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_usemaxlimitfee,
                   v_usegraylist,v_usegraylevel,v_useusercityid
            from   zxdbm_ismp.susr_basic
            where  usercode = v_usemsisdn;
        exception when no_data_found then
            if i_mutidbmode = 1 then
                o_mutiluserexit := 0;
                zxdbm_ismp.sp_getdblink(v_usemsisdn,v_usemsisdntype,v_ismutidb,v_dblink);
                v_sql := 'select userindex,usertype,paytype,blacklist,whitelist,'||
                         'redlist,blacklevel,whitelevel,msisdntype,status,'||
                         'activestatus,oppaytype,corpindex,lastusetime,maxlimitfee,'||
                         'graylist,graylevel,cityid'||
                         'from zxdbm_ismp.susr_basic'||'@'||v_dblink||
                         'where usercode = :p1';
                begin
                    execute immediate v_sql
                    into  v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,
                          v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,
                          v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_usemaxlimitfee,
                          v_usegraylist,v_usegraylevel,v_useusercityid
                    using v_usemsisdn;
                exception when no_data_found then
                    o_retcode   := 1001;    -- 用户不存在
                    o_debugpos := 16;
                    o_debuginfo := 'v_usemsisdn do not exist;';
                    return;
                when others then
                    o_retcode   := 506; -- 数据库谬误
                    o_debugpos := 17;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            else
                o_retcode   := 1001;    -- 用户不存在
                o_debugpos := 18;
                o_debuginfo := 'v_usemsisdn do not exist;';
                return;
            end if;
        when others then
            o_retcode   := 506; -- 数据库谬误
            o_debugpos := 19;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        o_usemsisdntype := v_usemsisdntype;
        o_userindex     := v_useuserindex;
        o_usertype      := v_useusertype;
        if (i_cmdchannel in (7,32)) then
            if (v_srcmsisdntype not in (1,2,3)) or (v_usemsisdntype not in (1,2,3)) then
                o_retcode   := 100;
                o_debugpos := 20;
                o_debuginfo := 'v_srcmsisdntype or v_usemsisdntype is not valid in database.';
                return;
            end if;
        end if;
        if o_mutiluserexit = 1 then
            -- 更新用户激活工夫
            if (v_useactivestatus = 0) then
            -- 待激活用户激活操作
                begin
                    update  zxdbm_ismp.susr_basic
                    set     activestatus = 1,
                            activetime = v_sysdate14
                    where   userindex = v_useuserindex;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 21;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        rollback;
                        return;
                    end if;
                    commit;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 22;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            else
            -- 已激活用户更新最近一次应用工夫
                if (i_silent = 1) then
                    if (substr(v_useusetime,1,8) <> v_sysdate8) then
                        begin
                            update  zxdbm_ismp.susr_basic
                            set     lastusetime = v_sysdate14
                            where   userindex = v_useuserindex;
                            if (sql%rowcount = 0) then
                                o_retcode   := 506;
                                o_debugpos := 23;
                                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                                rollback;
                                return;
                            end if;
                            commit;
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 24;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                    end if;
                end if;
            end if;
            -- 应用方状态鉴权
            if v_useuserstatus in (1,3) then
                o_retcode   := 1002;
                o_debugpos := 25;
                o_debuginfo := 'v_useuserstatus='||v_useuserstatus||', The user status is 1 or 3.';
                return;
            elsif v_useuserstatus = 4 then
                o_retcode   := 1008;
                o_debugpos := 26;
                o_debuginfo := 'v_useuserstatus='||v_useuserstatus||', The user status is 4.';
                return;
            end if;
        end if;
    else
        begin
            select userindex,usertype,paytype,blacklist,whitelist,
                   redlist,blacklevel,whitelevel,msisdntype,status,
                   activestatus,oppaytype,corpindex,lastusetime,maxlimitfee,
                   graylist,graylevel,cityid
            into   v_srcuserindex,v_srcusertype,v_srcpaytype,v_srcblacklist,v_srcwhitelist,
                   v_srcredlist,v_srcblacklevel,v_srcwhitelevel,v_srcmsisdntype,v_srcuserstatus,
                   v_srcactivestatus,v_srcoppaytype,v_srccorpindex,v_srcusetime,v_srcmaxlimitfee,
                   v_srcgraylist,v_srcgraylevel,v_srcusercityid
            from   zxdbm_ismp.susr_basic
            where  usercode = v_srcmsisdn;
        exception when no_data_found then
            o_retcode   := 1001;    -- 用户不存在
            o_debugpos := 27;
            o_debuginfo := 'v_srcmsisdn='||v_srcmsisdn||', user do not exist.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := o_srcmsisdntype;
            return;
        when others then
            o_retcode   := 506; -- 数据库谬误
            o_debugpos := 28;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := o_srcmsisdntype;
            return;
        end;
        v_useuserindex    := v_srcuserindex;
        v_useusertype     := v_srcusertype;
        v_usepaytype      := v_srcpaytype;
        v_useblacklist    := v_srcblacklist;
        v_usewhitelist    := v_srcwhitelist;
        v_useredlist      := v_srcredlist;
        v_useblacklevel   := v_srcblacklevel;
        v_usewhitelevel   := v_srcwhitelevel;
        v_usemsisdntype   := v_srcmsisdntype;
        v_useuserstatus   := v_srcuserstatus;
        v_useactivestatus := v_srcactivestatus;
        v_useoppaytype    := v_srcoppaytype;
        v_usecorpindex    := v_srccorpindex;
        v_useusetime      := v_srcusetime;
        v_usemaxlimitfee  := v_srcmaxlimitfee;
        v_usegraylist     := v_srcgraylist;
        v_usegraylevel    := v_srcgraylevel;

        o_srcmsisdntype := v_srcmsisdntype;
        o_usemsisdntype := v_usemsisdntype;
        o_userindex     := v_useuserindex;
        o_payuserindex  := v_srcuserindex;
        o_paytype       := v_srcpaytype;
        o_oppaytype     := v_srcoppaytype;
        o_usertype      := v_useusertype;
        o_cityid        := trim(v_srcusercityid);
        if (i_cmdchannel in (7,32)) then
            if v_srcmsisdntype not in (1,2,3) then
                o_retcode   := 107;
                o_debugpos := 29;
                o_debuginfo := 'v_srcmsisdntype is not valid.';
                return;
            end if;
        end if;
        if (v_srcactivestatus = 0) then
        -- 待激活用户激活操作
            begin
                update  zxdbm_ismp.susr_basic
                set     activestatus = 1,
                        activetime = v_sysdate14
                where   userindex = v_srcuserindex;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 30;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end if;
                commit;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 31;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        else
        -- 已激活用户更新最近一次应用工夫
            if (i_silent = 1) then
                if (substr(v_srcusetime,1,8) <> v_sysdate8) then
                    begin
                        update  zxdbm_ismp.susr_basic
                        set     lastusetime = v_sysdate14
                        where   userindex = v_srcuserindex;
                        if (sql%rowcount = 0) then
                            o_retcode   := 506;
                            o_debugpos := 32;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            rollback;
                            return;
                        end if;
                        commit;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 33;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                end if;
            end if;
        end if;
        -- 发起方状态鉴权
        if v_srcuserstatus in (1,3) then
            o_retcode   := 1002;
            o_debugpos := 34;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', subscriber status is 1 or 3.';
            return;
        elsif v_srcuserstatus = 4 then
            o_retcode   := 1008;
            o_debugpos := 35;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', subscriber status is 4.';
            return;
        end if;
    end if;
end if;

/
–part– – 订购 – 产品, 产品费率鉴权
/

-- 产品存在性鉴权
if (i_direct = 1) and (i_supportproductid = 0) then
-- 反向订购,并且反对业务代码
    if i_servicetype = 6 then  --400 用户的表构造不同, 具备 testuser、freeuseflag 字段
        v_sql := 'select productindex,needreplay,validmode,validcyctype,invalidmode,'||
                 'validcycparam,validdate,subfeemode,subfeedays,freedays,freeuseflag,freenotify,'||
                 'popularizestart,popularizestop,popularizeitem,needcharge,'||
                 'productname,status,onlyforcorp,starttime,endtime,'||
                 'workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,'||
                 'servicetype,subcapability,onlyforpkg,productid,ordertype,backfeemode,testuser,productsource'||
                 'from zxdbm_200.s200_product where serviceid = :p1';
        begin
            execute immediate v_sql
            into   v_productindex,v_needreplay,v_validmode,v_validcyctype,v_invalidmode,
                   v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,v_freeuseflag,v_freenotify,
                   v_popustart,v_popustop,v_popuitem,v_needcharge,
                   v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
                   v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
                   v_servicetype,v_subcapability,v_onlyforpkg,v_productid,v_ordertype,v_backfeemode,v_testuser,v_productsource
            using v_srvprodid;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 36;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 37;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    --modied by youqunxia20130530 order2.07.10
    elsif i_servicetype in (1,2,3,5,33,98) then  --200、300、500、600、1900、9800 用户的表构造具备 freeuseflag 字段
        v_sql := 'select productindex,needreplay,validmode,validcyctype,invalidmode,'||
                 'validcycparam,validdate,subfeemode,subfeedays,freedays,freeuseflag,freenotify,'||
                 'popularizestart,popularizestop,popularizeitem,needcharge,'||
                 'productname,status,onlyforcorp,starttime,endtime,'||
                 'workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,'||
                 'servicetype,subcapability,onlyforpkg,productid,ordertype,backfeemode,testuser,productsource'||
                 'from zxdbm_200.s200_product where serviceid = :p1';
        begin
            execute immediate v_sql
            into   v_productindex,v_needreplay,v_validmode,v_validcyctype,v_invalidmode,
                   v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,v_freeuseflag,v_freenotify,
                   v_popustart,v_popustop,v_popuitem,v_needcharge,
                   v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
                   v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
                   v_servicetype,v_subcapability,v_onlyforpkg,v_productid,v_ordertype,v_backfeemode,v_testuser,v_productsource
            using v_srvprodid;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 38;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 39;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;

    else
        v_sql := 'select productindex,needreplay,validmode,validcyctype,invalidmode,'||
                 'validcycparam,validdate,subfeemode,subfeedays,freedays,freenotify,'||
                 'popularizestart,popularizestop,popularizeitem,needcharge,'||
                 'productname,status,onlyforcorp,starttime,endtime,'||
                 'workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,'||
                 'servicetype,subcapability,onlyforpkg,productid,ordertype,backfeemode,productsource'||
                 'from zxdbm_200.s200_product where serviceid = :p1';
        begin
            execute immediate v_sql
            into   v_productindex,v_needreplay,v_validmode,v_validcyctype,v_invalidmode,
                   v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,v_freenotify,
                   v_popustart,v_popustop,v_popuitem,v_needcharge,
                   v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
                   v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
                   v_servicetype,v_subcapability,v_onlyforpkg,v_productid,v_ordertype,v_backfeemode,v_productsource
            using v_srvprodid;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 40;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 41;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
else
    if i_servicetype = 6 then  --400 用户的表构造不同, 具备 testuser、freeuseflag 字段
        v_sql := 'select productindex,needreplay,validmode,validcyctype,invalidmode,'||
                 'validcycparam,validdate,subfeemode,subfeedays,freedays,freeuseflag,freenotify,'||
                 'popularizestart,popularizestop,popularizeitem,needcharge,'||
                 'productname,status,onlyforcorp,starttime,endtime,'||
                 'workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,'||
                 'servicetype,subcapability,productid,ordertype,backfeemode,onlyforpkg,testuser,productsource'||
                 'from zxdbm_200.s200_product where productid = :p1';
        begin
            execute immediate v_sql
            into   v_productindex,v_needreplay,v_validmode,v_validcyctype,v_invalidmode,
                   v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,v_freeuseflag,v_freenotify,
                   v_popustart,v_popustop,v_popuitem,v_needcharge,
                   v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
                   v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
                   v_servicetype,v_subcapability,v_productid,v_ordertype,v_backfeemode,v_onlyforpkg,v_testuser,v_productsource
            using v_srvprodid;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 42;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 43;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    --modied by youqunxia20130530   order2.07.10
    elsif i_servicetype in (1,2,3,5,33,98) then  --200、300、500、600、1900、9800 用户的表构造具备 freeuseflag 字段
        v_sql := 'select productindex,needreplay,validmode,validcyctype,invalidmode,'||
                 'validcycparam,validdate,subfeemode,subfeedays,freedays,freeuseflag,freenotify,'||
                 'popularizestart,popularizestop,popularizeitem,needcharge,'||
                 'productname,status,onlyforcorp,starttime,endtime,'||
                 'workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,'||
                 'servicetype,subcapability,productid,ordertype,backfeemode,onlyforpkg,testuser,productsource'||
                 'from zxdbm_200.s200_product where productid = :p1';
        begin
            execute immediate v_sql
            into   v_productindex,v_needreplay,v_validmode,v_validcyctype,v_invalidmode,
                   v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,v_freeuseflag,v_freenotify,
                   v_popustart,v_popustop,v_popuitem,v_needcharge,
                   v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
                   v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
                   v_servicetype,v_subcapability,v_productid,v_ordertype,v_backfeemode,v_onlyforpkg,v_testuser,v_productsource
            using v_srvprodid;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 44;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 45;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    else
        v_sql := 'select productindex,needreplay,validmode,validcyctype,invalidmode,'||
                 'validcycparam,validdate,subfeemode,subfeedays,freedays,freenotify,'||
                 'popularizestart,popularizestop,popularizeitem,needcharge,'||
                 'productname,status,onlyforcorp,starttime,endtime,'||
                 'workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,'||
                 'servicetype,subcapability,productid,ordertype,backfeemode,onlyforpkg,productsource'||
                 'from zxdbm_200.s200_product where productid = :p1';
        begin
            execute immediate v_sql
            into   v_productindex,v_needreplay,v_validmode,v_validcyctype,v_invalidmode,
                   v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,v_freenotify,
                   v_popustart,v_popustop,v_popuitem,v_needcharge,
                   v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
                   v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
                   v_servicetype,v_subcapability,v_productid,v_ordertype,v_backfeemode,v_onlyforpkg,v_productsource
            using v_srvprodid;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 46;
            o_debuginfo := 'The product does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 47;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
end if;
o_productid      := v_productid;
o_productname    := v_productname;
o_productindex   := v_productindex;
o_serviceindex   := v_serviceindex;
o_cpindex        := v_cpindex;
o_smschargingcn  := v_smschargingcn;
o_servicetype    := v_servicetype;
o_subcapability  := v_subcapability;
o_ordertype      := v_ordertype;
o_popustop       := v_popustop;
o_freedays       := v_freedays;

–added by youqunxia20130531 设置收费期短信提醒语 order2.07.10

if i_servicetype in (1,2,3,5,6,33,98) and v_freeuseflag <> 0 then
    if v_freeuseflag = 1 then
         v_freenotitype := 1;
         --sms,mms,wap,mvs,dls,pim,brew 业务订购, 将收费期到月底转换为收费时长(小时),以不便后续的判断
         v_freedays := floor((to_date(v_curmonthendtime,'yyyymmddhh24miss')-to_date(v_sysdate14,'yyyymmddhh24miss'))*24);
    elsif v_freeuseflag = 2 then
         v_freenotitype := 2;
    elsif v_freeuseflag = 3 then
         v_freenotitype := 3;
    elsif v_freeuseflag = 4 then
         v_freenotitype := 0;
    end if;
end if;
o_freenotitype := v_freenotitype;

-- 订购非订购类产品鉴权
if v_ordertype <> 1 then
    if i_cmdchannel in (9,35,39,40) then
         o_retcode   := 1001227;
         o_debugpos := 48;
         o_debuginfo := 'v_ordertype='||v_ordertype||', the product can not be subscriberd.';
         return;
    else
         o_retcode   := 2100;
         o_debugpos := 49;
         o_debuginfo := 'v_ordertype='||v_ordertype||', the product can not be subscriberd.';
         return;
    end if;
end if;

-- 产品状态鉴权
if (((v_productsource <> 3) and (v_productstatus in (0,2)) and (v_workflowlife = 3)) or ((v_productsource = 3) and (v_productstatus = 0))) then
    o_producttype := 2;
elsif (v_productstatus <> 1) then
    o_retcode   := 2101;
    o_debugpos := 50;
    o_debuginfo := 'productid='||v_srvprodid||', The Product status is abnormal.';
    return;
end if;

-- 产品失效终止工夫判断
if (v_sysdate14 < v_productstarttime) or (v_sysdate14 > v_productendtime) then
    o_retcode   := 1011405;
    o_debugpos := 51;
    o_debuginfo := 'product is not valid any more.';
    return;
end if;

-- 获取产品的计费信息
if (v_popuitem = 2) then  -- 无推广期
    v_tempitem := 0;
elsif v_popuitem in (0,1) then  -- 推广期收费或者推广期计费
    if (v_sysdate8 >= v_popustart) and (v_sysdate8 <= v_popustop) then
        if v_popuitem = 0 then  -- 推广期收费
            v_needcharge := 0;
            v_popuexist := 0;
        else
            v_needcharge := 1;
            v_popuexist  := 1;
            v_tempitem   := v_popuitem;
        end if;
    else
        v_tempitem := 0;
    end if;
end if;
o_needcharge := v_needcharge;

if (v_needcharge = 1) then
    -- 欠费用户只能订购收费产品

— if (o_mutiluserexit = 1) and (v_srcuserstatus = 2) then

    if v_srcuserstatus = 2 then
        o_retcode   := 1003;
        o_debugpos := 52;
        o_debuginfo := 'The user status is 2, do not allow to subscribe the product.';
        return;
    end if;
    -- 费率存在性鉴权
    if i_servicetype in (1,2) then
        v_sql := 'select chargetype,subchargetype,cyctype,cycunit,cycparam,rentfee,fixfee,fixusetimes,autocontinue,minlimitfee,usecomfee,nextrentfee,rentfeevalidate,totaldiscount,description'||
            'from   zxdbm_200.s200_product_fee where  productindex = :p1 and itemindex = :p2';
        begin
            execute immediate v_sql into v_chargetype,v_subchargetype,v_cyctype,v_cycunit,v_cycparam,v_rentfee,v_fixfee,v_fixusetimes,v_autocontinue,v_minlimitfee,v_usecomfee,v_nextrentfee,v_rentfeevalidate,v_totaldiscount,v_description using v_productindex, v_tempitem;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 53;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 54;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    else
        begin
            select chargetype,subchargetype,cyctype,cycunit,cycparam,rentfee,fixfee,fixusetimes,
                   autocontinue,minlimitfee,usecomfee,totaldiscount,description
            into   v_chargetype,v_subchargetype,v_cyctype,v_cycunit,v_cycparam,v_rentfee,v_fixfee,v_fixusetimes,
                   v_autocontinue,v_minlimitfee,v_usecomfee,v_totaldiscount,v_description
            from   zxdbm_200.s200_product_fee
            where  productindex = v_productindex and itemindex = v_tempitem;
        exception when no_data_found then
            o_retcode   := 3103;
            o_debugpos := 55;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 56;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    o_chargetype   := v_chargetype;
    o_cyctype      := v_cyctype;
    o_fixusetimes  := v_fixusetimes;
    o_autocontinue := v_autocontinue;
    o_rentfee      := v_rentfee;
end if;

-- 推广期收费或者推广期计费,须要查问根本计费的费率信息
if v_popuexist in (0,1) then
    o_smschargingcn := v_description;
    begin
        select chargetype,cyctype,cycunit,cycparam
        into   v_jbchargetype,v_jbcyctype,v_jbcycunit,v_jbcycparam
        from   zxdbm_200.s200_product_fee
        where  productindex = v_productindex and itemindex = 0;
    exception when no_data_found then
        o_retcode   := 3103;
        o_debugpos := 57;
        o_debuginfo := 'The product fee does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 58;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
-- 0 资费判断,needcharge
if v_needcharge = 0 then
    o_cnfmtype := 1;
else
   if (v_rentfee = 0 and v_fixfee = 0 and v_minlimitfee = 0) then
       v_totaldctemplate := v_totaldiscount;
       loop
           v_index0 := instr(v_totaldctemplate,'&',1,1);
           v_dealtemplate := v_totaldctemplate;
           if v_index0 <> 0 then
               v_totaldclength := length(v_totaldctemplate);
               v_dealtemplate := substr(v_totaldctemplate, 1, v_index0-1);
               v_totaldctemplate := substr(v_totaldctemplate, 1+v_index0, v_totaldclength-v_index0);
           end if;
           v_totaldclength := length(v_dealtemplate);
           v_index1 := instr(v_dealtemplate,';',1,1);
           v_dealtemplate := substr(v_dealtemplate, 1+v_index1, v_totaldclength-v_index1);
           v_totaldclength := length(v_dealtemplate);
           v_index1 := instr(v_dealtemplate,';',1,1);
           v_dealtemplate := substr(v_dealtemplate, 1, v_index1-1);
           v_totaldcsum := to_number(v_dealtemplate);
           exit when (v_totaldcsum > 0 or v_index0 = 0);
       end loop;
       if v_totaldcsum = 0 then
           o_cnfmtype := 1;
       end if;
   end if;
end if;

-- 产品订购 / 赠送个性化鉴权
if (v_onlyforpkg = 1) then
    o_retcode   := 2201;
    o_debugpos := 59;
    o_debuginfo := 'The product can only be used by pkg.';
    return;
end if;
-- 只有非帐期包量 / 包月 / 包周期产品和收费产品才能够赠送
if (i_isthird = 1) then
    if (v_canbepresent = 0) then
         o_retcode   := 1001212;
         o_debugpos := 60;
         o_debuginfo := 'The product can not be presented.';
    else
        if (v_needcharge = 1) then
            if (v_chargetype not in (2,3,4,7,8)) or (v_cyctype <> 0) then
                o_retcode   := 1001217;
                o_debugpos := 61;
                o_debuginfo := 'v_chargetype='||v_chargetype||'v_cyctype='||v_cyctype||', The product can not be presented.';
            end if;
        end if;
    end if;
end if;
-- 赠送失败的短信模板须要上面两个参数
if o_retcode in (1001212,1001217)then
    begin
        select cpcnshortname,customersrvtel into v_cpcnshortname,v_customersrvtel
        from   zxdbm_ismp.scp_basic where cpindex = v_cpindex;
    exception when no_data_found then
        o_retcode   := 2000;
        o_debugpos := 62;
        o_debuginfo := 'v_cpindex='||v_cpindex||', the sp does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 63;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    o_cpcnshortname := v_cpcnshortname;
    o_customersrvtel := v_customersrvtel;
    return;
end if;
-- 订购指令查问  add by chenfuzhong 2008.12.24
begin
    select featurecode,accesscode
    into   o_cancelfeaturecode,o_cancelaccesscode
    from   zxdbm_ismp.ssrv_srvorder
    where  productid = v_productid and cmdtype = 2 and rownum = 1;
exception when no_data_found then
    null;
when others then
    o_retcode   := 506;
    o_debugpos := 64;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

/**
–part– – 订购 – 业务鉴权
*/

-- 业务存在性鉴权(MPSS 不须要鉴权)
--modified by chenfuzhong 2008.10.09
if i_servicetype = 101 then
    v_sql := 'select serviceid,status,colorlist,servicename,maincapability,submaincapability,cpid,orderupdateurl'||
             'from zxdbm_9900.s9900_service where serviceindex = :p1';
    begin
        execute immediate v_sql into v_serviceid,v_servicestatus,v_srvcolorlist,v_servicename,v_maincapability,v_submaincapability,v_cpid,v_orderupdateurl using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 65;
        o_debuginfo := 'serviceindex='||v_serviceindex||', The service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 66;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
elsif i_servicetype in (1,2,3) then
    v_sql := 'select serviceid,status,colorlist,servicename,subsrvtype,cpid,isservicesub,orderupdateurl,servicesort'||
             'from zxdbm_200.s200_service where  serviceindex = :p1';
    begin
        execute immediate v_sql into v_serviceid,v_servicestatus,v_srvcolorlist,v_servicename,v_subsrvtype,
        v_cpid,v_isservicesub,v_orderupdateurl,v_servicesort
        using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 67;
        o_debuginfo := 'serviceindex='||v_serviceindex||', The service does not exist';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 68;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
elsif i_servicetype <> 14 then
    begin
        select serviceid,status,colorlist,servicename,subsrvtype,cpid,orderupdateurl
        into   v_serviceid,v_servicestatus,v_srvcolorlist,v_servicename,v_subsrvtype,v_cpid,v_orderupdateurl
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 69;
        o_debuginfo := 'serviceindex='||v_serviceindex||', The service does not exist';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 70;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

o_serviceid         := v_serviceid;
o_servicename       := v_servicename;
o_maincapability    := v_maincapability;
o_submaincapability := v_submaincapability;
o_cpid              := v_cpid;

-- 业务状态鉴权,mpss 无业务
if (i_servicetype <> 14 and v_servicestatus <> 1) then
    o_retcode   := 1011510;
    o_debugpos := 71;
    o_debuginfo := 'v_servicestatus='||v_servicestatus||', The service status is abnormal.';
    return;
end if;

--added by youqunxia20130906 order3.02.01
-- 是否同步订购关系给 OIDD,0- 否,1- 是
if v_servicesort = 1 then
    o_issynctooidd := 1;
end if;

/**
–part– – 订购 – CP/SP 鉴权
**/

--CP/SP 存在性鉴权
begin
    select cpid,status,cpsubscribeurl,hasblacklist,cptype,insubblacklist,cpcnshortname,customersrvtel,cpsrvtype
    into   v_cpid,v_cpstatus,v_cpsubscribeurl,v_hasblacklist,v_cptype,v_insubblacklist,v_cpcnshortname,v_customersrvtel,v_cpsrvtype
    from   zxdbm_ismp.scp_basic
    where  cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 72;
    o_debuginfo := 'v_cpindex='||v_cpindex||', the sp does not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 73;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

o_cpid           := v_cpid;
o_cptype         := v_cptype;
o_cpcnshortname  := v_cpcnshortname;
o_customersrvtel := v_customersrvtel;
o_cpsrvtype      := v_cpsrvtype;

-- 按优先统提取同步 URL
if (trim(v_orderupdateurl) is null) or (length(trim(v_orderupdateurl)) < 8) then
    o_cpsubscribeurl := v_cpsubscribeurl;
else
    o_cpsubscribeurl := v_orderupdateurl;
end if;

--CP/SP 状态鉴权
if (v_cpstatus <> 1) then
    o_retcode   := 2001;
    o_debugpos := 74;
    o_debuginfo := 'v_cpstatus='||v_cpstatus||', The cp/sp status is abnormal.';
    return;
end if;
-- 限度用户订购 CP/SP 黑名单鉴权
if (v_insubblacklist <> 0) then
    o_retcode   := 1011406;
    o_debugpos := 75;
    o_debuginfo := 'insubblacklist='||v_insubblacklist||', cp/sp is in limit blacklist';
    return;
end if;

--SP 接入码查问
if (i_spaccesscode is null) or (length(trim(i_spaccesscode)) = 0) then
    begin
        select spaccesscode into v_spaccesscode
        from zxdbm_ismp.ssrv_srvorder
        where productindex = v_productindex and cmdtype = i_actiontype and servicetype = i_servicetype and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 76;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if trim(v_spaccesscode) is null then
        begin
            select accesscode into v_spaccesscode
            from zxdbm_ismp.ssrv_spaccesscode
            where cpid = v_cpid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 77;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    o_spaccesscode := v_spaccesscode;
end if;

/*
–part– – 订购 – 业务能力开明鉴权
*/

--SP 开明业务能力鉴权(MVS,MPSS,PIM,CPX 不须要鉴权)
if i_servicetype  in (5,14,33,101) then
    o_protocoltype := 0;
else
    begin
        select protocoltype
        into   v_protocoltype
        from   zxdbm_200.s200_sp_service_type
        where  cpindex = v_cpindex and servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
       o_retcode   := 2100;
       o_debugpos := 78;
       o_debuginfo := 'cp/sp serviceCapability is not open.';
       return;
    when others then
       o_retcode   := 506;
       o_debugpos := 79;
       o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
       return;
    end;
    o_protocoltype := v_protocoltype;
end if;

--added by youqunxia 20130817 Order3.02.01  鉴权是否开明 webgw 业务能力
begin
    select status, starttime, endtime
    into v_spsrvstatus,v_spsrvstarttime,v_spsrvendtime
    from zxdbm_5000.s5000_sp_service_type
    where cpindex = v_cpindex and servicetype = 58;
exception when no_data_found then
    o_haswebgw := 0;
when others then
    o_retcode   := 506;
    o_debugpos := 179;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
if v_spsrvstatus not in (1,3) then
    o_haswebgw := 0;
elsif v_spsrvstarttime > v_sysdate14 or v_spsrvendtime < v_sysdate14 then
    o_haswebgw := 0;
end if;

-- 零碎业务能力开明鉴权(CPX 查找主, 子业务能力)
if i_servicetype = 101 then
    begin
        select a.perssrvopen,b.srvtypeid
        into   v_perssrvopen,v_srvtypeid
        from   zxdbm_ismp.ssys_service_type a,zxdbm_ismp.ssys_service_type b
        where  a.servicetype = v_servicetype and a.subcapability = v_subcapability
        and    b.servicetype = v_maincapability and b.subcapability = v_submaincapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 80;
        o_debuginfo := 'CPX system serviceCapability is not open.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 81;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select perssrvopen,srvtypeid
        into   v_perssrvopen,v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 82;
        o_debuginfo := 'servicetype='||v_servicetype||'subcapability='||v_subcapability||', System serviceCapability is not open.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 83;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_srvtypeid   :=  v_srvtypeid;

/**
–part– – 订购 – 名单鉴权, 用户业务能力开明鉴权
**/
— if (o_mutiluserexit = 1) and (i_needauthuser = 1) then

if i_needauthuser = 1 then
    -- 应用方名单鉴权
    if (v_useblacklist <> 0) then
        if bitand(v_useblacklevel,1) > 0 then
            -- 零碎级黑名单查看
            v_tmpint    := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_useuserindex and colortype = 1 and colorlevel = 1
                and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 84;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if (v_tmpint > 0) then
                o_retcode   := 1004;
                o_debugpos := 85;
                o_colortype := 1;
                o_debuginfo := 'colortype = 1 and colorlevel = 1 and userindex ='||v_useuserindex||', The user is in system level blacklist.';
                return;
            end if;
        end if;
        --SP 级黑名单查看
        if v_hasblacklist = 1 and bitand(v_useblacklevel,2) > 0 then
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_useuserindex and colortype = 1 and colorlevel = 2 and colorid = v_cpindex
                and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 86;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint > 0 then
                o_retcode   := 1004;
                o_debugpos := 87;
                o_colortype := 1;
                o_debuginfo := 'colortype = 1 and colorlevel = 2 and colorid ='||v_cpindex||', The user is in SP level blacklist.';
                return;
            end if;
        end if;
        -- 业务能力级黑名单
        if bitand(v_useblacklevel,4) > 0 then
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_useuserindex and colortype = 1 and colorlevel = 3 and colorid = v_servicetype;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 88;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint > 0 then
                if v_usegraylist > 0 and bitand(v_usegraylevel,2) > 0 then
                    begin
                        select count(*)
                        into   v_tmpint
                        from   zxdbm_ismp.susr_colorlist
                        where  userindex = v_useuserindex and colortype = 3 and colorlevel = 2 and colorid = v_cpindex;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 89;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                    if (v_tmpint = 0) then
                        o_retcode   := 1004;
                        o_debugpos := 90;
                        o_colortype := 1;
                        o_debuginfo := 'colortype = 1 and colorlevel = 3 and colorid ='||v_servicetype||', The user is in serviceCapbility level blacklist.';
                        return;
                    end if;
                else
                    o_retcode   := 1004;
                    o_debugpos := 91;
                    o_debuginfo := 'colortype = 1 and colorlevel = 3 and colorid ='||v_servicetype||', The user is in serviceCapbility level blacklist.';
                    o_colortype := 1;
                    return;
                end if;
            end if;
        end if;
        if v_srvcolorlist = 1 and bitand(v_useblacklevel,8) > 0 then
            -- 业务级黑名单查看
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from    zxdbm_ismp.susr_colorlist
                where   userindex = v_useuserindex and colortype = 1 and colorlevel = 4 and colorid = v_serviceindex;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 92;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint > 0 then
                o_retcode   := 1004;
                o_debugpos := 93;
                o_debuginfo := 'colortype = 1 and colorlevel = 4 and colorid ='||v_serviceindex||', The user is in service level blacklist.';
                o_colortype := 1;
                return;
            end if;
        end if;
    end if;
    if (v_srvcolorlist = 2) then
        if (v_usewhitelist = 0) then
            o_retcode   := 1100001;
            o_debugpos := 94;
            o_debuginfo := 'v_srvcolorlist ='||v_srvcolorlist||'v_usewhitelist ='||v_usewhitelist||', service has whitelist,but user is not in whitelist.';
            return;
        end if;
        o_colortype := 2;
        v_tmpint := 0;
        begin
            select count(*)
            into   v_tmpint
            from   zxdbm_ismp.susr_colorlist
            where  userindex = v_useuserindex and colortype = 2 and colorlevel = 4 and colorid = v_serviceindex;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 95;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if v_tmpint = 0 then
            o_retcode   := 1109;
            o_debugpos := 96;
            o_debuginfo := 'userindex ='||v_useuserindex||', colortype = 2 and colorlevel = 4, colorid ='||v_serviceindex||',service has whitelist, but the user is not in service level whitelist.';
            return;
        end if;
    end if;
    if (v_useredlist <> 0) then
        o_colortype := 4;
    end if;
    -- 应用方开明业务能力鉴权
    begin
      --  select nvl(status,1)
        select status
        into   v_useopenstatus
        from   zxdbm_200.s200_service_useropen
        where  userindex = v_useuserindex and servicetype = v_servicetype;
    exception when no_data_found then
        v_useopenstatus := 1;
        begin
    --        select nvl(perssrvopen,1) into v_usetypesrvopen
            select perssrvopen into v_usetypesrvopen
            from zxdbm_ismp.ssrv_user_perssrvopen
            where servicetype = v_servicetype and subcapability = v_subcapability and msisdntype =v_usemsisdntype;
        exception when no_data_found then
            v_usetypesrvopen  := 1;
            if v_perssrvopen = 0 then
                o_retcode  := 1100;
                o_debugpos    := 97;
                o_debuginfo   := 'the user service capabilty is closed.';
                return;
            end if;
        when others then
            o_retcode  := 506;
            o_debugpos    := 98;
            o_debuginfo   := 'the user service capabilty is closed.';
            return;
        end;
    when others then
        o_retcode   := 506;
        o_debugpos := 99;
        return;
    end;
    if v_useopenstatus = 0 or v_usetypesrvopen = 0 then
        if i_cmdchannel in (9,35,39,40) then
            o_retcode   := 1001225;
        else
            o_retcode   := 1100;
        end if;
        o_debugpos := 100;
        o_debuginfo := 'v_useopenstatus ='||v_useopenstatus||', the user service capabilty is closed.';
        return;
    end if;
    if (v_srcmsisdn <> v_usemsisdn) then
    -- 发起方名单鉴权
        if (v_srcblacklist <> 0) then
            if bitand(v_srcblacklevel,1) > 0 then
                -- 零碎级黑名单查看
                v_tmpint    := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from   zxdbm_ismp.susr_colorlist
                    where  userindex = v_useuserindex and colortype = 1 and colorlevel = 1
                    and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 101;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if (v_tmpint > 0) then
                    o_retcode   := 1004;
                    o_debugpos := 102;
                    o_debuginfo := 'userindex ='||v_useuserindex||', colortype = 1 and colorlevel = 1'||', The user is in system level blacklist.';
                    return;
                end if;
            end if;
            --SP 级黑名单查看
            if v_hasblacklist = 1 and bitand(v_srcblacklevel,2) > 0 then
                v_tmpint := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from   zxdbm_ismp.susr_colorlist
                    where  userindex = v_srcuserindex and colortype = 1 and colorlevel = 2 and colorid = v_cpindex
                    and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 103;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if v_tmpint > 0 then
                    o_retcode   := 1004;
                    o_debugpos := 104;
                    o_debuginfo := 'userindex ='||v_srcuserindex||', colortype = 1 and colorlevel = 2'||', colorid ='||v_cpindex||', the user is in SP level blacklist.';
                    return;
                end if;
            end if;
            -- 业务能力级黑名单
            if bitand(v_srcblacklevel,4) > 0 then
                v_tmpint := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from   zxdbm_ismp.susr_colorlist
                    where  userindex = v_srcuserindex and colortype = 1 and colorlevel = 3 and colorid = v_servicetype;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 105;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if v_tmpint > 0 then
                    if v_srcgraylist > 0 and bitand(v_srcgraylevel,2) > 0 then
                        begin
                            select count(*)
                            into   v_tmpint
                            from   zxdbm_ismp.susr_colorlist
                            where  userindex = v_srcuserindex and colortype = 3 and colorlevel = 2 and colorid = v_cpindex;
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 106;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                        if (v_tmpint = 0) then
                            o_retcode   := 1004;
                            o_debugpos := 107;
                            o_debuginfo := 'userindex ='||v_srcuserindex||', colortype = 1 and colorlevel = 3'||', colorid ='||v_servicetype||', the user is in service capbility level blacklist.';
                            o_colortype := 1;
                            return;
                        end if;
                    else
                        o_retcode   := 1004;
                        o_debugpos := 108;
                        o_debuginfo := 'userindex ='||v_srcuserindex||', colortype = 1 and colorlevel = 3'||', colorid ='||v_servicetype||', The user is in service capbility level blacklist.';
                        o_colortype := 1;
                        return;
                    end if;
                end if;
            end if;
            if v_srvcolorlist = 1 and bitand(v_srcblacklevel,8) > 0 then
                -- 业务级黑名单查看
                v_tmpint := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from    zxdbm_ismp.susr_colorlist
                    where   userindex = v_srcuserindex and colortype = 1 and colorlevel = 4 and colorid = v_serviceindex;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 109;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if v_tmpint > 0 then
                    o_retcode   := 1004;
                    o_debugpos := 110;
                    o_debuginfo := 'userindex ='||v_srcuserindex||', colortype = 1 and colorlevel = 4'||', colorid ='||v_serviceindex||', the user is in service level blacklist.';
                    return;
                end if;
            end if;
        end if;
        if (v_srvcolorlist = 2) then
            if (v_srcwhitelist = 0) then
                o_retcode   := 1100001;
                o_debugpos := 111;
                o_debuginfo := 'v_srvcolorlist ='||v_srvcolorlist||', v_srcwhitelist ='||v_srcwhitelist||', the service has whitelist, but the user is not in whitelist.';
                return;
            end if;
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_srcuserindex and colortype = 2 and colorlevel = 4 and colorid = v_serviceindex;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 112;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint = 0 then
                o_retcode   := 1109;
                o_debugpos := 113;
                o_debuginfo := 'v_srvcolorlist ='||v_srvcolorlist||', the service has whitelist, but the user is not in service level whitelist.';
                return;
            end if;
        end if;
        -- 发起方开明业务能力鉴权
        begin

— select nvl(status,1)

            select status
            into   v_srcopenstatus
            from   zxdbm_200.s200_service_useropen
            where  userindex = v_srcuserindex and servicetype = v_servicetype;
        exception when no_data_found then
            v_srcopenstatus := 1;
            begin
    --            select nvl(perssrvopen,1) into v_srctypesrvopen
                select perssrvopen into v_srctypesrvopen
                from zxdbm_ismp.ssrv_user_perssrvopen
                where servicetype = v_servicetype and subcapability = v_subcapability and msisdntype =v_srcmsisdntype;
            exception when no_data_found then
                v_srctypesrvopen := 1;
                if v_perssrvopen = 0 then
                    o_retcode  := 1100;
                    o_debugpos    := 114;
                    o_debuginfo   := 'The user service capability is not open and system capability is closed';
                    return;
                end if;
            when others then
                o_retcode  := 506;
                o_debugpos    := 115;
                o_debuginfo   := 'Failed to query user ssrv_user_perssrvopen';
                return;
            end;
        when others then
            o_retcode   := 506;
            o_debugpos := 116;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if v_srcopenstatus = 0 or v_srctypesrvopen = 0 then
            if i_cmdchannel in (9,35,39,40) then
                o_retcode  := 1001225;
            else
                o_retcode  := 1100;
            end if;
            o_debugpos := 117;
            o_debuginfo := 'userindex ='||v_srcuserindex||'servicetype ='||v_servicetype||', the user service capabilty is closed.';
            return;
        end if;
    end if;
end if;

/
–part– – 订购 – 测试产品, 测试用户鉴权
*/

-- 测试产品鉴权

— if (o_mutiluserexit = 1) and (((v_productsource <> 3) and (v_productstatus in (0,2)) and (v_workflowlife = 3)) or

if (v_productsource <> 3 and v_productstatus in (0,2) and v_workflowlife = 3) or (v_productsource = 3 and v_productstatus = 0) then
    if (v_srcusertype <> 2) or (v_useusertype <> 2) then
        o_retcode   := 1100;
        o_debugpos := 118;
        o_debuginfo := 'The normal user can not use test product.';
        return;
    end if;
    --SP 测试用户鉴权
    -- 测试产品、测试用户 (发起方、应用方) 相干鉴权
    begin
        select cpindex
        into   v_srctestcpindex
        from   zxdbm_ismp.susr_testgroup_member
        where  userindex = v_srcuserindex;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 119;
        o_debuginfo := 'userindex ='||v_srcuserindex||', the test product is not open to the subscriber.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 120;
        return;
    end;
    if (v_srctestcpindex > 0) then
        if (v_srctestcpindex <> v_cpindex) then
            o_retcode   := 1001223;
            o_debugpos := 121;
            o_debuginfo := 'The test-user belongs to SP-A can not use test-product belonged to SP-B.';
            return;
        end if;
    end if;
    begin
        select cpindex
        into   v_usetestcpindex
        from   zxdbm_ismp.susr_testgroup_member
        where  userindex = v_useuserindex;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 122;
        o_debuginfo := 'userindex ='||v_useuserindex||', the test product is not open to the subscriber.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 123;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_usetestcpindex > 0) then
        if (v_usetestcpindex <> v_cpindex) then
            o_retcode   := 1001223;
            o_debugpos := 124;
            o_debuginfo := 'The test-user belongs to SP-A can not use test-product belonged to SP-B.';
            return;
        end if;
        o_usertype := 3;
    end if;
end if;

/*
–part– – 订购 – 团体相干鉴权(分 DB 用户不存在,不鉴权)
/

-- 团体产品、团体用户相干鉴权

— if (o_mutiluserexit = 1) and (v_onlyforcorp = 1) then

if v_onlyforcorp = 1 then
    -- 团体产品不容许赠送
    if (i_isthird = 1) then
        o_retcode    := 1011407;
        o_debugpos  := 125;
        o_debuginfo := 'v_onlyforcorp ='||v_onlyforcorp||'i_isthird ='||i_isthird||', the corp product can not to be presented.';
        return;
    end if;
    -- 普通用户不能订购一个团体专用产品
    if (v_srccorpindex <> v_usecorpindex) then
        o_retcode   := 1100;
        o_debugpos := 126;
        o_debuginfo := 'v_onlyforcorp ='||v_onlyforcorp||'v_srccorpindex ='||v_srccorpindex||', the normal user can not subscrib corp product.';
        return;
    end if;
    if (v_srccorpindex = 0) then
        o_retcode   := 1204;
        o_debugpos := 127;
        o_debuginfo := 'v_onlyforcorp ='||v_onlyforcorp||'v_srccorpindex ='||v_srccorpindex||', the normal user can not subscrib corp product.';
        return;
    end if;
    begin
        select  corpid,status,paymsisdn,corpcnshortname
        into    v_srccorpid,v_srccorpstatus,v_srccorppaymsisdn,v_corpname
        from    zxdbm_ismp.susr_corp
        where   corpindex = v_srccorpindex;
    exception when no_data_found then
        o_retcode   := 1001301;  -- 团体不存在
        o_debugpos := 128;
        o_debuginfo := 'v_srccorpindex ='||v_srccorpindex||', the corp do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 129;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;

    o_corpcnshortname  := v_corpname;
    o_corpid           := v_srccorpid;
    o_corpindex        := v_srccorpindex;

    if (v_srccorpstatus <> 1) then
        o_retcode   := 1001302;
        o_debugpos := 130;
        o_debuginfo := 'v_srccorpindex ='||v_srccorpindex||', the corp status is abnormal.';
        return;
    end if;
    -- 一个团体的产品只能由本团体的用户订购 / 赠送
    begin
        select subscribemode,payparty,status
        into   v_productsubmode,v_productpayparty,v_corpproductstatus
        from   zxdbm_ismp.ssrv_corp_product
        where  corpindex = v_srccorpindex and groupindex = 0 and productindex = v_productindex;
    exception when no_data_found then
        o_retcode   := 1011300;
        o_debugpos := 131;
        o_debuginfo := 'productindex ='||v_productindex||', corpindex ='||v_srccorpindex||', the product is not binded with the corp.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 132;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_corpproductstatus <> 0) then
        o_retcode   := 1011408;
        o_debugpos := 133;
        o_debuginfo := 'productindex ='||v_productindex||', corpindex ='||v_srccorpindex||', the binding relationship between the product and the corp is deleted.';
        return;
    end if;
    if (v_productsubmode = 0) then
    -- 必须团体管理员订购
        if (i_cmdchannel <> 4) then
            o_retcode   := 1001216;    -- 无权定购
            o_debugpos := 134;
            o_debuginfo := 'i_cmdchannel ='||i_cmdchannel||', v_productsubmode ='||v_productsubmode||', the corp product can only be subscribed by corp managers.';
            return;
        end if;
    end if;
end if;

/*
–part– – 订购 – 计费方、预付费零碎鉴权
*/

--if o_mutiluserexit = 1 then
    if (v_productpayparty = 1) then
        v_paymsisdn     := v_srccorpid;
        v_cardtype      := 0;
        v_paymsisdntype := 1;
        o_paymsisdn     := v_paymsisdn;
        o_paytype       := v_cardtype;
        o_payuserindex  := v_srccorpindex;
        o_paymode       := '团体付费';
        o_cityid        := trim(' ');
    else
        v_paymsisdn     := v_srcmsisdn;
        v_cardtype      := v_srcpaytype;
        v_paymsisdntype := v_srcmsisdntype;
        o_paymsisdn     := v_paymsisdn;
        o_paytype       := v_cardtype;
        o_payuserindex  := v_srcuserindex;
        o_paymode       := '集体付费';

        if (i_prepaidtype = 1) then
            o_scptype := 1;
        elsif i_prepaidtype = 2 then
            o_scptype := 2;
        else
            --attach 预付费归属,0- 未知,1-OCS,2-RTBP
            begin
                select phoneindex,attach
                into   v_phoneindex,v_attach
                from   zxdbm_ismp.ssys_phone
                where  startprefix <= substr(v_paymsisdn,1,length(startprefix))
                and    endprefix >= substr(v_paymsisdn,1,length(endprefix));
            exception when no_data_found then
                o_scptype  := 2;
                v_devexist := 0; -- 示意不存在对应号段对应设施配置
            when others then
                o_retcode   := 506;
                o_debugpos := 135;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if (v_devexist = 1) then
                if (v_attach = 1) then
                    o_scptype := 1;
                elsif (v_attach = 2) then
                    o_scptype := 2;
                else
                    begin
                        select 1
                        into   o_scptype
                        from   zxdbm_ismp.sdev_phone
                        where  phoneindex = v_phoneindex
                        and    devicetype = 5;
                    exception when no_data_found then
                        o_scptype := 2;
                    when others then
                        o_retcode   := 506;
                        o_debugpos := 136;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                end if;
             end if;
        end if;
    end if;

— end if;
/*
–part– – 订购 – 性能:订购关系鉴权(产品订购 / 业务订购)

  阐明:跨省赠送,赠送音讯不鉴权订购关系 / 多 DB 赠送,不在 OA 库鉴权订购关系

*/

if (i_mutidbmode = 1 and i_isthird = 1) or (i_actiontype = 17 and i_isfromnmsc = 1) then
    null;
else
    v_hasrecord := 1;
    begin      -- 产品订购
        select status,productid,productindex,lastrenttime,nextrentdate,payfordate,productpkgindex,endtime,
               varifee,isexperience
        into v_cursubstatus,v_cancelproductid,v_cancelproductindex,v_cancellastrenttime,v_cancelnextrentdate,v_cancelpayfordate,v_productpkgindex,v_subendtime,
             v_lastvarifee,v_isexperience1
        from zxdbm_200.s200_user_subscription
        where usercode = v_usemsisdn and productid = v_productid;
    exception when no_data_found then
        v_hasrecord := 0;
    when others then
        o_retcode   := 506;
        o_debugpos := 137;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_hasrecord > 0) then
        if v_productpkgindex <> 0 then
            begin
                select trim(productpkgname)
                into  o_productpkgname
                from zxdbm_ismp.ssrv_product_pkg
                where productpkgindex = v_productpkgindex;
            exception when no_data_found then
                o_retcode   := 2100;
                o_debugpos := 138;
                o_debuginfo := 'v_productpkgindex ='||v_productpkgindex||', the pkg do not exit.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 139;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            o_retcode   := 1200;   -- 该产品属于套餐,且用户已订购该套餐
            o_debugpos := 140;
            o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the user has subscribed pkg including this product.';
            return;
        end if;
        if v_cursubstatus <> 4 and v_chargetype <> 4 then    --(待生效订购关系 或 纯包量)能够反复订购
            --added by youqunxia20130818 order3.02.01
            if i_startcmdchannel = 45 then
                o_hassubscription := 1;
                 --6、可变价的反复订购
                o_issecondproduct := 6;
            elsif (i_cmdchannel = 40) then
                --added by youqunxia20131015 order3.02.01
                v_isexperience1 := trim(v_isexperience1);
                if (v_isexperience1 = '1') and (i_isexperience = 3)then
                    v_isexperience := '0';
                    --7: 体验转正式的反复订购
                    o_issecondproduct := 7;
                else
                    o_retcode   := 1200;
                    o_debugpos  := 178;
                    o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the user has subscribed the product.';
                    return;
                end if;
            else 
                o_retcode   := 1200;
                o_debugpos := 141;
                o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the user has subscribed the product.';
                return;
            end if;
        elsif v_chargetype = 4 then  -- 判断程序不能颠倒
            o_issecondproduct  := 3;
        --modied by youqunxia20130918 order3.02.01 
        -- 待生效订购关系的订购, 不反对退订应用足月的产品待生效产品的订购
        elsif v_cursubstatus = 4 and v_chargetype in (2,5,7) and v_invalidmode <> 2 then
            o_issecondproduct  := 2;
        else
            o_retcode   := 1200;
            o_debugpos  := 181;
            o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the user has subscribed the product.';
            return;
        end if;
    end if;
    -- 业务订购(内容类业务有 BREW、DLS、MVS)if i_servicetype not in (5,6,98) and v_hasrecord = 0 then
        o_issecondproduct  := 1;
        v_hasrecord := 1;
        begin
            select productid,productindex,lastrenttime,payfordate,productpkgindex,
                   freetime,isexperience
            into   v_cancelproductid,v_cancelproductindex,v_cancellastrenttime,v_cancelpayfordate,v_productpkgindex,
                   v_cancelfreetime,v_cancelisexperience
            from   zxdbm_200.s200_user_subscription
            where  usercode = v_usemsisdn and cpid = v_cpid and serviceid = v_serviceid;
        exception when no_data_found then
            o_issecondproduct := 0;
            v_hasrecord := 0;
        when others then
            o_retcode   := 506;
            o_debugpos := 142;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if (i_cmdchannel = 40) then
            --added by youqunxia20131018 order3.02.01
            -- 订购激活申请中 OperType 为 2:替换已有产品,则 ISMP 失常解决,将产品的订购关系进行替换,计费失常
            -- 体验转正式,则 ISMP 失常解决,将产品订购关系转为失常,计费失常
            v_cancelisexperience := trim(v_cancelisexperience);
            if (v_cancelisexperience = '1') and (i_isexperience = 0 or i_isexperience = 3)then
                v_isexperience := '0';
            end if;
        end if;
        if v_hasrecord > 0 then
            if v_productpkgindex <> 0 then
                o_retcode   := 1001210;                          -- 不能替换产品组合蕴含的产品
                o_debugpos := 143;
                o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productpkgindex ='||v_productpkgindex||', can not replace product in the pkg.';
                return;
            end if;
            if(v_cancelproductid <> v_productid) then
                if i_servicetype in (1,2,3) and v_isservicesub = 1 then       --sms,mms,wap 业务订购
                    null;
                else
                    o_retcode   := 1001210;
                    o_debugpos  := 144;
                    o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', serviceid ='||v_serviceid||', the user has subscribed a product in the same service.';
                    return;
                end if;
            end if;
        end if;
    end if;
    o_cancelproductid := v_cancelproductid;
    o_lastvarifee     := v_lastvarifee;
end if;

-- 业务订购 / 待生效订购关系只反对包月类产品 --?? 应该在鉴权了订购关系的状况下,才有上面的鉴权,T02 改
if o_issecondproduct in (1,2) then
    if i_servicetype = 5 and o_issecondproduct = 2 and v_chargetype in (3,6,8) then
        --MVS 的包周期产品在订购关系待生效状态时能够续订
        null;
    else
        if v_chargetype in (2,5,7) or v_needcharge = 0 then
            -- 包月类产品、收费产品能够替换
            null;
        else
            o_retcode   := 9999;
            o_debugpos := 145;
            o_debuginfo := 'v_chargetype='||v_chargetype||', No_month_Product can not update subscription.';
        end if;
    end if;
end if;
--added by youqunxia2013112 order3.02.01
if v_isexperience = '3' then
    o_retcode   := 1009023;
    o_debugpos  := 180;
    o_debuginfo := 'There is not free user subscription.';
end if;
o_isexperience  := v_isexperience;

/
–part– – 订购 – 设置订购关系失效工夫、状态
–0- 立刻失效,1- 下月失效,2- n 周期后失效,3- 指定日期失效
/

v_substatus    := 0;
--added by youqunxia20130910 order3.02.01
-- 开关关上,VSOP 侧发动捆绑类套餐、增值产品的订购激活、变更激活及退订,ISMP 中增值子产品订购关系立刻失效(包含订购、退订及变更),不以增值产品属性判断失效工夫;if (i_cmdchannel = 40) and (i_effectiveswitch = 1)then
    v_validmode := 0;
end if;
if (v_validmode = 0) or (v_validmode = 3 and v_validdate <= v_sysdate14) then
    v_substarttime := v_sysdate14;
    v_validmode := 0;
    v_substatus := 1;
elsif (v_validmode = 1) then
    v_substarttime := to_char((to_date(substr(v_curmonthendtime,1,8),'yyyymmdd') + 1),'yyyymmddhh24miss');
    v_substatus    := 0;
elsif (v_validmode = 2) then
-- 周期形式 0 - 非周期形式,1- 天,2- 周,3- 月
    if (v_validcyctype = 1) then
        v_substarttime := to_char(to_date(v_sysdate14,'yyyymmddhh24miss') + v_validcycparam,'yyyymmddhh24miss');
        v_substatus    := 0;
    elsif (v_validcyctype = 2) then
        v_substarttime := to_char(to_date(v_sysdate14,'yyyymmddhh24miss') + 7 * v_validcycparam,'yyyymmddhh24miss');
        v_substatus    := 0;
    elsif (v_validcyctype = 3) then
        v_substarttime := to_char(add_months(to_date(v_sysdate14,'yyyymmddhh24miss'),v_validcycparam),'yyyymmddhh24miss');
        v_substatus    := 0;
    else
        v_substarttime := v_sysdate14;
        v_substatus    := 1;
    end if;
elsif (v_validmode = 3) and (v_validdate > v_sysdate14) then
    v_substarttime := v_validdate;
    v_substatus    := 0;
else
    v_substarttime := v_sysdate14;
    v_substatus    := 1;
end if;

--modied by youqunxia20130601   order2.07.10 
if i_servicetype = 5 and v_freeuseflag in (1,2) then
    -- 流媒体产品 (天冀视讯业务) 用户首次订购享受收费期的时候,须要将订购关系置为立刻失效
    v_substarttime := v_sysdate14;
    v_validmode := 0;
    v_substatus := 1;
    -- 将之到期解决字段值置为 0,以对代码进行爱护(天翼视讯 MVS 此字段门户应限度为 0)v_freenotify := 0;
end if;
-- 失效工夫在推广期之外
if v_popuexist in (0,1) and (to_char(to_date(v_substarttime, 'yyyymmddhh24miss'), 'yyyymmdd') >= v_popustop) then
    v_popuexist := 3;
end if;
o_popuexist := v_popuexist;

/**
–part– – 订购 – – 计算产品订购关系收费期、产品订购关系下次扣租日期、产品订购关系上次扣租工夫、月租已扣日期

-- 从本月历史表中查问有没有退定记录

*/

v_hasrecord := 1;
begin
    v_sql := 'select freetime,lastrenttime,payfordate from (select freetime,lastrenttime,payfordate from zxdbm_200.s200_user_subs_hist' || v_curstrmonth ||
             'where usercode = :p1 and productid = :p2 and substr(canceltime,1,6) = :p3 order by subscriptionindex desc) temp where rownum=1';
    execute immediate v_sql into v_freetime,v_lastrenttime,v_payfordate using v_usemsisdn, v_productid, substr(v_sysdate14,1,6);
exception when no_data_found then
    v_hasrecord := 0;
when others then
    o_retcode   := 506;
    o_debugpos := 147;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

-- 收费期产品和应用产品历史订购关系的查问
if (v_freedays > 0 or v_testuser = 1) and v_hasrecord = 0 then
    begin
        select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist01 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
    exception when no_data_found then
        v_hasrecord := 0;
    when others then
        o_retcode   := 506;
        o_debugpos := 148;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist02 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 149;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist03 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 150;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist04 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 151;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist05 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 152;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist06 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 153;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist07 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 154;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist08 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 155;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist09 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 156;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist10 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 157;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist11 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 158;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    if v_hasrecord = 0 then
        begin
            select count(1) into v_hasrecord from zxdbm_200.s200_user_subs_hist12 where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 159;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
end if;
if v_testuser = 1 and v_hasrecord = 1 then
    o_retcode   := 1001226;
    o_debugpos := 160;
    o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the user has subscribed the test_product before.';
    return;
end if;
o_lastrenttime := v_lastrenttime;
o_payfordate   := v_payfordate;

-- 有收费期且为纯包量时,查问订购关系表
if v_freedays > 0 and v_chargetype = 4 then
    begin
        select freetime into v_freetime
        from zxdbm_200.s200_user_subscription
        where usercode = v_usemsisdn and productid = v_productid and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 161;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    -- 超过收费期订购时不享受收费期
    if v_sysdate14 > v_freetime and v_freetime <> '00000000000000' then
        v_freedays := 0;
    end if;
end if;

--modied by youqunxia20130530 计算收费期到期日期  order2.07.10
if (v_freedays > 0) and (v_hasrecord = 1) and (v_chargetype <> 4) then
    v_freetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') - 1,'yyyymmdd') || '235959';
else
    --sms,mms,wap、mvs、dls、pim、brew 业务到期日期计算
    if i_servicetype in (1,2,3,5,6,33,98) then
        if v_freeuseflag = 1 then
            -- 试用到月底
            v_freetime := to_char(last_day(to_date(v_substarttime,'yyyymmddhh24miss')),'yyyymmdd') || '235959';
        elsif v_freeuseflag = 2 then
            -- 试用 N 小时
            v_freetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_freedays/24 ,'yyyymmddhh24miss');
        elsif v_freeuseflag = 3 then
            -- 试用足月
            v_freetime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'), v_freedays ) - 1,'yyyymmdd') || '235959';
        elsif v_freeuseflag = 4 then
            -- 试用 N 天
            if (v_freedays = 3) then
                v_freetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 3,'yyyymmddhh24miss');
            else
                v_freetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_freedays - 1,'yyyymmdd') || '235959';
            end if;
            if (v_freedays > 0) and (i_freemodule = 1) and (v_freenotify in (0,1)) and (v_chargetype in (2,5,7)) then  -- 包月类收费期 优惠形式
                v_freetime := to_char(last_day(to_date(v_freetime,'yyyymmddhh24miss')),'yyyymmdd') || '235959';
            end if;
        end if;
    else
    -- 其余业务能力计算收费日期
    --added by youqunxia 2013.02.18
        if (v_freedays = 3) then
            v_freetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 3,'yyyymmddhh24miss');
        else
            v_freetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_freedays - 1,'yyyymmdd') || '235959';
        end if;
        if (v_freedays > 0) and (i_freemodule = 1) and (v_freenotify in (0,1)) and (v_chargetype in (2,5,7)) then  -- 包月类收费期 优惠形式
            v_freetime := to_char(last_day(to_date(v_freetime,'yyyymmddhh24miss')),'yyyymmdd') || '235959';
        end if;
    end if;
end if;
o_freetime := v_freetime;

if (v_freetime > v_substarttime) and (v_hasrecord = 0) and (o_issecondproduct not in (1,2)) then    -- 收费期
    if v_freenotify in (1,2) then
        -- 取默认值 '99991231';null;
    else
        v_nextrentdate := to_char(to_date(o_freetime,'yyyymmddhh24miss') + 1,'yyyymmdd');
    end if;
elsif v_popuexist in (0,1,3) then      -- 推广期
    if v_popuexist = 0 then           -- 推广期收费
        v_nextrentdate := to_char(to_date(v_popustop,'yyyymmdd') + 1,'yyyymmdd');
    elsif v_popuexist = 1 then       -- 推广期计费
        if v_chargetype = 1 then     -- 按次
            v_nextrentdate := to_char(to_date(v_popustop,'yyyymmdd') + 1,'yyyymmdd');
        elsif v_chargetype = 2 then  -- 包月
            if v_validmode = 0 then
                if v_popustop = to_char(last_day(to_date(v_substarttime,'yyyymmddhh24miss')),'yyyymmdd') then
                    if v_jbchargetype in (2,5,7) then
                        v_nextrentdate := to_char(last_day(to_date(v_substarttime,'yyyymmddhh24miss')) + v_rentday,'yyyymmdd');
                    else
                        v_nextrentdate := to_char(to_date(v_popustop,'yyyymmdd') + 1,'yyyymmdd');
                    end if;
                else
                    v_nextrentdate := to_char(last_day(to_date(v_substarttime,'yyyymmddhh24miss')) + v_rentday,'yyyymmdd');
                end if;
            else
                v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1,'yyyymmdd');
            end if;
        end if;
    elsif v_popuexist = 3 then       -- 订购在推广期内,失效在推广期之外
        v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1,'yyyymmdd');
    end if;
elsif (v_subchargetype = 1) and (v_cyctype = 1) then
    if v_validmode = 0 then
        if v_chargetype in (2,5,7) then
            --added by youqunxia20130923 order3.02.01
            if v_invalidmode = 2 then
                -- 上海院需要,退订应用足月的计算规定,退订后可应用到订购日(临界条件非凡解决)v_unsubenddate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),1), 'yyyymmdd');
                if substr(v_substarttime,7,2) < substr(v_unsubenddate,7,2) then
                    -- 实用 2 月 28 日订购(非平年)相似情景
                    v_unsubenddate :=substr(v_unsubenddate,1,6)||substr(v_substarttime,7,2);
                end if;
                v_nextrentdate := to_char(to_date(v_unsubenddate,'yyyymmdd') + 1,'yyyymmdd');
                
                -- 广东院需要,退订应用足月的计算规定,退订后应用到订购日前一天(临界条件非凡解决)if i_fullmonthmode = 1 then
                    v_nextrentdate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),1), 'yyyymmdd');
                    if substr(v_substarttime,7,2) < substr(v_nextrentdate,7,2) then
                        -- 实用 2 月 28 日订购(非平年)相似情景
                        v_nextrentdate :=substr(v_nextrentdate,1,6)||substr(v_substarttime,7,2);
                    elsif substr(v_substarttime,7,2) > substr(v_nextrentdate,7,2) then
                        -- 实用 1 月 31 订购的相似情景, 扣租日为下下个月的 1 号
                        v_nextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmdd'),1), 'yyyymm')||'01';
                    end if;
                end if;
            else
                v_nextrentdate := to_char(last_day(to_date(v_substarttime,'yyyymmddhh24miss')) + v_rentday,'yyyymmdd');
            end if;
        elsif v_chargetype in (3,6,8) then
            if (v_cycunit = 1) then    -- 包天
                if i_servicetype = 5 and o_issecondproduct = 2 then  -- 周期性 MVS 包天产品,待生效再次订购时调整下次扣租日期
                    v_nextrentdate := to_char(to_date(v_cancelnextrentdate,'yyyymmdd') + v_cycparam,'yyyymmdd');
                else
                    v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1 + v_cycparam,'yyyymmdd');
                end if;
            elsif (v_cycunit = 2) then -- 包周
                v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_cycparam * 7,'yyyymmdd');
            elsif (v_cycunit = 3) then -- 包月
                v_nextrentdate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam),'yyyymmdd');
            elsif (v_cycunit = 4) then -- 包半年
                v_nextrentdate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam * 6),'yyyymmdd');
            elsif (v_cycunit = 5) then -- 包年
                v_nextrentdate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam * 12),'yyyymmdd');
            end if;
        end if;
    else
        v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1,'yyyymmdd');
    end if;
elsif (v_subchargetype = 1) and (v_cyctype = 0) then
    if v_chargetype in (3,6,8) then
    -- 非立刻失效,非周期性产品,在订购关系开始后进行扣租
        if v_validmode <> 0 then
            v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1,'yyyymmdd');
        end if;
    end if;
elsif v_subchargetype in (2,3) then
    v_nextrentdate := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1,'yyyymmdd');
end if;
o_nextrentdate := v_nextrentdate;

/**
–part– – 订购 – 计算本次需扣费用 (业务下多个产品订购 or 订购关系待生效产品的订购 / 单个产品订购)
*/

if o_issecondproduct in (1,2) then
    -- 计算被 189 替换的原产品 / 订购关系待生效产品, 本月是否扣租
    begin
        select subfeemode,popularizestart,popularizestop,popularizeitem,needcharge
        into v_cancelsubfeemode,v_cancelpopustart,v_cancelpopustop,v_cancelpopuitem,v_cancelneedcharge
        from   zxdbm_200.s200_product
        where  productindex = v_cancelproductindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 162;
        o_debuginfo := 'v_cancelproductindex='||v_cancelproductindex||', The product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 163;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;

    -- 获取产品的计费信息
    if (v_cancelpopuitem = 2) then  -- 无推广期
        v_tempitem := 0;
    elsif v_cancelpopuitem in (0,1) then  -- 推广期收费或者推广期计费
        if (v_sysdate8 >= v_cancelpopustart) and (v_sysdate8 <= v_cancelpopustop) then
            if v_cancelpopuitem = 0 then  -- 推广期收费
                o_retcode   := 9999;
                o_debugpos := 164;
                o_debuginfo := 'v_popuitem='||v_popuitem||', popu_free_product can not update the subscription.';
            else
                v_tempitem := v_cancelpopuitem;
            end if;
        else
            v_tempitem := 0;
        end if;
    end if;

    if i_servicetype in (1,2) and v_cancelneedcharge <> 0 then
        v_sql := 'select rentfee,minlimitfee,chargetype,fixfee,nextrentfee,rentfeevalidate'||
                 'from zxdbm_200.s200_product_fee where  productindex = :p1 and itemindex = :p2';
        begin
            execute immediate v_sql into v_cancelrentfee,v_cancelminlimitfee,v_cancelchargetype,v_cancelfixfee,v_nextrentfee,v_rentfeevalidate using v_cancelproductindex,v_tempitem;
        exception when no_data_found then
            o_retcode   := 2100;
            o_debugpos := 165;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 166;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    elsif v_cancelneedcharge <> 0 then
        begin
            select rentfee,minlimitfee,chargetype,fixfee into v_cancelrentfee,v_cancelminlimitfee,v_cancelchargetype,v_cancelfixfee
            from   zxdbm_200.s200_product_fee
            where  productindex = v_cancelproductindex and itemindex = v_tempitem;
        exception when no_data_found then
            o_retcode   := 3103;
            o_debugpos := 167;
            o_debuginfo := 'The product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 168;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;

    if o_issecondproduct = 1 then  -- 订购待生效产品后面曾经鉴过权,此外不需要反复再进行鉴权,否则会导致 MVS 业务续订出错
        -- 订购待生效产品后面曾经鉴过权,此外不需要反复再进行鉴权,否则会导致 MVS 业务续订出错
        if v_cancelchargetype in (2,5,7) or v_cancelneedcharge = 0 then
            -- 包月类产品、收费产品能够替换
            null;
        else
            o_retcode   := 9999;
            o_debugpos := 169;
            o_debuginfo := 'v_cancelchargetype='||v_cancelchargetype||', No_month_Product can not update the subscription.';
        end if;
    end if;

    if v_cancelchargetype in (2,5,7) then
        if v_cancelfreetime < v_sysdate14 then
            if (substr(v_cancellastrenttime,1,6) = v_sysmonth6) then
                -- 本月租金已扣除
                o_subfee := 0;
                o_lastrenttime := v_cancellastrenttime;
                o_payfordate   := v_cancelpayfordate;
            elsif (substr(v_cancellastrenttime,1,6) < v_sysmonth6) then
                -- 本月租金未扣除
                v_subfee := v_cancelfixfee;
                if i_servicetype in (1,2) then
                    if (v_cancelrentfee <> v_nextrentfee) and (substr(v_rentfeevalidate,1,6) = v_sysmonth6) then
                        v_cancelrentfee := v_nextrentfee;
                    end if;
                end if;
                if (v_cancelsubfeemode = 1) then      -- 收取本帐期全副费用
                    v_subfee := v_subfee + v_cancelrentfee;
                elsif (v_cancelsubfeemode = 2) then   -- 上半月订购收取全月费用, 下半月订购收取半月费用
                    if (to_number(substr(v_sysdate8,7,2)) - 15 > 0) then
                        v_subfee := v_subfee + v_cancelrentfee/2;
                    else
                        v_subfee := v_subfee + v_cancelrentfee;
                    end if;
                elsif (v_cancelsubfeemode = 3) then   -- n 日全费含 n 日,n 日后收费
                    if (v_subfeedays = 0) then    -- 0 示意本月全副收费,其余示意 N 号之后收费。null;
                    elsif (to_number(substr(v_sysdate8,7,2)) - v_subfeedays <= 0) then
                        v_subfee := v_subfee + v_cancelrentfee;
                    else
                        null;
                    end if;
                elsif (v_cancelsubfeemode = 4) then   -- 理论天数免费
                    v_leftdays  := to_number(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')) - to_date(v_sysdate14,'yyyymmddhh24miss')) + 1;
                    v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                    v_subfee    := v_subfee + v_cancelrentfee*(v_leftdays/v_monthdays);
                end if;
                o_subfee := v_subfee;
                if o_subfee < v_cancelminlimitfee then
                    o_subfee := v_cancelminlimitfee;
                end if;
                o_lastrenttime := v_sysdate14;
                o_payfordate   := v_sysdate8;
            end if;
        end if;
    else
        if i_servicetype = 5 and v_cancelchargetype in (3,6,8) then --MVS 能够持续订购待生效状态的产品,只有 MVS 非包月的费率能够在待生效状态订购
            o_subfee := v_cancelrentfee + v_cancelfixfee;
            o_lastrenttime := v_sysdate14;
            o_payfordate   := v_sysdate8;
        end if;
    end if;
else
    -- 计算本次订购须要扣取的费用
    if (v_needcharge = 1) and ((o_freetime < v_sysdate14) or (v_freedays > 0 and v_hasrecord = 1)) and (v_validmode = 0) then
        if v_chargetype not in (2,3,4,5,6,7,8) then
            v_subfee := 0;
        else
            v_subfee := v_fixfee;
            if v_chargetype in (3,6,8) then                              -- 包周期产品
                v_subfee := v_subfee + v_rentfee;
            elsif  v_chargetype in (2,5,7) then                          -- 包月类产品
                --added by youqunxia20130923  order3.02.01
                -- 包月类产品,退订应用足月产品收取本月全副费用,与首月属性无关
                if v_invalidmode = 2 then
                    v_subfee := v_subfee + v_rentfee;
                else
                    if v_subchargetype <> 1 then
                        v_subfee := 0;
                    elsif v_chargetype in (2,5) and (v_hasrecord = 1 and v_backfeemode = 0 and substr(v_lastrenttime,1,6) = v_sysmonth6) then         --(包月,包月 + 单位费率)本月曾经订购过
                        v_subfee := 0;
                    elsif (v_chargetype = 7) and (v_hasrecord = 1 and v_backfeemode = 0 and substr(v_lastrenttime,1,6) = v_sysmonth6) then            --(包月 + 包量)本月曾经订购过
                       null;
                    else
                        if i_servicetype in (1,2) then
                            if (v_rentfee <> v_nextrentfee) and (substr(v_rentfeevalidate,1,6) = v_sysmonth6) then
                                v_rentfee := v_nextrentfee;
                            end if;
                        end if;
                        if (v_hasrecord = 1 and v_backfeemode = 1 and substr(v_lastrenttime,1,6) = v_sysmonth6) then     -- 退订须要补款产品本月曾经订购过
                            v_tag := 1;
                            v_leftdays  := to_number(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')) - to_date(v_sysdate14,'yyyymmddhh24miss')) + 1;
                            v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                            v_subfee    := v_subfee + v_rentfee*(v_leftdays/v_monthdays);
                        end if;
                        if (v_subfeemode = 1) then      -- 收取本帐期全副费用
                            if v_tag = 0 then
                                v_subfee := v_subfee + v_rentfee;
                            end if;
                        elsif (v_subfeemode = 2) then   -- 上半月订购收取全月费用, 下半月订购收取半月费用
                            if v_tag = 0 then
                                if (to_number(substr(v_sysdate8,7,2)) - 15 > 0) then
                                    v_subfee := v_subfee + v_rentfee/2;
                                else
                                    v_subfee := v_subfee + v_rentfee;
                                end if;
                            end if;
                        elsif (v_subfeemode = 3) then   -- n 日全费含 n 日,n 日后收费
                            if (v_subfeedays = 0) then    -- 0 示意本月全副收费,其余示意 N 号之后收费。null;
                            elsif (to_number(substr(v_sysdate8,7,2)) - v_subfeedays <= 0) then
                                if v_tag = 0 then
                                    v_subfee := v_subfee + v_rentfee;
                                end if;
                            else
                                null;
                            end if;
                        elsif (v_subfeemode = 4) then   -- 理论天数免费
                            if v_tag = 0 then
                                v_leftdays  := to_number(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')) - to_date(v_sysdate14,'yyyymmddhh24miss')) + 1;
                                v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                                v_subfee    := v_subfee + v_rentfee*(v_leftdays/v_monthdays);
                            end if;
                        end if;
                    end if;
                end if;
            end if;
        end if;
    end if;
    o_subfee := v_subfee;
    if o_subfee < v_minlimitfee then
        o_subfee := v_minlimitfee;
    end if;
    if o_subfee > 0 then
        o_lastrenttime := v_sysdate14;
        o_payfordate   := v_sysdate8;
        if v_cyctype = 0 then
            o_nextrentdate := '99991231';
        end if;
    end if;
end if;

--added by youqunxia 20130922 Order3.02.01
if (i_cmdchannel = 40) then
    -- 收费体验和积分兑换, 不填写 chargetime
    if i_isexperience in(1,2) then
        null;
    -- 费用 >0, 填写零碎工夫
    elsif (o_subfee > 0) then 
        v_chargetime := v_sysdate14;
    -- 费用 =0,填写下次扣租日
    else
        v_chargetime := o_nextrentdate || '050000';
    end if;
end if;
o_chargetime := v_chargetime;

/*
–part– – 订购 – 生产限额鉴权
*/
— if (o_mutiluserexit = 1) and (v_subfee > 0) and (v_productpayparty <> 1) then

if (v_subfee > 0) and (v_productpayparty <> 1) then
    if (v_srcmaxlimitfee = 0) then
        v_srcmaxlimitfee := i_monthconsumedlimit;
    end if;
    if (v_srcmaxlimitfee > 0) then
        begin
            v_sql := 'select sum(usedamounts) from zxdbm_ismp.ssrv_user_totalamount' || v_curstrmonth ||
                     'where userindex = :p1 and amounttype = 8 and amountindex = 0 and productindex = 0 and expiredate = :p2';
            execute immediate v_sql into v_usedamounts using v_srcuserindex,v_expiredate;
        exception when no_data_found then
              v_usedamounts := 0;
        when others then
            o_retcode   := 506;
            o_debugpos := 171;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if (v_usedamounts > v_srcmaxlimitfee) then
            o_maxlimitfee := to_char(v_srcmaxlimitfee);
            o_retcode     := 1006;          -- 用户已达生产限额
            o_debugpos   := 172;
            o_debuginfo := 'v_usedamounts ='||v_usedamounts||', v_srcmaxlimitfee ='||v_srcmaxlimitfee||', the usr run out the limit fee.';
            return;
        end if;
    end if;
end if;

/*
–part– – 订购 – 设置订购关系完结工夫
*/

if v_popuexist in (0,1,3) then                                                      -- 推广期根本计费费率
    v_chargetype := v_jbchargetype;
    v_cycunit := v_jbcycunit;
    v_cycparam := v_jbcycparam;
    v_cyctype := v_jbcyctype;
end if;

if  (v_freedays > 0) and (v_hasrecord = 0) and (v_freenotify in (1,2)) then
--modied by youqunxia2013.04.18
    v_subendtime := o_freetime;
else
    if v_chargetype in (1,4) then
        v_subendtime := v_productendtime;
    elsif v_chargetype in (2,5,7) then
        if v_cyctype = 1 then
            v_subendtime := v_productendtime;
        --added by youqunxia20130924 order3.02.01
        elsif v_invalidmode = 2 then
            -- 上海院需要,退订应用足月的计算规定,退订后可应用到订购日(临界条件非凡解决)v_unsubenddate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),1), 'yyyymmdd');
            if substr(v_substarttime,7,2) < substr(v_unsubenddate,7,2) then
                -- 实用 2 月 28 日订购(非平年)相似情景
                v_unsubenddate :=substr(v_unsubenddate,1,6)||substr(v_substarttime,7,2);
            end if;
            v_nextrentdate := to_char(to_date(v_unsubenddate,'yyyymmdd') + 1,'yyyymmdd');

            -- 广东院需要,退订应用足月的计算规定,退订后应用到订购日前一天(临界条件非凡解决)if i_fullmonthmode = 1 then
                v_nextrentdate := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),1), 'yyyymmdd');
                if substr(v_substarttime,7,2) < substr(v_nextrentdate,7,2) then
                -- 实用 2 月 28 日订购(非平年)相似情景
                v_nextrentdate :=substr(v_nextrentdate,1,6)||substr(v_substarttime,7,2);
                elsif substr(v_substarttime,7,2) > substr(v_nextrentdate,7,2) then
                -- 实用 1 月 31 订购的相似情景
                v_nextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmdd'),1), 'yyyymm')||'01';
                end if;
            end if;
            v_subendtime := to_char(to_date(v_nextrentdate,'yyyymmdd') -1,'yyyymmdd')||'235959';
        else
            v_subendtime := to_char(last_day(to_date(v_substarttime,'yyyymmddhh24miss')),'yyyymmdd') || '235959';
        end if;
    elsif v_chargetype in (3,6,8,9) then
        if (v_cycunit = 1) then -- 包天
            -- 周期性
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                if v_popuexist in (0,1) then  -- 推广期存在
                    v_subendtime := to_char(to_date(v_popustop,'yyyymmdd') + v_cycparam, 'yyyymmdd')||'235959';
                elsif (v_freedays > 0) and (v_hasrecord = 0) and (i_servicetype = 5) then  --MVS 业务包天非周期有收费期的场景
                    v_subendtime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_freedays/24 + v_cycparam,'yyyymmddhh24miss');
                elsif (v_freedays > 0) and (v_hasrecord = 0) then   -- 含收费期首次订购
                    v_subendtime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_freedays + v_cycparam - 1,'yyyymmdd')||'235959';
                else
                    if i_servicetype = 5 and v_cursubstatus = 4 then --MVS 业务待生效反复订购时,在原有完结时上基本上进行周期累加
                        v_subendtime := to_char(to_date(v_subendtime,'yyyymmddhh24miss') + v_cycparam,'yyyymmdd')||'235959';
                    else
                        v_subendtime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_cycparam,'yyyymmdd')||'235959';
                    end if;
                end if;
            end if;
        elsif (v_cycunit = 2) then -- 包周
            -- 周期性
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                if v_popuexist in (0,1) then
                    v_subendtime := to_char(to_date(v_popustop,'yyyymmdd') + v_cycparam*7, 'yyyymmdd')||'235959';
                elsif (v_freedays > 0) and (v_hasrecord = 0) then
                    v_subendtime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_freedays + v_cycparam*7-1,'yyyymmdd')||'235959';
                else
                    v_subendtime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + v_cycparam*7-1,'yyyymmdd')||'235959';
                end if;
            end if;
        elsif (v_cycunit = 3) then -- 包月
            -- 周期性
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                if v_popuexist in (0,1) then
                    v_subendtime := to_char(add_months(to_date(v_popustop,'yyyymmdd'),v_cycparam), 'yyyymmdd')||'235959';
                elsif (v_freedays > 0) and (v_hasrecord = 0) then
                    v_subendtime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam) + v_freedays -1,'yyyymmdd')||'235959';
                else
                    v_subendtime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam) -1,'yyyymmdd')||'235959';
                end if;
            end if;
        elsif (v_cycunit = 4) then -- 包半年
            -- 周期性
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                if v_popuexist in (0,1) then
                    v_subendtime := to_char(add_months(to_date(v_popustop,'yyyymmdd'),v_cycparam*6), 'yyyymmdd')||'235959';
                elsif (v_freedays > 0) and (v_hasrecord = 0) then
                    v_subendtime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam*6) + v_freedays - 1,'yyyymmdd')||'235959';
                else
                    v_subendtime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam*6)-1,'yyyymmdd')||'235959';
                end if;
            end if;
        elsif (v_cycunit = 5) then -- 包年
            -- 周期性
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                if v_popuexist in (0,1) then
                    v_subendtime := to_char(add_months(to_date(v_popustop,'yyyymmdd'),v_cycparam*12), 'yyyymmdd')||'235959';
                elsif (v_freedays > 0) and (v_hasrecord = 0) then
                    v_subendtime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam*12)+ v_freedays - 1,'yyyymmdd')||'235959';
                else
                    v_subendtime := to_char(add_months(to_date(v_substarttime,'yyyymmddhh24miss'),v_cycparam*12)-1,'yyyymmdd')||'235959';
                end if;
            end if;
        end if;
    else
        v_subendtime := v_productendtime;     -- 订购终止工夫, 临时定为产品终止工夫
    end if;
end if;

o_substarttime := v_substarttime;
o_subendtime   := v_subendtime;
o_substatus    := v_substatus;

— o_cdrbegintime := v_substarttime;

--added by youqunxia 2013.02.18
o_freenotify  := v_freenotify;
--added by youqunxia 20130314
o_validmode   := v_validmode;

/*
–part– – 订购 – 设置话单中的 begintime、endtime
*/

--added by youqunxia20130924 order3.02.01
-- 退订应用足月产品:话单计费完结工夫为下次扣租前一天的 "235959"
if v_chargetype in (2,5,7) and v_nextrentdate <= substr(v_subendtime,1,8) then
    if v_invalidmode = 2 then
        o_cdrendtime := to_char(to_date(v_nextrentdate,'yyyymmdd')-1,'yyyymmdd')||'235959';
    end if;
end if;

-- 收费期产品订购
if (o_freetime > o_substarttime) and (o_subfee = 0) then
    o_cnfmtype := 2;
end if;

--EventID chanelPlayerID 状态查问
if i_actiontype = 1 then
    begin
        select status into o_chanelplayerstate from zxdbm_ismp.channel_basic where cpid = i_channelid;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 173;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;

    begin
        select status into o_eventstate from zxdbm_ismp.ssys_event where eventid = i_eventid;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 174;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

-- 伪码解决(反对伪码开关关上, 非自营 sp)-- 反对业务 LCS,SMS,MVS,DLS,MMS,WAP,CPX
--MOAT 时,AuthPriceReq 音讯中 OA 实在号码转化为伪码, 同步 SP 应用

— if (o_mutiluserexit = 1) and i_servicetype in (1,2,3,4,41,5,6,101) then

if i_servicetype in (1,2,3,4,41,5,6,101) then
    if i_checkpseudocode = 1 and v_cpsrvtype <> 3 then
        if i_serviceflowtype = 1 then
            begin
                select pseudocode into o_pseudocode from zxdbm_ismp.susr_basic where usercode = i_oa;
            exception when no_data_found then
                o_retcode   := 1001;
                o_debugpos := 175;
                o_debuginfo := 'i_oa ='||i_oa||', the user does not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 176;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            o_pcodemsisdnswitch := 1;
        end if;
    end if;
end if;

-- 是否需进行二次确认
if (i_isnondreplay = 1) then
    o_needreplay := 0;
else
    o_needreplay := v_needreplay;
    if (i_cmdchannel = 45) then
        if (i_webgwcnfmswitch = 1) and (v_cpsrvtype <> 3) then
            o_needreplay := v_needreplay;
        else
            o_needreplay := 0;
        end if;
    end if;
end if;

-- 是否立刻下发收费期揭示确认短息设置
--added by youqunxia20130603 order2.07.10
if (v_freetime > v_substarttime) and (v_hasrecord = 0) then
    if (i_actiontype in (1,17,102) and v_needreplay = 0) or i_actiontype = 10 then
        v_freenoticetime := to_char(to_date(v_substarttime,'yyyymmddhh24miss') + 1,'yyyymmdd') || '080000';
        if (v_freetime < v_freenoticetime) then
            o_freenoticenow := 1;
        end if;
    end if;
end if;

-- 组装同步给 SP 的音讯
if (o_needreplay = 0) then
    if (o_protocoltype <> 0) then
     if (i_supportproductid = 1) then
        -- 应用产品代码同步
        if (o_protocoltype = 2) then
            o_msgtosp := 'DG' || '' || v_productid ||'  ' || v_usemsisdn;
        elsif (o_protocoltype = 1) then
            -- 平台向 sp 发送的同步音讯
            o_msgtosp     := '1001' || '' || v_productid ||' '|| v_usemsisdn ||' ' || v_paymsisdn;
            -- 平台向 sp 发送的确认音讯
            o_cnfmmsgtosp := '1000' || '' || v_productid ||' '|| v_usemsisdn ||' ' || v_paymsisdn;
        end if;
     else
        -- 应用业务代码同步
        if (o_protocoltype = 2) then
           o_msgtosp := 'DG' || '' || v_serviceid ||'  ' || v_usemsisdn;
        elsif (o_protocoltype = 1) then
           -- 平台向 sp 发送的同步音讯
           o_msgtosp     := '1001' || '' || v_serviceid ||'  '|| v_usemsisdn ||' ' || v_paymsisdn;
           -- 平台向 sp 发送的确认音讯
           o_cnfmmsgtosp := '1000' || '' || v_serviceid ||'  '|| v_usemsisdn ||' ' || v_paymsisdn;
        end if;
     end if;
  end if;
else
    -- 生成 linknum
    begin
        v_tmpint  := dbms_random.value(1,9999999999);
        o_linknum := v_sysdate14 || '655380' || lpad(to_char(v_tmpint),10,'0');
    exception when others then
        o_retcode   := 506;
        o_debugpos := 177;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

end slp_200_telicomsubreq;
/

prompt zxdbm_200.slp_200_telicomsubresp
create or replace procedure zxdbm_200.slp_200_telicomsubresp
(

i_srcmsisdn             in          varchar2,            -- 发起方 / 赠送方用户号码
i_usemsisdn             in          varchar2,            -- 应用方 / 受赠方用户号码
i_paymsisdn             in          varchar2,            -- 计费方用户号码
i_payuserindex          in          number,              -- 计费方号码序号
i_mutidbmode            in          number,              -- 零碎参数:是否多 DB 环境 0: 否 1: 是
i_cmdchannel            in          number,              -- 动作起源
i_isthird               in          number,              --0: 一般订购 1: 赠送
i_servicetype           in          number,              -- 产品业务能力类型
i_subcapability         in          number,              -- 产品业务能力子类型
i_serviceindex          in          number,              -- 业务序号
i_serviceid             in          varchar2,            -- 业务代码
i_productindex          in          number,              -- 产品序号
i_productid             in          varchar2,            -- 产品代码
i_chargetype            in          number,              -- 产品计费类型
i_cyctype               in          number,              -- 产品周期类型
i_corpindex             in          number,              -- 团体序号
i_corpid                in          varchar2,            -- 团体代码
i_cpindex               in          number,              --CP/SP 序号
i_cpid                  in          varchar2,            --CP/SP 代码
i_substatus             in          number,              -- 产品订购关系状态
i_autocontinue          in          number,              -- 周期性订购是否主动续订
i_substarttime          in          varchar2,            -- 产品订购关系失效工夫
i_subendtime            in          varchar2,            -- 产品订购关系生效工夫
i_lastrenttime          in          varchar2,            -- 产品订购关系上次扣租工夫
i_nextrentdate          in          varchar2,            -- 产品订购关系下次扣租日期
i_payfordate            in          varchar2,            -- 月租已付日期
i_fixusetimes           in          number,              -- 产品包量值
i_freetime              in          varchar2,            -- 产品订购关系收费期
i_opid                  in          varchar2,            -- 操作员工号
i_subfee                in          number,              -- 本次订购须要扣取的费用
i_usemsisdntype         in          number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
i_pseudocode            in          varchar2,            -- 用户伪码
i_pcodemsisdnswitch     in          number,              -- 若!=0, 则将伪码入订购关系表
i_cancelproductid       in          varchar2,            -- 被 189 替换的产品代码
i_issecondproduct       in          number,              -- 订购流程子类型 0: 一般订购 1: 业务订购 2: 待生效订购关系订购 3: 纯包量反复订购 6: 可变价的反复订购
i_needcharge            in          number,              -- 产品是否须要计费(只用于多 db 的跨 db 赠送)
--addded by youqunxia20130604  order2.07.10
i_freenoticenow         in          number,              -- 是否立刻下发过收费期揭示短信 0- 否,1- 是
i_pproductofferid       in          varchar2,            -- 增值产品对应的捆绑类套餐 ID
--added by youqunxia20130818 order3.02.01
i_varifee               in          varchar2,            -- 可变价格
i_eventid               in          varchar2,            -- 事件 ID
i_isexperience          in          varchar2,            -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
i_subscribetype         in          varchar2,            -- 订购形式:0:非批量受理 1: 批量受理
i_chargetime            in          varchar2,            -- 首次扣费时间
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos              out         number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_productsubid          out         varchar2,            -- 产品订购关系代码
o_porductsubindex       out         number               -- 产品订购关系序号

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14                   char(14)    := to_char(sysdate ,'yyyymmddhh24miss');
v_sysdate8                    char(8)     := substr(v_sysdate14,1,8);
v_plantime                    char(8)     := substr(v_sysdate14,1,8);
v_sysmonth6                   char(6)     := substr(v_sysdate14,1,6);
v_curmonth                    number(2)   := to_number(substr(v_sysdate14,5,2));        -- 长期寄存以后月份
v_curstrmonth                 char(2)     := lpad(to_char(v_curmonth),2,'0');           -- 长期寄存以后月份, 字符型
v_curmonthendtime             char(14)    := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')),'yyyymmdd')||'235959';
v_freenoticetime1             char(14)    := '00000000000000';

v_updateflag                  number(3)                                                  := 0;                                              -- 长期寄存更新胜利标记
v_retvalue                    number(10)                                                 := 0;                                              -- 长期寄存序列值
v_freemsisdntype              number(3)                                                  := 1;                                              -- 长期寄存收费期揭示的号码类型
v_sql                         varchar2(3072)                                             := ' ';                                            -- 长期寄存动静 sql
v_hasrecord                   number(3)                                                  := 0;                                              -- 长期寄存产品订购关系是否存在
v_issecondproduct             number(3)                                                  := i_issecondproduct;                              -- 订购流程子类型 0: 一般订购 1: 业务订购 2: 待生效订购关系订购 3: 纯包量反复订购 6: 可变价的反复订购 7: 体验转正式的反复订购
v_isservicesub                number(3)                                                  := 0;                                              -- 长期寄存是否业务订购(189 邮箱)
v_temp                        number(10)                                                 := 0;                                              -- 长期寄存变量

v_productsubindex             zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                                              -- 长期寄存订购关系序号
v_productsubid                zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';                                            -- 长期寄存订购关系代码
v_servicetype                 zxdbm_200.s200_user_subscription.servicetype%type          := i_servicetype;                                  -- 长期寄存业务能力类型
v_subcapability               zxdbm_200.s200_user_subscription.subcapability%type        := i_subcapability;                                -- 长期寄存业务能力子类型
v_serviceindex                zxdbm_200.s200_user_subscription.serviceindex%type         := i_serviceindex;                                 -- 长期寄存业务序号
v_serviceid                   zxdbm_200.s200_user_subscription.serviceid%type            := i_serviceid;                                    -- 长期寄存业务代码
v_productindex                zxdbm_200.s200_user_subscription.productindex%type         := i_productindex;                                 -- 长期寄存产品序号
v_productid                   zxdbm_200.s200_user_subscription.productid%type            := i_productid;                                    -- 长期寄存产品代码
v_propkgindex                 zxdbm_200.s200_user_subscription.productpkgindex%type      := 0;                                              -- 长期寄存套餐序号
v_propkgid                    zxdbm_200.s200_user_subscription.productpkgid%type         := ' ';                                            -- 长期寄存套餐代码
v_contentindex                zxdbm_200.s200_user_subscription.contentindex%type         := 0;                                              -- 长期寄存内容序号
v_contentid                   zxdbm_200.s200_user_subscription.contentid%type            := ' ';                                            -- 长期寄存内容代码
v_corpindex                   zxdbm_200.s200_user_subscription.corpindex%type            := i_corpindex;                                    -- 长期寄存团体序号
v_corpid                      zxdbm_200.s200_user_subscription.corpid%type               := i_corpid;                                       -- 长期寄存团体代码
v_cpindex                     zxdbm_200.s200_user_subscription.cpindex%type              := i_cpindex;                                      -- 长期寄存 CP/SP 序号
v_cpid                        zxdbm_200.s200_user_subscription.cpid%type                 := i_cpid;                                         -- 长期寄存 CP/SP 代码
v_srcmsisdn                   zxdbm_200.s200_user_subscription.subscriber%type           := i_srcmsisdn;                                    -- 发起方 / 赠送方用户号码
v_usemsisdn                   zxdbm_200.s200_user_subscription.usercode%type             := i_usemsisdn;                                    -- 应用方 / 受赠方用户号码
v_paymsisdn                   zxdbm_200.s200_user_subscription.payuser%type              := i_paymsisdn;                                    -- 计费方用户号码
v_subscribemode               zxdbm_200.s200_user_subscription.subscribemode%type        := 1;                                              -- 长期寄存订购形式
v_subscribechannel            zxdbm_200.s200_user_subscription.subscribechannel%type     := 3;                                              -- 长期寄存订购渠道
v_subscribeoptype             zxdbm_200.s200_user_subscription.subscribeoptype%type      := 0;                                              -- 长期寄存订购操作
v_cancelmode                  zxdbm_200.s200_user_subscription.cancelmode%type           := 0;                                              -- 长期寄存订购形式
v_cancelchannel               zxdbm_200.s200_user_subscription.cancelchannel%type        := 0;                                              -- 长期寄存订购渠道
v_canceloptype                zxdbm_200.s200_user_subscription.canceloptype%type         := 0;                                              -- 长期寄存订购操作
v_pausemode                   zxdbm_200.s200_user_subscription.pausemode%type            := 0;                                              -- 长期寄存产品暂停起因
v_resumemode                  zxdbm_200.s200_user_subscription.resumemode%type           := 0;                                              -- 长期寄存产品复原起因
v_substatus                   zxdbm_200.s200_user_subscription.status%type               := i_substatus;                                    -- 长期寄存产品订购关系状态
v_autocontinue                zxdbm_200.s200_user_subscription.autocontinue%type         := i_autocontinue;                                 -- 长期寄存周期性定购,是否主动续订
v_pushid                      zxdbm_200.s200_user_subscription.pushid%type               := ' ';                                            -- 长期寄存推荐者 ID
v_substarttime                zxdbm_200.s200_user_subscription.starttime%type            := i_substarttime;                                 -- 长期寄存定购失效工夫
v_subendtime                  zxdbm_200.s200_user_subscription.endtime%type              := i_subendtime;                                   -- 长期寄存定购生效工夫
v_lastrenttime                zxdbm_200.s200_user_subscription.lastrenttime%type         := i_lastrenttime;                                 -- 长期寄存上次扣租工夫
v_nextrentdate                zxdbm_200.s200_user_subscription.nextrentdate%type         := i_nextrentdate;                                 -- 长期寄存下次扣租日期
v_payfordate                  zxdbm_200.s200_user_subscription.payfordate%type           := i_payfordate;                                   -- 长期寄存月租已付日期
v_returnvalues                zxdbm_200.s200_user_subscription.returnvalues%type         := 0;                                              -- 长期寄存下一周期返还值
v_returntype                  zxdbm_200.s200_user_subscription.returntype%type           := 1;                                              -- 长期寄存返还量类型
v_returnstartdate             zxdbm_200.s200_user_subscription.returnstartdate%type      := '00000000';                                     -- 长期寄存返还值开始日期
v_returnenddate               zxdbm_200.s200_user_subscription.returnenddate%type        := '00000000';                                     -- 长期寄存返还值完结日期
v_fixusetimes                 zxdbm_200.s200_user_subscription.fixusetimes%type          := i_fixusetimes;                                  -- 长期寄存非周期包量容许应用值
v_chargeparty                 zxdbm_200.s200_user_subscription.chargeparty%type          := 0;                                              -- 长期寄存定购时填入,扣月租应用,计费方 0:用户;1:SP;2:团体
v_freetime                    zxdbm_200.s200_user_subscription.freetime%type             := i_freetime;                                     -- 长期寄存产品订购收费日期
v_canceltime                  zxdbm_200.s200_user_subscription.canceltime%type           := '00000000000000';                               -- 长期寄存用户退定工夫
v_firstusetime                zxdbm_200.s200_user_subscription.firstusetime%type         := '00000000000000';                               -- 长期寄存用户首次应用工夫
v_lastusetime                 zxdbm_200.s200_user_subscription.lastusetime%type          := '00000000000000';                               -- 长期寄存用户上次应用工夫
v_tastestarttime              zxdbm_200.s200_user_subscription.tastestarttime%type       := '00000000000000';                               -- 长期寄存体验期开始工夫
v_tasteendtime                zxdbm_200.s200_user_subscription.tasteendtime%type         := '00000000000000';                               -- 长期寄存体验期完结工夫
v_pausetime                   zxdbm_200.s200_user_subscription.pausetime%type            := '00000000000000';                               -- 长期寄存暂停工夫
v_resumetime                  zxdbm_200.s200_user_subscription.resumetime%type           := '00000000000000';                               -- 长期寄存暂停复原工夫
v_subscribeopid               zxdbm_200.s200_user_subscription.subscribeopid%type        := i_opid;                                         -- 长期寄存定购操作员工号
v_cancelopid                  zxdbm_200.s200_user_subscription.cancelopid%type           := ' ';                                            -- 长期寄存退定操作员工号
v_cancelreason                zxdbm_200.s200_user_subscription.cancelreason%type         := ' ';                                            -- 长期寄存退定起因形容
v_lastrent                    zxdbm_200.s200_user_subscription.lastrent%type             := i_subfee;                                       -- 长期寄存上次扣租金额
v_msisdntype                  zxdbm_200.s200_user_subscription.msisdntype%type           := i_usemsisdntype;                                -- 长期寄存用户号码类型 1-msisdn,2-phs,3-pstn,4-IPTV 接入号,5- 宽带接入号,6- 固定 IP
v_beupdatedproductid          zxdbm_200.s200_user_subscription.productid%type            := i_cancelproductid;                              -- 长期寄存产品代码
v_mdbsubstatus                zxdbm_200.s200_user_subscription.status%type               := 0;                                              -- 长期寄存产品订购关系状态
v_productpkgindex             zxdbm_200.s200_user_subscription.productpkgindex%type      := 0;                                              -- 长期寄存产品订购关系状态
v_pproductofferid             zxdbm_200.s200_user_subscription.pproductofferid%type      := ' ';                                            -- 长期寄存增值产品对应的捆绑类套餐 ID
--added by youqunxia20130818 order3.02.01
v_varifee                     zxdbm_200.s200_user_subscription.varifee%type              := '';                                             -- 长期寄存以后订购关系中的可变价格
v_eventid                     zxdbm_200.s200_user_subscription.eventid%type              := '';                                             -- 长期寄存事件 ID
v_isexperience                zxdbm_200.s200_user_subscription.isexperience%type         := i_isexperience;                                 -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
v_subscribetype               zxdbm_200.s200_user_subscription.subscribetype%type        := i_subscribetype;                                -- 订购形式:0:非批量受理 1: 批量受理 默认为 0
v_chargetime                  zxdbm_200.s200_user_subscription.chargetime%type           := '00000000000000';                               -- 首次扣费时间

-- 被 189 替换的订购关系
v_cancelproductsubindex       zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                                              -- 长期寄存订购关系序号
v_cancelproductsubid          zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';                                            -- 长期寄存订购关系代码
v_cancelservicetype           zxdbm_200.s200_user_subscription.servicetype%type          := i_servicetype;                                  -- 长期寄存业务能力类型
v_cancelsubcapability         zxdbm_200.s200_user_subscription.subcapability%type        := i_subcapability;                                -- 长期寄存业务能力子类型
v_cancelserviceindex          zxdbm_200.s200_user_subscription.serviceindex%type         := i_serviceindex;                                 -- 长期寄存业务序号
v_cancelserviceid             zxdbm_200.s200_user_subscription.serviceid%type            := i_serviceid;                                    -- 长期寄存业务代码
v_cancelproductindex          zxdbm_200.s200_user_subscription.productindex%type         := i_productindex;                                 -- 长期寄存产品序号
v_cancelproductid             zxdbm_200.s200_user_subscription.productid%type            := i_productid;                                    -- 长期寄存产品代码
v_cancelpropkgindex           zxdbm_200.s200_user_subscription.productpkgindex%type      := 0;                                              -- 长期寄存套餐序号
v_cancelpropkgid              zxdbm_200.s200_user_subscription.productpkgid%type         := ' ';                                            -- 长期寄存套餐代码
v_cancelcontentindex          zxdbm_200.s200_user_subscription.contentindex%type         := 0;                                              -- 长期寄存内容序号
v_cancelcontentid             zxdbm_200.s200_user_subscription.contentid%type            := ' ';                                            -- 长期寄存内容代码
v_cancelcorpindex             zxdbm_200.s200_user_subscription.corpindex%type            := i_corpindex;                                    -- 长期寄存团体序号
v_cancelcorpid                zxdbm_200.s200_user_subscription.corpid%type               := i_corpid;                                       -- 长期寄存团体代码
v_cancelcpindex               zxdbm_200.s200_user_subscription.cpindex%type              := i_cpindex;                                      -- 长期寄存 CP/SP 序号
v_cancelcpid                  zxdbm_200.s200_user_subscription.cpid%type                 := i_cpid;                                         -- 长期寄存 CP/SP 代码
v_cancelsubscriber            zxdbm_200.s200_user_subscription.subscriber%type           := i_srcmsisdn;                                    -- 发起方 / 赠送方用户号码
v_cancelusercode              zxdbm_200.s200_user_subscription.usercode%type             := i_usemsisdn;                                    -- 应用方 / 受赠方用户号码
v_cancelpayuser               zxdbm_200.s200_user_subscription.payuser%type              := i_paymsisdn;                                    -- 计费方用户号码
v_cancelsubscribemode         zxdbm_200.s200_user_subscription.subscribemode%type        := 1;                                              -- 长期寄存订购形式
v_cancelsubscribechannel      zxdbm_200.s200_user_subscription.subscribechannel%type     := 3;                                              -- 长期寄存订购渠道
v_cancelsubscribeoptype       zxdbm_200.s200_user_subscription.subscribeoptype%type      := 0;                                              -- 长期寄存订购操作
v_cancelcancelmode            zxdbm_200.s200_user_subscription.cancelmode%type           := 0;                                              -- 长期寄存订购形式
v_cancelcancelchannel         zxdbm_200.s200_user_subscription.cancelchannel%type        := 0;                                              -- 长期寄存订购渠道
v_cancelpausemode             zxdbm_200.s200_user_subscription.pausemode%type            := 0;                                              -- 长期寄存产品暂停起因
v_cancelresumemode            zxdbm_200.s200_user_subscription.resumemode%type           := 0;                                              -- 长期寄存产品复原起因
v_cancelsubstatus             zxdbm_200.s200_user_subscription.status%type               := i_substatus;                                    -- 长期寄存产品订购关系状态
v_cancelstatustime            zxdbm_200.s200_user_subscription.statustime%type           := '00000000000000';
v_cancelautocontinue          zxdbm_200.s200_user_subscription.autocontinue%type         := i_autocontinue;                                 -- 长期寄存周期性定购,是否主动续订
v_cancelpushid                zxdbm_200.s200_user_subscription.pushid%type               := ' ';                                            -- 长期寄存推荐者 ID
v_cancelsubstarttime          zxdbm_200.s200_user_subscription.starttime%type            := i_substarttime;                                 -- 长期寄存定购失效工夫
v_cancelsubendtime            zxdbm_200.s200_user_subscription.endtime%type              := i_subendtime;                                   -- 长期寄存定购生效工夫
v_cancellastrenttime          zxdbm_200.s200_user_subscription.lastrenttime%type         := i_lastrenttime;                                 -- 长期寄存上次扣租工夫
v_cancelnextrentdate          zxdbm_200.s200_user_subscription.nextrentdate%type         := i_nextrentdate;                                 -- 长期寄存下次扣租日期
v_cancelpayfordate            zxdbm_200.s200_user_subscription.payfordate%type           := i_payfordate;                                   -- 长期寄存月租已付日期
v_cancelreturnvalues          zxdbm_200.s200_user_subscription.returnvalues%type         := 0;                                              -- 长期寄存下一周期返还值
v_cancelreturntype            zxdbm_200.s200_user_subscription.returntype%type           := 1;                                              -- 长期寄存返还量类型
v_cancelreturnstartdate       zxdbm_200.s200_user_subscription.returnstartdate%type      := '00000000';                                     -- 长期寄存返还值开始日期
v_cancelreturnenddate         zxdbm_200.s200_user_subscription.returnenddate%type        := '00000000';                                     -- 长期寄存返还值完结日期
v_cancelfixusetimes           zxdbm_200.s200_user_subscription.fixusetimes%type          := i_fixusetimes;                                  -- 长期寄存非周期包量容许应用值
v_cancelchargeparty           zxdbm_200.s200_user_subscription.chargeparty%type          := 0;                                              -- 长期寄存定购时填入,扣月租应用,计费方 0:用户;1:SP;2:团体
v_cancelfreetime              zxdbm_200.s200_user_subscription.freetime%type             := i_freetime;                                     -- 长期寄存产品订购收费日期
v_cancelcreatetime            zxdbm_200.s200_user_subscription.freetime%type             := v_sysdate14;                                    -- 长期寄存产品订购创立日期
v_cancelcanceltime            zxdbm_200.s200_user_subscription.canceltime%type           := '00000000000000';                               -- 长期寄存用户退定工夫
v_cancelfirstusetime          zxdbm_200.s200_user_subscription.firstusetime%type         := '00000000000000';                               -- 长期寄存用户首次应用工夫
v_cancellastusetime           zxdbm_200.s200_user_subscription.lastusetime%type          := '00000000000000';                               -- 长期寄存用户上次应用工夫
v_canceltastestarttime        zxdbm_200.s200_user_subscription.tastestarttime%type       := '00000000000000';                               -- 长期寄存体验期开始工夫
v_canceltasteendtime          zxdbm_200.s200_user_subscription.tasteendtime%type         := '00000000000000';                               -- 长期寄存体验期完结工夫
v_cancelpausetime             zxdbm_200.s200_user_subscription.pausetime%type            := '00000000000000';                               -- 长期寄存暂停工夫
v_cancelresumetime            zxdbm_200.s200_user_subscription.resumetime%type           := '00000000000000';                               -- 长期寄存暂停复原工夫
v_cancelsubscribeopid         zxdbm_200.s200_user_subscription.subscribeopid%type        := i_opid;                                         -- 长期寄存定购操作员工号
v_cancelcancelopid            zxdbm_200.s200_user_subscription.cancelopid%type           := ' ';                                            -- 长期寄存退定操作员工号
v_cancelcancelreason          zxdbm_200.s200_user_subscription.cancelreason%type         := ' ';                                            -- 长期寄存退定起因形容
v_cancellastrent              zxdbm_200.s200_user_subscription.lastrent%type             := i_subfee;                                       -- 长期寄存上次扣租金额
v_cancelmsisdntype            zxdbm_200.s200_user_subscription.msisdntype%type           := i_usemsisdntype;                                -- 长期寄存用户号码类型 1-msisdn,2-phs,3-pstn,4-IPTV 接入号,5- 宽带接入号,6- 固定 IP
v_cancelpseudocode            zxdbm_200.s200_user_subscription.pseudocode%type           := ' ';                                            -- 长期寄存用户号码类型 1-msisdn,2-phs,3-pstn,4-IPTV 接入号,5- 宽带接入号,6- 固定 IP
v_canceloldproductid          zxdbm_200.s200_user_subscription.oldproductid%type         := ' ';                                            -- 长期寄存被替换产品 ID
v_cancelpproductofferid       zxdbm_200.s200_user_subscription.pproductofferid%type      := ' ';                                            -- 长期寄存增值产品对应的捆绑类套餐 ID

--added by youqunxia20130818 order3.02.01
v_cancelvarifee               zxdbm_200.s200_user_subscription.varifee%type              := '';                                      -- 长期寄存可变价格 
v_canceleventid               zxdbm_200.s200_user_subscription.eventid%type              := '';                                       -- 长期寄存事件 ID
v_cancelisexperience          zxdbm_200.s200_user_subscription.isexperience%type         := i_isexperience;                                 -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
v_cancelsubscribetype         zxdbm_200.s200_user_subscription.subscribetype%type        := i_subscribetype;                                -- 订购形式:0:非批量受理 1: 批量受理
v_cancelchargetime            zxdbm_200.s200_user_subscription.chargetime%type           := '00000000000000';                                   -- 首次扣费时间

v_unitvol                     zxdbm_200.s200_product_fee.unitvol%type                    := 10;                                             -- 长期寄存绝对于目前最小计量单位的量,时长为百毫秒,流量为 byte
v_chargetype                  zxdbm_200.s200_product_fee.chargetype%type                 := 0;                                              -- 长期寄存根本计费类型

v_popuitem                    zxdbm_200.s200_product.popularizeitem%type                 := 2;                                              -- 长期推广期计费类型
v_popustart                   zxdbm_200.s200_product.popularizestart%type                := v_sysdate8;                                     -- 长期推广期计费类型
v_popustop                    zxdbm_200.s200_product.popularizestop%type                 := v_sysdate8;                                     -- 长期推广期计费类型
v_needcharge                  zxdbm_200.s200_product.needcharge%type                     := 1;                                              -- 长期是否须要计费

v_fixtotalres                 zxdbm_ismp.ssrv_user_totalamount.fixtotalres%type          := 0;                                              -- 长期寄存包量最大容许应用资源,0- 无限度
v_pseudocode                  zxdbm_ismp.susr_basic.pseudocode%type                       := ' ';
v_payuserindex                zxdbm_ismp.susr_basic.userindex%type                       := i_payuserindex;                                 -- 长期寄存计费方用户序号

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos              := 0;
o_debuginfo             := ' ';
o_productsubid          := ' ';
o_porductsubindex       := 0;

/
多 DB,赠送,订购关系鉴权 此局部鉴权可能有问题,后续再查看批改
*/

if (i_mutidbmode = 1 and i_isthird = 1) then
    v_hasrecord := 1;
    begin
        select status,productpkgindex
        into   v_mdbsubstatus,v_productpkgindex
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and productid = v_productid;
    exception when no_data_found then
        v_hasrecord := 0;
    when others then
        o_retcode   := 506;
        o_debugpos := 1;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_hasrecord > 0) then
        if v_productpkgindex <> 0 then
            o_retcode   := 1200;   -- 该产品属于套餐,且用户已订购该套餐
            o_debugpos := 2;
            o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the user has subscribed pkg including this product.';
            return;
        end if;
        if v_mdbsubstatus <> 4 and i_chargetype <> 4 then --(待生效订购关系 或 纯包量)能够反复订购
            o_retcode   := 1200;        -- 用户曾经定购该产品
            o_debugpos := 3;
            o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||'mutidbmode, the user has subscribed the product.';
            return;
        elsif i_chargetype = 4 then  -- 判断程序不能颠倒
            v_issecondproduct := 3;
        elsif v_mdbsubstatus = 4 then
            v_issecondproduct := 2;    -- 待生效订购关系能够订购
        end if;
    end if;

    -- 查看该产品所属的业务是否是互斥的(只有短彩 WAP 的该字段可能为 1)
    begin
        select isservicesub into v_isservicesub
        from  zxdbm_200.s200_service
        where  serviceindex = i_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 4;
        o_debuginfo := 'i_serviceindex='||i_serviceindex||'mutidbmode, the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 5;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    -- 业务订购关系鉴权(目前仅 MVS,DLS,BREW 为内容类业务)if i_servicetype not in (5,6,98) and v_hasrecord = 0 then
        v_issecondproduct := 1;
        v_hasrecord := 0;
        begin
            select productid,productpkgindex
            into   v_beupdatedproductid,v_productpkgindex
            from   zxdbm_200.s200_user_subscription
            where  usercode = v_usemsisdn and cpid = v_cpid and serviceid = v_serviceid;
        exception when no_data_found then
            v_issecondproduct := 0;
            v_hasrecord := 0;
        when others then
            o_retcode   := 506;
            o_debugpos := 6;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if v_hasrecord > 0 then
            if v_productpkgindex <> 0 then
                o_retcode   := 1001210;                          -- 不能替换产品组合蕴含的产品
                o_debugpos := 7;
                o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productpkgindex ='||v_productpkgindex||', can not replace product in the pkg.';
                return;
            end if;
            if v_beupdatedproductid <> v_productid then
                if i_servicetype in (1,2,3) and v_isservicesub = 1 then       --sms,mms,wap 业务订购
                    null;
                else
                    o_retcode   := 1001210;
                    o_debugpos := 8;
                    o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', serviceid ='||v_serviceid||'mutidbmode, the user has subscribed a product in the same service.';
                    return;
                end if;
            end if;
        end if;
    end if;

    -- 业务订购 / 待生效订购关系只反对包月类产品
    if v_issecondproduct in (1,2) then
        if v_issecondproduct = 2 and i_servicetype = 5 and i_chargetype in (3,6,8) then
            --MVS 的包周期产品在订购关系待生效状态时能够续订
            null;
        else
            if i_chargetype in (2,5,7) or i_needcharge =0  then
                null;
            else
                o_retcode   := 9999;
                o_debugpos := 9;
                o_debuginfo := 'i_chargetype='||i_chargetype||'mutidbmode, No_month_Product can not update this subscription.';
            end if;
        end if;
    end if;
end if;

if (i_pcodemsisdnswitch <> 0) then
    v_pseudocode := i_pseudocode;        -- 用户伪码
end if;

/
–part– – 订购 2 – 订购渠道、订购形式
*/

-- 设置订购形式
if (i_isthird = 1) then
    v_subscribemode := 4;
elsif (i_cmdchannel = 4) then
    v_subscribemode := 2;
elsif (i_cmdchannel = 0) then
    v_subscribemode := 5;
elsif (i_cmdchannel = 27) then
    v_subscribemode := 3;
else
    v_subscribemode := 1;
end if;
-- 查问订购渠道
begin
    select portalchannel into v_subscribechannel
    from zxdbm_ismp.ssrv_channel_map
    where innerchannel = i_cmdchannel;
exception when no_data_found then
    v_subscribechannel := i_cmdchannel * 1000;
when others then
    o_retcode   := 506;
    o_debugpos := 11;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
-- 设置计费方
if (v_paymsisdn = v_corpid) then
    v_chargeparty  := 2;
else
    v_chargeparty  := 0;
end if;
-- 解决定购操作员工号
if v_subscribeopid is null then
    v_subscribeopid := ' ';
end if;

/**
设置订购时产生订购关系替换时,填历史订购关系表中的字段
**/

-- 设置退订渠道
v_cancelcancelchannel := v_subscribechannel;
-- 设置退订形式
if (i_cmdchannel = 6) then
    v_cancelcancelmode := 4;
elsif (i_cmdchannel in (0,20)) then
    v_cancelcancelmode := 3;
elsif (i_cmdchannel = 4) then
    v_cancelcancelmode := 5;
else
    v_cancelcancelmode := 2;
end if;

/**
–part– – 订购 2 – 事务开始
**/

begin
    if v_issecondproduct not in (1,2,6,7) then
    --0: 一般订购,3: 纯包量反复订购
    -- 产品订购落订购关系
        if i_chargetype = 4 and i_cyctype = 0 and v_issecondproduct = 3 then -- 纯包量的订购关系更新
            -- 将订购关系转入历史表
           /*
           20110525wyl
           1. 删除从订购关系表中读出 cancelmode,cancelchannel 两个字段。(在后面曾经赋值,再次读出会笼罩)*/
            begin
                select subscriptionindex,subscriptionid,servicetype,subcapability,
                       serviceindex,serviceid,productindex,productid,productpkgindex,
                       productpkgid,contentindex,contentid,corpindex,corpid,cpindex,
                       cpid,subscribemode,subscribechannel,subscribeoptype,
                       pausemode,resumemode,status,statustime,autocontinue,subscriber,usercode,
                       payuser,pushid,starttime,endtime,lastrenttime,
                       nextrentdate,payfordate,returnvalues,returntype,
                       returnstartdate,returnenddate,fixusetimes,chargeparty,
                       freetime,createtime,canceltime,firstusetime,lastusetime,
                       tastestarttime,tasteendtime,pausetime,resumetime,
                       subscribeopid,cancelopid,cancelreason,lastrent,msisdntype,pseudocode,oldproductid,
                       pproductofferid,varifee,eventid,isexperience,subscribetype,chargetime
                into   v_cancelproductsubindex,v_cancelproductsubid,v_cancelservicetype,v_cancelsubcapability,
                       v_cancelserviceindex,v_cancelserviceid,v_cancelproductindex,v_cancelproductid,v_cancelpropkgindex,
                       v_cancelpropkgid,v_cancelcontentindex,v_cancelcontentid,v_cancelcorpindex,v_cancelcorpid,v_cancelcpindex,
                       v_cancelcpid,v_cancelsubscribemode,v_cancelsubscribechannel,v_cancelsubscribeoptype,
                       v_cancelpausemode,v_cancelresumemode,v_cancelsubstatus,v_cancelstatustime,v_cancelautocontinue,v_cancelsubscriber,v_cancelusercode,
                       v_cancelpayuser,v_cancelpushid,v_cancelsubstarttime,v_cancelsubendtime,v_cancellastrenttime,
                       v_cancelnextrentdate,v_cancelpayfordate,v_cancelreturnvalues,v_cancelreturntype,
                       v_cancelreturnstartdate,v_cancelreturnenddate,v_cancelfixusetimes,v_cancelchargeparty,
                       v_cancelfreetime,v_cancelcreatetime,v_cancelcanceltime,v_cancelfirstusetime,v_cancellastusetime,
                       v_canceltastestarttime,v_canceltasteendtime,v_cancelpausetime,v_cancelresumetime,
                       v_cancelsubscribeopid,v_cancelcancelopid,v_cancelcancelreason,v_cancellastrent,v_cancelmsisdntype,v_cancelpseudocode,v_canceloldproductid,
                       v_cancelpproductofferid,v_cancelvarifee,v_canceleventid,v_cancelisexperience,v_cancelsubscribetype,v_cancelchargetime
                from   zxdbm_200.s200_user_subscription
                where  usercode = v_usemsisdn and productid = v_beupdatedproductid;
            exception when no_data_found then
                o_retcode   := 1201;
                o_debugpos := 12;
                o_debuginfo := 'the subscription dose not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 13;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;

— v_cancelcancelmode := 6;
— v_cancelcancelchannel := 110;

            v_cancelcanceltime := v_sysdate14;
            v_sql := 'insert into zxdbm_200.s200_user_subs_hist' || v_curstrmonth ||
            '(subscriptionindex,subscriptionid,servicetype,subcapability,'||
            'serviceindex,serviceid,productindex,productid,contentindex,contentid,'||
            'productpkgindex,productpkgid,corpindex,corpid,cpindex,cpid,subscribemode,'||
            'subscribechannel,subscribeoptype,cancelmode,cancelchannel,canceloptype,'||
            'pausemode,resumemode,status,statustime,autocontinue,subscriber,usercode,'||
            'payuser,pushid,starttime,endtime,lastrenttime,nextrentdate,payfordate,'||
            'returnvalues,returntype,returnstartdate,returnenddate,fixusetimes,'||
            'chargeparty,freetime,createtime,canceltime,firstusetime,lastusetime,'||
            'tastestarttime,tasteendtime,pausetime,resumetime,subscribeopid,'||
            'cancelopid,cancelreason,lastrent,msisdntype,pseudocode,oldproductid,pproductofferid,varifee,eventid,'||
            'isexperience,subscribetype,chargetime)'||
            'values(:p1,:p2,:p3,:p4,'||
            ':p5,:p6,:p7,:p8,:p9,:p10,'||
            ':p11,:p12,:p13,:p14,:p15,:p16,:p17,'||
            ':p18,:p19,:p20,:p21,:p22,'||
            ':p23,:p24,:p25,:p26,:p27,:p28,'||
            ':p29,:p30,:p31,:p32,:p33,:p34,:p35,'||
            ':p36,:p37,:p38,:p39,:p40,'||
            ':p41,:p42,:p43,:p44,:p45,:p46,'||
            ':p47,:p48,:p49,:p50,:p51,'||
            ':p52,:p53,:p54,:p55,:p56,:p57,:p58,:p59,:p60,:p61,'||
            ':p62,:p63,:p64)';
            begin
            -- 插入历史订购关系
                execute immediate v_sql
                using   v_cancelproductsubindex,v_cancelproductsubid,v_cancelservicetype,v_cancelsubcapability,
                        v_cancelserviceindex,v_cancelserviceid,v_cancelproductindex,v_cancelproductid,v_cancelcontentindex,v_cancelcontentid,
                        v_cancelpropkgindex,v_cancelpropkgid,v_cancelcorpindex,v_cancelcorpid,v_cancelcpindex,v_cancelcpid,v_cancelsubscribemode,
                        v_cancelsubscribechannel,v_cancelsubscribeoptype,v_cancelcancelmode,v_cancelcancelchannel,v_canceloptype,
                        v_cancelpausemode,v_cancelresumemode,v_cancelsubstatus,v_cancelstatustime,v_cancelautocontinue,v_cancelsubscriber,v_cancelusercode,
                        v_cancelpayuser,v_cancelpushid,v_cancelsubstarttime,v_cancelsubendtime,v_cancellastrenttime,v_cancelnextrentdate,v_cancelpayfordate,
                        v_cancelreturnvalues,v_cancelreturntype,v_cancelreturnstartdate,v_cancelreturnenddate,v_cancelfixusetimes,
                        v_cancelchargeparty,v_cancelfreetime,v_cancelcreatetime,v_cancelcanceltime,v_cancelfirstusetime,v_cancellastusetime,
                        v_canceltastestarttime,v_canceltasteendtime,v_cancelpausetime,v_cancelresumetime,v_cancelsubscribeopid,
                        v_cancelcancelopid,v_cancelcancelreason,v_cancellastrent,v_cancelmsisdntype,v_cancelpseudocode,v_canceloldproductid,
                        v_cancelpproductofferid,v_cancelvarifee,v_canceleventid,v_cancelisexperience,v_cancelsubscribetype,v_cancelchargetime;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 14;
                    o_debuginfo := 'no subs exist.';
                    rollback;
                    return;
                end if;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 15;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
            -- 对于非周期包量的产品,间接更新订购关系
            -- 生成新的订购关系 ID
            zxdbm_ismp.sp_getmaxvalue ('slp_order_prdindex',1,v_productsubindex);
            if (v_productsubindex = 0) then
                o_retcode   := 506;
                o_debugpos := 16;
                o_debuginfo := 'get slp_order_prdindex failed.';
                rollback;
                return;
            end if;
            begin
                select trunc(dbms_random.value(10000,99999)) into v_retvalue from dual;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 17;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
            v_productsubid := v_usemsisdn || to_char(v_retvalue);
            begin
                update zxdbm_200.s200_user_subscription
                set    subscriptionindex    = v_productsubindex,
                       subscriptionid       = v_productsubid,
                       --fixusetimes          = fixusetimes + v_fixusetimes,
                       starttime            = v_substarttime,
                       endtime              = v_subendtime,
                       status               = v_substatus,
                       --freetime             = v_freetime,
                       createtime           = v_sysdate14,
                       lastusetime          = v_lastusetime,
                       statustime           = v_sysdate14,
                       lastrenttime         = decode(v_lastrent,0,lastrenttime,v_sysdate14),
                       lastrent             = v_lastrent,
                       subscribemode        = v_subscribemode,
                       subscribechannel     = v_subscribechannel,
                       subscribeoptype      = v_subscribeoptype,
                       subscribeopid        = v_subscribeopid
                where  usercode = v_usemsisdn and productid = v_productid
                returning subscriptionindex,subscriptionid into v_productsubindex,v_productsubid;
                if (sql%rowcount = 0) then
                    v_updateflag := 0;
                else
                    v_updateflag := 1;
                end if;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 18;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
        end if;

        if (v_updateflag = 0) then
        -- 生成新的订购关系
            zxdbm_ismp.sp_getmaxvalue ('slp_order_prdindex',1,v_productsubindex);
            if (v_productsubindex = 0) then
                o_retcode   := 506;
                o_debugpos := 19;
                o_debuginfo := 'get slp_order_prdindex failes.';
                rollback;
                return;
            end if;
            begin
                select trunc(dbms_random.value(10000,99999)) into v_retvalue from dual;
            exception when others then
                o_retcode   := 506;
                o_debugpos  := 20;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
            v_productsubid := v_usemsisdn || to_char(v_retvalue);
            --added by youqunxia20130605  order2.07.10
            -- 对于 VSOP 发动的订购申请,若 ExtC5 非空,则将其填入订购关系表
            if trim(i_pproductofferid) is null then
                v_pproductofferid := ' ';
            else
                v_pproductofferid := i_pproductofferid;
            end if;
            --added by youqunxia 20130818 Order3.02.01
            -- 如果 fee 值非空,将其填入订购关系表
            v_varifee := to_number(i_varifee);
            -- 如果 eventid 值非空,将其填入订购关系表
            if trim(i_eventid) is not null then
                v_eventid := i_eventid;
            else
                v_eventid := '';
            end if;
            -- 如果 chargetime 值非空,将其填入订购关系表
            if trim(i_chargetime) is not null then
                v_chargetime := i_chargetime;
            else
                v_chargetime := '00000000000000';
            end if;
            begin
                insert into zxdbm_200.s200_user_subscription
                (subscriptionindex,subscriptionid,servicetype,subcapability,
                serviceindex,serviceid,productindex,productid,productpkgindex,
                productpkgid,contentindex,contentid,corpindex,corpid,cpindex,cpid,
                subscribemode,subscribechannel,subscribeoptype,
                cancelmode,cancelchannel,canceloptype,pausemode,
                resumemode,status,statustime,autocontinue,subscriber,
                usercode,payuser,pushid,starttime,endtime,lastrenttime,
                nextrentdate,payfordate,returnvalues,returntype,
                returnstartdate,returnenddate,fixusetimes,chargeparty,
                freetime,createtime,canceltime,firstusetime,
                lastusetime,tastestarttime,tasteendtime,pausetime,resumetime,
                subscribeopid,cancelopid,cancelreason,lastrent,msisdntype,
                pseudocode,pproductofferid,varifee,eventid,isexperience,subscribetype,chargetime)
                values
                (v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
                v_serviceindex,v_serviceid,v_productindex,v_productid,v_propkgindex,
                v_propkgid,v_contentindex,v_contentid,v_corpindex,v_corpid,v_cpindex,v_cpid,
                v_subscribemode,v_subscribechannel,v_subscribeoptype,
                v_cancelmode,v_cancelchannel,v_canceloptype,v_pausemode,
                v_resumemode,v_substatus,v_sysdate14,v_autocontinue,v_srcmsisdn,
                v_usemsisdn,v_paymsisdn,v_pushid,v_substarttime,v_subendtime,v_lastrenttime,
                v_nextrentdate,v_payfordate,v_returnvalues,v_returntype,
                v_returnstartdate,v_returnenddate,0,v_chargeparty,
                v_freetime,v_sysdate14,v_canceltime,v_firstusetime,
                v_lastusetime,v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,
                v_subscribeopid,v_cancelopid,v_cancelreason,v_lastrent,v_msisdntype,
                v_pseudocode,v_pproductofferid,v_varifee,v_eventid,v_isexperience,v_subscribetype,v_chargetime);
            exception when others then
                o_retcode   := 506;
                o_debugpos := 21;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
        end if;
    --added by youqunxia 20130818  Order3.02.01
    -- 可变价的反复订购订购,有定购关系时,按变更价格解决,更新订购关系
    elsif v_issecondproduct = 6 then
         v_varifee := to_number(i_varifee);
        -- 如果 eventid 值非空,将其填入订购关系表
        if trim(i_eventid) is not null then
            v_eventid := i_eventid;
        else
            v_eventid := '';
        end if;
        begin
            update zxdbm_200.s200_user_subscription
            set    status                     = v_substatus,
                   statustime                 = v_sysdate14,
                   starttime                  = v_substarttime,
                   endtime                    = v_subendtime,
                   lastrenttime               = v_lastrenttime,
                   nextrentdate               = v_nextrentdate,
                   payfordate                 = v_payfordate,
                   freetime                   = v_freetime,
                   subscribeopid              = v_subscribeopid,
                   lastrent                   = v_lastrent,
                   varifee                    = v_varifee,
                   eventid                    = v_eventid
            where  usercode = v_usemsisdn and productid = v_productid;
        exception when others then
            o_retcode  := 506;
            o_debugpos := 38;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end;
    --added by youqunxia 20131015  Order3.02.01
    -- 体验转正式的反复订购,更新订购关系
    elsif v_issecondproduct = 7 then
        -- 对于 VSOP 发动的订购申请,若 ExtC5 非空,则将其填入订购关系表
        if trim(i_pproductofferid) is null then
            v_pproductofferid := ' ';
        else
            v_pproductofferid := i_pproductofferid;
        end if;
        v_varifee := to_number(i_varifee);
        -- 如果 eventid 值非空,将其填入订购关系表
        if trim(i_eventid) is not null then
            v_eventid := i_eventid;
        else
            v_eventid := '';
        end if;
        -- 如果 chargetime 值非空,将其填入订购关系表
        if trim(i_chargetime) is not null then
            v_chargetime := i_chargetime;
        else
            v_chargetime := '00000000000000';
        end if;
        begin
            update zxdbm_200.s200_user_subscription
            set    status                     = v_substatus,
                   statustime                 = v_sysdate14,
                   starttime                  = v_substarttime,
                   endtime                    = v_subendtime,
                   lastrenttime               = v_lastrenttime,
                   nextrentdate               = v_nextrentdate,
                   payfordate                 = v_payfordate,
                   freetime                   = v_freetime,
                   subscribeopid              = v_subscribeopid,
                   lastrent                   = v_lastrent,
                   pproductofferid            = v_pproductofferid,
                   varifee                    = v_varifee,
                   eventid                    = v_eventid,
                   isexperience               = v_isexperience,
                   subscribetype              = v_subscribetype,
                   chargetime                 = v_chargetime
            where  usercode = v_usemsisdn and productid = v_productid;
        exception when others then
            o_retcode  := 506;
            o_debugpos := 39;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end;
    else
    -- 产品替换:1: 业务订购 2: 待生效订购关系订购
    /*
    20110525wyl
    1. 删除从订购关系表中读出 cancelmode,cancelchannel 两个字段。(在后面曾经赋值,再次读出会笼罩)*/
        begin
            select subscriptionindex,subscriptionid,servicetype,subcapability,
                   serviceindex,serviceid,productindex,productid,productpkgindex,
                   productpkgid,contentindex,contentid,corpindex,corpid,cpindex,
                   cpid,subscribemode,subscribechannel,subscribeoptype,
                   pausemode,resumemode,status,statustime,autocontinue,subscriber,usercode,
                   payuser,pushid,starttime,endtime,lastrenttime,
                   nextrentdate,payfordate,returnvalues,returntype,
                   returnstartdate,returnenddate,fixusetimes,chargeparty,
                   freetime,createtime,canceltime,firstusetime,lastusetime,
                   tastestarttime,tasteendtime,pausetime,resumetime,
                   subscribeopid,cancelopid,cancelreason,lastrent,msisdntype,pseudocode,oldproductid,
                   pproductofferid,varifee,eventid,isexperience,subscribetype,chargetime
            into   v_cancelproductsubindex,v_cancelproductsubid,v_cancelservicetype,v_cancelsubcapability,
                   v_cancelserviceindex,v_cancelserviceid,v_cancelproductindex,v_cancelproductid,v_cancelpropkgindex,
                   v_cancelpropkgid,v_cancelcontentindex,v_cancelcontentid,v_cancelcorpindex,v_cancelcorpid,v_cancelcpindex,
                   v_cancelcpid,v_cancelsubscribemode,v_cancelsubscribechannel,v_cancelsubscribeoptype,
                   v_cancelpausemode,v_cancelresumemode,v_cancelsubstatus,v_cancelstatustime,v_cancelautocontinue,v_cancelsubscriber,v_cancelusercode,
                   v_cancelpayuser,v_cancelpushid,v_cancelsubstarttime,v_cancelsubendtime,v_cancellastrenttime,
                   v_cancelnextrentdate,v_cancelpayfordate,v_cancelreturnvalues,v_cancelreturntype,
                   v_cancelreturnstartdate,v_cancelreturnenddate,v_cancelfixusetimes,v_cancelchargeparty,
                   v_cancelfreetime,v_cancelcreatetime,v_cancelcanceltime,v_cancelfirstusetime,v_cancellastusetime,
                   v_canceltastestarttime,v_canceltasteendtime,v_cancelpausetime,v_cancelresumetime,
                   v_cancelsubscribeopid,v_cancelcancelopid,v_cancelcancelreason,v_cancellastrent,v_cancelmsisdntype,v_cancelpseudocode,v_canceloldproductid,
                   v_cancelpproductofferid,v_cancelvarifee,v_canceleventid,v_cancelisexperience,v_cancelsubscribetype,v_cancelchargetime
            from   zxdbm_200.s200_user_subscription
            where  usercode = v_usemsisdn and productid = v_beupdatedproductid;
        exception when no_data_found then
            o_retcode   := 1201;
            o_debugpos := 22;
            o_debuginfo := 'the subscription dose not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 23;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        v_cancelcanceltime := v_sysdate14;
        v_sql := 'insert into zxdbm_200.s200_user_subs_hist' || v_curstrmonth ||
        '(subscriptionindex,subscriptionid,servicetype,subcapability,'||
        'serviceindex,serviceid,productindex,productid,contentindex,contentid,'||
        'productpkgindex,productpkgid,corpindex,corpid,cpindex,cpid,subscribemode,'||
        'subscribechannel,subscribeoptype,cancelmode,cancelchannel,canceloptype,'||
        'pausemode,resumemode,status,statustime,autocontinue,subscriber,usercode,'||
        'payuser,pushid,starttime,endtime,lastrenttime,nextrentdate,payfordate,'||
        'returnvalues,returntype,returnstartdate,returnenddate,fixusetimes,'||
        'chargeparty,freetime,createtime,canceltime,firstusetime,lastusetime,'||
        'tastestarttime,tasteendtime,pausetime,resumetime,subscribeopid,'||
        'cancelopid,cancelreason,lastrent,msisdntype,pseudocode,oldproductid,'||
        'pproductofferid,varifee,eventid,isexperience,subscribetype,chargetime)'||
        'values(:p1,:p2,:p3,:p4,'||
        ':p5,:p6,:p7,:p8,:p9,:p10,'||
        ':p11,:p12,:p13,:p14,:p15,:p16,:p17,'||
        ':p18,:p19,:p20,:p21,:p22,'||
        ':p23,:p24,:p25,:p26,:p27,:p28,'||
        ':p29,:p30,:p31,:p32,:p33,:p34,:p35,'||
        ':p36,:p37,:p38,:p39,:p40,'||
        ':p41,:p42,:p43,:p44,:p45,:p46,'||
        ':p47,:p48,:p49,:p50,:p51,'||
        ':p52,:p53,:p54,:p55,:p56,:p57,:p58,'||
        ':p59,:p60,:p61,:p62,:p63,:p64)';
        begin
        -- 插入历史订购关系
            execute immediate v_sql
            using   v_cancelproductsubindex,v_cancelproductsubid,v_cancelservicetype,v_cancelsubcapability,
                    v_cancelserviceindex,v_cancelserviceid,v_cancelproductindex,v_cancelproductid,v_cancelcontentindex,v_cancelcontentid,
                    v_cancelpropkgindex,v_cancelpropkgid,v_cancelcorpindex,v_cancelcorpid,v_cancelcpindex,v_cancelcpid,v_cancelsubscribemode,
                    v_cancelsubscribechannel,v_cancelsubscribeoptype,v_cancelcancelmode,v_cancelcancelchannel,v_canceloptype,
                    v_cancelpausemode,v_cancelresumemode,v_cancelsubstatus,v_cancelstatustime,v_cancelautocontinue,v_cancelsubscriber,v_cancelusercode,
                    v_cancelpayuser,v_cancelpushid,v_cancelsubstarttime,v_cancelsubendtime,v_cancellastrenttime,v_cancelnextrentdate,v_cancelpayfordate,
                    v_cancelreturnvalues,v_cancelreturntype,v_cancelreturnstartdate,v_cancelreturnenddate,v_cancelfixusetimes,
                    v_cancelchargeparty,v_cancelfreetime,v_cancelcreatetime,v_cancelcanceltime,v_cancelfirstusetime,v_cancellastusetime,
                    v_canceltastestarttime,v_canceltasteendtime,v_cancelpausetime,v_cancelresumetime,v_cancelsubscribeopid,
                    v_cancelcancelopid,v_cancelcancelreason,v_cancellastrent,v_cancelmsisdntype,v_cancelpseudocode,v_canceloldproductid,
                    v_cancelpproductofferid,v_cancelvarifee,v_canceleventid,v_cancelisexperience,v_cancelsubscribetype,v_cancelchargetime;
            if (sql%rowcount = 0) then
                o_retcode   := 506;
                o_debugpos := 24;
                o_debuginfo := 'no subs exist.';
                rollback;
                return;
            end if;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 25;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end;

        -- 生成新的订购关系 ID
        zxdbm_ismp.sp_getmaxvalue ('slp_order_prdindex',1,v_productsubindex);
        if (v_productsubindex = 0) then
            o_retcode   := 506;
            o_debugpos := 26;
            o_debuginfo := 'get slp_order_prdindex failed.';
            rollback;
            return;
        end if;
        begin
            select trunc(dbms_random.value(10000,99999)) into v_retvalue from dual;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 27;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end;
        v_productsubid := v_usemsisdn || to_char(v_retvalue);
        --added by youqunxia20130605  order2.07.10
        -- 对于 VSOP 发动的订购申请,若 ExtC5 非空,则将其填入订购关系表
        if trim(i_pproductofferid) is null then
            v_pproductofferid := ' ';
        else
            v_pproductofferid := i_pproductofferid;
        end if;
        --added by youqunxia 20130814 Order3.02.01
        v_varifee := to_number(i_varifee);
        -- 如果 eventid 值非空,将其填入订购关系表
        if trim(i_eventid) is not null then
            v_eventid := i_eventid;
        else
            v_eventid := '';
        end if;
        -- 如果 chargetime 值非空,将其填入订购关系表
        if trim(i_chargetime) is not null then
            v_chargetime := i_chargetime;
        else
            v_chargetime := '00000000000000';
        end if;
        begin
            update zxdbm_200.s200_user_subscription
            set    subscriptionindex          = v_productsubindex,
                   subscriptionid             = v_productsubid,
                   servicetype                = v_servicetype,
                   subcapability              = v_subcapability,
                   serviceindex               = v_serviceindex,
                   serviceid                  = v_serviceid,
                   productindex               = v_productindex,
                   productid                  = v_productid,
                   productpkgindex            = v_propkgindex,
                   productpkgid               = v_propkgid,
                   contentindex               = v_contentindex,
                   contentid                  = v_contentid,
                   corpindex                  = v_corpindex,
                   corpid                     = v_corpid,
                   cpindex                    = v_cpindex,
                   cpid                       = v_cpid,
                   subscribemode              = v_subscribemode,
                   subscribechannel           = v_subscribechannel,
                   subscribeoptype            = v_subscribeoptype,
                   cancelmode                 = v_cancelmode,
                   cancelchannel              = v_cancelchannel,
                   canceloptype               = v_canceloptype,
                   pausemode                  = v_pausemode,
                   resumemode                 = v_resumemode,
                   status                     = v_substatus,
                   statustime                 = v_sysdate14,
                   autocontinue               = v_autocontinue,
                   subscriber                 = v_srcmsisdn,
                   --usercode                   = v_usemsisdn,
                   payuser                    = v_paymsisdn,
                   pushid                     = v_pushid,
                   starttime                  = v_substarttime,
                   endtime                    = v_subendtime,
                   lastrenttime               = v_lastrenttime,
                   nextrentdate               = v_nextrentdate,
                   payfordate                 = v_payfordate,
                   returnvalues               = v_returnvalues,
                   returntype                 = v_returntype,
                   returnstartdate            = v_returnstartdate,
                   returnenddate              = v_returnenddate,
                   --fixusetimes                = v_fixusetimes,
                   chargeparty                = v_chargeparty,
                   freetime                   = v_freetime,
                   createtime                 = v_sysdate14,
                   canceltime                 = v_canceltime,
                   firstusetime               = v_firstusetime,
                   lastusetime                = v_lastusetime,
                   tastestarttime             = v_tastestarttime,
                   tasteendtime               = v_tasteendtime,
                   pausetime                  = v_pausetime,
                   resumetime                 = v_resumetime,
                   subscribeopid              = v_subscribeopid,
                   cancelopid                 = v_cancelopid,
                   cancelreason               = v_cancelreason,
                   lastrent                   = v_lastrent,
                   msisdntype                 = v_msisdntype,
                   pseudocode                 = v_pseudocode,
                   oldproductid               = v_cancelproductid,
                   pproductofferid            = v_pproductofferid,
                   varifee                    = v_varifee,
                   eventid                    = v_eventid,
                   isexperience               = v_isexperience,
                   subscribetype              = v_subscribetype,
                   chargetime                 = v_chargetime
            where  usercode = v_usemsisdn and productid = v_beupdatedproductid;
        exception when others then
                o_retcode   := 506;
                o_debugpos  := 28;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
        end;
    end if;
    if v_lastrent > 0 then
    -- 累计解决【生产累计;产品累计(纯包量)】v_sql := 'update zxdbm_ismp.ssrv_user_totalamount' || v_curstrmonth ||
                 'set usedamounts  = usedamounts + :p1 where userindex = :p2' ||
                 'and amounttype = 8 and amountindex = 0 and productindex = 0  and expiredate = :p3 and rownum = 1';
        begin
            execute immediate v_sql using v_lastrent,v_payuserindex,to_number(substr(v_curmonthendtime,1,8));
            if sql%rowcount = 0 then
                v_sql := 'insert into zxdbm_ismp.ssrv_user_totalamount' || v_curstrmonth ||
                         '(userindex,payuserindex,amounttype,usedamounts,amountindex,productindex,expiredate)' ||
                         'values(:p1,:p2,8,:p3,0,0,:p4)';
                begin
                    execute immediate v_sql using v_payuserindex,v_payuserindex,v_lastrent,to_number(substr(v_curmonthendtime,1,8));
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 29;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end;
            end if;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 30;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end;
    end if;

/*
推广期内订购 / 收费期内订购,根本计费为包量 / 查问产品累计,有累计,则跳过。无累计新增一条记录
*/

    begin
        select popularizeitem,popularizestart,popularizestop,needcharge
        into v_popuitem,v_popustart,v_popustop,v_needcharge
        from zxdbm_200.s200_product
        where productindex = v_productindex;
    exception when others then
        o_retcode   := 506;
        o_debugpos := 31;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if v_needcharge = 1 then
        begin
            select chargetype,fixusetimes,unitvol
            into v_chargetype,v_fixusetimes,v_unitvol
            from zxdbm_200.s200_product_fee
            where productindex = v_productindex and itemindex = 0;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 32;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end;
        -- 根本计费为纯包量(包含含推广期)
        if (i_chargetype = 4) or (v_chargetype = 4) then
            v_fixtotalres := v_fixusetimes * v_unitvol;
            if (i_freetime > v_sysdate14) or (v_popuitem in (0,1) and (v_sysdate8 >= v_popustart) and (v_sysdate8 <= v_popustop)) then
                begin
                    select count(1)
                    into v_temp
                    from zxdbm_ismp.ssrv_user_totalamount
                    where  userindex = v_payuserindex and amounttype = 0 and amountindex = v_productindex and productindex = 0;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 33;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            end if;
            if v_temp = 0 then
                begin
                    update zxdbm_ismp.ssrv_user_totalamount
                    set    fixtotalres = fixtotalres + v_fixtotalres,
                           expiredate = to_number(to_char(to_date(v_subendtime,'yyyymmddhh24miss'),'yyyymmdd'))
                    where  userindex = v_payuserindex and amounttype = 0 and amountindex = v_productindex and productindex = 0;
                    if (sql%rowcount = 0) then
                        begin
                            insert into zxdbm_ismp.ssrv_user_totalamount(userindex,amounttype,amountindex,productindex,payuserindex,fixtotalres,servicetype,expiredate)
                            values(v_payuserindex,0,v_productindex,0,v_payuserindex,v_fixtotalres,v_servicetype,to_number(to_char(to_date(v_subendtime,'yyyymmddhh24miss'),'yyyymmdd')));
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 34;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                    end if;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 35;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end;
            end if;
        end if;
    end if;
    commit;
    -- 事务完结
end;
o_productsubid          := v_productsubid;
o_porductsubindex       := v_productsubindex;

--added by youqunxia20130604  order2.07.10
if (v_freetime > v_substarttime) and (i_freenoticenow = 0) then
    -- 设置定时工作表中的号码类型
    if (v_msisdntype <> 1) then
        v_freemsisdntype := '4';
    end if;
    v_freenoticetime1 := to_char(to_date(v_freetime,'yyyymmddhh24miss'),'yyyymmdd') || '080000';
    if (v_freetime < v_freenoticetime1) then
        v_plantime := to_char(to_date(v_freetime,'yyyymmddhh24miss') - 1,'yyyymmdd');
        begin
            -- 革除定时工作表原有记录
            delete from zxdbm_ismp.freenotice_task
            where  usercode = v_usemsisdn and productid = v_productid;
            -- 插入定时工作
            insert into zxdbm_ismp.freenotice_task(plantime,createtime,usercode,msisdntype,spid,serviceid,productid)
            values(v_plantime, v_sysdate14, v_usemsisdn, v_freemsisdntype, v_cpid, v_serviceid, v_productid);
        exception when others then
            o_retcode   := 506;
            o_debugpos  := 36;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        commit;
    else
        begin
            -- 革除定时工作表原有记录
            delete from zxdbm_ismp.freenotice_task
            where  usercode = v_usemsisdn and productid = v_productid;
            -- 插入定时工作
            insert into zxdbm_ismp.freenotice_task(plantime,createtime,usercode,msisdntype,spid,serviceid,productid)
            values(substr(v_freetime,1,8), v_sysdate14, v_usemsisdn, v_freemsisdntype, v_cpid, v_serviceid, v_productid); 
        exception when others then
            o_retcode   := 506;
            o_debugpos  := 37;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        commit;
    end if;
end if;

end slp_200_telicomsubresp;
/

prompt zxdbm_200.slp_200_telicomusercheck
create or replace procedure zxdbm_200.slp_200_telicomusercheck
(

i_srcmsisdn             in          varchar2,            -- 发起方 / 赠送方用户号码
i_usemsisdn             in          varchar2,            -- 应用方 / 受赠方用户号码
i_oatype                in          number,              -- 发起方地址类型
i_servicetype           in          number,              -- 业务能力类型
i_cmdchannel            in          number,              -- 动作起源
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_isthird               in          number,              --0: 一般订购 1: 赠送
i_supportproductid      in          number,              -- 同步 SP、SP 下发应用 service 还是 productid 0-serviceid 1-productid
i_srvprodid             in          varchar2,            -- 业务 / 产品代码
i_direct                in          number,              -- 订购方向 0: 正向订购 1:SP 反向定购
i_prepaidtype           in          number,              -- 预付费接口类型 1-OCS 2- 非 OCS 3- 依据号段抉择是 OCS 或者非 OCS
i_checkpseudocode       in          number,              -- 零碎开关: 是否反对伪码   0- 不反对   1- 反对
i_serviceflowtype       in          number,              -- 业务流程类型
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos             out         number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_srcmsisdntype         out         number,              -- 发起方号码类型,1:msisdn,2:phs,3:pstn
o_usemsisdntype         out         number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
o_userindex             out         number,              -- 应用方号码序号
o_payuserindex          out         number,              -- 付费方号码序号
o_paytype               out         number,              -- 计费号码的付费类型 0: 后付费 1: 预付费 2: 准预付费
o_oppaytype             out         number,              -- 话单专用付费类型
o_colortype             out         number,              -- 应用方号码名单类型   0- 普通用户,1- 黑名单,2- 白名单,3- 灰名单,4- 红名单
o_usertype              out         number,              -- 应用方类型  1- 普通用户  2- 运营商测试用户  3-SP 测试用户
o_scptype               out         number,              -- 对预付费扣费的设施类型 1:OCS;2:非 OCS
o_paymode               out         varchar2,            -- 团体付费模式 团体付费 / 集体付费
o_corpid                out         varchar2,            -- 团体代码
o_corpindex             out         number,              -- 团体序号
o_corpcnshortname       out         varchar2,            -- 团体名称
o_paymsisdn             out         varchar2,            -- 去掉前缀的计费方号码
o_pcodemsisdnswitch     out         number,               -- 伪码和实在号码之间是否有转换:  0 否   1 实在号码转化伪码 2 伪码转化为实在号码
o_pseudocode            out         varchar2            -- 伪码

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)     := to_char(sysdate ,'yyyymmddhh24miss');
v_sysdate8              char(8)      := substr(v_sysdate14,1,8);
v_curmonth              number(2)    := to_number(substr(v_sysdate14,5,2));     -- 长期寄存以后月份
v_curstrmonth           char(2)      := lpad(to_char(v_curmonth),2,'0');        -- 长期寄存以后月份, 字符型

v_maincapability        number(10)                                          := 0;                                       -- 长期寄存组合业务主业务能力类型
v_submaincapability     number(10)                                          := 0;                                       -- 长期寄存组合业务主业务能力子类型
v_devexist              number(3)                                           := 1;                                       -- 长期寄存是否存在对应设施
v_sql                   varchar2(3072)                                      := ' ';                                     -- 长期寄存动静 sql
v_tmpint                number(10)                                          := 0;                                       -- 长期寄存长期数值

v_srcmsisdn             zxdbm_ismp.susr_basic.usercode%type                 := i_srcmsisdn;                                     -- 长期寄存发起方 / 赠送方用户号码
v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                 := i_usemsisdn;                                     -- 长期寄存应用方 / 受赠方用户号码
v_srcuserindex          zxdbm_ismp.susr_basic.userindex%type                := 0;                                       -- 长期寄存发起方用户序号
v_srcusertype           zxdbm_ismp.susr_basic.usertype%type                 := 1;                                       -- 长期寄存发起方用户类型
v_srcpaytype            zxdbm_ismp.susr_basic.paytype%type                  := 0;                                       -- 长期寄存发起方用户付费类型
v_srcblacklist          zxdbm_ismp.susr_basic.blacklist%type                := 0;                                       -- 长期寄存发起方是否进入黑名单
v_srcwhitelist          zxdbm_ismp.susr_basic.whitelist%type                := 0;                                       -- 长期寄存发起方是否进入白名单
v_srcredlist            zxdbm_ismp.susr_basic.redlist%type                  := 0;                                       -- 长期寄存发起方是否进入红名单
v_srcblacklevel         zxdbm_ismp.susr_basic.blacklevel%type               := 0;                                       -- 长期寄存发起方黑名单级别
v_srcwhitelevel         zxdbm_ismp.susr_basic.whitelevel%type               := 0;                                       -- 长期寄存发起方白名单级别
v_srcmsisdntype         zxdbm_ismp.susr_basic.msisdntype%type               := 1;                                       -- 长期寄存发起方号码类型
v_srcuserstatus         zxdbm_ismp.susr_basic.status%type                   := 0;                                       -- 长期寄存发起方状态
v_srcactivestatus       zxdbm_ismp.susr_basic.activestatus%type             := 0;                                       -- 长期寄存发起方激活状态
v_srcoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                := 0;                                       -- 长期寄存发起方话单专用付费类型
v_srccorpindex          zxdbm_ismp.susr_basic.corpindex%type                := 0;                                       -- 长期寄存发起方团体序号
v_srcusetime            zxdbm_ismp.susr_basic.lastusetime%type              := '00000000000000';                        -- 长期寄存发起方上次应用工夫
v_srcmaxlimitfee        zxdbm_ismp.susr_basic.maxlimitfee%type              := 0;                                       -- 长期寄存发起方最大生产限额
v_srcgraylist           zxdbm_ismp.susr_basic.graylist%type                 := 0;                                       -- 长期寄存发起方是否进入灰名单
v_srcgraylevel          zxdbm_ismp.susr_basic.graylevel%type                := 0;                                       -- 长期寄存发起方灰名单级别
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                := 0;                                       -- 长期寄存应用方用户序号
v_useusertype           zxdbm_ismp.susr_basic.usertype%type                 := 1;                                       -- 长期寄存应用方用户类型
v_usepaytype            zxdbm_ismp.susr_basic.paytype%type                  := 0;                                       -- 长期寄存应用方用户付费类型
v_useblacklist          zxdbm_ismp.susr_basic.blacklist%type                := 0;                                       -- 长期寄存应用方是否进入黑名单
v_usewhitelist          zxdbm_ismp.susr_basic.whitelist%type                := 0;                                       -- 长期寄存应用方是否进入白名单
v_useredlist            zxdbm_ismp.susr_basic.redlist%type                  := 0;                                       -- 长期寄存应用方是否进入红名单
v_useblacklevel         zxdbm_ismp.susr_basic.blacklevel%type               := 0;                                       -- 长期寄存应用方黑名单级别
v_usewhitelevel         zxdbm_ismp.susr_basic.whitelevel%type               := 0;                                       -- 长期寄存应用方白名单级别
v_usemsisdntype         zxdbm_ismp.susr_basic.msisdntype%type               := 1;                                       -- 长期寄存应用方号码类型
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                   := 0;                                       -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type             := 0;                                       -- 长期寄存应用方激活状态
v_useoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                := 0;                                       -- 长期寄存应用方话单专用付费类型
v_usecorpindex          zxdbm_ismp.susr_basic.corpindex%type                := 0;                                       -- 长期寄存应用方团体序号
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type              := '00000000000000';                        -- 长期寄存应用方上次应用工夫
v_usemaxlimitfee        zxdbm_ismp.susr_basic.maxlimitfee%type              := 0;                                       -- 长期寄存应用方最大生产限额
v_usegraylist           zxdbm_ismp.susr_basic.graylist%type                 := 0;                                       -- 长期寄存应用方是否进入灰名单
v_usegraylevel          zxdbm_ismp.susr_basic.graylevel%type                := 0;                                       -- 长期寄存应用方灰名单级别
v_paymsisdn             zxdbm_ismp.susr_basic.usercode%type                 := ' ';                                     -- 长期寄存计费方
v_paymsisdntype         zxdbm_ismp.susr_basic.msisdntype%type               := 1;                                       -- 长期寄存计费方号码类型
v_cardtype              zxdbm_ismp.susr_basic.paytype%type                  := 0;                                       -- 长期寄存用户付费类型 0 - 后付费,1- 预付费,2- 准预付费
v_srctestcpindex        zxdbm_ismp.susr_testgroup_member.cpindex%type       := 0;                                       -- 长期寄存 CP/SP 序号
v_usetestcpindex        zxdbm_ismp.susr_testgroup_member.cpindex%type       := 0;                                       -- 长期寄存 CP/SP 序号
v_srccorpid             zxdbm_ismp.susr_corp.corpid%type                    := ' ';                                     -- 长期寄存团体代码
v_srccorpstatus         zxdbm_ismp.susr_corp.status%type                    := 0;                                       -- 长期寄存团体状态
v_srccorppaymsisdn      zxdbm_ismp.susr_corp.paymsisdn%type                 := ' ';                                     -- 长期寄存团体付费号码
v_corpname              zxdbm_ismp.susr_corp.corpcnshortname%type           := ' ';                                     -- 长期寄存团体中文名简写

v_productindex          zxdbm_200.s200_product.productindex%type            := 0;                                       -- 长期寄存产品序号
v_needcharge            zxdbm_200.s200_product.needcharge%type              := 1;                                       -- 长期寄存是否须要计费,0- 收费,1- 须要计费
v_onlyforcorp           zxdbm_200.s200_product.onlyforcorp%type             := 0;                                       -- 长期寄存是否团体专用产品 0:个人用户专用 1:团体专用
v_cpindex               zxdbm_200.s200_product.cpindex%type                 := 0;                                       -- 长期寄存 CP/SP 序号
v_serviceindex          zxdbm_200.s200_product.serviceindex%type            := 0;                                       -- 长期寄存业务序号
v_servicetype           zxdbm_200.s200_product.servicetype%type             := 0;                                       -- 长期寄存业务能力类型
v_subcapability         zxdbm_200.s200_product.subcapability%type           := 1;                                       -- 长期寄存业务能力子类型 1 -3G,2-PHS,3-ISAG, 默认为 3g 业务能力(仅电信应用,其余营运商皆默认为 1)v_srvprodid             zxdbm_200.s200_product.productid%type               := i_srvprodid;                             -- 长期寄存业务产品代码
v_productstatus         zxdbm_200.s200_product.status%type                  := 0;                                       -- 长期寄存产品状态
v_onlyforpkg            zxdbm_200.s200_product.onlyforpkg%type              := 0;                                       -- 长期寄存是否套餐专用产品
v_ordertype             zxdbm_200.s200_product.ordertype%type               := 1;                                       -- 长期寄存产品订购类型
v_workflowlife          zxdbm_200.s200_product.workflowlife%type            := 0;                                       -- 长期寄存工作流流程状态
v_productsource         zxdbm_200.s200_product.productsource%type           := 0;                                       -- 产品起源 0:ISMP 公布的产品 1:同步自全国 SPMS 的产品 2:提供给漫游用户的产品

v_serviceid             zxdbm_200.s200_service.serviceid%type               := ' ';                                     -- 长期寄存业务代码
v_servicestatus         zxdbm_200.s200_service.status%type                  := 0;                                       -- 长期寄存业务状态
v_srvcolorlist          zxdbm_200.s200_service.colorlist%type               := 0;                                       -- 长期寄存是否有色彩列表,0- 无,1- 黑名单,2- 白名单
v_servicename           zxdbm_200.s200_service.servicename%type             := ' ';                                     -- 长期寄存业务名称
v_subsrvtype            zxdbm_200.s200_service.subsrvtype%type              := 0;                                       -- 长期寄存业务子类型
v_orderupdateurl        zxdbm_200.s200_service.orderupdateurl%type          := ' ';                                     -- 长期寄存业务表中订购关系更新告诉 URL
v_useopenstatus         zxdbm_200.s200_service_useropen.status%type         := 1;                                       -- 长期寄存应用方集体能力开明,0- 敞开,1- 开明
v_perssrvopen           zxdbm_ismp.ssys_service_type.perssrvopen%type       := 1;                                       -- 长期寄存集体能力缺省开明,0- 敞开,1- 开明
v_srvtypeid             zxdbm_ismp.ssys_service_type.srvtypeid%type         := ' ';                                     -- 长期寄存话单中的 srvtypeid
v_srcopenstatus         zxdbm_200.s200_service_useropen.status%type         := 1;                                       -- 长期寄存发起方集体能力开明,0- 敞开,1- 开明

v_productsubmode        zxdbm_ismp.ssrv_corp_product.subscribemode%type     := 0;                                       -- 长期寄存定购形式,0- 必须团体管理员定购,1- 团体管理员与团体成员均可定购
v_productpayparty       zxdbm_ismp.ssrv_corp_product.payparty%type          := 2;                                       -- 长期寄存团体专用产品付费方 1- 团体付费 2- 集体付费
v_corpproductstatus     zxdbm_ismp.ssrv_corp_product.status%type            := 0;                                       -- 长期寄存团体与产品关联状态 0- 失常;1- 删除
v_phoneindex            zxdbm_ismp.ssys_phone.phoneindex%type               := 0;                                       -- 长期寄存号段序号
v_phoneindexa           zxdbm_ismp.ssys_phone.phoneindex%type               := 0;                                       -- 长期寄存 A 省号段序号, 跨省赠送
v_phoneindexb           zxdbm_ismp.ssys_phone.phoneindex%type               := 0;                                       -- 长期寄存 B 省号段序号, 跨省赠送
v_attach                zxdbm_ismp.ssys_phone.attach%type                   := 0;                                       -- 长期寄存预付费归属,0- 未知,1-OCS,2-RTBP
v_cpid                  zxdbm_ismp.scp_basic.cpid%type                      := ' ';                                     -- 长期寄存 CP/SP 代码
v_cpstatus              zxdbm_ismp.scp_basic.status%type                    := 0;                                       -- 长期寄存 CP/SP 代码
v_cpsubscribeurl        zxdbm_ismp.scp_basic.cpsubscribeurl%type            := ' ';                                     -- 长期寄存 CP/SP 订购 URL
v_hasblacklist          zxdbm_ismp.scp_basic.hasblacklist%type              := 0;                                       -- 长期寄存是否有黑名单管制 0-无,1-有
v_cptype                zxdbm_ismp.scp_basic.cptype%type                    := 2;                                       -- 长期寄存 CP/SP 类型
v_cpsrvtype             zxdbm_ismp.scp_basic.cpsrvtype%type                 := 0;                                       -- 长期寄存 CP 服务类型
v_insubblacklist        zxdbm_ismp.scp_basic.insubblacklist%type            := 0;                                      -- 长期寄存限度订购 SP 黑名单标识
v_cpcnshortname         zxdbm_ismp.scp_basic.cpcnshortname%type             := ' ';                                     -- 长期寄存 CP/SP 中文名简写
v_customersrvtel        zxdbm_ismp.scp_basic.customersrvtel%type            := ' ';                                     -- 长期寄存 CP/SP 客服电话

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos             := 0;
o_debuginfo             := ' ';
o_paymsisdn             := ' ';
o_srcmsisdntype         := 1;
o_usemsisdntype         := 1;
o_userindex             := 0;
o_payuserindex          := 0;
o_paytype               := 0;
o_oppaytype             := 0;
o_scptype               := 2;
o_colortype             := 0;
o_usertype              := 0;
o_corpid                := ' ';
o_corpindex             := 0;
o_corpcnshortname       := ' ';
o_paymode               := '集体付费';
o_pcodemsisdnswitch     := 0;
o_pseudocode            := '';

/
*1. 用户鉴权
*/

-- 发起方和应用方存在性鉴权
if (i_needauthuser = 1) then
    if (i_isthird = 1) and (v_srcmsisdn <> v_usemsisdn) then
        begin
            select a.userindex,a.usertype,a.paytype,a.blacklist,a.whitelist,a.redlist,a.blacklevel,a.whitelevel,a.msisdntype,a.status,a.activestatus,a.oppaytype,a.corpindex,a.lastusetime,a.maxlimitfee,a.graylist,a.graylevel,
                   b.userindex,b.usertype,b.paytype,b.blacklist,b.whitelist,b.redlist,b.blacklevel,b.whitelevel,b.msisdntype,b.status,b.activestatus,b.oppaytype,b.corpindex,b.lastusetime,b.maxlimitfee,b.graylist,b.graylevel
            into   v_srcuserindex,v_srcusertype,v_srcpaytype,v_srcblacklist,v_srcwhitelist,v_srcredlist,v_srcblacklevel,v_srcwhitelevel,v_srcmsisdntype,v_srcuserstatus,v_srcactivestatus,v_srcoppaytype,v_srccorpindex,v_srcusetime,v_srcmaxlimitfee,v_srcgraylist,v_srcgraylevel,
                   v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_usemaxlimitfee,v_usegraylist,v_usegraylevel
            from   zxdbm_ismp.susr_basic a, zxdbm_ismp.susr_basic b
            where  a.usercode = v_srcmsisdn and b.usercode = v_usemsisdn;
        exception when no_data_found then
            o_retcode   := 1001;    -- 用户不存在
            o_debugpos := 1;
            o_debuginfo := 'v_srcmsisdn or v_usemsisdn is not exist.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := 1;
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 2;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := 1;
            return;
        end;
        o_srcmsisdntype := v_srcmsisdntype;
        o_usemsisdntype := v_usemsisdntype;
        o_userindex     := v_useuserindex;
        o_payuserindex  := v_srcuserindex;
        o_paytype       := v_srcpaytype;
        o_oppaytype     := v_srcoppaytype;
        o_usertype      := v_useusertype;

       -- 批量操作用户号码类型由用户表查问后鉴权
        if (i_cmdchannel in (7,32)) then
            if (v_srcmsisdntype not in (1,2,3)) or  (v_usemsisdntype not in (1,2,3)) then
                o_retcode   := 107;
                o_debugpos := 3;
                o_debuginfo := 'v_srcmsisdntype='||v_srcmsisdntype||', v_usemsisdntype='||v_usemsisdntype||', v_srcmsisdntype or v_usemsisdntype not in (1,2,3,4).';
                return;
            end if;
        end if;
        -- 发起方状态鉴权
        if v_srcuserstatus in (1,3) then
            o_retcode   := 1002;
            o_debugpos := 4;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', the subscriber status is 1 or 3.';
            return;
        elsif v_srcuserstatus = 4 then
            o_retcode   := 1008;
            o_debugpos := 5;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', the subscriber status is 4.';
            return;
        end if;
        -- 应用方状态鉴权
        if v_useuserstatus in (1,3) then
            o_retcode   := 1110;
            o_debugpos := 6;
            o_debuginfo := 'v_useuserstatus='||v_useuserstatus||', the user status is 1 or 3.';
            return;
        elsif v_useuserstatus = 4 then
            o_retcode   := 1110;
            o_debugpos := 7;
            o_debuginfo := 'v_useuserstatus='||v_useuserstatus||', the user status is 4.';
            return;
        end if;
    else
        begin
            select userindex,usertype,paytype,blacklist,whitelist,redlist,blacklevel,whitelevel,msisdntype,status,activestatus,oppaytype,corpindex,lastusetime,maxlimitfee,graylist,graylevel
            into   v_srcuserindex,v_srcusertype,v_srcpaytype,v_srcblacklist,v_srcwhitelist,v_srcredlist,v_srcblacklevel,v_srcwhitelevel,v_srcmsisdntype,v_srcuserstatus,v_srcactivestatus,v_srcoppaytype,v_srccorpindex,v_srcusetime,v_srcmaxlimitfee,v_srcgraylist,v_srcgraylevel
            from   zxdbm_ismp.susr_basic
            where  usercode = v_srcmsisdn;
        exception when no_data_found then
            o_retcode   := 1001;    -- 用户不存在
            o_debugpos := 8;
            o_debuginfo := 'v_srcmsisdn='||v_srcmsisdn||', the user is not exist.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := o_srcmsisdntype;
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 9;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            if (i_oatype = 4) then
                o_srcmsisdntype := 2;
            else
                o_srcmsisdntype := 1;
            end if;
            o_usemsisdntype := o_srcmsisdntype;
            return;
        end;
        v_useuserindex    := v_srcuserindex;
        v_useusertype     := v_srcusertype;
        v_usepaytype      := v_srcpaytype;
        v_useblacklist    := v_srcblacklist;
        v_usewhitelist    := v_srcwhitelist;
        v_useredlist      := v_srcredlist;
        v_useblacklevel   := v_srcblacklevel;
        v_usewhitelevel   := v_srcwhitelevel;
        v_usemsisdntype   := v_srcmsisdntype;
        v_useuserstatus   := v_srcuserstatus;
        v_useactivestatus := v_srcactivestatus;
        v_useoppaytype    := v_srcoppaytype;
        v_usecorpindex    := v_srccorpindex;
        v_useusetime      := v_srcusetime;
        v_usemaxlimitfee  := v_srcmaxlimitfee;
        v_usegraylist     := v_srcgraylist;
        v_usegraylevel    := v_srcgraylevel;

        o_srcmsisdntype := v_srcmsisdntype;
        o_usemsisdntype := v_usemsisdntype;
        o_userindex     := v_useuserindex;
        o_payuserindex  := v_srcuserindex;
        o_paytype       := v_srcpaytype;
        o_oppaytype     := v_srcoppaytype;
        o_usertype      := v_useusertype;

        --add by cfz 2008.08.20 批量操作用户号码类型由用户表查问后鉴权
        if (i_cmdchannel in (7,32)) then
            if v_srcmsisdntype not in (1,2,3) then
                o_retcode   := 107;
                o_debugpos := 10;
                o_debuginfo := 'v_srcmsisdntype='||v_srcmsisdntype||', v_srcmsisdntype is not valid.';
                return;
            end if;
        end if;
       -- 发起方状态鉴权
        if v_srcuserstatus in (1,3) then
            o_retcode   := 1002;
            o_debugpos := 11;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', the user status is 1 or 3.';
            return;
        elsif v_srcuserstatus = 4 then
            o_retcode   := 1008;
            o_debugpos := 12;
            o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', the user status is 4.';
            return;
        end if;
    end if;
end if;

/
2. 产品, 产品费率鉴权
/

-- 产品存在性鉴权
if (i_direct = 1) and (i_supportproductid = 0) then
-- 反向订购,并且反对业务代码
    begin
        select productindex,needcharge,onlyforcorp,cpindex,serviceindex,
               servicetype,subcapability,onlyforpkg,status,workflowlife,productsource
        into   v_productindex,v_needcharge,v_onlyforcorp,v_cpindex,v_serviceindex,
               v_servicetype,v_subcapability,v_onlyforpkg,v_productstatus,v_workflowlife,v_productsource
        from   zxdbm_200.s200_product
        where  serviceid = v_srvprodid and ordertype = 1;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 13;
        o_debuginfo := 'serviceid='||v_srvprodid||', the product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 14;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select productindex,needcharge,onlyforcorp,cpindex,serviceindex,
               servicetype,subcapability,onlyforpkg,status,workflowlife,productsource
        into   v_productindex,v_needcharge,v_onlyforcorp,v_cpindex,v_serviceindex,
               v_servicetype,v_subcapability,v_onlyforpkg,v_productstatus,v_workflowlife,v_productsource
        from   zxdbm_200.s200_product
        where  productid = v_srvprodid and ordertype = 1;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 15;
        o_debuginfo := 'productid='||v_srvprodid||', the product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 16;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

if (v_needcharge = 1) then
    -- 欠费用户只能订购收费产品
    if (v_srcuserstatus = 2) then
        o_retcode   := 1003;
        o_debugpos := 17;
        o_debuginfo := 'v_srcuserstatus='||v_srcuserstatus||', the user owes money, does not allow to subscribe the product.';
        return;
    end if;
end if;

/**
3. 业务鉴权
*/

-- 业务存在性鉴权(MPSS 不须要鉴权)
--modified by chenfuzhong 2008.10.09
if i_servicetype = 101 then
    v_sql := 'select serviceid,status,colorlist,servicename,maincapability,submaincapability,cpid,orderupdateurl'||
             'from zxdbm_9900.s9900_service where  serviceindex = :p1';
    begin
        execute immediate v_sql into v_serviceid,v_servicestatus,v_srvcolorlist,v_servicename,v_maincapability,v_submaincapability,v_cpid,v_orderupdateurl using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 18;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 19;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
elsif i_servicetype in (1,2,3) then
    v_sql := 'select serviceid,status,colorlist,servicename,subsrvtype,cpid,orderupdateurl'||
             'from zxdbm_200.s200_service where  serviceindex = :p1';
    begin
        execute immediate v_sql into v_serviceid,v_servicestatus,v_srvcolorlist,v_servicename,v_subsrvtype,v_cpid,v_orderupdateurl using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 20;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 21;
        return;
    end;
elsif i_servicetype <> 14 then
    begin
        select serviceid,status,colorlist,servicename,subsrvtype,cpid,orderupdateurl
        into   v_serviceid,v_servicestatus,v_srvcolorlist,v_servicename,v_subsrvtype,v_cpid,v_orderupdateurl
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 22;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 23;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

/**
4.CP/SP 鉴权
**/

--CP/SP 存在性鉴权
begin
    select cpid,status,cpsubscribeurl,hasblacklist,cptype,insubblacklist,cpcnshortname,customersrvtel,cpsrvtype
    into   v_cpid,v_cpstatus,v_cpsubscribeurl,v_hasblacklist,v_cptype,v_insubblacklist,v_cpcnshortname,v_customersrvtel,v_cpsrvtype
    from   zxdbm_ismp.scp_basic
    where  cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 24;
    o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 25;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

/*
5. 业务能力开明鉴权
*/

if i_servicetype = 101 then
    begin
        select a.perssrvopen,b.srvtypeid
        into   v_perssrvopen,v_srvtypeid
        from   zxdbm_ismp.ssys_service_type a,zxdbm_ismp.ssys_service_type b
        where  a.servicetype = v_servicetype and a.subcapability = v_subcapability
        and    b.servicetype = v_maincapability and b.subcapability = v_submaincapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 26;
        o_debuginfo := 'servicetype='||v_servicetype||', subcapability='||v_subcapability||', maincapability='||v_maincapability||', submaincapability='||v_submaincapability||', CPX system serviceCapability is not open.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 27;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select perssrvopen,srvtypeid
        into   v_perssrvopen,v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 28;
        o_debuginfo := 'servicetype='||v_servicetype||', subcapability='||v_subcapability||', System serviceCapability is not open.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 29;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

/**
6. 名单鉴权, 用户业务能力开明鉴权
**/

if (i_needauthuser = 1) then
    -- 应用方名单鉴权
    if (v_useblacklist <> 0) then
        if bitand(v_useblacklevel,1) > 0 then
            -- 零碎级黑名单查看
            v_tmpint    := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_useuserindex and colortype = 1 and colorlevel = 1
                and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 30;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if (v_tmpint > 0) then
                o_retcode   := 1004;
                o_debugpos := 31;
                o_colortype := 1;
                o_debuginfo := 'userindex ='||v_useuserindex||', the user is in system level blacklist.';
                return;
            end if;
        end if;
        --SP 级黑名单查看
        if v_hasblacklist = 1 and bitand(v_useblacklevel,2) > 0 then
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_useuserindex and colortype = 1 and colorlevel = 2 and colorid = v_cpindex
                and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 32;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint > 0 then
                o_retcode   := 1004;
                o_debugpos := 33;
                o_colortype := 1;
                o_debuginfo := 'colorid ='||v_cpindex||', the user is in SP level blacklist.';
                return;
            end if;
        end if;
        -- 业务能力级黑名单
        if bitand(v_useblacklevel,4) > 0 then
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_useuserindex and colortype = 1 and colorlevel = 3 and colorid = v_servicetype;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 34;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint > 0 then
                if v_usegraylist > 0 and bitand(v_usegraylevel,2) > 0 then
                    begin
                        select count(*)
                        into   v_tmpint
                        from   zxdbm_ismp.susr_colorlist
                        where  userindex = v_useuserindex and colortype = 3 and colorlevel = 2 and colorid = v_cpindex;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 35;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                    if (v_tmpint = 0) then
                        o_retcode   := 1004;
                        o_debugpos := 36;
                        o_colortype := 1;
                        o_debuginfo := 'colorid ='||v_servicetype||', the user is in serviceCapbility level blacklist.';
                        return;
                    end if;
                else
                    o_retcode   := 1004;
                    o_debugpos := 37;
                    o_debuginfo := 'colorid ='||v_servicetype||', the user is in serviceCapbility level blacklist.';
                    o_colortype := 1;
                    return;
                end if;
            end if;
        end if;
        if v_srvcolorlist = 1 and bitand(v_useblacklevel,8) > 0 then
            -- 业务级黑名单查看
            v_tmpint := 0;
            begin
                select count(1)
                into v_tmpint
                from zxdbm_ismp.susr_colorlist
                where userindex = v_useuserindex and colortype = 1 and colorlevel = 4 and colorid = v_serviceindex;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 38;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint > 0 then
                o_retcode   := 1004;
                o_debugpos := 39;
                o_debuginfo := 'colorid ='||v_serviceindex||', the user is in service level blacklist.';
                o_colortype := 1;
                return;
            end if;
        end if;
    end if;
    if (v_srvcolorlist = 2) then
        if (v_usewhitelist = 0) then
            o_retcode   := 1100001;
            o_debugpos := 40;
            o_debuginfo := 'v_srvcolorlist ='||v_srvcolorlist||', v_usewhitelist ='||v_usewhitelist||', user is not in whitelist.';
            return;
        end if;
        o_colortype := 2;
        v_tmpint := 0;
        begin
            select count(1)
            into   v_tmpint
            from   zxdbm_ismp.susr_colorlist
            where  userindex = v_useuserindex and colortype = 2 and colorlevel = 4 and colorid = v_serviceindex;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 41;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if v_tmpint = 0 then
            o_retcode   := 1109;
            o_debugpos := 42;
            o_debuginfo := 'userindex ='||v_useuserindex||', colorid ='||v_serviceindex||', user is not in service level whitelist.';
            return;
        end if;
    end if;
    if (v_useredlist <> 0) then
        o_colortype := 4;
    end if;
    -- 应用方开明业务能力鉴权
    begin
        select nvl(status,1)
        into   v_useopenstatus
        from   zxdbm_200.s200_service_useropen
        where  userindex = v_useuserindex and servicetype = v_servicetype;
    exception when no_data_found then
        if (v_perssrvopen = 0) then
            o_retcode   := 1100;
            o_debugpos := 43;
            o_debuginfo := 'v_useopenstatus ='||v_useopenstatus||', v_perssrvopen ='||v_perssrvopen||', the service capabilty is closed.';
            return;
        end if;
    when others then
        o_retcode   := 506;
        o_debugpos := 44;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_useopenstatus = 0) then
        if i_cmdchannel in (9,35,39,40) then
            o_retcode  := 1001225;
        else
            o_retcode  := 1100;
        end if;
        o_debugpos := 45;
        o_debuginfo := 'v_useopenstatus ='||v_useopenstatus||', the user service capabilty is closed.';
        return;
    end if;
    if (v_srcmsisdn <> v_usemsisdn) then
    -- 发起方名单鉴权
        if (v_srcblacklist <> 0) then
            if bitand(v_srcblacklevel,1) > 0 then
                -- 零碎级黑名单查看
                v_tmpint    := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from   zxdbm_ismp.susr_colorlist
                    where  userindex = v_useuserindex and colortype = 1 and colorlevel = 1
                    and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 46;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if (v_tmpint > 0) then
                    o_retcode   := 1004;
                    o_debugpos := 47;
                    o_debuginfo := 'userindex ='||v_useuserindex||', the user is in system level blacklist.';
                    return;
                end if;
            end if;
            --SP 级黑名单查看
            if v_hasblacklist = 1 and bitand(v_srcblacklevel,2) > 0 then
                v_tmpint := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from   zxdbm_ismp.susr_colorlist
                    where  userindex = v_srcuserindex and colortype = 1 and colorlevel = 2 and colorid = v_cpindex
                    and inuretime <= v_sysdate14 and abatetime >= v_sysdate14;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 48;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if v_tmpint > 0 then
                    o_retcode   := 1004;
                    o_debugpos := 49;
                    o_debuginfo := 'userindex ='||v_srcuserindex||', colorid ='||v_cpindex||', the user is in SP level blacklist.';
                    return;
                end if;
            end if;
            -- 业务能力级黑名单
            if bitand(v_srcblacklevel,4) > 0 then
                v_tmpint := 0;
                begin
                    select count(*)
                    into   v_tmpint
                    from   zxdbm_ismp.susr_colorlist
                    where  userindex = v_srcuserindex and colortype = 1 and colorlevel = 3 and colorid = v_servicetype;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 50;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if v_tmpint > 0 then
                    if v_srcgraylist > 0 and bitand(v_srcgraylevel,2) > 0 then
                        begin
                            select count(*)
                            into   v_tmpint
                            from   zxdbm_ismp.susr_colorlist
                            where  userindex = v_srcuserindex and colortype = 3 and colorlevel = 2 and colorid = v_cpindex;
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 51;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                        if (v_tmpint = 0) then
                            o_colortype := 1;
                            o_retcode   := 1004;
                            o_debugpos := 52;
                            o_debuginfo := 'userindex ='||v_srcuserindex||', colorid ='||v_servicetype||', te user is in service capbility level blacklist.';
                            return;
                        end if;
                    else
                        o_retcode   := 1004;
                        o_debugpos := 53;
                        o_debuginfo := 'userindex ='||v_srcuserindex||', colorid ='||v_servicetype||', the user is in service capbility level blacklist.';
                        o_colortype := 1;
                        return;
                    end if;
                end if;
            end if;
            if v_srvcolorlist = 1 and bitand(v_srcblacklevel,8) > 0 then
                -- 业务级黑名单查看
                v_tmpint := 0;
                begin
                    select count(1)
                    into v_tmpint
                    from  zxdbm_ismp.susr_colorlist
                    where userindex = v_srcuserindex and colortype = 1 and colorlevel = 4 and colorid = v_serviceindex;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 54;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
                if v_tmpint > 0 then
                    o_retcode   := 1004;
                    o_debugpos := 55;
                    o_debuginfo := 'userindex ='||v_srcuserindex||', colorid ='||v_serviceindex||', the user is in service level blacklist.';
                    return;
                end if;
            end if;
        end if;
        if (v_srvcolorlist = 2) then
            if (v_srcwhitelist = 0) then
                o_retcode   := 1100001;
                o_debugpos := 56;
                o_debuginfo := 'v_srvcolorlist ='||v_srvcolorlist||', v_srcwhitelist ='||v_srcwhitelist||', the user is not in whitelist.';
                return;
            end if;
            v_tmpint := 0;
            begin
                select count(*)
                into   v_tmpint
                from   zxdbm_ismp.susr_colorlist
                where  userindex = v_srcuserindex and colortype = 2 and colorlevel = 4 and colorid = v_serviceindex;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 57;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_tmpint = 0 then
                o_retcode   := 1109;
                o_debugpos := 58;
                o_debuginfo := 'v_srvcolorlist ='||v_srvcolorlist||',the user is not in service level whitelist.';
                return;
            end if;
        end if;
        -- 发起方开明业务能力鉴权
        begin
            select nvl(status,1)
            into   v_srcopenstatus
            from   zxdbm_200.s200_service_useropen
            where  userindex = v_srcuserindex and servicetype = v_servicetype;
        exception when no_data_found then
            if (v_perssrvopen = 0) then
                o_retcode   := 1100;
                o_debugpos := 59;
                o_debuginfo := 'userindex ='||v_srcuserindex||', servicetype ='||v_servicetype||', the user service capabilty is not exist, and  system service capabiltyis is closed.';
                return;
            end if;
        when others then
            o_retcode   := 506;
            o_debugpos := 60;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if (v_srcopenstatus = 0) then
            if i_cmdchannel in (9,35,39,40) then
                o_retcode  := 1001225;
            else
                o_retcode  := 1100;
            end if;
            o_debugpos := 61;
            o_debuginfo := 'userindex ='||v_srcuserindex||', servicetype ='||v_servicetype||', the user service capabilty is closed.';
            return;
        end if;
    end if;
end if;

/
* 测试产品, 测试用户鉴权
*/

-- 测试产品鉴权
-- if (v_productstatus in (0,2)) and (v_workflowlife = 3) then
if (((v_productsource <> 3) and (v_productstatus in (0,2)) and (v_workflowlife = 3)) or ((v_productsource = 3) and (v_productstatus = 0))) then
    if (v_srcusertype <> 2) or (v_useusertype <> 2) then
        o_retcode   := 1100;
        o_debugpos := 62;
        o_debuginfo := 'The normal user can not use test product.';
        return;
    end if;
    --SP 测试用户鉴权
    -- 测试产品、测试用户 (发起方、应用方) 相干鉴权
    begin
        select cpindex
        into   v_srctestcpindex
        from   zxdbm_ismp.susr_testgroup_member
        where  userindex = v_srcuserindex;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 63;
        o_debuginfo := 'userindex ='||v_srcuserindex||', the test product is not open to the subscriber.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 64;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_srctestcpindex > 0) then
        if (v_srctestcpindex <> v_cpindex) then
            o_retcode   := 1001223;
            o_debugpos := 65;
            o_debuginfo := 'The test-user belongs to SP-A can not use test-product belonged to SP-B.';
            return;
        end if;
    end if;
    begin
        select cpindex
        into   v_usetestcpindex
        from   zxdbm_ismp.susr_testgroup_member
        where  userindex = v_useuserindex;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 66;
        o_debuginfo := 'userindex ='||v_useuserindex||', the test product is not open to the subscriber.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 67;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_usetestcpindex > 0) then
        if (v_usetestcpindex <> v_cpindex) then
            o_retcode   := 1001223;
            o_debugpos := 68;
            o_debuginfo := 'The test-user belongs to SP-A can not use test-product belonged to SP-B.';
            return;
        end if;
        o_usertype := 3;
    end if;
end if;

/*
团体相干鉴权
/

-- 团体产品、团体用户相干鉴权
if (v_onlyforcorp = 1) then
    -- 团体产品不容许赠送
    if (i_isthird = 1) then
        o_retcode    := 1011407;
        o_debugpos  := 69;
        o_debuginfo := 'v_onlyforcorp ='||v_onlyforcorp||', i_isthird ='||i_isthird||',the corp product can not to be presented.';
        return;
    end if;
    -- 普通用户不能订购一个团体专用产品
    if (v_srccorpindex <> v_usecorpindex) then
        o_retcode   := 1100;
        o_debugpos := 70;
        o_debuginfo := 'v_onlyforcorp ='||v_onlyforcorp||', v_srccorpindex ='||v_srccorpindex||', the normal user can not subscribe corp product.';
        return;
    end if;
    if (v_srccorpindex = 0) then
        o_retcode   := 1204;
        o_debugpos := 71;
        o_debuginfo := 'v_onlyforcorp ='||v_onlyforcorp||', v_srccorpindex ='||v_srccorpindex||', the normal user can not subscribe corp product.';
        return;
    end if;
    begin
        select  corpid,status,paymsisdn,corpcnshortname
        into    v_srccorpid,v_srccorpstatus,v_srccorppaymsisdn,v_corpname
        from    zxdbm_ismp.susr_corp
        where   corpindex = v_srccorpindex;
    exception when no_data_found then
        o_retcode   := 1001301;  -- 团体不存在
        o_debugpos := 72;
        o_debuginfo := 'v_srccorpindex ='||v_srccorpindex||', the corp is not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 73;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;

    o_corpcnshortname  := v_corpname;
    o_corpid           := v_srccorpid;
    o_corpindex        := v_srccorpindex;

    if (v_srccorpstatus <> 1) then
        o_retcode   := 1001302;
        o_debugpos := 74;
        o_debuginfo := 'v_srccorpindex ='||v_srccorpindex||', the Corp status is abnormal.';
        return;
    end if;
    -- 一个团体的产品只能由本团体的用户订购 / 赠送
    begin
        select subscribemode,payparty,status
        into   v_productsubmode,v_productpayparty,v_corpproductstatus
        from   zxdbm_ismp.ssrv_corp_product
        where  corpindex = v_srccorpindex and groupindex = 0 and productindex = v_productindex;
    exception when no_data_found then
        o_retcode   := 1011300;
        o_debugpos := 75;
        o_debuginfo := 'productindex ='||v_productindex||', corpindex ='||v_srccorpindex||', the product is not binded with the corp.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 76;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_corpproductstatus <> 0) then
        o_retcode   := 1011408;
        o_debugpos := 77;
        o_debuginfo := 'productindex ='||v_productindex||', corpindex ='||v_srccorpindex||', the binding relationship between the product and the corp is deleted.';
        return;
    end if;
    if (v_productsubmode = 0) then
    -- 必须团体管理员订购
        if (i_cmdchannel <> 4) then
            o_retcode   := 1001216;    -- 无权定购
            o_debugpos := 78;
            o_debuginfo := 'v_productsubmode ='||v_productsubmode||', the corp product can only be subscribed by Corp managers.';
            return;
        end if;
    end if;
end if;

/*
– 计费方、预付费零碎鉴权
*/

if (v_productpayparty = 1) then
    v_paymsisdn     := v_srccorpid;
    v_cardtype      := 0;
    v_paymsisdntype := 1;
    o_paymsisdn     := v_paymsisdn;
    o_paytype       := v_cardtype;
    o_payuserindex  := v_srccorpindex;
    o_paymode       := '团体付费';
else
    v_paymsisdn     := v_srcmsisdn;
    v_cardtype      := v_srcpaytype;
    v_paymsisdntype := v_srcmsisdntype;
    o_paymsisdn     := v_paymsisdn;
    o_paytype       := v_cardtype;
    o_payuserindex  := v_srcuserindex;
    o_paymode       := '集体付费';

    if (i_prepaidtype = 1) then
        o_scptype := 1;
    elsif i_prepaidtype = 2 then
        o_scptype := 2;
    else
        --attach 预付费归属,0- 未知,1-OCS,2-RTBP
        begin
            select phoneindex,attach
            into   v_phoneindex,v_attach
            from   zxdbm_ismp.ssys_phone
            where  startprefix <= substr(v_paymsisdn,1,length(startprefix))
            and    endprefix >= substr(v_paymsisdn,1,length(endprefix));
        exception when no_data_found then
            o_scptype  := 2;
            v_devexist := 0; -- 示意不存在对应号段对应设施配置
        when others then
            o_retcode   := 506;
            o_debugpos := 79;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if (v_devexist = 1) then
            if (v_attach = 1) then
                o_scptype := 1;
            elsif (v_attach = 2) then
                o_scptype := 2;
            else
                begin
                    select 1
                    into   o_scptype
                    from   zxdbm_ismp.sdev_phone
                    where  phoneindex = v_phoneindex
                    and    devicetype = 5;
                exception when no_data_found then
                    o_scptype := 2;
                when others then
                    o_retcode   := 506;
                    o_debugpos := 80;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            end if;
         end if;
    end if;
end if;

-- 伪码解决(反对伪码开关关上, 非自营 sp)-- 反对业务 LCS,SMS,MVS,DLS,MMS,WAP,CPX
--MOAT 时,AuthPriceReq 音讯中 OA 实在号码转化为伪码, 同步 SP 应用
begin
    select cpsrvtype into v_cpsrvtype
    from zxdbm_ismp.scp_basic
    where cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 81;
    o_debuginfo := 'v_cpindex='||v_cpindex||', the sp does not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 82;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

if i_servicetype in (1,2,3,4,41,5,6,101) then
    if i_checkpseudocode = 1 and v_cpsrvtype <> 3 then
        if i_serviceflowtype = 1 then
            begin
                select pseudocode into o_pseudocode from zxdbm_ismp.susr_basic where usercode = i_srcmsisdn;
            exception when no_data_found then
                o_retcode   := 1001;
                o_debugpos := 83;
                o_debuginfo := 'i_srcmsisdn ='||i_srcmsisdn||', the user does not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 84;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            o_pcodemsisdnswitch := 1;
        end if;
    end if;
end if;

end slp_200_telicomusercheck;
/

– 多 DB,收费期揭示定时工作,用户更新工夫解决。
prompt zxdbm_200.slp_200_telicommaindb
create or replace procedure zxdbm_200.slp_200_telicommaindb
(

i_srcmsisdn             in          varchar2,            -- 发起方 / 赠送方用户号码
i_usemsisdn             in          varchar2,            -- 应用方 / 受赠方用户号码
i_usemsisdntype         in          number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
i_actiontype            in          number,              -- 动作类型
i_startactiontype       in          number,              -- 二次确认流程中的第一次动作类型
i_cmdchannel            in          number,              -- 动作起源
i_productid             in          varchar2,            -- 产品代码
i_serviceid             in          varchar2,            -- 业务代码
i_cpid                  in          varchar2,            --CP/SP 代码
i_freetime              in          varchar2,            -- 产品订购关系收费期
i_rollback              in          number,              -- 是否回滚订购关系 0- 不回滚 1- 回滚
i_isthird               in          number,              --0: 一般订购 1: 赠送
i_silent                in          number,              -- 缄默去激活开关
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_provinceorder         in          number,              -- 零碎开关: 是否反对跨省赠送   0- 不反对   1- 反对
i_isfromnmsc            in          number,              -- 是否 nmsc 过去的音讯 0: 否 1:是
i_substarttime          in          varchar2,            -- 产品订购关系失效工夫
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos             out         number,              -- 进口程序标识
o_debuginfo             out         varchar2             -- 调试信息

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)     := to_char(sysdate ,'yyyymmddhh24miss');
v_sysdate8              char(8)      := substr(v_sysdate14,1,8);
v_curmonth              number(2)    := to_number(substr(v_sysdate14,5,2));     -- 长期寄存以后月份
v_curstrmonth           char(2)      := lpad(to_char(v_curmonth),2,'0');        -- 长期寄存以后月份, 字符型

v_freetime              zxdbm_200.s200_user_subscription.freetime%type             := i_freetime;                                     -- 长期寄存产品订购收费日期
v_srcmsisdn             zxdbm_200.s200_user_subscription.subscriber%type           := i_srcmsisdn;                                    -- 发起方 / 赠送方用户号码
v_usemsisdn             zxdbm_200.s200_user_subscription.usercode%type             := i_usemsisdn;                                    -- 应用方 / 受赠方用户号码
v_productid             zxdbm_200.s200_user_subscription.productid%type            := i_productid;                                    -- 长期寄存产品代码
v_msisdntype            zxdbm_200.s200_user_subscription.msisdntype%type           := i_usemsisdntype;                                -- 长期寄存用户号码类型 1-msisdn,2-phs,3-pstn,4-IPTV 接入号,5- 宽带接入号,6- 固定 IP
v_cpid                  zxdbm_200.s200_user_subscription.cpid%type                 := i_cpid;                                         -- 长期寄存 CP/SP 代码
v_serviceid             zxdbm_200.s200_user_subscription.serviceid%type            := i_serviceid;                                    -- 长期寄存业务代码
v_phoneindex            zxdbm_ismp.ssys_phone.phoneindex%type                      := 0;                                              -- 长期寄存号段序号
v_phoneindexa           zxdbm_ismp.ssys_phone.phoneindex%type                      := 0;                                              -- 长期寄存 A 省号段序号, 跨省赠送
v_phoneindexb           zxdbm_ismp.ssys_phone.phoneindex%type                      := 0;                                              -- 长期寄存 B 省号段序号, 跨省赠送
v_attach                zxdbm_ismp.ssys_phone.attach%type                          := 0;                                              -- 长期寄存预付费归属,0- 未知,1-OCS,2-RTBP
v_srcuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                                              -- 长期寄存发起方用户序号
v_srcuserstatus         zxdbm_ismp.susr_basic.status%type                          := 0;                                              -- 长期寄存发起方状态
v_srcactivestatus       zxdbm_ismp.susr_basic.activestatus%type                    := 0;                                              -- 长期寄存发起方激活状态
v_srcusetime            zxdbm_ismp.susr_basic.lastusetime%type                     := '00000000000000';                               -- 长期寄存发起方上次应用工夫
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                                              -- 长期寄存应用方用户序号
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                          := 0;                                              -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type                    := 0;                                              -- 长期寄存应用方激活状态
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type                     := '00000000000000';                               -- 长期寄存应用方上次应用工夫

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos             := 0;
o_debuginfo             := ' ';
-- 订购流程,更新用户上次应用工夫
/*
if (i_actiontype in (1,17,102)) or (i_startactiontype in (1,17,102)) then
    -- 是否跨省赠送的鉴权(依据号段鉴权是否本省用户)
    -- 赠送他省不对 DA 鉴权, 来自他省赠送不对 OA 鉴权
    if i_provinceorder = 1 then
        if i_actiontype in (1,17) and (i_isfromnmsc = 1) then
            begin
                select phoneindex
                into   v_phoneindexa
                from   zxdbm_ismp.ssys_phone
                where  startprefix <= substr(v_srcmsisdn,1,length(startprefix))
                and    endprefix >= substr(v_srcmsisdn,1,length(endprefix));
            exception when no_data_found then
                null;
            when others then
                o_retcode   := 506;
                o_debugpos := 1;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            begin
                select phoneindex
                into   v_phoneindexb
                from   zxdbm_ismp.ssys_phone
                where  startprefix <= substr(v_usemsisdn,1,length(startprefix))
                and    endprefix >= substr(v_usemsisdn,1,length(endprefix));
            exception when no_data_found then
                null;
            when others then
                o_retcode   := 506;
                o_debugpos := 2;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if v_phoneindexa <> 0 and v_phoneindexb = 0 then
                v_usemsisdn := v_srcmsisdn;
            elsif v_phoneindexa = 0 and v_phoneindexb <> 0 then
                v_srcmsisdn := v_usemsisdn;
            end if;
        end if;
    end if;
    -- 发起方和应用方存在性鉴权
    if i_needauthuser = 1 then
        if (i_isthird = 1) and (v_srcmsisdn <> v_usemsisdn) then
            begin
                select a.userindex,a.status,a.activestatus,a.lastusetime,
                       b.userindex,b.status,b.activestatus,b.lastusetime
                into   v_srcuserindex,v_srcuserstatus,v_srcactivestatus,v_srcusetime,
                       v_useuserindex,v_useuserstatus,v_useactivestatus,v_useusetime
                from   zxdbm_ismp.susr_basic a, zxdbm_ismp.susr_basic b
                where  a.usercode = v_srcmsisdn and b.usercode = v_usemsisdn;
            exception when no_data_found then
                o_retcode   := 1001;    -- 用户不存在
                o_debugpos := 3;
                o_debuginfo := 'user do not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 4;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if (v_srcactivestatus = 0) then
            -- 待激活用户激活操作
                begin
                    update  zxdbm_ismp.susr_basic
                    set     activestatus = 1,
                            activetime = v_sysdate14
                    where   userindex = v_srcuserindex;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 5;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        rollback;
                        return;
                    end if;
                    commit;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 6;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                  end;
            else
            -- 已激活用户更新最近一次应用工夫
                if (i_silent = 1) then
                    if (substr(v_srcusetime,1,8) <> v_sysdate8) then
                        begin
                            update  zxdbm_ismp.susr_basic
                            set     lastusetime = v_sysdate14
                            where   userindex = v_srcuserindex;
                            if (sql%rowcount = 0) then
                                o_retcode   := 506;
                                o_debugpos := 7;
                                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                                rollback;
                                return;
                            end if;
                            commit;
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 8;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                    end if;
                end if;
            end if;
            if (v_useactivestatus = 0) then
            -- 待激活用户激活操作
                begin
                    update  zxdbm_ismp.susr_basic
                    set     activestatus = 1,
                            activetime = v_sysdate14
                    where   userindex = v_useuserindex;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 9;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        rollback;
                        return;
                    end if;
                    commit;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 10;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            else
            -- 已激活用户更新最近一次应用工夫
                if (i_silent = 1) then
                    if (substr(v_useusetime,1,8) <> v_sysdate8) then
                        begin
                            update  zxdbm_ismp.susr_basic
                            set     lastusetime = v_sysdate14
                            where   userindex = v_useuserindex;
                            if (sql%rowcount = 0) then
                                o_retcode   := 506;
                                o_debugpos := 11;
                                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                                rollback;
                                return;
                            end if;
                            commit;
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 12;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                    end if;
                end if;
            end if;
            -- 发起方状态鉴权
        else
            begin
                select userindex,status,activestatus,lastusetime
                into   v_srcuserindex,v_srcuserstatus,v_srcactivestatus,v_srcusetime
                from   zxdbm_ismp.susr_basic
                where  usercode = v_srcmsisdn;
            exception when no_data_found then
                o_retcode   := 1001;    -- 用户不存在
                o_debugpos := 13;
                o_debuginfo := 'user do not exist.';
                return;
            when others then
                o_retcode   := 506; -- 数据库谬误
                o_debugpos := 14;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            if (v_srcactivestatus = 0) then
            -- 待激活用户激活操作
                begin
                    update  zxdbm_ismp.susr_basic
                    set     activestatus = 1,
                            activetime = v_sysdate14
                    where   userindex = v_srcuserindex;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 15;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        rollback;
                        return;
                    end if;
                    commit;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 16;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            else
            -- 已激活用户更新最近一次应用工夫
                if (i_silent = 1) then
                    if (substr(v_srcusetime,1,8) <> v_sysdate8) then
                        begin
                            update  zxdbm_ismp.susr_basic
                            set     lastusetime = v_sysdate14
                            where   userindex = v_srcuserindex;
                            if (sql%rowcount = 0) then
                                o_retcode   := 506;
                                o_debugpos := 17;
                                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                                rollback;
                                return;
                            end if;
                            commit;
                        exception when others then
                            o_retcode   := 506;
                            o_debugpos := 18;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            return;
                        end;
                    end if;
                end if;
            end if;
        end if;
    end if;
end if;
*/
-- 退订流程,更新退订方上次应用工夫, 删除收费期定时工作

— if (i_actiontype in (2,18,103)) or (i_startactiontype in (2,18,103)) then

    if (i_needauthuser = 1) then
        begin
            select userindex,status,activestatus,lastusetime
            into   v_useuserindex,v_useuserstatus,v_useactivestatus,v_useusetime
            from   zxdbm_ismp.susr_basic
            where  usercode = v_usemsisdn;
        exception when no_data_found then
            o_retcode   := 1001;
            o_debugpos := 19;
            o_debuginfo := 'user do not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 20;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if (v_useactivestatus = 0) then
            -- 待激活用户激活操作
            begin
                update  zxdbm_ismp.susr_basic
                set     activestatus = 1,
                        activetime = v_sysdate14
                where   userindex = v_useuserindex;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 21;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end if;
                commit;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 22;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        else
            -- 已激活用户更新最近一次应用工夫
            if (i_silent = 1) then
                if (substr(v_useusetime,1,8) <> v_sysdate8) then
                    begin
                        update  zxdbm_ismp.susr_basic
                        set     lastusetime = v_sysdate14
                        where   userindex = v_useuserindex;
                        if (sql%rowcount = 0) then
                            o_retcode   := 506;
                            o_debugpos := 23;
                            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                            rollback;
                            return;
                        end if;
                        commit;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 24;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                end if;
            end if;
        end if;
    end if;

— end if;
end slp_200_telicommaindb;
/

– 退订入库
prompt zxdbm_200.slp_200_telicomcancelreq
create or replace procedure zxdbm_200.slp_200_telicomcancelreq
(

i_oa                    in          varchar2,            -- 发起方用户号码
i_oatype                in          number,              -- 发起方地址类型
i_srvprodid             in          varchar2,            -- 业务 / 产品代码
i_serviceid             in          varchar2,            -- 业务代码
i_actiontype            in          number,              -- 动作类型
i_cmdchannel            in          number,              -- 动作起源
i_lallindex             in          number,              -- 流程分支:1 鉴权批价 91 二次确认超时
i_servicetype           in          number,              -- 业务能力类型
i_countrycode           in          varchar2,            -- 国家码
i_spaccesscode          in          varchar2,            --antuprice 音讯中的 SP 接入码
i_silent                in          number,              -- 缄默去激活开关
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_needreplay            in          number,              -- 产品退订是否须要二次确认
i_direct                in          number,              -- 订购方向 0: 正向退订 1:SP 反向退订
i_supportproductid      in          number,              -- 同步 SP、SP 下发应用 service 还是 productid 0-serviceid 1-productid
i_prepaidtype           in          number,              -- 预付费接口类型 1-OCS 2- 非 OCS 3- 依据号段抉择是 OCS 或者非 OCS
i_opid                  in          varchar2,            -- 操作员工号
i_rollback              in          number,              -- 是否回滚订购关系 0- 不回滚 1- 回滚
i_catchflag             in          number,              -- 二次确认类型 1- 订购  2,3- 退订 4- 改号
i_checkpseudocode       in          number,              -- 零碎开关: 是否反对伪码   0- 不反对   1- 反对
i_mutidbmode            in          number,              -- 是否多 DB 环境 0: 否 1: 是
i_eventid               in          varchar2,            -- 事件 ID
i_channelid             in          varchar2,            -- 渠道商 ID
i_cancelproductid       in          varchar2,            -- 被替换的产品代码
i_issecondproduct       in          number,              -- 订购流程子类型 0: 一般订购 1: 业务订购 2: 待生效订购关系订购 3: 纯包量反复订购 6: 可变价的反复订购 7: 体验转正式的反复订购
--added by youqunxia 20131010  Order3.02.01
i_effectiveswitch       in          number,              --VSOP 发动的订购退订立刻失效开关是否关上,0- 敞开,1- 关上
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos             out         number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_usemsisdn             out         varchar2,            -- 去掉前缀的应用方用户号码
o_paymsisdn             out         varchar2,            -- 去掉前缀的计费方号码
o_usemsisdntype         out         number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
o_paymsisdntype         out         number,              -- 付费方号码类型,1:msisdn,2:phs,3:pstn
o_userindex             out         number,              -- 应用方号码序号
o_paytype               out         number,              -- 计费号码的付费类型 0: 后付费 1: 预付费 2: 准预付费
o_oppaytype             out         number,              -- 话单专用付费类型
o_scptype               out         number,              -- 对预付费扣费的设施类型 1:OCS;2:非 OCS
o_subfee                   out         number,              -- 本次退订须要扣取 / 补回的费用
o_feemode               out         number,              --1:扣费  2:补款
o_colortype             out         number,              -- 应用方号码名单类型   0- 普通用户,1- 黑名单,2- 白名单,3- 灰名单,4- 红名单
o_cpid                  out         varchar2,            --CP/SP 代码
o_cpindex               out         number,              --CP/SP 序号
o_cpcnshortname         out         varchar2,            --CP/SP 名称
o_cpunsubscribeurl      out         varchar2,            --CP/SP 退订 URL
o_cptype                out         number,              --CP/SP 类型 0: 本省 1:是全国业务
o_protocoltype          out         number,              -- 定购同步协定类型 0 -ismp(wbs 形式),1-smgp2.0(cngp1.0),2-smgp3.0
o_msgtosp               out         varchar2,            --SMGP/CNGP 同步 sp 的音讯内容
o_customersrvtel        out         varchar2,            --CP/SP 客服电话
o_serviceid             out         varchar2,            -- 业务代码
o_serviceindex          out         number,              -- 业务序号
o_servicename           out         varchar2,            -- 业务名称
o_productid             out         varchar2,            -- 产品代码
o_productindex          out         number,              -- 产品序号
o_productname           out         varchar2,            -- 产品名称
o_smschargingcn         out         varchar2,            -- 产品资费短信形容
o_servicetype           out         number,              -- 产品业务能力类型
o_subcapability         out         number,              -- 产品业务能力子类型
o_srvtypeid             out         varchar2,            -- 业务能力编码,对应 ssys_service_type 表中的 srvtypeid
o_corpid                out         varchar2,            -- 团体代码
o_corpindex             out         number,              -- 团体序号
o_corpcnshortname       out         varchar2,            -- 团体名称
o_subendtime            out         varchar2,            -- 产品订购关系生效工夫
o_linknum               out         varchar2,            -- 业务话单中同一个流程中二次确认前后话单的关联
o_productsubid          out         varchar2,            -- 产品订购关系代码
o_productsubindex       out         number,              -- 产品订购关系序号
o_neednotifysp          out         number,               -- 是否有必要告诉 SP
o_pseudocode            out         varchar2,            -- 伪码
o_pcodemsisdnswitch     out         number,              -- 伪码和实在号码之间是否有转换:  0 否   1 实在号码转化伪码 2 伪码转化为实在号码
o_chanelplayerstate     out         number,              --cp/sp 状态,0- 申请,1- 失常,2- 暂停(暂停代收费),3- 预登记,4- 登记,5- 解冻,21- 暂停端口
o_eventstate            out         number,              --0, 失常 1, 登记
o_spaccesscode          out         varchar2,              --SP 接入码
o_maincapability        out         number,              -- 组合业务主业务能力类型
o_submaincapability     out         number,              -- 组合业务主业务能力子类型
o_cpsrvtype             out         number,              --CP 服务类型:0:CP+SP,1:CP,2:SP ;3:自营业务 SP
o_orderfeaturecode      out         varchar2,            -- 短信, 彩信订购指令
o_cdrbegintime          out         varchar2,            -- 话单计费开始工夫
o_cdrendtime            out         varchar2,             -- 话单计费完结工夫
o_producttype           out         number,               -- 产品类型   1- 失常产品 2- 测试产品
o_cnfmtype              out         number,               -- 产品零扣费类型 0: 非零扣费  1: 产品收费或者费率设置为 0  2: 收费期无费用
o_invalidmode           out         number,               -- 退订失效形式,0 立刻失效,1- 下一帐期失效 2- 退定后可应用足月
o_cityid                out         varchar2,             -- 用户表中的 cityid
--added by youqunxia 2013.01.17
o_orderaccesscode       out         varchar2,             -- 短信, 彩信订购接入码
--added by youqunxia20130906 Order3.02.01
o_issynctooidd          out         number                -- 是否同步订购关系给 OIDD,0- 否,1- 是

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)     := to_char(sysdate ,'yyyymmddhh24miss');
v_sysdate8              char(8)      := substr(v_sysdate14,1,8);
v_sysmonth6             char(6)      := substr(v_sysdate14,1,6);

v_curmonth              number(2)    := to_number(substr(v_sysdate14,5,2));     -- 长期寄存以后月份
v_curstrmonth           char(2)      := lpad(to_char(v_curmonth),2,'0');        -- 长期寄存以后月份, 字符型
v_curmonthendtime       char(14)     := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')),'yyyymmdd')||'235959';
v_nextmonthstarttime    char(14)     := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')) + 1,'yyyymmdd')||'000000';

v_maincapability        number(10)                                                 := 0;                       -- 长期寄存组合业务主业务能力类型
v_submaincapability     number(10)                                                 := 0;                       -- 长期寄存组合业务主业务能力子类型
v_countrycode           varchar2(5)                                                := i_countrycode;           -- 长期寄存国家码
v_tempitem              number(10)                                                 := 0;                       -- 长期寄存 0 或者推广期的计费子序号
v_cmdchannel            number(10)                                                 := i_cmdchannel;            -- 长期寄存动作起源
v_tmpint                number(10)                                                 := 0;                       -- 长期寄存长期数值
v_devexist              number(3)                                                  := 1;                       -- 长期寄存是否存在对应设施
v_leftdays              number(10)                                                 := 0;                       -- 本月残余天数
v_monthdays             number(10)                                                 := 0;                       -- 本月无效免费天数
v_sql                   varchar2(3072)                                             := ' ';                     -- 长期寄存动静 sql
v_isservicesub          number(3)                                                  := 0;                       -- 长期寄存是否业务订购
v_spaccesscode          varchar2(40)                                               := ' ';                     -- 长期寄存 sp 接入码
v_silentdays            number(10)                                                 := 0;                       -- 缄默用户天数
v_nextrentfee           number(10)                                                 := 0;                       -- 长期寄存待失效包月费
v_rentfeevalidate       char(6)                                                    := ' ';                     -- 长期寄存待失效包月费率失效月
v_totaldctemplate       varchar2(500)                                              := ' ';                     -- 长期寄存解析模板:产品分档费率
v_dealtemplate          varchar2(500)                                              := ' ';                     -- 长期寄存解析模板:待解析的分档段
v_totaldclength         number(3)                                                  := 0;                       -- 长期寄存解析模板: 分档字符串的长度
v_totaldcsum            number(10)                                                 := 0;                       -- 长期寄存解析模板: 分档总费用
v_index0                number(3)                                                  := 0;                       -- 长期寄存解析模板: 分档字符串中 & 的地位
v_index1                number(3)                                                  := 0;                       -- 长期寄存解析模板: 分档字符串中; 的地位
v_nextrentdatecycle     char(14)                                                   := v_sysdate14;             -- 长期寄存包周期产品的下次打算扣租工夫
v_freeuseflag           number(3)                                                  := 0;                       -- 长期存入流媒体业务的试用期属性
v_hasrecord             number(3)                                                  := 0;                       -- 寄存须要退订的产品是否蕴含在捆绑销售品中(0,不蕴含;1,蕴含)v_templockmonth         number(5,2)                                                := 0;                       -- 长期寄存退订时与订购时相差的月份数

v_oa                    zxdbm_ismp.susr_basic.usercode%type                        := ' ';                     -- 长期寄存发起方用户号码
v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                        := ' ';                     -- 长期寄存应用方用户号码
v_paymsisdn             zxdbm_ismp.susr_basic.usercode%type                        := ' ';                     -- 长期寄存计费方用户号码
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                       -- 长期寄存应用方用户序号
v_payuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                       -- 长期寄存计费方用户序号
v_useusertype           zxdbm_ismp.susr_basic.usertype%type                        := 1;                       -- 长期寄存应用方用户类型
v_usepaytype            zxdbm_ismp.susr_basic.paytype%type                         := 0;                       -- 长期寄存应用方用户付费类型
v_paypaytype            zxdbm_ismp.susr_basic.paytype%type                         := 0;                       -- 长期寄存付费方用户付费类型
v_useblacklist          zxdbm_ismp.susr_basic.blacklist%type                       := 0;                       -- 长期寄存应用方是否进入黑名单
v_usewhitelist          zxdbm_ismp.susr_basic.whitelist%type                       := 0;                       -- 长期寄存应用方是否进入白名单
v_useredlist            zxdbm_ismp.susr_basic.redlist%type                         := 0;                       -- 长期寄存应用方是否进入红名单
v_useblacklevel         zxdbm_ismp.susr_basic.blacklevel%type                      := 0;                       -- 长期寄存应用方黑名单级别
v_usewhitelevel         zxdbm_ismp.susr_basic.whitelevel%type                      := 0;                       -- 长期寄存应用方白名单级别
v_usemsisdntype         zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                       -- 长期寄存应用方号码类型
v_paymsisdntype         zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                       -- 长期寄存付费方号码类型
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                          := 0;                       -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type                    := 0;                       -- 长期寄存应用方激活状态
v_useoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                       := 0;                       -- 长期寄存应用方话单专用付费类型
v_payoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                       := 0;                       -- 长期寄存付费方话单专用付费类型
v_usecorpindex          zxdbm_ismp.susr_basic.corpindex%type                       := 0;                       -- 长期寄存应用方团体序号
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type                     := '00000000000000';        -- 长期寄存应用方上次应用工夫
v_useusercityid         zxdbm_ismp.susr_basic.cityid%type                          := ' ';                                       -- 长期寄存计费方号码类型
v_payusercityid         zxdbm_ismp.susr_basic.cityid%type                          := ' ';                                       -- 长期寄存计费方号码类型

v_usecorpid             zxdbm_ismp.susr_corp.corpid%type                           := ' ';                     -- 长期寄存团体代码
v_productindex          zxdbm_200.s200_product.productindex%type                   := 0;                       -- 长期寄存产品序号
v_invalidmode           zxdbm_200.s200_product.invalidmode%type                    := 0;                       -- 退订失效形式,0 立刻失效,1- 下一帐期失效 2- 退定后可应用足月
v_validcyctype          zxdbm_200.s200_product.validcyctype%type                   := 0;                       -- 长期寄存周期形式 0 - 非周期,1- 天,2- 周,3- 月,定购失效形式为 2 时失效
v_validcycparam         zxdbm_200.s200_product.validcycparam%type                  := 0;                       -- 长期寄存周期参数,定购失效形式为 2 时失效
v_validdate             zxdbm_200.s200_product.validdate%type                      := v_sysdate14;             -- 长期寄存指定失效日期
v_subfeemode            zxdbm_200.s200_product.subfeemode%type                     := 1;                       -- 长期寄存定购当月免费形式
v_subfeedays            zxdbm_200.s200_product.subfeedays%type                     := 0;                       -- 长期寄存免费日期取值范畴为 0~28,0 示意本月全副收费,其余示意 n 号之后收费。v_freedays              zxdbm_200.s200_product.freedays%type                       := 0;                       -- 长期寄存收费试用天数
v_popustart             zxdbm_200.s200_product.popularizestart%type                := v_sysdate8;              -- 长期寄存推广期开始工夫
v_popustop              zxdbm_200.s200_product.popularizestop%type                 := v_sysdate8;              -- 长期寄存推广期完结工夫
v_popuitem              zxdbm_200.s200_product.popularizeitem%type                 := 0;                       -- 长期寄存推广期计费计划,0 示意收费,1- 推广期计划
v_needcharge            zxdbm_200.s200_product.needcharge%type                     := 1;                       -- 长期寄存是否须要计费,0- 收费,1- 须要计费
v_productname           zxdbm_200.s200_product.productname%type                    := ' ';                     -- 长期寄存产品名称
v_productstatus         zxdbm_200.s200_product.status%type                         := 0;                       -- 长期寄存产品状态
v_onlyforcorp           zxdbm_200.s200_product.onlyforcorp%type                    := 0;                       -- 长期寄存是否团体专用产品 0:个人用户专用 1:团体专用
v_productstarttime      zxdbm_200.s200_product.starttime%type                      := v_sysdate14;             -- 长期寄存产品失效工夫
v_productendtime        zxdbm_200.s200_product.endtime%type                        := '99991231235959';        -- 长期寄存产品终止工夫
v_workflow              zxdbm_200.s200_product.workflow%type                       := 0;                       -- 长期寄存工作流状态
v_workflowlife          zxdbm_200.s200_product.workflowlife%type                   := 0;                       -- 长期寄存工作流流程状态
v_cpindex               zxdbm_200.s200_product.cpindex%type                        := 0;                       -- 长期寄存 CP/SP 序号
v_serviceindex          zxdbm_200.s200_product.serviceindex%type                   := 0;                       -- 长期寄存业务序号
v_smschargingcn         zxdbm_200.s200_product.smschargingcn%type                  := ' ';                     -- 长期寄存产品资费短信形容
v_canbepresent          zxdbm_200.s200_product.canbepresent%type                   := 0;                       -- 长期寄存是否可赠送,0- 不可赠送,1- 可赠送
v_servicetype           zxdbm_200.s200_product.servicetype%type                    := 0;                       -- 长期寄存业务能力类型
v_subcapability         zxdbm_200.s200_product.subcapability%type                  := 1;                       -- 长期寄存业务能力子类型 1 -3G,2-PHS,3-ISAG, 默认为 3g 业务能力(仅电信应用,其余营运商皆默认为 1)v_srvprodid             zxdbm_200.s200_product.productid%type                      := i_srvprodid;             -- 长期寄存业务产品代码
v_productid             zxdbm_200.s200_product.productid%type                      := ' ';                     -- 长期寄存产品代码
v_onlyforpkg            zxdbm_200.s200_product.onlyforpkg%type                     := 0;                       -- 长期寄存是否套餐专用产品
v_backfeemode           zxdbm_200.s200_product.backfeemode%type                    := 0;                       -- 长期寄存退定补款形式,0- 不补款,1- 按帐期残余理论天数补款
--added by youqunxia20130924 order3.02.01
v_lockmonth             zxdbm_200.s200_product.lockmonth%type                      := 0;                       -- 长期存产品放协定期,单位月份, 为 0 时按无协定期解决

v_chargetype            zxdbm_200.s200_product_fee.chargetype%type                 := 0;                       -- 长期寄存计费类型
v_subchargetype         zxdbm_200.s200_product_fee.subchargetype%type              := 0;                       -- 长期寄存计费子类型
v_cyctype               zxdbm_200.s200_product_fee.cyctype%type                    := 0;                       -- 长期寄存周期类型 0 - 非周期,1- 周期性
v_cycunit               zxdbm_200.s200_product_fee.cycunit%type                    := 0;                       -- 长期寄存周期单位 0- 无,1- 天,2- 周,3- 月,4- 半年,5- 年,6- 小时,7- 分钟,8- 秒
v_cycparam              zxdbm_200.s200_product_fee.cycparam%type                   := 0;                       -- 长期寄存周期参数
v_rentfee               zxdbm_200.s200_product_fee.rentfee%type                    := 0;                       -- 长期寄存周期性费用金额
v_fixfee                zxdbm_200.s200_product_fee.fixfee%type                     := 0;                       -- 长期寄存包量费用
v_fixusetimes           zxdbm_200.s200_product_fee.fixusetimes%type                := 0;                       -- 长期寄存包量应用值,0- 无限度
v_unitvol               zxdbm_200.s200_product_fee.unitvol%type                    := 10;                      -- 长期寄存绝对于目前最小计量单位的量,时长为百毫秒,流量为 byte
v_autocontinue          zxdbm_200.s200_product_fee.autocontinue%type               := 0;                       -- 长期寄存周期性定购,是否主动续订
v_minlimitfee           zxdbm_200.s200_product_fee.minlimitfee%type                := 0;                       -- 长期寄存保底费用,0- 无保底费
v_usecomfee             zxdbm_200.s200_product_fee.usecomfee%type                  := 1;                       -- 长期寄存限度(量、工夫)外应用形式,1- 应用根本费率,0- 不容许持续应用
v_totaldiscount         zxdbm_200.s200_product_fee.totaldiscount%type              := ' ';                            -- 长期寄存限度(量、工夫)外应用形式,1- 应用根本费率,0- 不容许持续应用
v_cpid                  zxdbm_ismp.scp_basic.cpid%type                             := ' ';                     -- 长期寄存 CP/SP 代码
v_cpstatus              zxdbm_ismp.scp_basic.status%type                           := 0;                       -- 长期寄存 CP/SP 代码
v_cpsubscribeurl        zxdbm_ismp.scp_basic.cpsubscribeurl%type                   := ' ';                     -- 长期寄存 CP/SP 订购 URL
v_cpunsubscribeurl      zxdbm_ismp.scp_basic.cpunsubscribeurl%type                 := ' ';                     -- 长期寄存 CP/SP 退订 URL
v_hasblacklist          zxdbm_ismp.scp_basic.hasblacklist%type                     := 0;                       -- 长期寄存是否有黑名单管制 0-无,1-有
v_cptype                zxdbm_ismp.scp_basic.cptype%type                           := 2;                       -- 长期寄存 CP/SP 类型
v_cpsrvtype             zxdbm_ismp.scp_basic.cpsrvtype%type                        := 0;                       -- 长期寄存 CP 服务类型
v_insubblacklist        zxdbm_ismp.scp_basic.insubblacklist%type                   := 0;                       -- 长期寄存限度订购 SP 黑名单标识
v_cpcnshortname         zxdbm_ismp.scp_basic.cpcnshortname%type                    := ' ';                     -- 长期寄存 CP/SP 中文名简写
v_customersrvtel        zxdbm_ismp.scp_basic.customersrvtel%type                   := ' ';                     -- 长期寄存 CP/SP 客服电话
v_protocoltype          zxdbm_200.s200_sp_service_type.protocoltype%type           := 0;                       -- 长期寄存定购同步协定类型 0 -ismp(wbs 形式),1-smgp2.0(cngp1.0),2-smgp3.0(cngp1.0 扩大)v_srvtypeid             zxdbm_ismp.ssys_service_type.srvtypeid%type                := ' ';                     -- 长期寄存话单中的 srvtypeid
v_productcancelmode     zxdbm_ismp.ssrv_corp_product.unsubscribemode%type          := 0;                       -- 长期寄存退订形式,0- 必须团体管理员退订,1- 团体管理员与团体成员均可退订
v_productpayparty       zxdbm_ismp.ssrv_corp_product.payparty%type                 := 2;                       -- 长期寄存团体专用产品付费方 1- 团体付费 2- 集体付费
v_productsubindex       zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                       -- 长期寄存订购关系序号
v_productsubid          zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';                     -- 长期寄存订购关系代码
v_serviceid             zxdbm_200.s200_user_subscription.serviceid%type            := i_serviceid;             -- 长期寄存业务代码
v_propkgindex           zxdbm_200.s200_user_subscription.productpkgindex%type      := 0;                       -- 长期寄存套餐序号
v_propkgid              zxdbm_200.s200_user_subscription.productpkgid%type         := ' ';                     -- 长期寄存套餐代码
v_contentindex          zxdbm_200.s200_user_subscription.contentindex%type         := 0;                       -- 长期寄存内容序号
v_contentid             zxdbm_200.s200_user_subscription.contentid%type            := ' ';                     -- 长期寄存内容代码
v_corpindex             zxdbm_200.s200_user_subscription.corpindex%type            := 0;                       -- 长期寄存团体序号
v_corpid                zxdbm_200.s200_user_subscription.corpid%type               := ' ';                     -- 长期寄存团体代码
v_subscriber            zxdbm_200.s200_user_subscription.subscriber%type           := ' ';                     -- 发起方用户号码
v_usercode              zxdbm_200.s200_user_subscription.usercode%type             := ' ';                     -- 应用方用户号码
v_payuser               zxdbm_200.s200_user_subscription.payuser%type              := ' ';                     -- 计费方用户号码
v_subscribemode         zxdbm_200.s200_user_subscription.subscribemode%type        := 1;                       -- 长期寄存订购形式
v_subscribechannel      zxdbm_200.s200_user_subscription.subscribechannel%type     := 3;                       -- 长期寄存订购渠道
v_subscribeoptype       zxdbm_200.s200_user_subscription.subscribeoptype%type      := 0;                       -- 长期寄存订购操作
v_cancelmode            zxdbm_200.s200_user_subscription.cancelmode%type           := 0;                       -- 长期寄存订购形式
v_cancelchannel         zxdbm_200.s200_user_subscription.cancelchannel%type        := 0;                       -- 长期寄存订购渠道
v_canceloptype          zxdbm_200.s200_user_subscription.canceloptype%type         := 0;                       -- 长期寄存订购操作
v_pausemode             zxdbm_200.s200_user_subscription.pausemode%type            := 0;                       -- 长期寄存产品暂停起因
v_resumemode            zxdbm_200.s200_user_subscription.resumemode%type           := 0;                       -- 长期寄存产品复原起因
v_substatus             zxdbm_200.s200_user_subscription.status%type               := 0;                       -- 长期寄存产品订购关系状态
v_pushid                zxdbm_200.s200_user_subscription.pushid%type               := ' ';                     -- 长期寄存推荐者 ID
v_substarttime          zxdbm_200.s200_user_subscription.starttime%type            := v_sysdate14;             -- 长期寄存定购失效工夫
v_cursubendtime         zxdbm_200.s200_user_subscription.endtime%type              := v_sysdate14;             -- 长期寄存以后定购关系生效工夫
v_subendtime            zxdbm_200.s200_user_subscription.endtime%type              := '99991231235959';        -- 长期寄存定购生效工夫
v_lastrenttime          zxdbm_200.s200_user_subscription.lastrenttime%type         := '00000000000000';        -- 长期寄存上次扣租工夫
v_nextrentdate          zxdbm_200.s200_user_subscription.nextrentdate%type         := v_sysdate8;              -- 长期寄存下次扣租日期
v_nextnextrentdate      zxdbm_200.s200_user_subscription.nextrentdate%type         := v_sysdate8;              -- 长期寄存下下次扣租日期
v_payfordate            zxdbm_200.s200_user_subscription.payfordate%type           := '00000000';              -- 长期寄存月租已付日期
v_returnvalues          zxdbm_200.s200_user_subscription.returnvalues%type         := 0;                       -- 长期寄存下一周期返还值
v_returntype            zxdbm_200.s200_user_subscription.returntype%type           := 1;                       -- 长期寄存返还量类型
v_returnstartdate       zxdbm_200.s200_user_subscription.returnstartdate%type      := '00000000';              -- 长期寄存返还值开始日期
v_returnenddate         zxdbm_200.s200_user_subscription.returnenddate%type        := '00000000';              -- 长期寄存返还值完结日期
v_chargeparty           zxdbm_200.s200_user_subscription.chargeparty%type          := 0;                       -- 长期寄存定购时填入,扣月租应用,计费方 0:用户;1:SP;2:团体
v_freetime              zxdbm_200.s200_user_subscription.freetime%type             := '00000000000000';        -- 长期寄存产品订购收费日期
v_createtime            zxdbm_200.s200_user_subscription.createtime%type           := '00000000000000';        -- 长期寄存用户订购工夫
v_canceltime            zxdbm_200.s200_user_subscription.canceltime%type           := '00000000000000';        -- 长期寄存用户退定工夫
v_firstusetime          zxdbm_200.s200_user_subscription.firstusetime%type         := '00000000000000';        -- 长期寄存用户首次应用工夫
v_lastusetime           zxdbm_200.s200_user_subscription.lastusetime%type          := '00000000000000';        -- 长期寄存用户上次应用工夫
v_tastestarttime        zxdbm_200.s200_user_subscription.tastestarttime%type       := '00000000000000';        -- 长期寄存体验期开始工夫
v_tasteendtime          zxdbm_200.s200_user_subscription.tasteendtime%type         := '00000000000000';        -- 长期寄存体验期完结工夫
v_pausetime             zxdbm_200.s200_user_subscription.pausetime%type            := '00000000000000';        -- 长期寄存暂停工夫
v_resumetime            zxdbm_200.s200_user_subscription.resumetime%type           := '00000000000000';        -- 长期寄存暂停复原工夫
v_subscribeopid         zxdbm_200.s200_user_subscription.subscribeopid%type        := ' ';                     -- 长期寄存定购操作员工号
v_cancelopid            zxdbm_200.s200_user_subscription.cancelopid%type           := i_opid;                  -- 长期寄存退定操作员工号
v_cancelreason          zxdbm_200.s200_user_subscription.cancelreason%type         := ' ';                     -- 长期寄存退定起因形容
v_lastrent              zxdbm_200.s200_user_subscription.lastrent%type             := 0;                       -- 长期寄存上次扣租金额
v_rollbacklastrent      zxdbm_200.s200_user_subscription.lastrent%type             := 0;                       -- 长期寄存上次扣租金额(订购关系待生效产品的订购失败回滚)
v_msisdntype            zxdbm_200.s200_user_subscription.msisdntype%type           := 1;                       -- 长期寄存用户号码类型 1-msisdn,2-phs,3-pstn,4-IPTV 接入号,5- 宽带接入号,6- 固定 IP
v_productsubstatus      zxdbm_200.s200_user_subscription.status%type               := 0;
v_pseudocode            zxdbm_200.s200_user_subscription.pseudocode%type           := ' ';                     -- 长期寄存订购关系表中伪码
v_oldproductid          zxdbm_200.s200_user_subscription.oldproductid%type         := ' ';                     -- 长期寄存产品代码
--added by youqunxia20130608 order2.07.10
v_pproductofferid       zxdbm_200.s200_user_subscription.pproductofferid%type      := ' ';                     -- 长期寄存增值产品对应的捆绑类套餐 ID
--added by youqunxia20130906 order3.02.01
v_varifee               zxdbm_200.s200_user_subscription.varifee%type              := '';                      -- 长期寄存以后订购关系中的可变价格                                    
v_eventid               zxdbm_200.s200_user_subscription.eventid%type              := '';                      -- 长期寄存事件 ID    
v_servicesort           zxdbm_200.s200_service.servicesort%type                    := 0;                       -- 业务归属 0:一般业务、1:属于 OIDD 2:属于定位
v_servicename           zxdbm_200.s200_service.servicename%type                    := ' ';                     -- 长期寄存业务表中的业务名称
v_isexperience          zxdbm_200.s200_user_subscription.isexperience%type         := '0';                     -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
v_subscribetype         zxdbm_200.s200_user_subscription.subscribetype%type        := '0';                     -- 订购形式:0:非批量受理 1: 批量受理 默认为 0
v_chargetime            zxdbm_200.s200_user_subscription.chargetime%type           := '00000000000000';        -- 首次扣费时间

v_orderupdateurl        zxdbm_200.s200_service.orderupdateurl%type                 := ' ';                     -- 长期寄存业务表中
v_subsrvtype            zxdbm_200.s200_service.subsrvtype%type                     := 1;                       -- 长期寄存业务子类型,1-wap pull,2-wap push,3-op wap push,4-wap pull 下载,101- 试用业务(也示意 wap pull 试用业务);102:wap push 试用业务;1001 - 根本通道费;1002
v_phoneindex            zxdbm_ismp.ssys_phone.phoneindex%type                      := 0;                       -- 长期寄存号段序号
v_attach                zxdbm_ismp.ssys_phone.attach%type                          := 0;                       -- 长期寄存预付费归属,0- 未知,1-OCS,2-RTBP



begin

-- 出参初始化
o_retcode               := 0;
o_debugpos             := 0;
o_debuginfo             := ' ';
o_usemsisdn             := ' ';
o_paymsisdn             := ' ';
o_usemsisdntype         := 1;
o_paymsisdntype         := 1;
o_userindex             := 0;
o_paytype               := 0;
o_oppaytype             := 0;
o_scptype               := 2;
o_subfee                   := 0;
o_feemode               := 1;
o_colortype             := 0;
o_cpid                  := ' ';
o_cpindex               := 0;
o_cpcnshortname         := ' ';
o_cpunsubscribeurl      := ' ';
o_cptype                := 0;
o_protocoltype          := 0;
o_msgtosp               := ' ';
o_customersrvtel        := ' ';
o_serviceid             := ' ';
o_serviceindex          := 0;
o_servicename           := ' ';
o_productid             := ' ';
o_productindex          := 0;
o_productname           := ' ';
o_smschargingcn         := ' ';
o_servicetype           := 0;
o_subcapability         := 1;
o_srvtypeid             := ' ';
o_corpid                := ' ';
o_corpindex             := 0;
o_corpcnshortname       := ' ';
o_subendtime            := '99991231235959';
o_linknum               := ' ';
o_productsubid          := ' ';
o_productsubindex       := 0;
o_neednotifysp          := 0;
o_pseudocode            :='';
o_pcodemsisdnswitch     :=0;
o_chanelplayerstate     :=0;
o_eventstate            :=1;
o_spaccesscode          := i_spaccesscode;
o_maincapability        := 0;
o_submaincapability     := 0;
o_cpsrvtype             :=0;
o_orderfeaturecode      := ' ';
o_cdrbegintime          := substr(v_sysdate8,1,6) || '01000000';
o_cdrendtime            := v_curmonthendtime;
o_producttype           := 1;
o_cnfmtype              := 0;
o_invalidmode           := 0;
o_cityid                := '';

--added by youqunxia 2013.01.17
o_orderaccesscode       := ' ';

o_issynctooidd          := 0;

if v_cancelopid is null then
    v_cancelopid := ' ';
end if;

/**
–part– –telicomcancelreq– 1. 预鉴权

 发起方地址类型
 发起方用户号码去前缀

**/

-- 发起方地址类型鉴权 现网局点可思考正文.
-- 批量操作不进行鉴权, 由业务从用户表中查询处理
--modied by youqunxia20130709 Order2.07.10
if (i_actiontype <> 17 and i_lallindex <> 91) then
    if i_oatype not in (1,2,3,4) then
        o_retcode   := 107;
        o_debugpos := 1;
        o_debuginfo := 'i_oatype='||i_oatype||', not in (1,2,3,4).';
        return;
    end if;
end if;

-- 发起方用户号码去前缀
v_oa := ltrim(rtrim(nvl(i_oa,'0')));
if v_oa like ('+' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 2);
elsif v_oa like ('00' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 3);
elsif v_oa like (v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 1);
end if;
if (substr(v_oa,1,1) <> '0') and (i_oatype = 4) then
    v_oa := '0' || v_oa;
end if;
v_usemsisdn := v_oa;
o_usemsisdn  := v_usemsisdn;
if (v_usemsisdn = '0') then
    o_retcode   := 1001;
    o_debugpos := 2;
    o_debuginfo := 'v_usemsisdn='||v_usemsisdn||', v_usemsisdn is 0.';
    return;
end if;

/**
–part– –telicomcancelreq– 2. 应用方号码存在性鉴权
**/

if (i_needauthuser = 1) then
    begin
        select userindex,usertype,paytype,blacklist,whitelist,
               redlist,blacklevel,whitelevel,msisdntype,status,
               activestatus,oppaytype,corpindex,lastusetime,cityid
        into   v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,
               v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,
               v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_useusercityid
        from   zxdbm_ismp.susr_basic
        where  usercode = v_usemsisdn;
    exception when no_data_found then
        o_retcode   := 1001;
        o_debugpos := 3;
        o_debuginfo := 'usercode do not exist.';
        if (i_oatype = 4) then
            v_usemsisdntype    := 2;
        else
            v_usemsisdntype    := 1;
        end if;
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 4;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        if (i_oatype = 4) then
            o_usemsisdntype    := 2;
        else
            o_usemsisdntype    := 1;
        end if;
        return;
    end;
    v_paymsisdn     := v_usemsisdn;
    v_paymsisdntype := v_usemsisdntype;
    v_payuserindex  := v_useuserindex;
    o_paymsisdn     := v_paymsisdn;
    o_usemsisdntype := v_usemsisdntype;
    o_paymsisdntype := v_paymsisdntype;
    o_userindex     := v_useuserindex;
    o_paytype       := v_usepaytype;
    o_oppaytype     := v_useoppaytype;
    o_corpindex     := v_usecorpindex;
    o_cityid        := trim(v_useusercityid);

    -- 批量操作用户号码类型由用户表查问后鉴权
    if (i_cmdchannel in (7,32)) then
         if v_usemsisdntype not in (1,2,3) then
             o_retcode   := 100;
             o_debugpos := 5;
             o_debuginfo := 'v_usemsisdntype='||v_usemsisdntype||', not in (1,2,3);';
             return;
         end if;
    end if;

    if (v_useredlist = 1) then
        o_colortype := 4;
    else
        o_colortype := 0;
    end if;
    if i_mutidbmode = 0 then
        if (v_useactivestatus = 0) then
            -- 待激活用户激活操作
            begin
                update  zxdbm_ismp.susr_basic
                set     activestatus = 1,
                        activetime = v_sysdate14
                where   userindex = v_useuserindex;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 6;
                    o_debuginfo := 'usercode do not exist.';
                    rollback;
                    return;
                end if;
                commit;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 7;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        else
            -- 已激活用户更新最近一次应用工夫
            if (i_silent = 1) then
                if (substr(v_useusetime,1,8) <> v_sysdate8) then
                    begin
                        update  zxdbm_ismp.susr_basic
                        set     lastusetime = v_sysdate14
                        where   userindex = v_useuserindex;
                        if (sql%rowcount = 0) then
                            o_retcode   := 506;
                            o_debugpos := 8;
                            o_debuginfo := 'usercode do not exist.';
                            rollback;
                            return;
                        end if;
                        commit;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 9;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                end if;
            end if;
        end if;
    end if;
end if;

/**
–part– –telicomcancelreq– 3. 产品存在性鉴权
**/

-- 产品互斥时,ESMGP 传 21 个 0 在 productid 字段当中,同时传进来业务 ID,此时以业务 ID 来获取实在的产品 ID
if v_srvprodid = '000000000000000000000' then
    v_sql := 'select isservicesub from zxdbm_200.s200_service where serviceid = :p1';
    begin
        execute immediate v_sql into v_isservicesub using v_serviceid;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 10;
        o_debuginfo := 'serviceindex='||v_serviceid||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 11;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if v_isservicesub <> 1 then
        o_retcode   := 505;
        o_debugpos := 12;
        o_debuginfo := 'esmgp parse error.';
        return;
    end if;
    -- 获取实在的产品 ID, 用于后续的操作
    begin
        select productid
        into   v_srvprodid
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and serviceid = v_serviceid;
    exception when no_data_found then
        o_retcode   := 1201;
        o_debugpos := 13;
        o_debuginfo := o_debuginfo ||'v_usemsisdn ='||v_usemsisdn||'v_serviceid ='||v_serviceid||'the subscription dose not exist;';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 14;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

if (i_direct = 1 and i_supportproductid = 0) then
-- 反向订购并且反对业务 ID 的退订
    begin
        select productindex,invalidmode,validcyctype,
               validcycparam,validdate,subfeemode,subfeedays,freedays,
               popularizestart,popularizestop,popularizeitem,needcharge,
               productname,status,onlyforcorp,starttime,endtime,
               workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,
               servicetype,subcapability,onlyforpkg,productid,backfeemode,lockmonth
        into   v_productindex,v_invalidmode,v_validcyctype,
               v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,
               v_popustart,v_popustop,v_popuitem,v_needcharge,
               v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
               v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
               v_servicetype,v_subcapability,v_onlyforpkg,v_productid,v_backfeemode,v_lockmonth
        from  zxdbm_200.s200_product
        where serviceid = v_srvprodid and ordertype = 1;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 15;
        o_debuginfo := 'serviceid='||v_srvprodid||', ordertype = 1'||', the product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 16;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select productindex,invalidmode,validcyctype,
               validcycparam,validdate,subfeemode,subfeedays,freedays,
               popularizestart,popularizestop,popularizeitem,needcharge,
               productname,status,onlyforcorp,starttime,endtime,
               workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,
               servicetype,subcapability,productid,backfeemode,serviceid,lockmonth
        into   v_productindex,v_invalidmode,v_validcyctype,
               v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,
               v_popustart,v_popustop,v_popuitem,v_needcharge,
               v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
               v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
               v_servicetype,v_subcapability,v_productid,v_backfeemode,v_serviceid,v_lockmonth
        from   zxdbm_200.s200_product
        where  productid = v_srvprodid;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 17;
        o_debuginfo   := 'productid='||v_srvprodid||', the product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 18;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_productid      := v_productid;
o_productname    := v_productname;
o_productindex   := v_productindex;
o_serviceindex   := v_serviceindex;
o_serviceid      := v_serviceid;
o_cpindex        := v_cpindex;
o_smschargingcn  := v_smschargingcn;
o_servicetype    := v_servicetype;
o_subcapability  := v_subcapability;
if i_servicetype = 5 then
    v_sql := 'select freeuseflag,freedays from zxdbm_200.s200_product where productindex = :p1';
    begin
        execute immediate v_sql into v_freeuseflag,v_freedays using v_productindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 19;
        o_debuginfo   := 'The product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 20;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
-- 产品状态鉴权
if (v_productstatus in (0,2) and (v_workflowlife = 3)) then
    o_producttype := 2;
end if;

--added by youqunxia20130925 order3.02.01
-- 产品状态为登记 / 预登记时,按失常解决, 产品登记的优先级高于协定期
v_templockmonth := months_between(sysdate,to_date(v_productstarttime,'yyyymmddhh24miss'));
if v_productstatus in (3,4) then
    null;
elsif v_templockmonth < v_lockmonth then
    -- 产品协定期内不容许退订
    o_retcode   := 1009017;
    o_debugpos  := 89;
    o_debuginfo := 'The product is in the bargaining,can not cancel.';
    return;
else
    null;
end if;

-- 获取产品的计费信息
if (v_popuitem = 2) then  -- 无推广期
    v_tempitem := 0;
elsif v_popuitem in (0,1) then  -- 推广期收费或者推广期计费
    if (v_sysdate8 >= v_popustart) and (v_sysdate8 <= v_popustop) then
        if v_popuitem = 0 then  -- 推广期收费
            v_needcharge := 0;
        else
            v_needcharge := 1;
            v_tempitem := v_popuitem;
        end if;
    else
        v_tempitem := 0;
    end if;
end if;

if (v_needcharge = 1) then
    -- 费率存在性鉴权
    if i_servicetype in (1,2) then
        v_sql := 'select chargetype,subchargetype,cyctype,cycunit,cycparam,rentfee,fixfee,fixusetimes,unitvol,autocontinue,minlimitfee,usecomfee,nextrentfee,rentfeevalidate,totaldiscount'||
                 'from zxdbm_200.s200_product_fee where  productindex = :p1 and itemindex = :p2';
        begin
            execute immediate v_sql into v_chargetype,v_subchargetype,v_cyctype,v_cycunit,v_cycparam,v_rentfee,v_fixfee,v_fixusetimes,v_unitvol,v_autocontinue,v_minlimitfee,v_usecomfee,v_nextrentfee,v_rentfeevalidate,v_totaldiscount using v_productindex, v_tempitem;
        exception when no_data_found then
            o_retcode   := 3103;
            o_debugpos := 21;
            o_debuginfo := 'productindex='||v_productindex||', itemindex='||v_tempitem||', the product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 22;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    else
        begin
            select chargetype,subchargetype,cyctype,cycunit,cycparam,
                   rentfee,fixfee,fixusetimes,unitvol,autocontinue,minlimitfee,usecomfee,totaldiscount
            into   v_chargetype,v_subchargetype,v_cyctype,v_cycunit,v_cycparam,
                   v_rentfee,v_fixfee,v_fixusetimes,v_unitvol,v_autocontinue,v_minlimitfee,v_usecomfee,v_totaldiscount
            from   zxdbm_200.s200_product_fee
            where  productindex = v_productindex and itemindex = v_tempitem;
        exception when no_data_found then
            o_retcode   := 3103;
            o_debugpos := 23;
            o_debuginfo := 'productindex='||v_productindex||', itemindex='||v_tempitem||', the product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 24;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;

    -- 0 资费判断,needcharge
    if v_needcharge = 0 then
        o_cnfmtype := 1;
    else
       if (v_rentfee = 0 and v_fixfee = 0 and v_minlimitfee = 0) then
            v_totaldctemplate := v_totaldiscount;
            loop
                v_index0 := instr(v_totaldctemplate,'&',1,1);
                v_dealtemplate := v_totaldctemplate;
                if v_index0 <> 0 then
                    v_totaldclength := length(v_totaldctemplate);
                    v_dealtemplate := substr(v_totaldctemplate, 1, v_index0-1);
                    v_totaldctemplate := substr(v_totaldctemplate, 1+v_index0, v_totaldclength-v_index0);
                end if;
                v_totaldclength := length(v_dealtemplate);
                v_index1 := instr(v_dealtemplate,';',1,1);
                v_dealtemplate := substr(v_dealtemplate, 1+v_index1, v_totaldclength-v_index1);
                v_totaldclength := length(v_dealtemplate);
                v_index1 := instr(v_dealtemplate,';',1,1);
                v_dealtemplate := substr(v_dealtemplate, 1, v_index1-1);
                v_totaldcsum := to_number(v_dealtemplate);
                exit when (v_totaldcsum > 0 or v_index0 = 0);
            end loop;
            if v_totaldcsum = 0 then
                o_cnfmtype := 1;
            end if;
       end if;
    end if;
end if;

-- 是否业务退订
if i_servicetype in (1,2,3) then
    v_sql := 'select isservicesub,servicesort from zxdbm_200.s200_service where  serviceindex = :p1';
    begin
        execute immediate v_sql into v_isservicesub,v_servicesort using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 25;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 26;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

--added by youqunxia20130906 order3.02.01
-- 是否同步订购关系给 OIDD,0- 否,1- 是
if v_servicesort = 1 then
    o_issynctooidd := 1;
end if;

if i_servicetype <> 14 then
    begin
        select orderupdateurl,subsrvtype,servicename into v_orderupdateurl,v_subsrvtype,v_servicename
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 27;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 28;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_servicename := v_servicename;

if i_servicetype = 101 then
    v_sql := 'select maincapability,submaincapability'||
             'from zxdbm_9900.s9900_service where serviceindex = :p1';
    begin
        execute immediate v_sql into v_maincapability,v_submaincapability using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 29;
        o_debuginfo   := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 30;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    o_maincapability    := v_maincapability;
    o_submaincapability := v_submaincapability;
end if;

-- 包月类退订形式解决
if v_needcharge = 1 and v_chargetype in (2,5,7) then
    if i_cmdchannel in (1,2,36,14) then
        if i_servicetype in (1,2) or (i_servicetype = 3 and v_subsrvtype = 2) then
            v_invalidmode := 0;
        elsif i_servicetype = 3 and v_subsrvtype = 1 then
            v_invalidmode := 1;
        else
            null;
        end if;
    end if;
end if;

/*
–part– –telicomcancelreq– 4. 零碎业务能力鉴权
*/

-- 零碎业务能力鉴权
if i_servicetype = 101 then
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_maincapability and subcapability = v_submaincapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 31;
        o_debuginfo   := 'servicetype='||v_maincapability||', subcapability='||v_submaincapability||', the system service capbility does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 32;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 33;
        o_debuginfo   := 'servicetype='||v_servicetype||', subcapability='||v_subcapability||', the system service capbility does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 34;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_srvtypeid   :=  v_srvtypeid;

/*
–part– –telicomcancelreq– 5.CP/SP 存在性及 sp 相干鉴权
*/

--CP/SP 存在性鉴权
begin
    select cpid,cpsrvtype,status,cpsubscribeurl,cpunsubscribeurl,hasblacklist,cptype,insubblacklist,cpcnshortname,customersrvtel
    into   v_cpid,v_cpsrvtype,v_cpstatus,v_cpsubscribeurl,v_cpunsubscribeurl,v_hasblacklist,v_cptype,v_insubblacklist,v_cpcnshortname,v_customersrvtel
    from   zxdbm_ismp.scp_basic
    where  cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 35;
    o_debuginfo   := 'cpindex='||v_cpindex||', the cp/sp does not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 36;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
if (v_cpunsubscribeurl is null) or (v_cpunsubscribeurl = ' ') then
    v_cpunsubscribeurl := v_cpsubscribeurl;
end if;
o_cpid             := v_cpid;
o_cptype           := v_cptype;
o_cpsrvtype        := v_cpsrvtype;
o_cpcnshortname    := v_cpcnshortname;
o_customersrvtel   := v_customersrvtel;
if (trim(v_orderupdateurl) is null) or (length(trim(v_orderupdateurl)) < 8) then
    o_cpunsubscribeurl := v_cpunsubscribeurl;
else
    o_cpunsubscribeurl := v_orderupdateurl;
end if;

--SP 开明业务能力鉴权(MVS,MPSS,PIM,CPX 不须要鉴权)
if i_servicetype in (5,14,33,101) then
    o_protocoltype := 0;
else
    begin
        select protocoltype
        into   v_protocoltype
        from   zxdbm_200.s200_sp_service_type
        where  cpindex = v_cpindex and servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
       o_retcode   := 2100;
       o_debugpos := 37;
       o_debuginfo   := 'v_cpindex='||v_cpindex||', v_servicetype='||v_servicetype||', v_subcapability='||v_subcapability||', the opened service capability of the SP does not exist.';
       return;
    when others then
       o_retcode   := 506;
       o_debugpos := 38;
       o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
       return;
    end;
    o_protocoltype := v_protocoltype;
end if;

--SP 接入码查问
if (i_spaccesscode is null) or (length(trim(i_spaccesscode)) = 0) then
    begin
        select spaccesscode into v_spaccesscode
        from zxdbm_ismp.ssrv_srvorder
        where productindex = v_productindex and cmdtype = i_actiontype and servicetype = i_servicetype and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 39;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if trim(v_spaccesscode) is null then
        begin
            select accesscode into v_spaccesscode
            from zxdbm_ismp.ssrv_spaccesscode
            where cpid = v_cpid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 40;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    o_spaccesscode := v_spaccesscode;
end if;

-- 订购指令查问
begin
--modified by youqunxia 2013.01.17  added accesscode
    select featurecode,accesscode
    into   o_orderfeaturecode,o_orderaccesscode
    from   zxdbm_ismp.ssrv_srvorder
    where  productid = v_productid and cmdtype = 1 and rownum = 1;
exception when no_data_found then
    null;
when others then
    o_retcode   := 506;
    o_debugpos := 41;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

--EventID 和 ChanelPlayerID 状态查问
if i_actiontype = 2 then
    begin
        select status into o_chanelplayerstate from zxdbm_ismp.channel_basic where cpid = i_channelid;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 42;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    begin
        select status into o_eventstate from zxdbm_ismp.ssys_event where eventid = i_eventid;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 43;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

– 伪码解决 (反对伪码开关关上, 非自营 sp)– 反对业务 LCS,SMS,MVS,DLS,MMS,WAP,CPX
– 退订时,AuthPriceReq 音讯中 OA(DA) 实在号码转化为伪码, 同步 SP
– 这里订购业务的回滚订购关系不做解决

if i_servicetype in (1,2,3,4,41,5,6,101) then
    if i_actiontype <> 1 and i_catchflag <> 1 then
        if i_checkpseudocode = 1 and v_cpsrvtype <> 3 then
            begin
                select pseudocode into o_pseudocode from zxdbm_ismp.susr_basic where usercode = i_oa;
            exception when no_data_found then
                o_retcode   := 1001;
                o_debugpos := 44;
                o_debuginfo := 'i_oa ='||i_oa||', the user dose not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 45;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            o_pcodemsisdnswitch := 1;
        end if;
    end if;
end if;

-- 如果团体专用产品属性为:必须团体管理员退定,则必须在团体门户上退定
if (v_onlyforcorp = 1) then
    begin
        select  corpid
        into    v_usecorpid
        from    zxdbm_ismp.susr_corp
        where   corpindex = v_usecorpindex;
    exception when no_data_found then
        o_retcode   := 1001301;  -- 团体不存在
        o_debugpos := 46;
        o_debuginfo := 'v_usecorpindex ='||v_usecorpindex||', the corp dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 47;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    o_corpid  := v_usecorpid;
    -- 本团体的产品只能由本团体的用户退订
    begin
        select unsubscribemode,payparty
        into   v_productcancelmode,v_productpayparty
        from   zxdbm_ismp.ssrv_corp_product
        where  corpindex = v_usecorpindex and groupindex = 0 and productindex = v_productindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 48;
        o_debuginfo := 'corpindex ='||v_usecorpindex||', productindex ='||v_productindex||', the product of the corp dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 49;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_productcancelmode = 0 and i_rollback = 0) then
        -- 必须团体管理员退订
        if (v_cmdchannel <> 4) then
            o_retcode   := 1001214;    -- 无权退订
            o_debugpos := 50;
            o_debuginfo := 'v_productcancelmode ='||v_productcancelmode||', v_cmdchannel ='||v_cmdchannel||', the operator has no privilege to cancel the subscription.';
            return;
        end if;
    end if;
else
    v_usecorpindex  := 0;
    o_corpindex     := v_usecorpindex;
end if;

/*
–part– –telicomcancelreq– 产品订购关系存在性鉴权(是否业务退订)
/

if i_issecondproduct = 1 or v_isservicesub = 1 then
    begin
        select subscriptionindex,subscriptionid,servicetype,subcapability,
               serviceindex,serviceid,productindex,productid,productpkgindex,
               productpkgid,contentindex,contentid,corpindex,corpid,cpindex,
               cpid,subscribemode,subscribechannel,subscribeoptype,
               pausemode,resumemode,status,autocontinue,subscriber,usercode,
               payuser,pushid,starttime,endtime,lastrenttime,
               nextrentdate,payfordate,returnvalues,returntype,
               returnstartdate,returnenddate,fixusetimes,chargeparty,
               freetime,createtime,canceltime,firstusetime,lastusetime,
               tastestarttime,tasteendtime,pausetime,resumetime,
               subscribeopid,cancelreason,lastrent,msisdntype,pseudocode,
               oldproductid,pproductofferid,varifee,eventid,
               isexperience,subscribetype,chargetime
        into   v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
               v_serviceindex,v_serviceid,v_productindex,v_productid,v_propkgindex,
               v_propkgid,v_contentindex,v_contentid,v_corpindex,v_corpid,v_cpindex,
               v_cpid,v_subscribemode,v_subscribechannel,v_subscribeoptype,
               v_pausemode,v_resumemode,v_productsubstatus,v_autocontinue,v_subscriber,v_usercode,
               v_payuser,v_pushid,v_substarttime,v_cursubendtime,v_lastrenttime,
               v_nextrentdate,v_payfordate,v_returnvalues,v_returntype,
               v_returnstartdate,v_returnenddate,v_fixusetimes,v_chargeparty,
               v_freetime,v_createtime,v_canceltime,v_firstusetime,v_lastusetime,
               v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,
               v_subscribeopid,v_cancelreason,v_lastrent,v_msisdntype,v_pseudocode,
               v_oldproductid,v_pproductofferid,v_varifee,v_eventid,
               v_isexperience,v_subscribetype,v_chargetime
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and serviceid = v_serviceid;
    exception when no_data_found then
        o_retcode   := 1201;
        o_debugpos := 51;
        o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_serviceid ='||v_serviceid||', the subscription dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 52;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select subscriptionindex,subscriptionid,servicetype,subcapability,
               serviceindex,serviceid,productindex,productid,productpkgindex,
               productpkgid,contentindex,contentid,corpindex,corpid,cpindex,
               cpid,subscribemode,subscribechannel,subscribeoptype,
               pausemode,resumemode,status,autocontinue,subscriber,usercode,
               payuser,pushid,starttime,endtime,lastrenttime,
               nextrentdate,payfordate,returnvalues,returntype,
               returnstartdate,returnenddate,fixusetimes,chargeparty,
               freetime,createtime,canceltime,firstusetime,lastusetime,
               tastestarttime,tasteendtime,pausetime,resumetime,
               subscribeopid,cancelreason,lastrent,msisdntype,pseudocode,
               oldproductid,pproductofferid,varifee,eventid,
               isexperience,subscribetype,chargetime
        into   v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
               v_serviceindex,v_serviceid,v_productindex,v_productid,v_propkgindex,
               v_propkgid,v_contentindex,v_contentid,v_corpindex,v_corpid,v_cpindex,
               v_cpid,v_subscribemode,v_subscribechannel,v_subscribeoptype,
               v_pausemode,v_resumemode,v_productsubstatus,v_autocontinue,v_subscriber,v_usercode,
               v_payuser,v_pushid,v_substarttime,v_cursubendtime,v_lastrenttime,
               v_nextrentdate,v_payfordate,v_returnvalues,v_returntype,
               v_returnstartdate,v_returnenddate,v_fixusetimes,v_chargeparty,
               v_freetime,v_createtime,v_canceltime,v_firstusetime,v_lastusetime,
               v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,
               v_subscribeopid,v_cancelreason,v_lastrent,v_msisdntype,v_pseudocode,
               v_oldproductid,v_pproductofferid,v_varifee,v_eventid,
               v_isexperience,v_subscribetype,v_chargetime
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and productid = v_productid;
    exception when no_data_found then
        o_retcode   := 1201;
        o_debugpos := 53;
        o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the subscription dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 54;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

if v_productsubstatus in (4,5) then
    o_retcode   := 1202;
    o_debugpos := 55;
    o_debuginfo := 'status of the subscription is abnormal.';
    return;
elsif (v_productsubstatus = 6) or (v_cursubendtime < v_sysdate14) then
    o_retcode   := 1201;
    o_debugpos := 56;
    o_debuginfo := 'The subscription does not exist.';
    return;
end if;

--added by youqunxia20130609   order2.07.10
-- 判断是否属于捆绑品
if trim(v_pproductofferid) is not null and i_cmdchannel <> 40 then
    if i_actiontype = 10 then
        null;
    else
        o_retcode   := 1001229;
        o_debugpos  := 58;
        o_debuginfo := 'The product is binding,unsubscribe illegal .';
        return;
    end if;
end if;

if  (v_freetime > v_substarttime) and (v_freetime > v_sysdate14) then
    v_invalidmode := 0;
elsif (i_servicetype = 5) then
    v_invalidmode := 1; --MVS 业务门户上不显示该字段,缺省退订都为下帐期失效
end if;

--added by youqunxia20130910 order3.02.01
--VSOP 侧发动捆绑类套餐、增值产品的订购激活、变更激活及退订,ISMP 中增值子产品订购关系立刻失效(包含订购、退订及变更), 不以增值产品属性判断失效工夫;if (i_cmdchannel = 40) and (i_effectiveswitch = 1)then
    v_invalidmode := 0;
end if;
o_invalidmode := v_invalidmode;

-- 缄默用户清理订购关系判断
if i_cmdchannel = 20 then
    if v_lastusetime = '00000000000000' then
        v_silentdays := to_date(v_sysdate14,'yyyymmddhh24miss') - to_date(v_substarttime,'yyyymmddhh24miss');
    else
        v_silentdays := to_date(v_sysdate14,'yyyymmddhh24miss') - to_date(v_lastusetime,'yyyymmddhh24miss');
    end if;

    if (v_silentdays < 30) then
        o_retcode   := 1001224;        -- 不满足缄默用户清理订购关系条件
        o_debugpos := 59;
        o_debuginfo := 'v_lastusetime ='||v_lastusetime||', it is not allowed to delete subscription of silent user.';
        return;
    end if;
end if;

--(除 CRM 发动的退订)套餐下的产品不容许独自退订
if  (v_propkgindex <> 0 and i_cmdchannel not in (9,35,39,40)) then
    o_retcode   := 1001214;
    o_debugpos := 60;
    o_debuginfo := 'the product in pkg is not allowed to be unsubscribed alone.';
    return;
end if;
o_paymsisdn  :=  v_payuser;
o_productsubindex := v_productsubindex;
o_productsubid    := v_productsubid;

-- 依据 i_needreplay 决定鉴权是否持续
if (i_needreplay = 1) then
    begin
        v_tmpint  := dbms_random.value(1,9999999999);
        o_linknum := v_sysdate14 || '655380' || lpad(to_char(v_tmpint),10,'0');
    exception when others then
        o_retcode   := 506;
        o_debugpos := 61;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    return;
end if;

/*
–part– –telicomcancelreq– 6. 计费方设置
*/

if (v_productpayparty = 1) then
    v_paymsisdn     := v_usecorpid;
    o_paytype       := 0;
    o_paymsisdn     := v_paymsisdn;
    v_payuserindex  := v_corpindex;
    o_cityid        := trim(' ');
else
    -- 赠送时,订购关系只能由应用方退订,此时须要将付费方的信息带出存储过程
    if (v_payuser <> v_usemsisdn) then
        v_paymsisdn := v_payuser;
        o_paymsisdn := v_paymsisdn;
        begin
            select msisdntype,paytype,oppaytype,cityid
            into   v_paymsisdntype,v_paypaytype,v_payoppaytype,v_payusercityid
            from   zxdbm_ismp.susr_basic
            where  usercode = v_payuser;
        exception when no_data_found then
            o_retcode   := 1001;
            o_debugpos := 62;
            o_debuginfo := 'v_payuser ='||v_payuser||', user dose not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 63;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        o_paytype        := v_paypaytype;
        o_oppaytype      := v_payoppaytype;
        o_paymsisdntype  := v_paymsisdntype;
        o_cityid         := trim(v_payusercityid);
    end if;
    if (i_prepaidtype = 1) then
        o_scptype := 1;
    elsif i_prepaidtype = 2 then
        o_scptype := 2;
    else
        --attach 预付费归属,0- 未知,1-OCS,2-RTBP
        begin
            select phoneindex,attach
            into   v_phoneindex,v_attach
            from   zxdbm_ismp.ssys_phone
            where  startprefix <= substr(v_paymsisdn,1,length(startprefix))
            and    endprefix >= substr(v_paymsisdn,1,length(endprefix));
        exception when no_data_found then
            o_scptype  := 2;
            v_devexist := 0; -- 示意不存在对应号段对应设施配置
        when others then
            o_retcode   := 506;
            o_debugpos := 64;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        if (v_devexist = 1) then
            if (v_attach = 1) then
                o_scptype := 1;
            elsif (v_attach = 2) then
                o_scptype := 2;
            else
                begin
                    select 1
                    into   o_scptype
                    from   zxdbm_ismp.sdev_phone
                    where  phoneindex = v_phoneindex
                    and    devicetype = 5;
                exception when no_data_found then
                    o_scptype := 2;
                when others then
                    o_retcode   := 506;
                    o_debugpos := 65;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    return;
                end;
            end if;
         end if;
    end if;
end if;

/**
–part– –telicomcancelreq 本次退订须要扣取或者补回的费用,退订立刻失效订购业务才扣费
**/

if v_chargetype in (3,6,8) then
    -- 包周期补款;(包周期产品退订不须要扣费,业务或者月租在周期第一天曾经扣取)-- 门户申请包周期的产品时,退订都是立刻失效的,所以没有对退订失效形式进行判断
    if (v_backfeemode = 1) and (v_lastrenttime <> '00000000000000') then
        if v_cycunit = 1 then
            v_nextrentdatecycle := to_char(to_date(v_lastrenttime,'YYYYMMDDHH24MISS') + v_cycparam,'YYYYMMDDHH24MISS');
        elsif v_cycunit = 2 then
            v_nextrentdatecycle := to_char(to_date(v_lastrenttime,'YYYYMMDDHH24MISS') + v_cycparam * 7,'YYYYMMDDHH24MISS');
        elsif v_cycunit = 3 then
            v_nextrentdatecycle := to_char(add_months(to_date(v_lastrenttime,'YYYYMMDDHH24MISS'), v_cycparam),'YYYYMMDDHH24MISS');
        elsif v_cycunit = 4 then
            v_nextrentdatecycle := to_char(add_months(to_date(v_lastrenttime,'YYYYMMDDHH24MISS'), v_cycparam * 6),'YYYYMMDDHH24MISS');
        elsif v_cycunit = 5 then
            v_nextrentdatecycle := to_char(add_months(to_date(v_lastrenttime,'YYYYMMDDHH24MISS'), v_cycparam * 12),'YYYYMMDDHH24MISS');
        end if;

        if v_nextrentdatecycle > v_sysdate14 then
            v_monthdays := floor(to_date(v_nextrentdatecycle, 'YYYYMMDDHH24MISS') - to_date(v_lastrenttime, 'YYYYMMDDHH24MISS'));
            v_leftdays  := floor(to_date(v_nextrentdatecycle, 'YYYYMMDDHH24MISS') - to_date(v_sysdate14, 'YYYYMMDDHH24MISS'));
        end if;
        o_subfee     := v_lastrent * v_leftdays / v_monthdays;
        o_feemode := 2;
    end if;
elsif v_chargetype in (2,5,7) then
    if (substr(v_lastrenttime,1,6) = v_sysmonth6) then
        -- 本月租金已扣除
        -- 对包月类产品和纯包量产品都会补款
        if v_backfeemode = 1 then
            if (v_productsubstatus in (0,2) or (v_productsubstatus in (1,3) and v_invalidmode = 0)) then
                --0- 待失效;1- 失常;2:暂停 + 待失效;3:暂停;4:待生效;5:暂停+待生效;6:登记
                v_leftdays  := to_number(substr(v_curmonthendtime,1,8)) - to_number(v_sysdate8);
                if (substrb(v_sysdate14,1,6) = substrb(v_substarttime,1,6)) then

— v_monthdays := to_number(substr(v_curmonthendtime,1,8)) – to_number(substr(v_substarttime,1,8)) + 1;

                    v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                    if v_subfeemode in (1,-1) then
                        o_subfee  := v_lastrent * v_leftdays / v_monthdays;
                        o_feemode := 2;
                    end if;
                else
                    v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                    o_subfee  := v_lastrent * v_leftdays / v_monthdays;
                    o_feemode := 2;
                end if;
               /*
                v_leftdays  := to_number(substr(v_curmonthendtime,1,8)) - to_number(v_sysdate8);
                if (substrb(v_sysdate14,1,6) = substrb(v_substarttime,1,6)) then
                    v_monthdays := to_number(substr(v_curmonthendtime,1,8)) - to_number(substr(v_substarttime,1,8)) + 1;
                else
                    v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                end if;
                o_subfee     := v_lastrent * v_leftdays / v_monthdays;
                o_feemode := 2;
                */
            end if;
        end if;
    elsif (substr(v_lastrenttime,1,6) < v_sysmonth6) then
        -- 本月租金未扣除
        o_feemode := 1;
        if (v_productsubstatus in (0,2) or (v_productsubstatus in (1,3) and v_invalidmode = 0)) then
            if (substr(v_substarttime,1,6) = v_sysmonth6) then
                -- 产品订购工夫在当月
                if (v_needcharge = 1) and (v_freetime < v_sysdate14) and (v_substarttime < v_sysdate14) then
                    if v_chargetype not in (2,3,4,5,6,7,8) or (v_isservicesub = 1 and trim(v_oldproductid) is not null and v_productid <> v_oldproductid) then
                        o_subfee := 0;
                    else
                        o_subfee := v_fixfee;
                        if v_chargetype in (2,5,7) then
                            if i_servicetype in (1,2) then
                                if (v_rentfee <> v_nextrentfee) and (substr(v_rentfeevalidate,1,6) = v_sysmonth6) then
                                    v_rentfee := v_nextrentfee;
                                end if;
                            end if;
                            if v_backfeemode = 1 and v_subfeemode = 1 then
                                v_subfeemode := 4;
                            end if;
                            if (v_subfeemode = 1) then
                                -- 收取本帐期全副费用
                                o_subfee := o_subfee + v_rentfee;
                            elsif (v_subfeemode = 2) then
                                -- 上半月订购收取全月费用, 下半月订购收取半月费用
                                if (to_number(substr(v_substarttime,7,2)) - 15 > 0) then
                                    o_subfee := o_subfee + v_rentfee/2;
                                else
                                    o_subfee := o_subfee + v_rentfee;
                                end if;
                            elsif (v_subfeemode = 3) then
                                -- n 日全费含 n 日,n 日后收费
                                if (v_subfeedays = 0) then
                                    -- 0 示意本月全副收费,其余示意 N 号之后收费。null;
                                elsif (to_number(substr(v_substarttime,7,2)) - v_subfeedays <= 0) then
                                    o_subfee := o_subfee + v_rentfee;
                                else
                                    null;
                                end if;
                            elsif (v_subfeemode = 4) then
                                -- 理论天数免费
                                v_leftdays  := floor(to_number(to_date(v_sysdate14,'yyyymmddhh24miss') - to_date(v_freetime,'yyyymmddhh24miss')))+1;
                                v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                                o_subfee       := o_subfee + v_rentfee*(v_leftdays/v_monthdays);
                            end if;
                        end if;
                    end if;
                end if;
            else
                if (v_needcharge = 1) and (v_freetime < v_sysdate14) and (v_substarttime < v_sysdate14) then
                    if v_chargetype not in (2,3,4,5,6,7,8) then
                        o_subfee := 0;
                    else
                        o_subfee := v_fixfee;
                        if v_chargetype in (2,5,7) then
                            -- 产品订购工夫不在当月
                            if i_servicetype in (1,2) then
                                if (v_rentfee <> v_nextrentfee) and (substr(v_rentfeevalidate,1,6) = v_sysmonth6) then
                                    v_rentfee := v_nextrentfee;
                                end if;
                            end if;
                            if (v_backfeemode = 1) then
                                v_leftdays  := to_number(substr(v_sysdate8,7,2));
                                v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                                o_subfee := o_subfee + v_rentfee * v_leftdays / v_monthdays;
                            else
                                o_subfee := o_subfee + v_rentfee;
                            end if;
                        end if;
                    end if;
                end if;
            end if;
        end if;
    end if;
else
    if (substr(v_lastrenttime,1,6) = v_sysmonth6) then
        -- 本月租金已扣除
        -- 对包月类产品和纯包量产品都会补款
        if (v_backfeemode = 1) then
            if (v_productsubstatus in (0,2) or (v_productsubstatus in (1,3) and v_invalidmode = 0)) then
                --0- 待失效;1- 失常;2:暂停 + 待失效;3:暂停;4:待生效;5:暂停+待生效;6:登记
                v_leftdays  := to_number(substr(v_curmonthendtime,1,8)) - to_number(v_sysdate8);
                if (substrb(v_sysdate14,1,6) = substrb(v_substarttime,1,6)) then
                    v_monthdays := to_number(substr(v_curmonthendtime,1,8)) - to_number(substr(v_substarttime,1,8)) + 1;
                else
                    v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                end if;
                o_subfee     := v_lastrent * v_leftdays / v_monthdays;
                o_feemode := 2;
            end if;
        end if;
    elsif (substr(v_lastrenttime,1,6) < v_sysmonth6) then
        -- 本月租金未扣除
        o_feemode := 1;
        if (v_productsubstatus in (0,2) or (v_productsubstatus in (1,3) and v_invalidmode = 0)) then
            if (substr(v_substarttime,1,6) = v_sysmonth6) then
                -- 产品订购工夫在当月
                if (v_needcharge = 1) and (v_freetime < v_sysdate14) and (v_substarttime < v_sysdate14) then
                    if v_chargetype not in (2,3,4,5,6,7,8) then
                        o_subfee := 0;
                    else
                        o_subfee := v_fixfee;
                        if v_chargetype in (2,5,7) then
                            if i_servicetype in (1,2) then
                                if (v_rentfee <> v_nextrentfee) and (substr(v_rentfeevalidate,1,6) = v_sysmonth6) then
                                    v_rentfee := v_nextrentfee;
                                end if;
                            end if;
                            if (v_backfeemode = 1) then
                                v_subfeemode := 4;
                            end if;
                            if (v_subfeemode = 1) then      -- 收取本帐期全副费用
                                o_subfee := o_subfee + v_rentfee;
                            elsif (v_subfeemode = 2) then   -- 上半月订购收取全月费用, 下半月订购收取半月费用
                                if (to_number(substr(v_substarttime,7,2)) - 15 > 0) then
                                    o_subfee := o_subfee + v_rentfee/2;
                                else
                                    o_subfee := o_subfee + v_rentfee;
                                end if;
                            elsif (v_subfeemode = 3) then   -- n 日全费含 n 日,n 日后收费
                                if (v_subfeedays = 0) then    -- 0 示意本月全副收费,其余示意 N 号之后收费。null;
                                elsif (to_number(substr(v_substarttime,7,2)) - v_subfeedays <= 0) then
                                    o_subfee := o_subfee + v_rentfee;
                                else
                                    null;
                                end if;
                            elsif (v_subfeemode = 4) then   -- 理论天数免费
                                v_leftdays  := floor(to_number(to_date(v_sysdate14,'yyyymmddhh24miss') - to_date(v_freetime,'yyyymmddhh24miss')))+1;
                                v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                                o_subfee       := o_subfee + v_rentfee*(v_leftdays/v_monthdays);
                            end if;
                        end if;
                    end if;
                end if;
            else
                if (v_needcharge = 1) and (v_freetime < v_sysdate14) and (v_substarttime < v_sysdate14) then
                    if v_chargetype not in (2,3,4,5,6,7,8) then
                        o_subfee := 0;
                    else
                        o_subfee := v_fixfee;
                        if v_chargetype in (2,5,7) then
                            -- 产品订购工夫不在当月
                            if i_servicetype in (1,2) then
                                if (v_rentfee <> v_nextrentfee) and (substr(v_rentfeevalidate,1,6) = v_sysmonth6) then
                                    v_rentfee := v_nextrentfee;
                                end if;
                            end if;
                            if (v_backfeemode = 1) then
                                v_leftdays  := to_number(substr(v_sysdate8,7,2));
                                v_monthdays := to_number(substr(v_curmonthendtime,7,2));
                                o_subfee := o_subfee + v_rentfee * v_leftdays / v_monthdays;
                            else
                                o_subfee := o_subfee + v_rentfee;
                            end if;
                        end if;
                    end if;
                end if;
            end if;
        end if;
    end if;
end if;
-- 首次应用扣费然而未应用 / 在线包月然而本月未应用的状况不扣费
if (substr(v_lastrenttime,1,6) < v_sysmonth6) then
    if (v_subchargetype = 2 and v_firstusetime = '00000000000000') or (v_subchargetype = 3 and substr(v_lastusetime,1,6) <> v_sysmonth6) then
         o_subfee := 0;
    end if;
end if;
if (o_subfee < v_minlimitfee) and (o_feemode = 1) then
     o_subfee := v_minlimitfee;
end if;
-- 用户状态为用户被动停机(用户状态为 1)、用户被动停机及欠费停机 (用户状态为 3) 两种时,不计费
if v_useuserstatus in (1,3) then
    o_subfee := 0;
    o_feemode := 1;
end if;
if (o_subfee > 0) and (o_feemode = 1) and (v_chargetype in (2,5,7)) then
    v_lastrenttime := v_sysdate14;
    v_payfordate   := v_sysdate8;
end if;
if (v_freetime > v_sysdate14 and o_subfee = 0) then
    o_cnfmtype := 2;
end if;

/**
–part– –telicomcancelreq– 形式、退订渠道
**/

v_canceloptype  := 0;
-- 设置退订形式
if (i_cmdchannel = 6) then
    v_cancelmode := 4;
elsif (i_cmdchannel in (0,20)) then
    v_cancelmode := 3;
elsif (i_cmdchannel = 4) then
    v_cancelmode := 5;
else
    v_cancelmode := 2;
end if;

-- 设置退订渠道
begin
    select portalchannel into v_cancelchannel
    from zxdbm_ismp.ssrv_channel_map
    where innerchannel = i_cmdchannel;
exception when no_data_found then
    v_cancelchannel := i_cmdchannel * 1000;
when others then
    o_retcode   := 506;
    o_debugpos := 66;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

/**
–part– –telicomcancelreq– 订购关系完结工夫
**/

if i_servicetype = 5 then
    -- 对 MVS 业务的订购关系生效工夫做非凡解决
    if v_chargetype in (3,6,8) and v_cyctype = 0 then -- 如果为非周期性
        v_subendtime := v_cursubendtime;
    elsif v_chargetype in (3,6,8) then
        -- 如果为周期性(MVS 的包周期计费只存在包天形式)v_subendtime := to_char(to_date(v_nextrentdate,'yyyymmdd') - 1,'yyyymmdd') || '235959';
    elsif v_chargetype in (2,5,7) then
        if v_invalidmode = 0 then
            v_subendtime := v_sysdate14;
        elsif v_invalidmode = 1 then
            v_subendtime := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')),'yyyymmdd') || '235959';
        end if;
    end if;
else
    if (v_invalidmode = 0) then
        v_subendtime := v_sysdate14;
    -- 对于非立刻失效的产品依照 v_chargetype 别离解决
    elsif v_chargetype in (2,5,7) then
        --added by youqunxia20130924 order3.02.01
        if v_invalidmode = 2 and v_cyctype = 1 then
            if v_lastrenttime ='00000000000000' and v_freetime > v_substarttime then
                -- 如果为收费期内退订,已将 v_invalidmode 置 0,此处解决收费期后,扣租前的退订的工夫计算
                v_nextnextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmdd') ,1 ),'yyyymmdd');
                if substr(v_nextrentdate,7,2) < substr(v_nextnextrentdate,7,2) then
                    v_nextnextrentdate := substr(v_nextnextrentdate,1,6) || substr(v_nextrentdate,7,2);
                elsif substr(v_nextrentdate,7,2) > substr(v_nextnextrentdate,7,2) then
                    v_nextnextrentdate := to_char(add_months(to_date(v_nextnextrentdate,'yyyymmdd') ,1 ),'yyyymm')||'01';
                end if;
                v_subendtime := to_char(to_date(v_nextnextrentdate,'YYYYMMDD') - 1,'YYYYMMDD')||'235959';
            else
                v_subendtime := to_char((to_date(v_nextrentdate,'YYYYMMDD') -1 ),'YYYYMMDD')||'235959';
            end if;
        elsif v_invalidmode = 2 and v_cyctype = 0 then
            v_subendtime := v_cursubendtime;
        else
            v_subendtime := v_curmonthendtime;
        end if;
    elsif v_chargetype in (3,6,8) then
        if v_cyctype = 0 then
            v_subendtime := v_cursubendtime;
        elsif v_cyctype = 1 then
            if v_lastrenttime ='00000000000000' and v_freetime > v_substarttime then
                -- 如果为收费期内退订,已将 v_invalidmode 置 0,此处解决收费期后,扣租前的退订的工夫计算
                -- 包周期的产品的试用期都在账期外
                -- 收费产品是没有试用期的
                if (v_cycunit = 1) then
                    -- 包天
                    v_nextnextrentdate := to_char(to_date(v_nextrentdate,'yyyymmddhh24miss') + v_cycparam,'yyyymmdd');
                elsif (v_cycunit = 2) then
                    -- 包周
                    v_nextnextrentdate := to_char(to_date(v_nextrentdate,'yyyymmddhh24miss') + v_cycparam * 7,'yyyymmdd');
                elsif (v_cycunit = 3) then
                    -- 包月(如果目标月份没有 31 号,add_month 函数会主动取月最初一天)
                    v_nextnextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmddhh24miss'),v_cycparam),'yyyymmdd');
                elsif (v_cycunit = 4) then
                    -- 包半年
                    v_nextnextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmddhh24miss'),v_cycparam * 6),'yyyymmdd');
                elsif (v_cycunit = 5) then
                    -- 包年
                    v_nextnextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmddhh24miss'),v_cycparam * 12),'yyyymmdd');
                elsif (v_cycunit = 9) then
                    -- 包季度
                    v_nextnextrentdate := to_char(add_months(to_date(v_nextrentdate,'yyyymmddhh24miss'),v_cycparam * 3),'yyyymmdd');
                end if;
                v_subendtime := to_char(to_date(v_nextnextrentdate,'YYYYMMDD') - 1,'YYYYMMDD')||'235959';
            else
                v_subendtime := to_char(to_date(v_nextrentdate,'YYYYMMDD') -1 ,'YYYYMMDD')||'235959';
            end if;
        end if;
        -- 若本周期的完结工夫超过本月,则默认为本月月底失效。if v_subendtime > v_curmonthendtime then
            v_subendtime := v_curmonthendtime;
        end if;
    else
        -- 对于 v_chargetype 为(0/1/4),如果非立刻失效,默认设置为下月失效。v_subendtime := v_curmonthendtime;
    end if;
    /*
    if (v_invalidmode = 0) then
        v_subendtime := v_sysdate14;
    else
        v_subendtime := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')) + 1,'yyyymmdd') || '000000';
    end if;
    */
end if;
o_subendtime := v_subendtime;

/**
–part– –telicomcancelreq– 退订后的状态设置
**/

--modied by youqunxia20130924 order3.02.01
if (v_productsubstatus = 1) and (v_invalidmode in (1,2)) then
-- 失常 + 下一帐期实效 / 退定后可应用足月, 间接更新订购关系为待生效
    v_substatus := 4;
elsif (v_productsubstatus = 3) and (v_invalidmode in (1,2)) then
-- 暂停 + 下一帐期实效 / 退定后可应用足月,间接更新订购关系为暂停 + 待生效
    v_substatus := 5;
else
    v_substatus := 6;
end if;

--added by youqunxia20130820 order3.02.01
-- 订购关系状态失常和暂停时退订时,把下次扣租日期改为订购关系完结的后一天, 防止月租再次扣租
if (v_productsubstatus in (1,3)) and (v_invalidmode = 2) then
    v_nextrentdate := to_char(to_date(v_subendtime,'yyyymmddhh24miss') + 1,'yyyymmdd');
end if;

/**
–part– –telicomcancelreq– 设置话单中的 begintime、endtime
**/

if substr(v_substarttime,1,6) = substr(v_sysdate8,1,6) then
    o_cdrbegintime := v_substarttime;
else
    if(v_subendtime < o_cdrendtime) then
        o_cdrendtime := v_subendtime;
    end if;
end if;
v_subscribeoptype := 3;

/**
–part– –telicomcancelreq– 事务开始
**/

if (v_productsubstatus in(1,3)) and (v_invalidmode in(1,2)) and (i_rollback = 0) then
-- 处于失常或者暂停状态,并且下一帐期生效的产品订购关系:更新订购关系
    begin
        update zxdbm_200.s200_user_subscription
        set    endtime       = v_subendtime,
               status        = v_substatus,
               subscribeoptype = v_subscribeoptype,
               canceltime    = v_sysdate14,
               statustime    = v_sysdate14,
               cancelmode    = v_cancelmode,
               cancelchannel = v_cancelchannel,
               canceloptype  = v_canceloptype,
               cancelopid    = v_cancelopid,
               nextrentdate  = v_nextrentdate
        where usercode = v_usemsisdn and productid = v_productid;
        if (sql%rowcount = 0) then
            o_retcode   := 506;
            o_debugpos := 67;
            o_debuginfo := 'v_usemsisdn='||v_usemsisdn||', v_productid='||v_productid||', the record of user_subscription do not exist.';
            rollback;
            return;
        end if;
    exception when others then
        o_retcode   := 506;
        o_debugpos := 68;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        rollback;
        return;
    end;
    commit;
    o_neednotifysp := 1;
else
    begin
        -- 事务开始
        if (i_rollback = 0) then
            v_sql := 'insert into zxdbm_200.s200_user_subs_hist' || v_curstrmonth ||
            '(subscriptionindex,subscriptionid,servicetype,subcapability,
            serviceindex,serviceid,productindex,productid,contentindex,contentid,
            productpkgindex,productpkgid,corpindex,corpid,cpindex,cpid,subscribemode,
            subscribechannel,subscribeoptype,cancelmode,cancelchannel,canceloptype,
            pausemode,resumemode,status,statustime,autocontinue,subscriber,usercode,
            payuser,pushid,starttime,endtime,lastrenttime,nextrentdate,payfordate,
            returnvalues,returntype,returnstartdate,returnenddate,fixusetimes,
            chargeparty,freetime,createtime,canceltime,firstusetime,lastusetime,
            tastestarttime,tasteendtime,pausetime,resumetime,subscribeopid,
            cancelopid,cancelreason,lastrent,msisdntype,pseudocode,pproductofferid,
            varifee,eventid,isexperience,subscribetype,chargetime)
            values(:p1,:p2,:p3,:p4,
            :p5,:p6,:p7,:p8,:p9,:p10,
            :p11,:p12,:p13,:p14,:p15,:p16,:p17,
            :p18,:p19,:p20,:p21,:p22,
            :p23,:p24,:p25,:p26,:p27,:p28,
            :p29,:p30,:p31,:p32,:p33,:p34,:p35,
            :p36,:p37,:p38,:p39,:p40,
            :p41,:p42,:p43,:p44,:p45,:p46,
            :p47,:p48,:p49,:p50,:p51,
            :p52,:p53,:p54,:p55,:p56,:p57,:p58,
            :p59,:p60,:p61,:p62,:p63)';
            begin
            -- 插入历史订购关系
                execute immediate v_sql
                using   v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
                        v_serviceindex,v_serviceid,v_productindex,v_productid,v_contentindex,v_contentid,
                        v_propkgindex,v_propkgid,v_corpindex,v_corpid,v_cpindex,v_cpid,v_subscribemode,
                        v_subscribechannel,v_subscribeoptype,v_cancelmode,v_cancelchannel,v_canceloptype,
                        v_pausemode,v_resumemode,v_substatus,v_sysdate14,v_autocontinue,v_subscriber,v_usercode,
                        v_payuser,v_pushid,v_substarttime,v_subendtime,v_lastrenttime,v_nextrentdate,v_payfordate,
                        v_returnvalues,v_returntype,v_returnstartdate,v_returnenddate,v_fixusetimes,
                        v_chargeparty,v_freetime,v_createtime,v_sysdate14,v_firstusetime,v_lastusetime,
                        v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,v_subscribeopid,
                        v_cancelopid,v_cancelreason,v_lastrent,v_msisdntype,v_pseudocode,v_pproductofferid,
                        v_varifee,v_eventid,v_isexperience,v_subscribetype,v_chargetime;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 69;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end if;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 70;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
        end if;

        if (i_rollback = 1) and (i_issecondproduct in (1,2,3)) then
         -- 业务订购 / 待生效 / 纯包量订购关系产品的订购 -- 回滚
            v_rollbacklastrent  := v_lastrent;
            v_sql := 'select subscriptionindex,subscriptionid,servicetype,subcapability,'||
                'serviceindex,serviceid,productindex,productid,contentindex,contentid,'||
                'productpkgindex,productpkgid,corpindex,corpid,cpindex,cpid,subscribemode,'||
                'subscribechannel,subscribeoptype,cancelmode,cancelchannel,canceloptype,'||
                'pausemode,resumemode,status,statustime,autocontinue,subscriber,usercode,'||
                'payuser,pushid,starttime,endtime,lastrenttime,nextrentdate,payfordate,'||
                'returnvalues,returntype,returnstartdate,returnenddate,fixusetimes,'||
                'chargeparty,freetime,createtime,canceltime,firstusetime,lastusetime,'||
                'tastestarttime,tasteendtime,pausetime,resumetime,subscribeopid,'||
                'cancelopid,cancelreason,lastrent,msisdntype,pseudocode,pproductofferid,'||
                'varifee,eventid,isexperience,subscribetype,chargetime'||
                'from zxdbm_200.s200_user_subs_hist' || v_curstrmonth ||
                'where usercode = :p1 and productid = :p2 and to_number(statustime) in'||
                '(select max(to_number(statustime)) from zxdbm_200.s200_user_subs_hist'|| v_curstrmonth ||
                'where usercode = :p3 and productid = :p4)';
            begin
                execute immediate v_sql into
                v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
                v_serviceindex,v_serviceid,v_productindex,v_productid,v_contentindex,v_contentid,
                v_propkgindex,v_propkgid,v_corpindex,v_corpid,v_cpindex,v_cpid,v_subscribemode,
                v_subscribechannel,v_subscribeoptype,v_cancelmode,v_cancelchannel,v_canceloptype,
                v_pausemode,v_resumemode,v_substatus,v_sysdate14,v_autocontinue,v_subscriber,v_usercode,
                v_payuser,v_pushid,v_substarttime,v_subendtime,v_lastrenttime,v_nextrentdate,v_payfordate,
                v_returnvalues,v_returntype,v_returnstartdate,v_returnenddate,v_fixusetimes,
                v_chargeparty,v_freetime,v_createtime,v_canceltime,v_firstusetime,v_lastusetime,
                v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,v_subscribeopid,
                v_cancelopid,v_cancelreason,v_lastrent,v_msisdntype,v_pseudocode,v_pproductofferid,
                v_varifee,v_eventid,v_isexperience,v_subscribetype,v_chargetime
                using v_usercode,i_cancelproductid,v_usercode,i_cancelproductid;
            exception when no_data_found then
                o_retcode   := 1201;
                o_debugpos := 71;
                o_debuginfo := 'v_usercode='||v_usercode||', i_cancelproductid='||i_cancelproductid||', user_subs_hist does not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 72;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;

            -- 更新订购关系表, 删除历史订购关系表中同一业务的原订购关系
            if i_issecondproduct = 1 then
                -- 业务订购失败后的回滚
                v_canceltime := '00000000000000';
                begin
                    update zxdbm_200.s200_user_subscription
                    set    subscriptionindex          = v_productsubindex,
                           subscriptionid             = v_productsubid,
                           servicetype                = v_servicetype,
                           subcapability              = v_subcapability,
                           serviceindex               = v_serviceindex,
                           --serviceid                  = v_serviceid,
                           productindex               = v_productindex,
                           productid                  = v_productid,
                           productpkgindex            = v_propkgindex,
                           productpkgid               = v_propkgid,
                           contentindex               = v_contentindex,
                           contentid                  = v_contentid,
                           corpindex                  = v_corpindex,
                           corpid                     = v_corpid,
                           cpindex                    = v_cpindex,
                           cpid                       = v_cpid,
                           subscribemode              = v_subscribemode,
                           subscribechannel           = v_subscribechannel,
                           subscribeoptype            = v_subscribeoptype,
                           cancelmode                 = v_cancelmode,
                           cancelchannel              = v_cancelchannel,
                           canceloptype               = v_canceloptype,
                           pausemode                  = v_pausemode,
                           resumemode                 = v_resumemode,
                           status                     = v_substatus,
                           statustime                 = v_sysdate14,
                           autocontinue               = v_autocontinue,
                           subscriber                 = v_subscriber,
                           usercode                   = v_usercode,
                           payuser                    = v_payuser,
                           pushid                     = v_pushid,
                           starttime                  = v_substarttime,
                           endtime                    = v_subendtime,
                           lastrenttime               = v_lastrenttime,
                           nextrentdate               = v_nextrentdate,
                           payfordate                 = v_payfordate,
                           returnvalues               = v_returnvalues,
                           returntype                 = v_returntype,
                           returnstartdate            = v_returnstartdate,
                           returnenddate              = v_returnenddate,
                           fixusetimes                = v_fixusetimes,
                           chargeparty                = v_chargeparty,
                           freetime                   = v_freetime,
                           createtime                 = v_createtime,
                           canceltime                 = v_canceltime,
                           firstusetime               = v_firstusetime,
                           lastusetime                = v_lastusetime,
                           tastestarttime             = v_tastestarttime,
                           tasteendtime               = v_tasteendtime,
                           pausetime                  = v_pausetime,
                           resumetime                 = v_resumetime,
                           subscribeopid              = v_subscribeopid,
                           cancelopid                 = v_cancelopid,
                           cancelreason               = v_cancelreason,
                           lastrent                   = v_lastrent,
                           msisdntype                 = v_msisdntype,
                           pseudocode                 = v_pseudocode,
                           pproductofferid            = v_pproductofferid,
                           varifee                    = v_varifee,
                           eventid                    = v_eventid,
                           isexperience               = v_isexperience,
                           subscribetype              = v_subscribetype,
                           chargetime                 = v_chargetime
                    where  usercode = v_usemsisdn and serviceid = v_serviceid;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 73;
                        o_debuginfo := 'usercode='||v_useuserindex||', serviceid='||v_serviceid||', user subsription do not exist.';
                        rollback;
                        return;
                    end if;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 74;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end;
            elsif i_issecondproduct in (2,3) then
                -- 待生效订购关系订购失败后的回滚 以及 纯包量产品再次订购失改后的回滚
                begin
                    update zxdbm_200.s200_user_subscription
                    set    subscriptionindex          = v_productsubindex,
                           subscriptionid             = v_productsubid,
                           servicetype                = v_servicetype,
                           subcapability              = v_subcapability,
                           serviceindex               = v_serviceindex,
                           serviceid                  = v_serviceid,
                           productindex               = v_productindex,
                       --  productid                  = v_productid,
                           productpkgindex            = v_propkgindex,
                           productpkgid               = v_propkgid,
                           contentindex               = v_contentindex,
                           contentid                  = v_contentid,
                           corpindex                  = v_corpindex,
                           corpid                     = v_corpid,
                           cpindex                    = v_cpindex,
                           cpid                       = v_cpid,
                           subscribemode              = v_subscribemode,
                           subscribechannel           = v_subscribechannel,
                           subscribeoptype            = v_subscribeoptype,
                           cancelmode                 = v_cancelmode,
                           cancelchannel              = v_cancelchannel,
                           canceloptype               = v_canceloptype,
                           pausemode                  = v_pausemode,
                           resumemode                 = v_resumemode,
                           status                     = v_substatus,
                           statustime                 = v_sysdate14,
                           autocontinue               = v_autocontinue,
                           subscriber                 = v_subscriber,
                           usercode                   = v_usercode,
                           payuser                    = v_payuser,
                           pushid                     = v_pushid,
                           starttime                  = v_substarttime,
                           endtime                    = v_subendtime,
                           lastrenttime               = v_lastrenttime,
                           nextrentdate               = v_nextrentdate,
                           payfordate                 = v_payfordate,
                           returnvalues               = v_returnvalues,
                           returntype                 = v_returntype,
                           returnstartdate            = v_returnstartdate,
                           returnenddate              = v_returnenddate,
                           fixusetimes                = v_fixusetimes,
                           chargeparty                = v_chargeparty,
                           freetime                   = v_freetime,
                           createtime                 = v_createtime,
                           canceltime                 = v_canceltime,
                           firstusetime               = v_firstusetime,
                           lastusetime                = v_lastusetime,
                           tastestarttime             = v_tastestarttime,
                           tasteendtime               = v_tasteendtime,
                           pausetime                  = v_pausetime,
                           resumetime                 = v_resumetime,
                           subscribeopid              = v_subscribeopid,
                           cancelopid                 = v_cancelopid,
                           cancelreason               = v_cancelreason,
                           lastrent                   = v_lastrent,
                           msisdntype                 = v_msisdntype,
                           pseudocode                 = v_pseudocode,
                           pproductofferid            = v_pproductofferid,
                           varifee                    = v_varifee,
                           eventid                    = v_eventid,
                           isexperience               = v_isexperience,
                           subscribetype              = v_subscribetype,
                           chargetime                 = v_chargetime
                    where  usercode = v_usemsisdn and productid = i_cancelproductid;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 75;
                        o_debuginfo := 'usercode='||v_usemsisdn||', productid='||i_cancelproductid||', user subsription do not exist.';
                        rollback;
                        return;
                    end if;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 76;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end;
            end if;

            if i_issecondproduct in (1,2,3) then
            -- 将订购时扣除的费用累积减去
                v_sql := 'update zxdbm_ismp.ssrv_user_totalamount' || v_curstrmonth ||
                         'set usedamounts  = usedamounts - :p1 where userindex = :p2' ||
                         'and amounttype = 8 and amountindex = 0 and productindex = 0';
                begin
                    execute immediate v_sql using v_rollbacklastrent,v_payuserindex;
                    if sql%rowcount = 0 then
                        o_retcode   := 506;
                        o_debugpos := 77;
                        o_debuginfo := 'payuserindex='||v_payuserindex||', user is not exist.';
                        rollback;
                        return;
                    end if;
                    commit;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 78;
                    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                    rollback;
                    return;
                end;
            end if;
            if i_issecondproduct = 3 then
                if v_sysdate14 > v_freetime or v_sysdate8 < v_popustart or v_sysdate8 > v_popustop then
                    -- 将订购时纯包量产生的累积减去(收费期外) 推广期只有单位费率与包月, 所以如果有推广期则必定是收费的
                    begin
                        update zxdbm_ismp.ssrv_user_totalamount
                        set    fixtotalres = greatest(fixtotalres - v_fixusetimes*v_unitvol,0),
                               expiredate = to_number(to_char(to_date(v_subendtime,'yyyymmddhh24miss'),'yyyymmdd'))
                        where  userindex = v_payuserindex and amounttype = 0 and amountindex = v_productindex and productindex = 0;
                        if (sql%rowcount = 0) then
                            o_retcode   := 0;
                            o_debugpos := 79;
                            o_debuginfo := 'produt amount info do not exist.';
                        end if;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 80;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        rollback;
                        return;
                    end;
                end if;
            end if;

            -- 删除历史表中转移到正式订购关系表后的订购关系
            v_sql := 'delete from zxdbm_200.s200_user_subs_hist' || v_curstrmonth ||
                     'where to_number(statustime) in (select max(to_number(statustime)) from zxdbm_200.s200_user_subs_hist'|| v_curstrmonth ||
                     'where usercode = :p1 and productid = :p2)';
            begin
                execute immediate v_sql using v_usercode,i_cancelproductid;
            exception when no_data_found then
                o_retcode   := 2100;
                o_debugpos := 81;
                o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 82;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        --added by youqunxia20131118 order3.02.01 对于预付费用户,体验转正式到 OCS 扣费失败的解决,把 isexperience 更新为 1
        elsif (i_rollback = 1) and (i_issecondproduct = 7) then
            v_rollbacklastrent  := v_lastrent;
            begin
                update zxdbm_200.s200_user_subscription
                set  isexperience     = 1
                where usercode = v_usemsisdn and productid = v_productid;
                    if (sql%rowcount = 0) then
                        o_retcode   := 506;
                        o_debugpos := 89;
                        o_debuginfo := 'usercode='||v_usemsisdn||', productid='||v_productid||', user subsription do not exist.';
                        rollback;
                        return;
                    end if;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 90;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
            -- 将订购时扣除的费用累积减去
            v_sql := 'update zxdbm_ismp.ssrv_user_totalamount' || v_curstrmonth ||
                     'set usedamounts  = usedamounts - :p1 where userindex = :p2' ||
                     'and amounttype = 8 and amountindex = 0 and productindex = 0';
            begin
                execute immediate v_sql using v_rollbacklastrent,v_payuserindex;
                if sql%rowcount = 0 then
                    o_retcode   := 506;
                    o_debugpos := 91;
                    o_debuginfo := 'payuserindex='||v_payuserindex||', user is not exist.';
                    rollback;
                    return;
                end if;
                commit;
            exception when others then
               o_retcode   := 506;
               o_debugpos := 92;
               o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
               rollback;
               return;
            end;
        else
            -- 失常退订或失常订购关系的回滚
            -- 产品退订或者产品订购回滚或者业务退订, 均须要删除订购关系和累计
            if v_isservicesub = 1 then
                begin
                    delete
                    from zxdbm_200.s200_user_subscription
                    where usercode = v_usemsisdn and serviceid = v_serviceid;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 83;
                    o_debuginfo := 'v_usemsisdn='||v_usemsisdn||', v_serviceid='||v_serviceid||', failed to delete user_subscription.';
                    rollback;
                    return;
                end;
            else
                begin
                    delete
                    from zxdbm_200.s200_user_subscription
                    where usercode = v_usemsisdn and productid = v_productid;
                exception when others then
                    o_retcode   := 506;
                    o_debugpos := 84;
                    o_debuginfo := 'v_usemsisdn='||v_usemsisdn||', v_productid='||v_productid||', failed to delete user_subscription.';
                    rollback;
                    return;
                end;
            end if;
            -- 革除累计
            begin
                delete
                from   zxdbm_ismp.ssrv_user_totalamount
                where  userindex = v_payuserindex and amounttype = 0 and amountindex = v_productindex and productindex = 0;
            exception when others then
                o_retcode := 506;
                o_debugpos := 85;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
            v_sql := 'delete from zxdbm_ismp.ssrv_user_totalamount'|| v_curstrmonth ||
                    'where userindex = :p1 and amounttype = 0 and amountindex = :p2 and productindex = 0';
            begin
                execute immediate v_sql
                using   v_payuserindex,v_productindex;
                if (sql%rowcount = 0) then
                    o_retcode := 0;
                    o_debugpos := 86;
                    o_debuginfo := 'no data in zxdbm_ismp.ssrv_user_totalamount'|| v_curstrmonth ||'.';
                end if;
            exception when others then
                o_retcode := 506;
                o_debugpos := 87;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end;
        end if;
        commit;
    -- 事务完结
    end;
    o_neednotifysp := 1;
end if;

-- 订购回滚 或者 退订删除收费期定时工作。begin
    delete from zxdbm_ismp.freenotice_task
    where  usercode = v_usemsisdn and productid = v_productid;
exception when others then
    o_retcode   := 506;
    o_debugpos := 88;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    rollback;
    return;
end;
commit;
-- 组装同步给 SP 的音讯
if (v_protocoltype <> 0) then
   if (i_supportproductid = 1) then
      -- 应用产品代码同步
      if (v_protocoltype = 2) then
          o_msgtosp := 'QX' || '' || v_productid ||'  ' ||v_usemsisdn;
      elsif (o_protocoltype = 1) then
          --0:正向退订  1:SP 反向退订
          if (i_direct = 1) then
              o_msgtosp := '2002' || '' ||'0'||' '|| v_productid ||' '|| v_usemsisdn ||' ' || v_paymsisdn;
          else
              o_msgtosp := '1002' || '' || v_productid ||' '|| v_usemsisdn ||' ' || v_paymsisdn;
          end if;
      end if;
   else
      -- 应用业务代码同步
      if (v_protocoltype = 2) then
          o_msgtosp := 'QX' || '' || v_serviceid ||'  ' || v_usemsisdn;
      elsif (o_protocoltype = 1) then
          --0:正向退订 1:SP 反向退订
          if (i_direct = 1) then
              o_msgtosp := '2002' || '' ||'0'||' '|| v_serviceid ||' '|| v_usemsisdn ||' ' || v_paymsisdn;
          else
              o_msgtosp := '1002' || '' || v_serviceid ||' '|| v_usemsisdn ||' ' || v_paymsisdn;
          end if;
      end if;
   end if;
end if;

end slp_200_telicomcancelreq;
/

– 产品收费期揭示
prompt zxdbm_200.slp_200_telicomfreenotify
create or replace procedure zxdbm_200.slp_200_telicomfreenotify
(

i_oa                    in          varchar2,            -- 发起方用户号码
i_oatype                in          number,              -- 发起方地址类型
i_servicetype           in          number,              -- 业务能力类型
i_productid             in          varchar2,            -- 产品代码
i_actiontype            in          number,              -- 动作类型
i_countrycode           in          varchar2,            -- 国家码
i_spaccesscode          in          varchar2,            --antuprice 音讯中的 SP 接入码
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_status                in          number,              -- 取缓存订购关系状态;i_endtime               in          varchar2,            -- 取缓存产品订购关系完结工夫
i_freenotice            in          number,              -- 收费期到期主动续订和主动勾销是否下发短信:0 否 1 是;i_cmdchannel            in          number,              -- 外部渠道
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos              out         number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_usemsisdn             out         varchar2,            -- 去掉前缀的应用方用户号码
o_paymsisdn             out         varchar2,            -- 去掉前缀的计费方号码
o_usemsisdntype         out         number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
o_userindex             out         number,              -- 应用方号码序号
o_freenotify            out         number,              -- 收费试用期到短信告诉形式,0- 到期主动免费揭示,1- 到期需用户确认订购揭示,2- 到期主动勾销揭示,3- 到期确认订购胜利 4- 收费期到期主动续订和主动勾销不下发短信,5- 到期需用户确认退订揭示,6- 到期确认退订超时,超时订购胜利揭示
o_paytype               out         number,              -- 计费号码的付费类型 0: 后付费 1: 预付费 2: 准预付费
o_oppaytype             out         number,              -- 话单专用付费类型
o_colortype             out         number,              -- 应用方号码名单类型   0- 普通用户,1- 黑名单,2- 白名单,3- 灰名单,4- 红名单
o_cpid                  out         varchar2,            --CP/SP 代码
o_cpindex               out         number,              --CP/SP 序号
o_cpcnshortname         out         varchar2,            --CP/SP 名称
o_cptype                out         number,              --CP/SP 类型
o_customersrvtel        out         varchar2,            --CP/SP 客服电话
o_serviceid             out         varchar2,            -- 业务代码
--o_serviceindex        out         number,              -- 业务序号
o_servicename           out         varchar2,            -- 业务名称
o_productid             out         varchar2,            -- 产品代码
--o_productindex        out         number,              -- 产品序号
o_productname           out         varchar2,            -- 产品名称
o_smschargingcn         out         varchar2,            -- 产品资费短信形容
o_servicetype           out         number,              -- 产品业务能力类型
o_subcapability         out         number,              -- 产品业务能力子类型
o_srvtypeid             out         varchar2,            -- 业务能力编码
o_freetime              out         varchar2,            -- 产品订购关系收费期
o_linknum               out         varchar2,            -- 业务话单中同一个流程中二次确认前后话单的关联
o_productsubid          out         varchar2,            -- 产品订购关系代码
o_productsubindex       out         varchar2,             -- 产品订购关系序号
o_spaccesscode          out         varchar2,              --SP 接入码
o_maincapability        out         number,              -- 组合业务主业务能力类型
o_submaincapability     out         number,              -- 组合业务主业务能力子类型
o_cpsrvtype             out         number,              --CP 服务类型:0:CP+SP,1:CP,2:SP ;3:自营业务 SP
o_buffertime            out         number,              -- 收费期揭示缓存工夫
o_status                out         number,              -- 订购关系状态;o_endtime               out         varchar2,             -- 产品订购关系完结工夫
o_cityid                out         varchar2,            -- 产品订购关系完结工夫
--added by youqunxia20130526  order2.07.10
o_cancelaccesscode      out         varchar2,            -- 产品退订接入码
o_cancelfeaturecode     out         varchar2             -- 短信, 彩信退订指令

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)                                                   := to_char(sysdate ,'yyyymmddhh24miss');
v_tmpint                number(10)                                                 := 0;                         -- 长期寄存长期数值
v_sql                   varchar2(3072)                                             := ' ';                       -- 长期寄存动静 sql
v_maincapability        number(10)                                                 := 0;                                       -- 长期寄存组合业务主业务能力类型
v_submaincapability     number(10)                                                 := 0;                                       -- 长期寄存组合业务主业务能力子类型
v_countrycode           varchar2(5)                                                := i_countrycode;             -- 长期寄存国家码

v_oa                    zxdbm_ismp.susr_basic.usercode%type                        := ' ';                       -- 长期寄存发起方用户号码
v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                        := ' ';                       -- 长期寄存应用方用户号码
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                         -- 长期寄存应用方用户序号
v_useusertype           zxdbm_ismp.susr_basic.usertype%type                        := 1;                         -- 长期寄存应用方用户类型
v_usepaytype            zxdbm_ismp.susr_basic.paytype%type                         := 0;                         -- 长期寄存应用方用户付费类型
v_useblacklist          zxdbm_ismp.susr_basic.blacklist%type                       := 0;                         -- 长期寄存应用方是否进入黑名单
v_usewhitelist          zxdbm_ismp.susr_basic.whitelist%type                       := 0;                         -- 长期寄存应用方是否进入白名单
v_useredlist            zxdbm_ismp.susr_basic.redlist%type                         := 0;                         -- 长期寄存应用方是否进入红名单
v_useblacklevel         zxdbm_ismp.susr_basic.blacklevel%type                      := 0;                         -- 长期寄存应用方黑名单级别
v_usewhitelevel         zxdbm_ismp.susr_basic.whitelevel%type                      := 0;                         -- 长期寄存应用方白名单级别
v_usemsisdntype         zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                         -- 长期寄存应用方号码类型
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                          := 0;                         -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type                    := 0;                         -- 长期寄存应用方激活状态
v_useoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                       := 0;                         -- 长期寄存应用方话单专用付费类型
v_usecorpindex          zxdbm_ismp.susr_basic.corpindex%type                       := 0;                         -- 长期寄存应用方团体序号
v_useusercityid         zxdbm_ismp.susr_basic.cityid%type                          := 0;                         -- 长期寄存用户所属的城市 ID
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type                     := '00000000000000';          -- 长期寄存应用方上次应用工夫
v_productid             zxdbm_200.s200_product.productid%type                      := i_productid;               -- 长期寄存产品代码
v_productindex          zxdbm_200.s200_product.productindex%type                   := 0;                         -- 长期寄存产品序号
v_productname           zxdbm_200.s200_product.productname%type                    := ' ';                       -- 长期寄存产品名称
v_smschargingcn         zxdbm_200.s200_product.smschargingcn%type                  := ' ';                       -- 长期寄存产品资费短信形容
v_servicetype           zxdbm_200.s200_product.servicetype%type                    := 0;                         -- 长期寄存产品业务能力类型
v_subcapability         zxdbm_200.s200_product.subcapability%type                  := 1;                         -- 长期寄存产品业务能力子类型
v_freenotify            zxdbm_200.s200_product.freenotify%type                     := 0;                         -- 收费期到是否发送告诉,0- 不发送,1- 发送
v_productendtime        zxdbm_200.s200_product.endtime%type                        := '99991231235959';          -- 长期寄存产品终止工夫
v_serviceid             zxdbm_200.s200_service.serviceid%type                      := ' ';                       -- 长期寄存业务代码
v_serviceindex          zxdbm_200.s200_service.serviceindex%type                   := 0;                         -- 长期寄存业务序号
v_servicename           zxdbm_200.s200_service.servicename%type                    := ' ';                       -- 长期寄存业务名称
v_cpid                  zxdbm_ismp.scp_basic.cpid%type                             := ' ';                       -- 长期寄存 CP/SP 代码
v_cptype                zxdbm_ismp.scp_basic.cptype%type                           := 2;                         -- 长期寄存 CP/SP 类型
v_cpindex               zxdbm_ismp.scp_basic.cpindex%type                          := 0;                         -- 长期寄存 CP/SP 序号
v_cpsrvtype             zxdbm_ismp.scp_basic.cpsrvtype%type                        := 0;                         -- 长期寄存 CP 服务类型
v_cpcnshortname         zxdbm_ismp.scp_basic.cpcnshortname%type                    := ' ';                       -- 长期寄存 CP/SP 中文名简写
v_customersrvtel        zxdbm_ismp.scp_basic.customersrvtel%type                   := ' ';                       -- 长期寄存 CP/SP 客服电话
v_productsubindex       zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                         -- 长期寄存订购关系序号
v_productsubid          zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';                       -- 长期寄存订购关系代码
v_status                zxdbm_200.s200_user_subscription.status%type               := 0;                         -- 订购关系状态状态,0- 待失效,1- 失常,2- 暂停,待生效,登记
v_subscribechannel      zxdbm_200.s200_user_subscription.subscribechannel%type     := 1;                         -- 长期寄存订购关系订购渠道
v_freetime              zxdbm_200.s200_user_subscription.freetime%type             := '00000000000000';          -- 长期寄存产品订购收费日期
v_endtime               zxdbm_200.s200_user_subscription.endtime%type              := '99991231235959';
v_nextrentdate          zxdbm_200.s200_user_subscription.nextrentdate%type         := '99991231';                -- 长期寄存下次扣租日期
v_subendtime            zxdbm_200.s200_user_subscription.endtime%type              := '99991231235959';          -- 长期寄存订购关系生效工夫
v_chargetype            zxdbm_200.s200_product_fee.chargetype%type                 := 0;
v_cyctype               zxdbm_200.s200_product_fee.cyctype%type                    := 0;                         -- 长期寄存周期类型 0 - 非周期,1- 周期性
v_cycunit               zxdbm_200.s200_product_fee.cycunit%type                    := 0;                         -- 长期寄存周期单位 0- 无,1- 天,2- 周,3- 月,4- 半年,5- 年,6- 小时,7- 分钟,8- 秒
v_cycparam              zxdbm_200.s200_product_fee.cycparam%type                   := 0;                         -- 长期寄存周期参数
v_srvtypeid             zxdbm_ismp.ssys_service_type.srvtypeid%type                := ' ';                       -- 长期寄存话单中的 srvtypeid
v_spaccesscode          zxdbm_ismp.ssrv_srvorder.spaccesscode%type                 := ' ';                       -- 长期寄存 sp 接入码
--added by youqunxia20130526  order2.07.10
v_cancelaccesscode      zxdbm_ismp.ssrv_srvorder.accesscode%type                   := ' ';                       -- 长期寄存退订接入码
v_cancelfeaturecode     zxdbm_ismp.ssrv_srvorder.featurecode%type                  := ' ';                       -- 长期寄存退订特色码

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos             := 0;
o_debuginfo             := ' ';
o_usemsisdn             := ' ';
o_paymsisdn             := ' ';
o_usemsisdntype         := 1;
o_userindex             := 0;
o_freenotify            := 1;
o_paytype               := 0;
o_oppaytype             := 0;
o_colortype             := 0;
o_cpid                  := ' ';
o_cpindex               := 0;
o_cpcnshortname         := ' ';
o_cptype                := 0;
o_customersrvtel        := ' ';
o_serviceid             := ' ';
--o_serviceindex          := 0;
o_servicename           := ' ';
o_productid             := ' ';
--o_productindex          := 0;
o_productname           := ' ';
o_smschargingcn         := ' ';
o_servicetype           := 0;
o_subcapability         := 1;
o_srvtypeid             := ' ';
o_freetime              := '00000000000000';
o_linknum               := ' ';
o_productsubid          := ' ';
o_productsubindex       := 0;
o_spaccesscode          := i_spaccesscode;
o_maincapability        := 0;
o_submaincapability     := 0;
o_cpsrvtype             := 0;
o_buffertime            := 0;
o_endtime               := v_endtime;
o_cityid                := '';
--added by youqunxia20130526
o_cancelaccesscode      := '';
o_cancelfeaturecode     := '';


-- 发起方用户号码去前缀
v_oa := ltrim(rtrim(nvl(i_oa,'0')));
if v_oa like ('+' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 2);
elsif v_oa like ('00' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 3);
elsif v_oa like (v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 1);
end if;
if (substr(v_oa,1,1) <> '0') and (i_oatype = 4) then
    v_oa := '0' || v_oa;
end if;
v_usemsisdn  := v_oa;
o_usemsisdn  := v_usemsisdn;
if (v_usemsisdn = '0') then
    o_retcode   := 1001;
    o_debugpos := 2;
    o_debuginfo := 'v_usemsisdn error.';
    return;
end if;
-- 应用方号码存在性鉴权
if (i_needauthuser = 1) then
    begin
        select userindex,usertype,paytype,blacklist,whitelist,
               redlist,blacklevel,whitelevel,msisdntype,status,
               activestatus,oppaytype,corpindex,lastusetime,cityid
        into   v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,
               v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,
               v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_useusercityid
        from   zxdbm_ismp.susr_basic
        where  usercode = v_usemsisdn;
    exception when no_data_found then
        o_retcode   := 1001;
        o_debugpos := 3;
        o_debuginfo := 'user info do not exist.';
        if (i_oatype = 4) then
            v_usemsisdntype    := 2;
        else
            v_usemsisdntype    := 1;
        end if;
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 4;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        if (i_oatype = 4) then
            o_usemsisdntype    := 2;
        else
            o_usemsisdntype    := 1;
        end if;
        return;
    end;
    o_usemsisdntype := v_usemsisdntype;
    o_userindex     := v_useuserindex;
    o_paymsisdn     := v_usemsisdn;
    o_paytype       := v_usepaytype;
    o_oppaytype     := v_useoppaytype;
    o_cityid        := trim(v_useusercityid);
    if (v_useredlist = 1) then
        o_colortype := 4;
    else
        o_colortype := 0;
    end if;
end if;
-- 产品存在性鉴权
begin
    select productindex,productname,smschargingcn,serviceindex,servicetype,
           subcapability,cpindex,freenotify,endtime
    into   v_productindex,v_productname,v_smschargingcn,v_serviceindex,v_servicetype,
           v_subcapability,v_cpindex,v_freenotify,v_productendtime
    from   zxdbm_200.s200_product
    where  productid = v_productid;
exception when no_data_found then
    o_retcode   := 2100;
    o_debugpos := 5;
    o_debuginfo := 'product info do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 6;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_productid  := v_productid;
--o_productindex  := v_productindex;
o_productname   := v_productname;
o_smschargingcn := v_smschargingcn;
--o_serviceindex  := v_serviceindex;
o_servicetype   := v_servicetype;
o_subcapability := v_subcapability;
o_cpindex       := v_cpindex;

begin
    select chargetype,cyctype,cycunit,cycparam
    into   v_chargetype,v_cyctype,v_cycunit,v_cycparam
    from   zxdbm_200.s200_product_fee
    where  productindex = v_productindex and itemindex = 0;
exception when no_data_found then
    o_retcode   := 3103;
    o_debugpos := 7;
    o_debuginfo := 'product fee do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 8;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

-- 业务存在性鉴权(MPSS 不须要鉴权)
if i_servicetype = 101 then
    v_sql := 'select serviceid,servicename,maincapability,submaincapability'||
             'from zxdbm_9900.s9900_service where serviceindex = :p1';
    begin
        execute immediate v_sql into v_serviceid,v_servicename,v_maincapability,v_submaincapability using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 9;
        o_debuginfo := 'cpx service do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 10;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
elsif i_servicetype <> 14 then
    begin
        select serviceid,servicename
        into   v_serviceid,v_servicename
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 11;
        o_debuginfo := 'service do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 12;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

o_serviceid   := v_serviceid;
o_servicename := v_servicename;
o_maincapability    := v_maincapability;
o_submaincapability := v_submaincapability;

-- 零碎业务能力鉴权
if i_servicetype = 101 then
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_maincapability and subcapability = v_submaincapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 13;
        o_debuginfo := 'cpx info in ssys_service_type do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 14;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
       return;
    end;
else
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 15;
        o_debuginfo := 'info in ssys_service_type do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 16;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_srvtypeid   :=  v_srvtypeid;

--CP/SP 存在性鉴权
begin
    select cpid,cptype,cpcnshortname,customersrvtel,cpsrvtype
    into   v_cpid,v_cptype,v_cpcnshortname,v_customersrvtel,v_cpsrvtype
    from   zxdbm_ismp.scp_basic
    where  cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 17;
    o_debuginfo := 'sp do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 18;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_cpid            := v_cpid;
o_cptype          := v_cptype;
o_cpsrvtype       := v_cpsrvtype;
o_cpcnshortname   := v_cpcnshortname;
o_customersrvtel  := v_customersrvtel;

--added by youqunxia20130526   order2.07.10
-- 产品退订指令查问
begin
    select featurecode,accesscode
    into   v_cancelfeaturecode,v_cancelaccesscode
    from   zxdbm_ismp.ssrv_srvorder
    where  productid = v_productid and cmdtype = 2 and rownum = 1;
exception when no_data_found then
    null;
when others then
    o_retcode   := 506;
    o_debugpos := 28;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_cancelaccesscode := v_cancelaccesscode;
o_cancelfeaturecode := v_cancelfeaturecode;

--SP 接入码查问
if (i_spaccesscode is null) or (length(trim(i_spaccesscode)) = 0) then
    begin
        select spaccesscode into v_spaccesscode
        from zxdbm_ismp.ssrv_srvorder
        where productindex = v_productindex and cmdtype in (1,2) and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 19;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if trim(v_spaccesscode) is null then
        begin
            select accesscode into v_spaccesscode
            from zxdbm_ismp.ssrv_spaccesscode
            where cpid = v_cpid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 20;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    o_spaccesscode := v_spaccesscode;
end if;

-- 产品订购关系存在性鉴权
begin
    select subscriptionindex,subscriptionid,freetime,subscribechannel,status,
           endtime
    into   v_productsubindex,v_productsubid,v_freetime,v_subscribechannel,v_status,
           v_endtime
    from   zxdbm_200.s200_user_subscription
    where  usercode = v_usemsisdn and productid = v_productid;
exception when no_data_found then
    o_retcode   := 1201;
    o_debugpos := 21;
    o_debuginfo := 'subscription do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 22;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_freetime         := v_freetime;
o_productsubindex  := v_productsubindex;
o_productsubid     := v_productsubid;
o_status           := v_status;
o_endtime          := v_endtime;

-- 设置 o_freenotify
--added by youqunxia20130526  order2.07.10
if i_actiontype =10 then
    -- 到期确认订购胜利揭示
    o_freenotify  := 3;
elsif i_cmdchannel = 1001 then
    -- 到期确认退订超时揭示,订购胜利
    o_freenotify  := 6;
else
    o_freenotify  := v_freenotify;
    if v_freenotify = 3 then
        -- 到期确认退订揭示
        o_freenotify := 5;
    end if;
    if (i_freenotice = 0) and v_freenotify in (0,2) then
        -- 收费期到期主动续订和主动勾销时不下发短信
        o_freenotify := 4;
    end if;
end if;

-- 收费期确认订购胜利,或者确认退订超时订购胜利,批改订购关系
if i_actiontype = 10 or i_cmdchannel = 1001 then 
    -- 批改下次扣租工夫和订购关系生效工夫
    v_nextrentdate := to_char(to_date(v_freetime,'yyyymmddhh24miss') + 1,'yyyymmdd');
    if v_chargetype in (1,4) then
        v_subendtime := v_productendtime;
    elsif v_chargetype in (2,5,7) then
        if v_cyctype = 1 then
            v_subendtime := v_productendtime;
        else
            v_subendtime := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')),'yyyymmdd') || '235959';
        end if;
    elsif v_chargetype in (3,6,8,9) then
        if (v_cycunit = 1) then
            -- 包天
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                v_subendtime := to_char(to_date(v_sysdate14,'yyyymmddhh24miss') + v_cycparam,'yyyymmdd')||'235959';
            end if;
        elsif (v_cycunit = 2) then
            -- 包周
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                v_subendtime := to_char(to_date(v_sysdate14,'yyyymmddhh24miss') + v_cycparam*7,'yyyymmdd')||'235959';
            end if;
        elsif (v_cycunit = 3) then
            -- 包月
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                v_subendtime := to_char(add_months(to_date(v_sysdate14,'yyyymmddhh24miss'),v_cycparam),'yyyymmdd')||'235959';
            end if;
        elsif (v_cycunit = 4) then
            -- 包半年
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                v_subendtime := to_char(add_months(to_date(v_sysdate14,'yyyymmddhh24miss'),v_cycparam*6),'yyyymmdd')||'235959';
            end if;
        elsif (v_cycunit = 5) then
            -- 包年
            if v_cyctype = 1 then
                v_subendtime := v_productendtime;
            else
                v_subendtime := to_char(add_months(to_date(v_sysdate14,'yyyymmddhh24miss'),v_cycparam*12),'yyyymmdd')||'235959';
            end if;
        end if;
    else
        -- 订购终止工夫, 临时定为产品终止工夫
        v_subendtime := v_productendtime;
    end if;
    if i_cmdchannel = 46 then
        -- 查问订购渠道
        begin
            select portalchannel into v_subscribechannel
            from zxdbm_ismp.ssrv_channel_map
            where innerchannel = i_cmdchannel;
        exception when no_data_found then
            v_subscribechannel := i_cmdchannel * 1000;
        when others then
            o_retcode   := 506;
            o_debugpos := 11;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;

    begin
        update  zxdbm_200.s200_user_subscription
        set     endtime = v_subendtime,
                nextrentdate = v_nextrentdate,
                subscribechannel = v_subscribechannel
        where   usercode = v_usemsisdn and productid = v_productid;
        if (sql%rowcount = 0) then
            o_retcode   := 506;
            o_debugpos := 23;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            rollback;
            return;
        end if;
    exception when others then
        o_retcode   := 506;
        o_debugpos := 24;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if v_chargetype = 4 then -- 对于纯包量有收费期的状况,须要更新累积表的过期工夫到新的订购关系完结工夫
        begin
            update  zxdbm_ismp.ssrv_user_totalamount
            set     expiredate = to_number(substr(v_subendtime,1,8))
            where   userindex = v_useuserindex and amounttype = 0 and amountindex = v_productindex and rownum = 1;
            if (sql%rowcount = 0) then
                o_retcode   := 506;
                o_debugpos := 25;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                rollback;
                return;
            end if;
        exception when others then
            o_retcode   := 506;
            o_debugpos := 26;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    commit;
end if;

--added by youqunxia20130526  order2.07.10
-- 收费期到期需用户确认订购 / 退订 缓存工夫设置
if o_freenotify in (1,5) then
    --cache 工夫计算
    o_buffertime := 3600*24*ABS(to_date('235959', 'HH24MISS') - to_date(substr(v_sysdate14,9,6), 'HH24MISS'));
    -- 生成 o_linknum
    begin
        v_tmpint  := dbms_random.value(1,9999999999);
        o_linknum := v_sysdate14 || '655380' || lpad(to_char(v_tmpint),10,'0');
    exception when others then
        o_retcode   := 506;
        o_debugpos := 27;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

end slp_200_telicomfreenotify;
/

– 暂停 / 激活产品订购关系鉴权
prompt zxdbm_200.slp_200_telicomsubchangereq
create or replace procedure zxdbm_200.slp_200_telicomsubchangereq
(

i_oa                    in          varchar2,            -- 发起方用户号码
i_oatype                in          number,              -- 发起方地址类型
i_servicetype           in          number,              -- 业务能力类型
i_productid             in          varchar2,            -- 产品代码
i_actiontype            in          number,              -- 动作类型
i_cmdchannel            in          number,              -- 动作起源
i_countrycode           in          varchar2,            -- 国家码
i_spaccesscode          in          varchar2,            --antuprice 音讯中的 SP 接入码
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_checkpseudocode       in          number,              -- 零碎开关: 是否反对伪码   0- 不反对   1- 反对
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos             out         number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_usemsisdn             out         varchar2,            -- 去掉前缀的应用方用户号码
o_paymsisdn             out         varchar2,            -- 去掉前缀的计费方号码
o_usemsisdntype         out         number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
o_userindex             out         number,              -- 应用方号码序号
o_paytype               out         number,              -- 计费号码的付费类型 0: 后付费 1: 预付费 2: 准预付费
o_oppaytype             out         number,              -- 话单专用付费类型
o_colortype             out         number,              -- 应用方号码名单类型   0- 普通用户,1- 黑名单,2- 白名单,3- 灰名单,4- 红名单
o_cpid                  out         varchar2,            --CP/SP 代码
o_cpindex               out         number,              --CP/SP 序号
o_cpcnshortname         out         varchar2,            --CP/SP 名称
o_cpsubscribeurl        out         varchar2,            --CP/SP 订购 URL
o_cptype                out         number,              --CP/SP 类型
o_customersrvtel        out         varchar2,            --CP/SP 客服电话
o_serviceid             out         varchar2,            -- 业务代码
o_serviceindex          out         number,              -- 业务序号
o_servicename           out         varchar2,            -- 业务名称
o_productid             out         varchar2,            -- 产品代码
o_productindex          out         number,              -- 产品序号
o_productname           out         varchar2,            -- 产品名称
o_smschargingcn         out         varchar2,            -- 产品资费短信形容
o_servicetype           out         number,              -- 产品业务能力类型
o_subcapability         out         number,              -- 产品业务能力子类型
o_srvtypeid             out         varchar2,            -- 业务能力编码
o_productsubid          out         varchar2,            -- 产品订购关系代码
o_productsubindex       out         varchar2,            -- 产品订购关系序号
o_productsubstatus      out         number,              -- 产品订购关系状态
o_neednotifysp          out         number,               -- 是否有必要告诉 SP
o_pseudocode            out         varchar2,             -- 伪码
o_pcodemsisdnswitch     out         number,               -- 伪码和实在号码之间是否有转换:  0 否   1 实在号码转化伪码 2 伪码转化为实在号码
o_spaccesscode          out         varchar2,             --SP 接入码
o_maincapability        out         number,               -- 组合业务主业务能力类型
o_submaincapability     out         number,               -- 组合业务主业务能力子类型
o_cpsrvtype             out         number,               --CP 服务类型:0:CP+SP,1:CP,2:SP ;3:自营业务 SP
o_cityid                out         varchar2,             -- 用户所属城市 ID
--added by youqunxia20130906 order3.02.01
o_issynctooidd          out         number                -- 是否同步订购关系给 OIDD,0- 否,1- 是 

)
as

v_sql                   varchar2(3072)                                             := ' ';                    -- 长期寄存动静 sql
v_countrycode           varchar2(5)                                                := i_countrycode;          -- 长期寄存国家码
v_maincapability        number(10)                                                 := 0;                      -- 长期寄存组合业务主业务能力类型
v_submaincapability     number(10)                                                 := 0;                      -- 长期寄存组合业务主业务能力子类型

v_oa                    zxdbm_ismp.susr_basic.usercode%type                        := ' ';                    -- 长期寄存发起方用户号码
v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                        := ' ';                    -- 长期寄存应用方用户号码
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                      -- 长期寄存应用方用户序号
v_useusertype           zxdbm_ismp.susr_basic.usertype%type                        := 1;                      -- 长期寄存应用方用户类型
v_usepaytype            zxdbm_ismp.susr_basic.paytype%type                         := 0;                      -- 长期寄存应用方用户付费类型
v_useblacklist          zxdbm_ismp.susr_basic.blacklist%type                       := 0;                      -- 长期寄存应用方是否进入黑名单
v_usewhitelist          zxdbm_ismp.susr_basic.whitelist%type                       := 0;                      -- 长期寄存应用方是否进入白名单
v_useredlist            zxdbm_ismp.susr_basic.redlist%type                         := 0;                      -- 长期寄存应用方是否进入红名单
v_useblacklevel         zxdbm_ismp.susr_basic.blacklevel%type                      := 0;                      -- 长期寄存应用方黑名单级别
v_usewhitelevel         zxdbm_ismp.susr_basic.whitelevel%type                      := 0;                      -- 长期寄存应用方白名单级别
v_usemsisdntype         zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                      -- 长期寄存应用方号码类型
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                          := 0;                      -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type                    := 0;                      -- 长期寄存应用方激活状态
v_useoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                       := 0;                      -- 长期寄存应用方话单专用付费类型
v_usecorpindex          zxdbm_ismp.susr_basic.corpindex%type                       := 0;                      -- 长期寄存应用方团体序号
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type                     := '00000000000000';       -- 长期寄存应用方上次应用工夫
v_useusercityid         zxdbm_ismp.susr_basic.cityid%type                          := ' ';                    -- 长期寄存应用方所属城市 ID

v_srvtypeid             zxdbm_ismp.ssys_service_type.srvtypeid%type                := ' ';                    -- 长期寄存话单中的 srvtypeid
v_cpid                  zxdbm_ismp.scp_basic.cpid%type                             := ' ';                    -- 长期寄存 CP/SP 代码
v_cptype                zxdbm_ismp.scp_basic.cptype%type                           := 2;                      -- 长期寄存 CP/SP 类型
v_cpsrvtype             zxdbm_ismp.scp_basic.cpsrvtype%type                        := 0;                                                  -- 长期寄存 CP 服务类型
v_cpindex               zxdbm_ismp.scp_basic.cpindex%type                          := 0;                      -- 长期寄存 CP/SP 序号
v_cpcnshortname         zxdbm_ismp.scp_basic.cpcnshortname%type                    := ' ';                    -- 长期寄存 CP/SP 中文名简写
v_customersrvtel        zxdbm_ismp.scp_basic.customersrvtel%type                   := ' ';                    -- 长期寄存 CP/SP 客服电话
v_cpsubscribeurl        zxdbm_ismp.scp_basic.cpsubscribeurl%type                   := ' ';                    -- 长期寄存 CP/SP 订购 URL
v_productid             zxdbm_200.s200_product.productid%type                      := i_productid;            -- 长期寄存产品代码
v_productindex          zxdbm_200.s200_product.productindex%type                   := 0;                      -- 长期寄存产品序号
v_productname           zxdbm_200.s200_product.productname%type                    := ' ';                    -- 长期寄存产品名称
v_smschargingcn         zxdbm_200.s200_product.smschargingcn%type                  := ' ';                    -- 长期寄存产品资费短信形容
v_servicetype           zxdbm_200.s200_product.servicetype%type                    := 0;                      -- 长期寄存产品业务能力类型
v_subcapability         zxdbm_200.s200_product.subcapability%type                  := 1;                      -- 长期寄存产品业务能力子类型
v_serviceid             zxdbm_200.s200_service.serviceid%type                      := ' ';                    -- 长期寄存业务代码
v_serviceindex          zxdbm_200.s200_service.serviceindex%type                   := 0;                      -- 长期寄存业务序号
v_servicename           zxdbm_200.s200_service.servicename%type                    := ' ';                    -- 长期寄存业务名称
v_orderupdateurl        zxdbm_200.s200_service.orderupdateurl%type                 := ' ';                    -- 长期寄存业务表中订购关系更新告诉 URL
v_productsubindex       zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                      -- 长期寄存订购关系序号
v_productsubid          zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';                    -- 长期寄存订购关系代码
v_productsubstatus      zxdbm_200.s200_user_subscription.status%type               := 0;                      -- 长期寄存订购关系状态
v_spaccesscode          zxdbm_ismp.ssrv_srvorder.spaccesscode%type                 := ' ';                    -- 长期寄存 sp 接入码
--added by youqunxia20130906 order3.02.01
v_servicesort           zxdbm_200.s200_service.servicesort%type                    := 0;                      -- 业务归属 0:一般业务、1:属于 OIDD 2:属于定位

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos             := 0;
o_debuginfo             := ' ';
o_usemsisdn             := ' ';
o_paymsisdn             := ' ';
o_usemsisdntype         := 1;
o_userindex             := 0;
o_paytype               := 0;
o_oppaytype             := 0;
o_colortype             := 0;
o_cpid                  := ' ';
o_cpindex               := 0;
o_cpcnshortname         := ' ';
o_cpsubscribeurl        := ' ';
o_cptype                := 0;
o_customersrvtel        := ' ';
o_serviceid             := ' ';
o_serviceindex          := 0;
o_servicename           := ' ';
o_productid             := ' ';
o_productindex          := 0;
o_productname           := ' ';
o_smschargingcn         := ' ';
o_servicetype           := 0;
o_subcapability         := 1;
o_srvtypeid             := ' ';
o_productsubid          := ' ';
o_productsubindex       := 0;
o_productsubstatus      := 0;
o_neednotifysp          := 0;
o_pseudocode            :='';
o_pcodemsisdnswitch     :=0;
o_spaccesscode          := i_spaccesscode;
o_maincapability        := 0;
o_submaincapability     := 0;
o_cpsrvtype             := 0;
o_cityid                := '';
o_issynctooidd          := 0;

-- 发起方地址类型鉴权
if i_oatype not in (1,2,3,4) then
    o_retcode   := 107;
    o_debugpos := 1;
    o_debuginfo := 'i_oatype is not valid.';
    return;
end if;

-- 发起方用户号码去前缀
v_oa := ltrim(rtrim(nvl(i_oa,'0')));
if v_oa like ('+' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 2);
elsif v_oa like ('00' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 3);
elsif v_oa like (v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 1);
end if;
if (substr(v_oa,1,1) <> '0') and (i_oatype = 4) then
    v_oa := '0' || v_oa;
end if;
v_usemsisdn  := v_oa;
o_usemsisdn  := v_usemsisdn;
if (v_usemsisdn = '0') then
    o_retcode   := 1001;
    o_debugpos := 2;
    o_debuginfo := 'v_usemsisdn error.';
    return;
end if;
-- 应用方号码存在性鉴权
if (i_needauthuser = 1) then
    begin
        select userindex,usertype,paytype,blacklist,whitelist,
               redlist,blacklevel,whitelevel,msisdntype,status,
               activestatus,oppaytype,corpindex,lastusetime,cityid
        into   v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,
               v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,
               v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_useusercityid
        from   zxdbm_ismp.susr_basic
        where  usercode = v_usemsisdn;
    exception when no_data_found then
        o_retcode   := 1001;
        o_debugpos := 3;
        o_debuginfo := 'user info do not exist.';
        if (i_oatype = 4) then
            v_usemsisdntype    := 2;
        else
            v_usemsisdntype    := 1;
        end if;
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 4;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        if (i_oatype = 4) then
            o_usemsisdntype    := 2;
        else
            o_usemsisdntype    := 1;
        end if;
        return;
    end;
    o_usemsisdntype := v_usemsisdntype;
    o_userindex     := v_useuserindex;
    o_paymsisdn     := v_usemsisdn;
    o_paytype       := v_usepaytype;
    o_oppaytype     := v_useoppaytype;
    o_cityid        := trim(v_useusercityid);
    if (v_useredlist = 1) then
        o_colortype := 4;
    else
        o_colortype := 0;
    end if;
end if;
-- 产品存在性鉴权
begin
    select productindex,productname,smschargingcn,serviceindex,servicetype,
           subcapability,cpindex
    into   v_productindex,v_productname,v_smschargingcn,v_serviceindex,v_servicetype,
           v_subcapability,v_cpindex
    from   zxdbm_200.s200_product
    where  productid = v_productid;
exception when no_data_found then
    o_retcode   := 2100;
    o_debugpos := 5;
    o_debuginfo := 'product info do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 6;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_productid     := v_productid;
o_productindex  := v_productindex;
o_productname   := v_productname;
o_smschargingcn := v_smschargingcn;
o_serviceindex  := v_serviceindex;
o_servicetype   := v_servicetype;
o_subcapability := v_subcapability;
o_cpindex       := v_cpindex;

-- 业务存在性鉴权(MPSS 不须要鉴权)
if i_servicetype = 101 then
    v_sql := 'select serviceid,servicename,maincapability,submaincapability,orderupdateurl'||
             'from zxdbm_9900.s9900_service where serviceindex = :p1';
    begin
        execute immediate v_sql into v_serviceid,v_servicename,v_maincapability,v_submaincapability,v_orderupdateurl using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 7;
        o_debuginfo := 'cpx service info do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 8;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
--added by youqunxia20130906 order3.02.01
elsif i_servicetype in(1,2,3) then
    begin
        select serviceid,servicename,orderupdateurl,servicesort
        into   v_serviceid,v_servicename,v_orderupdateurl,v_servicesort
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 26;
        o_debuginfo := 'service info do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 27;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
elsif i_servicetype <> 14 then
    begin
        select serviceid,servicename,orderupdateurl
        into   v_serviceid,v_servicename,v_orderupdateurl
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 9;
        o_debuginfo := 'service info do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 10;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

o_serviceid   := v_serviceid;
o_servicename := v_servicename;
o_maincapability    := v_maincapability;
o_submaincapability := v_submaincapability;

--added by youqunxia20130906 order3.02.01
-- 是否同步订购关系给 OIDD,0- 否,1- 是
if v_servicesort = 1 then
    o_issynctooidd := 1;
end if;

-- 零碎业务能力鉴权
if i_servicetype = 101 then
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_maincapability and subcapability = v_submaincapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 11;
        o_debuginfo := 'cpx ssys_service_type do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 12;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
       return;
    end;
else
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 13;
        o_debuginfo := 'ssys_service_type do not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 14;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_srvtypeid   :=  v_srvtypeid;

--CP/SP 存在性鉴权
begin
    select cpid,cpsrvtype,cptype,cpcnshortname,customersrvtel,cpsubscribeurl
    into   v_cpid,v_cpsrvtype,v_cptype,v_cpcnshortname,v_customersrvtel,v_cpsubscribeurl
    from   zxdbm_ismp.scp_basic
    where  cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 15;
    o_debuginfo := 'sp info do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 16;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

o_cpid            := v_cpid;
o_cptype          := v_cptype;
o_cpsrvtype       := v_cpsrvtype;
o_cpcnshortname   := v_cpcnshortname;
o_customersrvtel  := v_customersrvtel;
if (trim(v_orderupdateurl) is null) or (length(trim(v_orderupdateurl)) < 8) then
    o_cpsubscribeurl := v_cpsubscribeurl;
else
    o_cpsubscribeurl := v_orderupdateurl;
end if;

--SP 接入码查问
if (i_spaccesscode is null) or (length(trim(i_spaccesscode)) = 0) then
    begin
        select spaccesscode into v_spaccesscode
        from zxdbm_ismp.ssrv_srvorder
        where productindex = v_productindex and cmdtype in (1,2) and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 17;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if trim(v_spaccesscode) is null then
        begin
            select accesscode into v_spaccesscode
            from zxdbm_ismp.ssrv_spaccesscode
            where cpid = v_cpid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 18;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
    o_spaccesscode := v_spaccesscode;
end if;


– 伪码解决 (反对伪码开关关上, 非自营 sp)– 反对业务 LCS,SMS,MVS,DLS,MMS,WAP,CPX
– 退订时,AuthPriceReq 音讯中 OA(DA) 实在号码转化为伪码, 同步 SP
– 这里订购业务的回滚订购关系不做解决

if i_servicetype in (1,2,3,4,41,5,6,101) then
    if i_checkpseudocode = 1 and v_cpsrvtype <> 3 then
        begin
            select pseudocode into o_pseudocode from zxdbm_ismp.susr_basic where usercode = v_oa;
        exception when no_data_found then
            o_retcode   := 1001;
            o_debugpos := 19;
            o_debuginfo := 'userinfo do not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 20;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        o_pcodemsisdnswitch := 1;
    end if;
end if;

*/

-- 产品订购关系存在性鉴权
begin
    select subscriptionindex,subscriptionid,status
    into   v_productsubindex,v_productsubid,v_productsubstatus
    from   zxdbm_200.s200_user_subscription
    where  usercode = v_usemsisdn and productid = v_productid;
exception when no_data_found then
    o_retcode   := 1201;
    o_debugpos := 21;
    o_debuginfo := 'subscription info do not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 22;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_productsubindex  := v_productsubindex;
o_productsubid     := v_productsubid;
o_productsubstatus := v_productsubstatus;

if (i_actiontype = 3) then
    if v_productsubstatus not in (0,1,4) then
        o_retcode      := 505;
        o_debugpos    := 23;
        o_debuginfo    := 'product status is 0,1,4.';
        o_neednotifysp := 0;
        return;
    elsif v_productsubstatus = 1 then
        o_neednotifysp := 1;
    else
        o_neednotifysp := 0;
    end if;
elsif (i_actiontype = 4) then
    if v_productsubstatus not in (2,3,5) then
        o_retcode      := 505;
        o_debugpos    := 24;
        o_debuginfo    := 'product status is 2,3,5.';
        o_neednotifysp := 0;
        return;
    elsif v_productsubstatus = 3 then
        o_neednotifysp := 1;
    else
        o_neednotifysp := 0;
    end if;
else
    o_retcode      := 505;
    o_debugpos    := 25;
    o_debuginfo    := 'cmd error.';
    o_neednotifysp := 0;
    return;
end if;

end slp_200_telicomsubchangereq;
/

– 暂停 / 激活产品订购关系更新
prompt zxdbm_200.slp_200_telicomsubchangeresp
create or replace procedure zxdbm_200.slp_200_telicomsubchangeresp
(

i_usemsisdn             in          varchar2,            -- 应用方用户号码
i_productid             in          varchar2,            -- 产品代码
i_actiontype            in          number,              -- 动作类型
i_cmdchannel            in          number,              -- 动作起源
i_productsubstatus      in          number,              -- 产品订购关系状态
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos             out         number,              -- 进口程序标识
o_debuginfo             out         varchar2             -- 调试信息

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)                                              := to_char(sysdate ,'yyyymmddhh24miss');

v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                   := i_usemsisdn;                            -- 长期寄存应用方用户号码
v_productid             zxdbm_200.s200_user_subscription.productid%type       := i_productid;                            -- 长期寄存产品代码
v_productsubstatus      zxdbm_200.s200_user_subscription.status%type          := i_productsubstatus;                     -- 长期寄存订购关系状态
v_cancelchannel         zxdbm_200.s200_user_subscription.cancelchannel%type   := 0;                                      -- 长期寄存暂停复原渠道

begin

-- 出参初始化
o_retcode       := 0;
o_debugpos     := 0;
o_debuginfo     := ' ';

-- 设置退订渠道
begin
    select portalchannel into v_cancelchannel
    from zxdbm_ismp.ssrv_channel_map
    where innerchannel = i_cmdchannel;
exception when no_data_found then
    v_cancelchannel := i_cmdchannel * 1000;
when others then
    o_retcode   := 506;
    o_debugpos := 1;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
-- 设置更新后产品订购关系的状态
if (i_actiontype = 3) then
    if (v_productsubstatus = 0) then
        v_productsubstatus := 2;
    elsif (v_productsubstatus = 1) then
        v_productsubstatus := 3;
    elsif (v_productsubstatus = 4) then
        v_productsubstatus := 5;
    else
        o_retcode    := 505;
        o_debugpos  := 2;
        o_debuginfo  := 'product status error.';
        return;
    end if;
    begin
        update zxdbm_200.s200_user_subscription
        set    status      = v_productsubstatus,
               statustime  = v_sysdate14,
               subscribeoptype = 1,
               pausetime   = v_sysdate14,
               cancelchannel = v_cancelchannel
        where  usercode = v_usemsisdn and productid = v_productid;
        if (sql%rowcount = 0) then
           o_retcode    := 506;
           o_debugpos  := 3;
           o_debuginfo  := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
           rollback;
        end if;
    exception when others then
        o_retcode    := 506;
        o_debugpos  := 4;
        o_debuginfo  := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        rollback;
        return;
    end;
elsif (i_actiontype = 4) then
    if (v_productsubstatus = 2) then
        v_productsubstatus := 0;
    elsif (v_productsubstatus = 3) then
        v_productsubstatus := 1;
    elsif (v_productsubstatus = 5) then
        v_productsubstatus := 4;
    else
        o_retcode    := 505;
        o_debugpos  := 5;
        o_debuginfo  := 'product status error.';
        return;
    end if;
    begin
        update zxdbm_200.s200_user_subscription
        set    status      = v_productsubstatus,
               statustime  = v_sysdate14,
               subscribeoptype = 2,
               resumetime  = v_sysdate14,
               cancelchannel = v_cancelchannel
        where  usercode = v_usemsisdn and productid = v_productid;
        if (sql%rowcount = 0) then
           o_retcode    := 506;
           o_debugpos  := 6;
           o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
           rollback;
        end if;
    exception when others then
        o_retcode    := 506;
        o_debugpos  := 7;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        rollback;
        return;
    end;
else
    o_retcode    := 505;
    o_debugpos  := 8;
    o_debuginfo := 'cmd error.';
    return;
end if;
commit;

end slp_200_telicomsubchangeresp;
/

– 批改从号码, msp 专用流程
– 本存储过程将无需确认的批改从号码和需二次确认的告诉流程和确认批改从号码流程合一
prompt zxdbm_200.slp_200_telicommodifysubreq
create or replace procedure zxdbm_200.slp_200_telicommodifysubreq
(

i_msisdn                in          varchar2,      -- 订购用户
i_productid             in          varchar2,      -- 产品 id
i_countrycode           in          varchar2,      -- 国家代码
i_prepaidtype           in          number,        -- 预付费接口类型 1-OCS 2- 非 OCS 3- 依据号段抉择是 OCS 或者非 OCS
o_retcode               out         number,        -- 返回后果 0: 胜利;9999: 透传到下以节点;other: 失败
o_debugpos             out         number,        -- 用来定位谬误具体位置
o_debuginfo             out         varchar2,      -- 调试信息
o_accesscode            out         varchar2,      -- 音讯的源号码;
o_cpsubscribeurl        out         varchar2,      --SP 订购 url
o_paytype               out         number,        -- 用户付费类型,0,后付费;1,预付费。o_oppaytype             out         number,        -- 用户付费类型(话单)
o_servicename           out         varchar2,      -- 业务名称
o_cpid                  out         varchar2,      --cp 代码
o_cpname                out         varchar2,      --cp 名称
o_serviceid             out         varchar2,      -- 业务 ID
o_subscriptionindex     out         number,        -- 订购关系 ID
o_scptype               out         number,        -- 对预付费扣费的设施类型:1:OCS;2:RTBP
o_productname           out         varchar2,      -- 产品名称
o_customersrvtel        out         varchar2,      -- 客服电话
o_msisdntype            out         number,        -- 用户号码类型
o_smschargingcn         out         varchar2,      -- 产品资费短信形容
o_servicetype           out         number,        -- 业务能力类型
o_subcapability         out         number,        -- 业务能力子类型 1 -3G,2-PHS,3-ISAG
o_subscriptionid        out         varchar2,      -- 订购关系 id
o_cptype                out         number,        --cp/sp 类型 0: 是本省   1:是全国业务
o_srvtypeid             out         varchar2,       -- 业务能力编码,ssys_service_type 表中的 srvtypeid
o_cdrtsuserindex        out         number,        -- 流程话单中的用户编号
o_cdrtsusercode         out         varchar2,      -- 流程话单中的用户号码
o_cpindex               out         number,        --cpindex 索引
o_corpindex             out         number,        --corpindex 索引
o_corpid                out         varchar2,      --corpid
o_cpsrvtype             out         number         --CP 服务类型:0:CP+SP,1:CP,2:SP ;3:自营业务 SP

)
is

v_dev_exist           number(3,0)            := 1;                                        -- 是否在平台 ssys_phone 表中存在号段信息,0: 不存在,1: 存在

v_msisdn              zxdbm_ismp.susr_basic.usercode%type                        := ' ';
v_userindex           zxdbm_ismp.susr_basic.userindex%type                       := 0;                         -- 用户号码序号
v_oppaytype           zxdbm_ismp.susr_basic.oppaytype%type                       := 0;
v_paytype             zxdbm_ismp.susr_basic.oppaytype%type                       := 0;
v_msisdntype          zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                          -- 用户号码类型
v_productid           zxdbm_200.s200_product.productid%type                      := i_productid;
v_productindex        zxdbm_200.s200_product.productindex%type                   := 0;
v_serviceindex        zxdbm_200.s200_product.serviceindex%type                   := 0;                          -- 业务编码
v_cpindex             zxdbm_200.s200_product.cpindex%type                        := 0;                          --cp/sp 编码
v_productname         zxdbm_200.s200_product.productname%type                    := ' ';
v_smschargingcn       zxdbm_200.s200_product.smschargingcn%type                  := ' ';
v_servicetype         zxdbm_200.s200_product.servicetype%type                    := 0;                          -- 业务能力类型
v_subcapability       zxdbm_200.s200_product.subcapability%type                  := 0;
v_servicename         zxdbm_200.s200_service.servicename%type                    := ' ';                        -- 业务名称
v_serviceid           zxdbm_200.s200_service.serviceid%type                      := ' ';                        -- 业务代码
v_orderupdateurl      zxdbm_200.s200_service.orderupdateurl%type                 := ' ';
v_cpcnshortname       zxdbm_ismp.scp_basic.cpcnshortname%type                    := ' ';                        --cp/sp 中文名简写
v_cpid                zxdbm_ismp.scp_basic.cpid%type                             := ' ';
v_cpsubscribeurl      zxdbm_ismp.scp_basic.cpsubscribeurl%type                   := ' ';
v_customersrvtel      zxdbm_ismp.scp_basic.customersrvtel%type                   := ' ';
v_cptype              zxdbm_ismp.scp_basic.cptype%type                           := 0;                          --cp/sp 类型 1:全网 sp  2: 省(本地)  3: 市
v_cpsrvtype           zxdbm_ismp.scp_basic.cpsrvtype%type                        := 0;                          -- 长期寄存 CP 服务类型
v_subscriptionindex   zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                          -- 订购关系顺序号
v_subscriptionid      zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';
v_corpindex           zxdbm_200.s200_user_subscription.corpindex%type            := 0;                          -- 所属团体标识,0- 示意不属于任何团体
v_corpid              zxdbm_200.s200_user_subscription.corpid%type               := ' ';
v_payuser             zxdbm_200.s200_user_subscription.payuser%type              := ' ';
v_phoneindex          zxdbm_ismp.ssys_phone.phoneindex%type                      := 0;
v_attach              zxdbm_ismp.ssys_phone.attach%type                          := 0;                          -- 预付费归属,0- 未知,1-OCS,2-RTBP
v_srvtypeid           zxdbm_ismp.ssys_service_type.srvtypeid%type                 := '';
v_accesscode          zxdbm_ismp.ssrv_spaccesscode.accesscode%type                := ' ';

begin

o_retcode                 := 0;
o_debugpos               := 0;
o_debuginfo               := ' ';
o_accesscode              := ' ';
o_cpsubscribeurl          := ' ';
o_paytype                 := 0;
o_oppaytype               := 0;
o_servicename             := ' ';
o_cpid                    := ' ';
o_cpname                  := ' ';
o_serviceid               := ' ';
o_subscriptionindex       := 0;
o_scptype                 := i_prepaidtype;
o_productname             := ' ';
o_customersrvtel          := ' ';
o_msisdntype              := 1;
o_smschargingcn           := ' ';
o_servicetype             := 1;
o_subcapability           := 1;
o_subscriptionid          := ' ';
o_cptype                  := 0;
o_srvtypeid               := ' ';
o_cdrtsuserindex          := 0;
o_cdrtsusercode           := ' ';
o_cpindex                 := 0;
o_corpindex               := 0;
o_corpid                  := ' ';
o_cpsrvtype               := 0;
/****************************************************
 用户鉴权
*****************************************************/
v_msisdn := ltrim(rtrim(nvl(i_msisdn,'0')));
if (substr(v_msisdn,1,lengthb(i_countrycode)) = i_countrycode) then
    v_msisdn := substr(v_msisdn, lengthb(i_countrycode)+1);
elsif substr(v_msisdn,1,lengthb(i_countrycode)+1) = concat('+',i_countrycode) then
    v_msisdn := substr(v_msisdn, lengthb(i_countrycode)+2);
end if;
o_cdrtsusercode := v_msisdn;

-- 用户鉴权
if (v_msisdn <> '0') then
    begin
       select userindex,oppaytype,paytype,msisdntype
       into   v_userindex,v_oppaytype,v_paytype,v_msisdntype
       from zxdbm_ismp.susr_basic
       where usercode = v_msisdn;
   exception when no_data_found then
       o_retcode := 0;  --1001;
       o_debugpos := 1;
       o_debuginfo := 'user do not exist.';
   when others then
       o_retcode := 506;
       o_debugpos := 2;
       o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
       return;
   end;
end if;
o_cdrtsuserindex := v_userindex;
o_oppaytype := v_oppaytype;
o_paytype := v_paytype;
o_msisdntype := v_msisdntype;

-- 取产品信息
begin
    select productindex,serviceindex,cpindex,
         productname,smschargingcn,servicetype,subcapability
    into v_productindex,v_serviceindex,v_cpindex,
         v_productname,v_smschargingcn,v_servicetype,v_subcapability
    from zxdbm_200.s200_product
    where productid = v_productid;
exception when no_data_found then
    o_retcode := 2100;
    o_debugpos := 3;
    o_debuginfo := 'product do not exist.';
    return;
when others then
    o_retcode := 506;
    o_debugpos := 4;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_cpindex := v_cpindex;
o_productname := v_productname;
o_smschargingcn := v_smschargingcn;
o_servicetype := v_servicetype;
o_subcapability := v_subcapability;

-- 话单用内部业务能力编码
begin
    select srvtypeid into v_srvtypeid
    from zxdbm_ismp.ssys_service_type
    where servicetype = v_servicetype and  subcapability = v_subcapability;
exception when others then
    o_retcode := 506;
    o_debugpos := 5;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_srvtypeid := v_srvtypeid;

-- 取得业务相干信息
begin
    select servicename,serviceid,orderupdateurl
    into   v_servicename,v_serviceid,v_orderupdateurl
    from zxdbm_200.s200_service
    where serviceindex = v_serviceindex;
exception when no_data_found then
    o_retcode := 2100;
    o_debugpos := 6;
    o_debuginfo := 'service do not exist.';
    return;
when others then
    o_retcode :=506;
    o_debugpos := 7;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_servicename:=v_servicename;
o_serviceid := v_serviceid;

-- 取得 cp 中文简称
begin
    select cpcnshortname,cpid,cpsubscribeurl,customersrvtel,cptype,cpsrvtype
    into   v_cpcnshortname,v_cpid,v_cpsubscribeurl,v_customersrvtel,v_cptype,v_cpsrvtype
    from zxdbm_ismp.scp_basic
    where cpindex = v_cpindex;
exception when no_data_found then
    o_retcode := 2000;
    o_debugpos := 8;
    o_debuginfo := 'sp do not exist.';
    return;
when others then
    o_retcode :=506;
    o_debugpos := 9;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_cpname :=v_cpcnshortname;
o_cpid := v_cpid;
o_customersrvtel := v_customersrvtel;
o_cpsrvtype := v_cpsrvtype;
o_cptype          := v_cptype;

if (trim(v_orderupdateurl) is null) or (length(trim(v_orderupdateurl)) < 8) then
    o_cpsubscribeurl := v_cpsubscribeurl;
else
    o_cpsubscribeurl := v_orderupdateurl;
end if;

--SP 接入码查问
begin
    select spaccesscode into v_accesscode
    from zxdbm_ismp.ssrv_srvorder
    where productindex = v_productindex and rownum = 1;
exception when no_data_found then
    begin
        select accesscode into v_accesscode
        from zxdbm_ismp.ssrv_spaccesscode
        where cpid = v_cpid and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 10;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
when others then
    o_retcode   := 506;
    o_debugpos := 11;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_accesscode := v_accesscode;

-- 查看订购关系
begin
   select subscriptionindex,subscriptionid,corpindex,corpid,payuser
    into  v_subscriptionindex,v_subscriptionid,v_corpindex,v_corpid,v_payuser
    from zxdbm_200.s200_user_subscription
    where usercode = v_msisdn and productid = v_productid;
exception when no_data_found then
    o_retcode := 1201;
    o_debugpos := 12;
    o_debuginfo := 'subscription do not exist.';
    return;
when others then
    o_retcode := 506;
    o_debugpos  := 13;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;
o_subscriptionindex := v_subscriptionindex;
o_subscriptionid := v_subscriptionid;
o_corpindex := v_corpindex;
o_corpid := v_corpid;

---- 依据用户手机所在号段抉择扣费设施是 ocs 还是 rtbp,1:OCS;2:RTBP;if (i_prepaidtype not in (1,2)) then
    --attach 预付费归属,0- 未知,1-OCS,2-RTBP
    begin
        select phoneindex,attach
        into v_phoneindex,v_attach
        from zxdbm_ismp.ssys_phone
        where startprefix <= substr(v_payuser,1,length(startprefix))
        and endprefix >= substr(v_payuser,1,length(endprefix))
        and phonetype = 1;
    exception when no_data_found then
        o_scptype := 2;
        v_dev_exist := 0; -- 示意不存在对应号段对应设施配置
    when others then
        o_retcode := 506;
        o_debugpos := 14;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_dev_exist = 1) then
        if (v_attach = 1) then
            o_scptype := 1;
        elsif (v_attach = 2) then
            o_scptype := 2;
        else
            begin
                select 1 into o_scptype
                from zxdbm_ismp.sdev_phone
                where phoneindex = v_phoneindex
                and devicetype = 5;
            exception when no_data_found then
                o_scptype := 2;
            when others then
                o_retcode := 506;
                o_debugpos := 15;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        end if;
    end if;
end if;

end slp_200_telicommodifysubreq;
/

/*
反对退订过程是否先同步订购关系再退订(0- 先退订后同步 1- 先同步后退订)两种模式
减少存储过程 slp_200_telicomprecancel
*/

prompt zxdbm_200.slp_200_telicomprecancel
create or replace procedure zxdbm_200.slp_200_telicomprecancel
(

i_oa                    in          varchar2,            -- 发起方用户号码
i_oatype                in          number,              -- 发起方地址类型
i_srvprodid             in          varchar2,            -- 业务 / 产品代码
i_serviceid             in          varchar2,            -- 业务代码
i_actiontype            in          number,              -- 动作类型
i_cmdchannel            in          number,              -- 动作起源
i_lallindex             in          number,              -- 流程分支:1 鉴权批价 91 二次确认超时
i_servicetype           in          number,              -- 业务能力类型
i_countrycode           in          varchar2,            -- 国家码
i_spaccesscode          in          varchar2,            --antuprice 音讯中的 SP 接入码
i_silent                in          number,              -- 缄默去激活开关
i_needauthuser          in          number,              -- 是否须要鉴权用户 0- 不须要 1- 须要
i_needreplay            in          number,              -- 产品退订是否须要二次确认
i_direct                in          number,              -- 订购方向 0: 正向退订 1:SP 反向退订
i_supportproductid      in          number,              -- 同步 SP、SP 下发应用 service 还是 productid 0-serviceid 1-productid
--i_prepaidtype           in          number,              -- 预付费接口类型 1-OCS 2- 非 OCS 3- 依据号段抉择是 OCS 或者非 OCS
i_catchflag             in          number,              -- 二次确认类型 1- 订购  2,3- 退订 4- 改号
i_checkpseudocode       in          number,              -- 零碎开关: 是否反对伪码   0- 不反对   1- 反对
i_mutidbmode            in          number,              -- 是否多 DB 环境 0: 否 1: 是
i_eventid               in          varchar2,            -- 事件 ID
i_channelid             in          varchar2,            -- 渠道商 ID
--added by youqunxia 20130815  Order3.02.01
--i_effectiveswitch       in          number,              --VSOP 发动的订购退订立刻失效开关是否关上,0- 敞开,1- 关上
o_retcode               out         number,              -- 鉴权返回码 0 代表胜利,否则代表错误码
o_debugpos             out          number,              -- 进口程序标识
o_debuginfo             out         varchar2,            -- 调试信息
o_usemsisdn             out         varchar2,            -- 去掉前缀的应用方用户号码
o_paymsisdn             out         varchar2,            -- 去掉前缀的计费方号码
o_usemsisdntype         out         number,              -- 应用方号码类型,1:msisdn,2:phs,3:pstn
o_paymsisdntype         out         number,              -- 付费方号码类型,1:msisdn,2:phs,3:pstn
o_paytype               out         number,              -- 计费号码的付费类型 0: 后付费 1: 预付费 2: 准预付费
o_oppaytype             out         number,              -- 话单专用付费类型
o_cpid                  out         varchar2,            --CP/SP 代码
o_cpcnshortname         out         varchar2,            --CP/SP 名称
o_cpunsubscribeurl      out         varchar2,            --CP/SP 退订 URL
o_cptype                out         number,              --CP/SP 类型 0: 本省 1:是全国业务
o_customersrvtel        out         varchar2,            --CP/SP 客服电话
o_serviceid             out         varchar2,            -- 业务代码
o_productid             out         varchar2,            -- 产品代码
o_productname           out         varchar2,            -- 产品名称
o_smschargingcn         out         varchar2,            -- 产品资费短信形容
o_subcapability         out         number,              -- 产品业务能力子类型
o_srvtypeid             out         varchar2,            -- 业务能力编码,对应 ssys_service_type 表中的 srvtypeid
o_subendtime            out         varchar2,            -- 产品订购关系生效工夫
o_linknum               out         varchar2,            -- 业务话单中同一个流程中二次确认前后话单的关联
o_pseudocode            out         varchar2,            -- 伪码
o_pcodemsisdnswitch     out         number,              -- 伪码和实在号码之间是否有转换:  0 否   1 实在号码转化伪码 2 伪码转化为实在号码
o_chanelplayerstate     out         number,              --cp/sp 状态,0- 申请,1- 失常,2- 暂停(暂停代收费),3- 预登记,4- 登记,5- 解冻,21- 暂停端口
o_eventstate            out         number,              --0, 失常 1, 登记
o_cpsrvtype             out         number,              --CP 服务类型:0:CP+SP,1:CP,2:SP ;3:自营业务 SP
o_cdrbegintime          out         varchar2,            -- 话单计费开始工夫
o_cdrendtime            out         varchar2,            -- 话单计费完结工夫
o_producttype           out         number,              -- 产品类型   1- 失常产品 2- 测试产品
o_cityid                out         varchar2,            -- 话单计费完结工夫
--added by youqunxia20130906 Order3.02.01
o_issynctooidd          out         number                -- 是否同步订购关系给 OIDD,0- 否,1- 是

)
as

-- 新增上面几个对于工夫的参数,尽量减少 sysdate 的调用,所有用到 sysdate 的中央,以 to_date(v_sysdate14,'yyyymmddhh24miss')进行代替
v_sysdate14             char(14)     := to_char(sysdate ,'yyyymmddhh24miss');
v_sysdate8              char(8)      := substr(v_sysdate14,1,8);
v_curmonth              number(2)    := to_number(substr(v_sysdate14,5,2));     -- 长期寄存以后月份
v_curstrmonth           char(2)      := lpad(to_char(v_curmonth),2,'0');        -- 长期寄存以后月份, 字符型
v_curmonthendtime       char(14)     := to_char(last_day(to_date(v_sysdate14,'yyyymmddhh24miss')),'yyyymmdd')||'235959';

v_maincapability        number(10)                                                 := 0;                       -- 长期寄存组合业务主业务能力类型
v_submaincapability     number(10)                                                 := 0;                       -- 长期寄存组合业务主业务能力子类型
v_countrycode           varchar2(5)                                                := i_countrycode;           -- 长期寄存国家码
v_tempitem              number(10)                                                 := 0;                       -- 长期寄存 0 或者推广期的计费子序号
v_cmdchannel            number(10)                                                 := i_cmdchannel;            -- 长期寄存动作起源
v_tmpint                number(10)                                                 := 0;                       -- 长期寄存长期数值
v_devexist              number(3)                                                  := 1;                       -- 长期寄存是否存在对应设施
v_leftdays              number(10)                                                 := 0;                       -- 本月残余天数
v_monthdays             number(10)                                                 := 0;                       -- 本月无效免费天数
v_sql                   varchar2(3072)                                             := ' ';                     -- 长期寄存动静 sql
v_isservicesub          number(3)                                                  := 0;                       -- 长期寄存是否业务订购
v_spaccesscode          varchar2(40)                                               := ' ';                     -- 长期寄存 sp 接入码
v_silentdays            number(10)                                                 := 0;                       -- 缄默用户天数
v_nextrentfee           number(10)                                                 := 0;                       -- 长期寄存待失效包月费
v_rentfeevalidate       char(6)                                                    := ' ';                     -- 长期寄存待失效包月费率失效月
v_totaldctemplate       varchar2(500)                                              := ' ';                     -- 长期寄存解析模板:产品分档费率
v_dealtemplate          varchar2(500)                                              := ' ';                     -- 长期寄存解析模板:待解析的分档段
v_totaldclength         number(3)                                                  := 0;                       -- 长期寄存解析模板: 分档字符串的长度
v_totaldcsum            number(10)                                                 := 0;                       -- 长期寄存解析模板: 分档总费用
v_index0                number(3)                                                  := 0;                       -- 长期寄存解析模板: 分档字符串中 & 的地位
v_index1                number(3)                                                  := 0;                       -- 长期寄存解析模板: 分档字符串中; 的地位
v_nextrentdatecycle     char(14)                                                   := v_sysdate14;             -- 长期寄存包周期产品的下次打算扣租工夫
v_freeuseflag           number(3)                                                  := 0;                       -- 长期存入流媒体业务的试用期属性
v_hasrecord             number(3)                                                  := 0;                       -- 寄存须要退订的产品是否蕴含在捆绑销售品中(0,不蕴含;1,蕴含)v_oa                    zxdbm_ismp.susr_basic.usercode%type                        := ' ';                     -- 长期寄存发起方用户号码
v_usemsisdn             zxdbm_ismp.susr_basic.usercode%type                        := ' ';                     -- 长期寄存应用方用户号码
v_paymsisdn             zxdbm_ismp.susr_basic.usercode%type                        := ' ';                     -- 长期寄存计费方用户号码
v_useuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                       -- 长期寄存应用方用户序号
v_payuserindex          zxdbm_ismp.susr_basic.userindex%type                       := 0;                       -- 长期寄存计费方用户序号
v_useusertype           zxdbm_ismp.susr_basic.usertype%type                        := 1;                       -- 长期寄存应用方用户类型
v_usepaytype            zxdbm_ismp.susr_basic.paytype%type                         := 0;                       -- 长期寄存应用方用户付费类型
v_paypaytype            zxdbm_ismp.susr_basic.paytype%type                         := 0;                       -- 长期寄存付费方用户付费类型
v_useblacklist          zxdbm_ismp.susr_basic.blacklist%type                       := 0;                       -- 长期寄存应用方是否进入黑名单
v_usewhitelist          zxdbm_ismp.susr_basic.whitelist%type                       := 0;                       -- 长期寄存应用方是否进入白名单
v_useredlist            zxdbm_ismp.susr_basic.redlist%type                         := 0;                       -- 长期寄存应用方是否进入红名单
v_useblacklevel         zxdbm_ismp.susr_basic.blacklevel%type                      := 0;                       -- 长期寄存应用方黑名单级别
v_usewhitelevel         zxdbm_ismp.susr_basic.whitelevel%type                      := 0;                       -- 长期寄存应用方白名单级别
v_usemsisdntype         zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                       -- 长期寄存应用方号码类型
v_paymsisdntype         zxdbm_ismp.susr_basic.msisdntype%type                      := 1;                       -- 长期寄存付费方号码类型
v_useuserstatus         zxdbm_ismp.susr_basic.status%type                          := 0;                       -- 长期寄存应用方状态
v_useactivestatus       zxdbm_ismp.susr_basic.activestatus%type                    := 0;                       -- 长期寄存应用方激活状态
v_useoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                       := 0;                       -- 长期寄存应用方话单专用付费类型
v_payoppaytype          zxdbm_ismp.susr_basic.oppaytype%type                       := 0;                       -- 长期寄存付费方话单专用付费类型
v_usecorpindex          zxdbm_ismp.susr_basic.corpindex%type                       := 0;                       -- 长期寄存应用方团体序号
v_useusetime            zxdbm_ismp.susr_basic.lastusetime%type                     := '00000000000000';        -- 长期寄存应用方上次应用工夫
v_useusercityid         zxdbm_ismp.susr_basic.cityid%type                          := ' ';                                       -- 长期寄存计费方号码类型
v_payusercityid         zxdbm_ismp.susr_basic.cityid%type                          := ' ';                                       -- 长期寄存计费方号码类型

v_usecorpid             zxdbm_ismp.susr_corp.corpid%type                           := ' ';                     -- 长期寄存团体代码
v_productindex          zxdbm_200.s200_product.productindex%type                   := 0;                       -- 长期寄存产品序号
v_invalidmode           zxdbm_200.s200_product.invalidmode%type                    := 0;                       -- 退定 0- 立刻失效,1- 下月失效
v_validcyctype          zxdbm_200.s200_product.validcyctype%type                   := 0;                       -- 长期寄存周期形式 0 - 非周期,1- 天,2- 周,3- 月,定购失效形式为 2 时失效
v_validcycparam         zxdbm_200.s200_product.validcycparam%type                  := 0;                       -- 长期寄存周期参数,定购失效形式为 2 时失效
v_validdate             zxdbm_200.s200_product.validdate%type                      := v_sysdate14;             -- 长期寄存指定失效日期
v_subfeemode            zxdbm_200.s200_product.subfeemode%type                     := 1;                       -- 长期寄存定购当月免费形式
v_subfeedays            zxdbm_200.s200_product.subfeedays%type                     := 0;                       -- 长期寄存免费日期取值范畴为 0~28,0 示意本月全副收费,其余示意 n 号之后收费。v_freedays              zxdbm_200.s200_product.freedays%type                       := 0;                       -- 长期寄存收费试用天数
v_popustart             zxdbm_200.s200_product.popularizestart%type                := v_sysdate8;              -- 长期寄存推广期开始工夫
v_popustop              zxdbm_200.s200_product.popularizestop%type                 := v_sysdate8;              -- 长期寄存推广期完结工夫
v_popuitem              zxdbm_200.s200_product.popularizeitem%type                 := 0;                       -- 长期寄存推广期计费计划,0 示意收费,1- 推广期计划
v_needcharge            zxdbm_200.s200_product.needcharge%type                     := 1;                       -- 长期寄存是否须要计费,0- 收费,1- 须要计费
v_productname           zxdbm_200.s200_product.productname%type                    := ' ';                     -- 长期寄存产品名称
v_productstatus         zxdbm_200.s200_product.status%type                         := 0;                       -- 长期寄存产品状态
v_onlyforcorp           zxdbm_200.s200_product.onlyforcorp%type                    := 0;                       -- 长期寄存是否团体专用产品 0:个人用户专用 1:团体专用
v_productstarttime      zxdbm_200.s200_product.starttime%type                      := v_sysdate14;             -- 长期寄存产品失效工夫
v_productendtime        zxdbm_200.s200_product.endtime%type                        := '99991231235959';        -- 长期寄存产品终止工夫
v_workflow              zxdbm_200.s200_product.workflow%type                       := 0;                       -- 长期寄存工作流状态
v_workflowlife          zxdbm_200.s200_product.workflowlife%type                   := 0;                       -- 长期寄存工作流流程状态
v_cpindex               zxdbm_200.s200_product.cpindex%type                        := 0;                       -- 长期寄存 CP/SP 序号
v_serviceindex          zxdbm_200.s200_product.serviceindex%type                   := 0;                       -- 长期寄存业务序号
v_smschargingcn         zxdbm_200.s200_product.smschargingcn%type                  := ' ';                     -- 长期寄存产品资费短信形容
v_canbepresent          zxdbm_200.s200_product.canbepresent%type                   := 0;                       -- 长期寄存是否可赠送,0- 不可赠送,1- 可赠送
v_servicetype           zxdbm_200.s200_product.servicetype%type                    := 0;                       -- 长期寄存业务能力类型
v_subcapability         zxdbm_200.s200_product.subcapability%type                  := 1;                       -- 长期寄存业务能力子类型 1 -3G,2-PHS,3-ISAG, 默认为 3g 业务能力(仅电信应用,其余营运商皆默认为 1)v_srvprodid             zxdbm_200.s200_product.productid%type                      := i_srvprodid;             -- 长期寄存业务产品代码
v_productid             zxdbm_200.s200_product.productid%type                      := ' ';                     -- 长期寄存产品代码
v_onlyforpkg            zxdbm_200.s200_product.onlyforpkg%type                     := 0;                       -- 长期寄存是否套餐专用产品
v_backfeemode           zxdbm_200.s200_product.backfeemode%type                    := 0;                       -- 长期寄存退定补款形式,0- 不补款,1- 按帐期残余理论天数补款
v_chargetype            zxdbm_200.s200_product_fee.chargetype%type                 := 0;                       -- 长期寄存计费类型
v_subchargetype         zxdbm_200.s200_product_fee.subchargetype%type              := 0;                       -- 长期寄存计费子类型
v_cyctype               zxdbm_200.s200_product_fee.cyctype%type                    := 0;                       -- 长期寄存周期类型 0 - 非周期,1- 周期性
v_cycunit               zxdbm_200.s200_product_fee.cycunit%type                    := 0;                       -- 长期寄存周期单位 0- 无,1- 天,2- 周,3- 月,4- 半年,5- 年,6- 小时,7- 分钟,8- 秒
v_cycparam              zxdbm_200.s200_product_fee.cycparam%type                   := 0;                       -- 长期寄存周期参数
v_rentfee               zxdbm_200.s200_product_fee.rentfee%type                    := 0;                       -- 长期寄存周期性费用金额
v_fixfee                zxdbm_200.s200_product_fee.fixfee%type                     := 0;                       -- 长期寄存包量费用
v_fixusetimes           zxdbm_200.s200_product_fee.fixusetimes%type                := 0;                       -- 长期寄存包量应用值,0- 无限度
v_unitvol               zxdbm_200.s200_product_fee.unitvol%type                    := 10;                      -- 长期寄存绝对于目前最小计量单位的量,时长为百毫秒,流量为 byte
v_autocontinue          zxdbm_200.s200_product_fee.autocontinue%type               := 0;                       -- 长期寄存周期性定购,是否主动续订
v_minlimitfee           zxdbm_200.s200_product_fee.minlimitfee%type                := 0;                       -- 长期寄存保底费用,0- 无保底费
v_usecomfee             zxdbm_200.s200_product_fee.usecomfee%type                  := 1;                       -- 长期寄存限度(量、工夫)外应用形式,1- 应用根本费率,0- 不容许持续应用
v_totaldiscount         zxdbm_200.s200_product_fee.totaldiscount%type              := ' ';                            -- 长期寄存限度(量、工夫)外应用形式,1- 应用根本费率,0- 不容许持续应用
v_cpid                  zxdbm_ismp.scp_basic.cpid%type                             := ' ';                     -- 长期寄存 CP/SP 代码
v_cpstatus              zxdbm_ismp.scp_basic.status%type                           := 0;                       -- 长期寄存 CP/SP 代码
v_cpsubscribeurl        zxdbm_ismp.scp_basic.cpsubscribeurl%type                   := ' ';                     -- 长期寄存 CP/SP 订购 URL
v_cpunsubscribeurl      zxdbm_ismp.scp_basic.cpunsubscribeurl%type                 := ' ';                     -- 长期寄存 CP/SP 退订 URL
v_hasblacklist          zxdbm_ismp.scp_basic.hasblacklist%type                     := 0;                       -- 长期寄存是否有黑名单管制 0-无,1-有
v_cptype                zxdbm_ismp.scp_basic.cptype%type                           := 2;                       -- 长期寄存 CP/SP 类型
v_cpsrvtype             zxdbm_ismp.scp_basic.cpsrvtype%type                        := 0;                       -- 长期寄存 CP 服务类型
v_insubblacklist        zxdbm_ismp.scp_basic.insubblacklist%type                   := 0;                       -- 长期寄存限度订购 SP 黑名单标识
v_cpcnshortname         zxdbm_ismp.scp_basic.cpcnshortname%type                    := ' ';                     -- 长期寄存 CP/SP 中文名简写
v_customersrvtel        zxdbm_ismp.scp_basic.customersrvtel%type                   := ' ';                     -- 长期寄存 CP/SP 客服电话
v_protocoltype          zxdbm_200.s200_sp_service_type.protocoltype%type           := 0;                       -- 长期寄存定购同步协定类型 0 -ismp(wbs 形式),1-smgp2.0(cngp1.0),2-smgp3.0(cngp1.0 扩大)v_srvtypeid             zxdbm_ismp.ssys_service_type.srvtypeid%type                := ' ';                     -- 长期寄存话单中的 srvtypeid
v_productcancelmode     zxdbm_ismp.ssrv_corp_product.unsubscribemode%type          := 0;                       -- 长期寄存退订形式,0- 必须团体管理员退订,1- 团体管理员与团体成员均可退订
v_productpayparty       zxdbm_ismp.ssrv_corp_product.payparty%type                 := 2;                       -- 长期寄存团体专用产品付费方 1- 团体付费 2- 集体付费
v_productsubindex       zxdbm_200.s200_user_subscription.subscriptionindex%type    := 0;                       -- 长期寄存订购关系序号
v_productsubid          zxdbm_200.s200_user_subscription.subscriptionid%type       := ' ';                     -- 长期寄存订购关系代码
v_serviceid             zxdbm_200.s200_user_subscription.serviceid%type            := i_serviceid;             -- 长期寄存业务代码
v_propkgindex           zxdbm_200.s200_user_subscription.productpkgindex%type      := 0;                       -- 长期寄存套餐序号
v_propkgid              zxdbm_200.s200_user_subscription.productpkgid%type         := ' ';                     -- 长期寄存套餐代码
v_contentindex          zxdbm_200.s200_user_subscription.contentindex%type         := 0;                       -- 长期寄存内容序号
v_contentid             zxdbm_200.s200_user_subscription.contentid%type            := ' ';                     -- 长期寄存内容代码
v_corpindex             zxdbm_200.s200_user_subscription.corpindex%type            := 0;                       -- 长期寄存团体序号
v_corpid                zxdbm_200.s200_user_subscription.corpid%type               := ' ';                     -- 长期寄存团体代码
v_subscriber            zxdbm_200.s200_user_subscription.subscriber%type           := ' ';                     -- 发起方用户号码
v_usercode              zxdbm_200.s200_user_subscription.usercode%type             := ' ';                     -- 应用方用户号码
v_payuser               zxdbm_200.s200_user_subscription.payuser%type              := ' ';                     -- 计费方用户号码
v_subscribemode         zxdbm_200.s200_user_subscription.subscribemode%type        := 1;                       -- 长期寄存订购形式
v_subscribechannel      zxdbm_200.s200_user_subscription.subscribechannel%type     := 3;                       -- 长期寄存订购渠道
v_subscribeoptype       zxdbm_200.s200_user_subscription.subscribeoptype%type      := 0;                       -- 长期寄存订购操作
v_pausemode             zxdbm_200.s200_user_subscription.pausemode%type            := 0;                       -- 长期寄存产品暂停起因
v_resumemode            zxdbm_200.s200_user_subscription.resumemode%type           := 0;                       -- 长期寄存产品复原起因
v_pushid                zxdbm_200.s200_user_subscription.pushid%type               := ' ';                     -- 长期寄存推荐者 ID
v_substarttime          zxdbm_200.s200_user_subscription.starttime%type            := v_sysdate14;             -- 长期寄存定购失效工夫
v_cursubendtime         zxdbm_200.s200_user_subscription.endtime%type              := v_sysdate14;             -- 长期寄存以后定购关系生效工夫
v_subendtime            zxdbm_200.s200_user_subscription.endtime%type              := '99991231235959';        -- 长期寄存定购生效工夫
v_lastrenttime          zxdbm_200.s200_user_subscription.lastrenttime%type         := '00000000000000';        -- 长期寄存上次扣租工夫
v_nextrentdate          zxdbm_200.s200_user_subscription.nextrentdate%type         := v_sysdate8;              -- 长期寄存下次扣租日期
v_payfordate            zxdbm_200.s200_user_subscription.payfordate%type           := '00000000';              -- 长期寄存月租已付日期
v_returnvalues          zxdbm_200.s200_user_subscription.returnvalues%type         := 0;                       -- 长期寄存下一周期返还值
v_returntype            zxdbm_200.s200_user_subscription.returntype%type           := 1;                       -- 长期寄存返还量类型
v_returnstartdate       zxdbm_200.s200_user_subscription.returnstartdate%type      := '00000000';              -- 长期寄存返还值开始日期
v_returnenddate         zxdbm_200.s200_user_subscription.returnenddate%type        := '00000000';              -- 长期寄存返还值完结日期
v_chargeparty           zxdbm_200.s200_user_subscription.chargeparty%type          := 0;                       -- 长期寄存定购时填入,扣月租应用,计费方 0:用户;1:SP;2:团体
v_freetime              zxdbm_200.s200_user_subscription.freetime%type             := '00000000000000';        -- 长期寄存产品订购收费日期
v_createtime            zxdbm_200.s200_user_subscription.createtime%type           := '00000000000000';        -- 长期寄存用户订购工夫
v_canceltime            zxdbm_200.s200_user_subscription.canceltime%type           := '00000000000000';        -- 长期寄存用户退定工夫
v_firstusetime          zxdbm_200.s200_user_subscription.firstusetime%type         := '00000000000000';        -- 长期寄存用户首次应用工夫
v_lastusetime           zxdbm_200.s200_user_subscription.lastusetime%type          := '00000000000000';        -- 长期寄存用户上次应用工夫
v_tastestarttime        zxdbm_200.s200_user_subscription.tastestarttime%type       := '00000000000000';        -- 长期寄存体验期开始工夫
v_tasteendtime          zxdbm_200.s200_user_subscription.tasteendtime%type         := '00000000000000';        -- 长期寄存体验期完结工夫
v_pausetime             zxdbm_200.s200_user_subscription.pausetime%type            := '00000000000000';        -- 长期寄存暂停工夫
v_resumetime            zxdbm_200.s200_user_subscription.resumetime%type           := '00000000000000';        -- 长期寄存暂停复原工夫
v_subscribeopid         zxdbm_200.s200_user_subscription.subscribeopid%type        := ' ';                     -- 长期寄存定购操作员工号
v_cancelreason          zxdbm_200.s200_user_subscription.cancelreason%type         := ' ';                     -- 长期寄存退定起因形容
v_lastrent              zxdbm_200.s200_user_subscription.lastrent%type             := 0;                       -- 长期寄存上次扣租金额
v_rollbacklastrent      zxdbm_200.s200_user_subscription.lastrent%type             := 0;                       -- 长期寄存上次扣租金额(订购关系待生效产品的订购失败回滚)
v_msisdntype            zxdbm_200.s200_user_subscription.msisdntype%type           := 1;                       -- 长期寄存用户号码类型 1-msisdn,2-phs,3-pstn,4-IPTV 接入号,5- 宽带接入号,6- 固定 IP
v_productsubstatus      zxdbm_200.s200_user_subscription.status%type               := 0;
v_pseudocode            zxdbm_200.s200_user_subscription.pseudocode%type           := ' ';                     -- 长期寄存订购关系表中伪码
--added by youqunxia20130608   order2.07.10
v_pproductofferid       zxdbm_200.s200_user_subscription.pproductofferid%type      := ' ';                     -- 长期寄存增值产品对应的捆绑类套餐 ID
v_varifee               zxdbm_200.s200_user_subscription.varifee%type              := '';                      -- 长期寄存以后订购关系中的可变价格                                    
v_eventid               zxdbm_200.s200_user_subscription.eventid%type              := '';                      -- 长期寄存事件 ID
v_isexperience          zxdbm_200.s200_user_subscription.isexperience%type         := 0;                       -- 订购类型:0:失常订购 1:收费体验 2:积分兑换 3:体验转正式 默认为 0
v_subscribetype         zxdbm_200.s200_user_subscription.subscribetype%type        := 0;                       -- 订购形式:0:非批量受理 1: 批量受理 默认为 0
v_chargetime            zxdbm_200.s200_user_subscription.chargetime%type           := '00000000000000';        -- 首次扣费时间

v_orderupdateurl        zxdbm_200.s200_service.orderupdateurl%type                 := ' ';                     -- 长期寄存业务表中
v_subsrvtype            zxdbm_200.s200_service.subsrvtype%type                     := 1;                       -- 长期寄存业务子类型,1-wap pull,2-wap push,3-op wap push,4-wap pull 下载,101- 试用业务(也示意 wap pull 试用业务);102:wap push 试用业务;1001 - 根本通道费;1002
v_servicesort           zxdbm_200.s200_service.servicesort%type                    := 0;                       -- 业务归属 0:一般业务、1:属于 OIDD 2:属于定位

v_phoneindex            zxdbm_ismp.ssys_phone.phoneindex%type                      := 0;                       -- 长期寄存号段序号
v_attach                zxdbm_ismp.ssys_phone.attach%type                          := 0;                       -- 长期寄存预付费归属,0- 未知,1-OCS,2-RTBP

begin

-- 出参初始化
o_retcode               := 0;
o_debugpos             := 0;
o_debuginfo             := ' ';
o_usemsisdn             := ' ';
o_paymsisdn             := ' ';
o_usemsisdntype         := 1;
o_paymsisdntype         := 1;
o_paytype               := 0;
o_oppaytype             := 0;
o_cpid                  := ' ';
o_cpcnshortname         := ' ';
o_cpunsubscribeurl      := ' ';
o_cptype                := 0;
o_customersrvtel        := ' ';
o_serviceid             := ' ';
o_productid             := ' ';
o_productname           := ' ';
o_smschargingcn         := ' ';
o_subcapability         := 1;
o_srvtypeid             := ' ';
o_subendtime            := '99991231235959';
o_linknum               := ' ';
o_pseudocode            :='';
o_pcodemsisdnswitch     :=0;
o_chanelplayerstate     :=0;
o_eventstate            :=1;
o_cpsrvtype             :=0;
o_cdrbegintime          := substr(v_sysdate8,1,6) || '01000000';
o_cdrendtime            := v_curmonthendtime;
o_producttype           := 1;
o_cityid                := '';
o_issynctooidd          := 0;

/**
1. 预鉴权

 发起方地址类型
 发起方用户号码去前缀

**/

-- 发起方地址类型鉴权 现网局点可思考正文.
-- 批量操作不进行鉴权, 由业务从用户表中查询处理
--modied by youqunxia20130709 Order2.07.10
if (i_actiontype <> 17 and i_lallindex <> 91) then
    if i_oatype not in (1,2,3,4) then
        o_retcode   := 107;
        o_debugpos := 1;
        o_debuginfo := 'i_oatype='||i_oatype||', not in (1,2,3,4).';
        return;
    end if;
end if;

-- 发起方用户号码去前缀
v_oa := ltrim(rtrim(nvl(i_oa,'0')));
if v_oa like ('+' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 2);
elsif v_oa like ('00' || v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 3);
elsif v_oa like (v_countrycode || '%') then
    v_oa := substr(v_oa, length(v_countrycode) + 1);
end if;
if (substr(v_oa,1,1) <> '0') and (i_oatype = 4) then
    v_oa := '0' || v_oa;
end if;
v_usemsisdn := v_oa;
o_usemsisdn  := v_usemsisdn;
if (v_usemsisdn = '0') then
    o_retcode   := 1001;
    o_debugpos := 2;
    o_debuginfo := 'v_usemsisdn='||v_usemsisdn||', v_usemsisdn is 0.';
    return;
end if;

/**
2. 应用方号码存在性鉴权
**/

if (i_needauthuser = 1) then
    begin
        select userindex,usertype,paytype,blacklist,whitelist,
               redlist,blacklevel,whitelevel,msisdntype,status,
               activestatus,oppaytype,corpindex,lastusetime,cityid
        into   v_useuserindex,v_useusertype,v_usepaytype,v_useblacklist,v_usewhitelist,
               v_useredlist,v_useblacklevel,v_usewhitelevel,v_usemsisdntype,v_useuserstatus,
               v_useactivestatus,v_useoppaytype,v_usecorpindex,v_useusetime,v_useusercityid
        from   zxdbm_ismp.susr_basic
        where  usercode = v_usemsisdn;
    exception when no_data_found then
        o_retcode   := 1001;
        o_debugpos := 3;
        o_debuginfo := 'usercode do not exist.';
        if (i_oatype = 4) then
            v_usemsisdntype    := 2;
        else
            v_usemsisdntype    := 1;
        end if;
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 4;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        if (i_oatype = 4) then
            o_usemsisdntype    := 2;
        else
            o_usemsisdntype    := 1;
        end if;
        return;
    end;
    v_paymsisdn     := v_usemsisdn;
    v_paymsisdntype := v_usemsisdntype;
    v_payuserindex  := v_useuserindex;
    o_paymsisdn     := v_paymsisdn;
    o_usemsisdntype := v_usemsisdntype;
    o_paymsisdntype := v_paymsisdntype;
    o_paytype       := v_usepaytype;
    o_oppaytype     := v_useoppaytype;
    o_cityid        := trim(v_useusercityid);

    -- 批量操作用户号码类型由用户表查问后鉴权
    if (i_cmdchannel in (7,32)) then
         if v_usemsisdntype not in (1,2,3) then
             o_retcode   := 100;
             o_debugpos := 5;
             o_debuginfo := 'v_usemsisdntype='||v_usemsisdntype||', not in (1,2,3);';
             return;
         end if;
    end if;

    if i_mutidbmode = 0 then
        if (v_useactivestatus = 0) then
            -- 待激活用户激活操作
            begin
                update  zxdbm_ismp.susr_basic
                set     activestatus = 1,
                        activetime = v_sysdate14
                where   userindex = v_useuserindex;
                if (sql%rowcount = 0) then
                    o_retcode   := 506;
                    o_debugpos := 6;
                    o_debuginfo := 'usercode do not exist.';
                    rollback;
                    return;
                end if;
                commit;
            exception when others then
                o_retcode   := 506;
                o_debugpos := 7;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
        else
            -- 已激活用户更新最近一次应用工夫
            if (i_silent = 1) then
                if (substr(v_useusetime,1,8) <> v_sysdate8) then
                    begin
                        update  zxdbm_ismp.susr_basic
                        set     lastusetime = v_sysdate14
                        where   userindex = v_useuserindex;
                        if (sql%rowcount = 0) then
                            o_retcode   := 506;
                            o_debugpos := 8;
                            o_debuginfo := 'usercode do not exist.';
                            rollback;
                            return;
                        end if;
                        commit;
                    exception when others then
                        o_retcode   := 506;
                        o_debugpos := 9;
                        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                        return;
                    end;
                end if;
            end if;
        end if;
    end if;
end if;

/**
3. 产品存在性鉴权
**/

-- 产品互斥时,ESMGP 传 21 个 0 在 productid 字段当中,同时传进来业务 ID,此时以业务 ID 来获取实在的产品 ID
if v_srvprodid = '000000000000000000000' then
    v_sql := 'select isservicesub from zxdbm_200.s200_service where serviceid = :p1';
    begin
        execute immediate v_sql into v_isservicesub using v_serviceid;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 10;
        o_debuginfo := 'serviceindex='||v_serviceid||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 11;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if v_isservicesub <> 1 then
        o_retcode   := 505;
        o_debugpos := 12;
        o_debuginfo := 'esmgp parse error.';
        return;
    end if;
    -- 获取实在的产品 ID, 用于后续的操作
    begin
        select productid
        into   v_srvprodid
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and serviceid = v_serviceid;
    exception when no_data_found then
        o_retcode   := 1201;
        o_debugpos := 13;
        o_debuginfo := o_debuginfo ||'v_usemsisdn ='||v_usemsisdn||'v_serviceid ='||v_serviceid||'the subscription dose not exist;';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 14;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

if (i_direct = 1 and i_supportproductid = 0) then
-- 反向订购并且反对业务 ID 的退订
    begin
        select productindex,invalidmode,validcyctype,
               validcycparam,validdate,subfeemode,subfeedays,freedays,
               popularizestart,popularizestop,popularizeitem,needcharge,
               productname,status,onlyforcorp,starttime,endtime,
               workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,
               servicetype,subcapability,onlyforpkg,productid,backfeemode
        into   v_productindex,v_invalidmode,v_validcyctype,
               v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,
               v_popustart,v_popustop,v_popuitem,v_needcharge,
               v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
               v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
               v_servicetype,v_subcapability,v_onlyforpkg,v_productid,v_backfeemode
        from  zxdbm_200.s200_product
        where serviceid = v_srvprodid and ordertype = 1;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 15;
        o_debuginfo := 'serviceid='||v_srvprodid||', ordertype = 1'||', the product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 16;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select productindex,invalidmode,validcyctype,
               validcycparam,validdate,subfeemode,subfeedays,freedays,
               popularizestart,popularizestop,popularizeitem,needcharge,
               productname,status,onlyforcorp,starttime,endtime,
               workflow,workflowlife,cpindex,serviceindex,smschargingcn,canbepresent,
               servicetype,subcapability,productid,backfeemode,serviceid
        into   v_productindex,v_invalidmode,v_validcyctype,
               v_validcycparam,v_validdate,v_subfeemode,v_subfeedays,v_freedays,
               v_popustart,v_popustop,v_popuitem,v_needcharge,
               v_productname,v_productstatus,v_onlyforcorp,v_productstarttime,v_productendtime,
               v_workflow,v_workflowlife,v_cpindex,v_serviceindex,v_smschargingcn,v_canbepresent,
               v_servicetype,v_subcapability,v_productid,v_backfeemode,v_serviceid
        from   zxdbm_200.s200_product
        where  productid = v_srvprodid;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 17;
        o_debuginfo   := 'productid='||v_srvprodid||', the product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 18;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_productid      := v_productid;
o_productname    := v_productname;
o_serviceid      := v_serviceid;
o_smschargingcn  := v_smschargingcn;
o_subcapability  := v_subcapability;
if i_servicetype = 5 then
    v_sql := 'select freeuseflag,freedays from zxdbm_200.s200_product where productindex = :p1';
    begin
        execute immediate v_sql into v_freeuseflag,v_freedays using v_productindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 19;
        o_debuginfo   := 'The product does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 20;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
-- 产品状态鉴权
if (v_productstatus in (0,2) and (v_workflowlife = 3)) then
    o_producttype := 2;
end if;

-- 获取产品的计费信息
if (v_popuitem = 2) then  -- 无推广期
    v_tempitem := 0;
elsif v_popuitem in (0,1) then  -- 推广期收费或者推广期计费
    if (v_sysdate8 >= v_popustart) and (v_sysdate8 <= v_popustop) then
        if v_popuitem = 0 then  -- 推广期收费
            v_needcharge := 0;
        else
            v_needcharge := 1;
            v_tempitem := v_popuitem;
        end if;
    else
        v_tempitem := 0;
    end if;
end if;

if (v_needcharge = 1) then
    -- 费率存在性鉴权
    if i_servicetype in (1,2) then
        v_sql := 'select chargetype,subchargetype,cyctype,cycunit,cycparam,rentfee,fixfee,fixusetimes,unitvol,autocontinue,minlimitfee,usecomfee,nextrentfee,rentfeevalidate,totaldiscount'||
                 'from zxdbm_200.s200_product_fee where  productindex = :p1 and itemindex = :p2';
        begin
            execute immediate v_sql into v_chargetype,v_subchargetype,v_cyctype,v_cycunit,v_cycparam,v_rentfee,v_fixfee,v_fixusetimes,v_unitvol,v_autocontinue,v_minlimitfee,v_usecomfee,v_nextrentfee,v_rentfeevalidate,v_totaldiscount using v_productindex, v_tempitem;
        exception when no_data_found then
            o_retcode   := 3103;
            o_debugpos := 21;
            o_debuginfo := 'productindex='||v_productindex||', itemindex='||v_tempitem||', the product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 22;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    else
        begin
            select chargetype,subchargetype,cyctype,cycunit,cycparam,
                   rentfee,fixfee,fixusetimes,unitvol,autocontinue,minlimitfee,usecomfee,totaldiscount
            into   v_chargetype,v_subchargetype,v_cyctype,v_cycunit,v_cycparam,
                   v_rentfee,v_fixfee,v_fixusetimes,v_unitvol,v_autocontinue,v_minlimitfee,v_usecomfee,v_totaldiscount
            from   zxdbm_200.s200_product_fee
            where  productindex = v_productindex and itemindex = v_tempitem;
        exception when no_data_found then
            o_retcode   := 3103;
            o_debugpos := 23;
            o_debuginfo := 'productindex='||v_productindex||', itemindex='||v_tempitem||', the product fee does not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 24;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
end if;

-- 是否业务退订
if i_servicetype in (1,2,3) then
    v_sql := 'select isservicesub,servicesort from zxdbm_200.s200_service where  serviceindex = :p1';
    begin
        execute immediate v_sql into v_isservicesub,v_servicesort using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 25;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 26;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

--added by youqunxia20130906 order3.02.01
-- 是否同步订购关系给 OIDD,0- 否,1- 是
if v_servicesort = 1 then
    o_issynctooidd := 1;
end if;

if i_servicetype <> 14 then
    begin
        select orderupdateurl,subsrvtype into v_orderupdateurl,v_subsrvtype
        from   zxdbm_200.s200_service
        where  serviceindex = v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 27;
        o_debuginfo := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 28;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

if i_servicetype = 101 then
    v_sql := 'select maincapability,submaincapability'||
             'from zxdbm_9900.s9900_service where serviceindex = :p1';
    begin
        execute immediate v_sql into v_maincapability,v_submaincapability using v_serviceindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 29;
        o_debuginfo   := 'serviceindex='||v_serviceindex||', the service does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 30;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

-- 包月类退订形式解决
if v_needcharge = 1 and v_chargetype in (2,5,7) then
    if i_cmdchannel in (1,2,36,14) then
        if i_servicetype in (1,2) or (i_servicetype = 3 and v_subsrvtype = 2) then
            v_invalidmode := 0;
        elsif i_servicetype = 3 and v_subsrvtype = 1 then
            v_invalidmode := 1;
        else
            null;
        end if;
    end if;
end if;

/*
*4. 零碎业务能力鉴权
*/

-- 零碎业务能力鉴权
if i_servicetype = 101 then
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_maincapability and subcapability = v_submaincapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 31;
        o_debuginfo   := 'servicetype='||v_maincapability||', subcapability='||v_submaincapability||', the system service capbility does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 32;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select srvtypeid
        into   v_srvtypeid
        from   zxdbm_ismp.ssys_service_type
        where  servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
        o_retcode   := 1100;
        o_debugpos := 33;
        o_debuginfo   := 'servicetype='||v_servicetype||', subcapability='||v_subcapability||', the system service capbility does not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 34;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;
o_srvtypeid   :=  v_srvtypeid;

/*
*5.CP/SP 存在性及 sp 相干鉴权
*/

--CP/SP 存在性鉴权
begin
    select cpid,cpsrvtype,status,cpsubscribeurl,cpunsubscribeurl,hasblacklist,cptype,insubblacklist,cpcnshortname,customersrvtel
    into   v_cpid,v_cpsrvtype,v_cpstatus,v_cpsubscribeurl,v_cpunsubscribeurl,v_hasblacklist,v_cptype,v_insubblacklist,v_cpcnshortname,v_customersrvtel
    from   zxdbm_ismp.scp_basic
    where  cpindex = v_cpindex;
exception when no_data_found then
    o_retcode   := 2000;
    o_debugpos := 35;
    o_debuginfo   := 'cpindex='||v_cpindex||', the cp/sp does not exist.';
    return;
when others then
    o_retcode   := 506;
    o_debugpos := 36;
    o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
    return;
end;

if (v_cpunsubscribeurl is null) or (v_cpunsubscribeurl = ' ') then
    v_cpunsubscribeurl := v_cpsubscribeurl;
end if;
o_cpid             := v_cpid;
o_cptype           := v_cptype;
o_cpsrvtype        := v_cpsrvtype;
o_cpcnshortname    := v_cpcnshortname;
o_customersrvtel   := v_customersrvtel;
if (trim(v_orderupdateurl) is null) or (length(trim(v_orderupdateurl)) < 8) then
    o_cpunsubscribeurl := v_cpunsubscribeurl;
else
    o_cpunsubscribeurl := v_orderupdateurl;
end if;

–SP 开明业务能力鉴权(MVS,MPSS,PIM,CPX 不须要鉴权)

if i_servicetype in (5,14,33,101) then
    null;

— o_protocoltype := 0;

else
    begin
        select protocoltype
        into   v_protocoltype
        from   zxdbm_200.s200_sp_service_type
        where  cpindex = v_cpindex and servicetype = v_servicetype and subcapability = v_subcapability;
    exception when no_data_found then
       o_retcode   := 2100;
       o_debugpos := 37;
       o_debuginfo   := 'v_cpindex='||v_cpindex||', v_servicetype='||v_servicetype||', v_subcapability='||v_subcapability||', the opened service capability of the SP does not exist.';
       return;
    when others then
       o_retcode   := 506;
       o_debugpos := 38;
       o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
       return;
    end;

— o_protocoltype := v_protocoltype;

end if;

--SP 接入码查问
if (i_spaccesscode is null) or (length(trim(i_spaccesscode)) = 0) then
    begin
        select spaccesscode into v_spaccesscode
        from zxdbm_ismp.ssrv_srvorder
        where productindex = v_productindex and cmdtype = i_actiontype and servicetype = i_servicetype and rownum = 1;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 39;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if trim(v_spaccesscode) is null then
        begin
            select accesscode into v_spaccesscode
            from zxdbm_ismp.ssrv_spaccesscode
            where cpid = v_cpid and rownum = 1;
        exception when no_data_found then
            null;
        when others then
            o_retcode   := 506;
            o_debugpos := 40;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
    end if;
end if;


--EventID 和 ChanelPlayerID 状态查问
if i_actiontype = 2 then
    begin
        select status into o_chanelplayerstate from zxdbm_ismp.channel_basic where cpid = i_channelid;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 41;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    begin
        select status into o_eventstate from zxdbm_ismp.ssys_event where eventid = i_eventid;
    exception when no_data_found then
        null;
    when others then
        o_retcode   := 506;
        o_debugpos := 42;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

– 伪码解决 (反对伪码开关关上, 非自营 sp)– 反对业务 LCS,SMS,MVS,DLS,MMS,WAP,CPX
– 退订时,AuthPriceReq 音讯中 OA(DA) 实在号码转化为伪码, 同步 SP
– 这里订购业务的回滚订购关系不做解决

if i_servicetype in (1,2,3,4,41,5,6,101) then
    if i_actiontype <> 1 and i_catchflag <> 1 then
        if i_checkpseudocode = 1 and v_cpsrvtype <> 3 then
            begin
                select pseudocode into o_pseudocode from zxdbm_ismp.susr_basic where usercode = i_oa;
            exception when no_data_found then
                o_retcode   := 1001;
                o_debugpos := 43;
                o_debuginfo := 'i_oa ='||i_oa||', the user dose not exist.';
                return;
            when others then
                o_retcode   := 506;
                o_debugpos := 44;
                o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
                return;
            end;
            o_pcodemsisdnswitch := 1;
        end if;
    end if;
end if;

-- 如果团体专用产品属性为:必须团体管理员退定,则必须在团体门户上退定
if (v_onlyforcorp = 1) then
    begin
        select  corpid
        into    v_usecorpid
        from    zxdbm_ismp.susr_corp
        where   corpindex = v_usecorpindex;
    exception when no_data_found then
        o_retcode   := 1001301;  -- 团体不存在
        o_debugpos := 45;
        o_debuginfo := 'v_usecorpindex ='||v_usecorpindex||', the corp dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 46;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;

— o_corpid := v_usecorpid;

    -- 本团体的产品只能由本团体的用户退订
    begin
        select unsubscribemode,payparty
        into   v_productcancelmode,v_productpayparty
        from   zxdbm_ismp.ssrv_corp_product
        where  corpindex = v_usecorpindex and groupindex = 0 and productindex = v_productindex;
    exception when no_data_found then
        o_retcode   := 2100;
        o_debugpos := 47;
        o_debuginfo := 'corpindex ='||v_usecorpindex||', productindex ='||v_productindex||', the product of the corp dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 48;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    if (v_productcancelmode = 0) then
        -- 必须团体管理员退订
        if (v_cmdchannel <> 4) then
            o_retcode   := 1001214;    -- 无权退订
            o_debugpos := 49;
            o_debuginfo := 'v_productcancelmode ='||v_productcancelmode||', v_cmdchannel ='||v_cmdchannel||', the operator has no privilege to cancel the subscription.';
            return;
        end if;
    end if;
else
    v_usecorpindex  := 0;
end if;

-- 产品订购关系存在性鉴权(是否业务退订)
if  v_isservicesub = 1 then
    begin
        select subscriptionindex,subscriptionid,servicetype,subcapability,
               serviceindex,serviceid,productindex,productid,productpkgindex,
               productpkgid,contentindex,contentid,corpindex,corpid,cpindex,
               cpid,subscribemode,subscribechannel,subscribeoptype,
               pausemode,resumemode,status,autocontinue,subscriber,usercode,
               payuser,pushid,starttime,endtime,lastrenttime,
               nextrentdate,payfordate,returnvalues,returntype,
               returnstartdate,returnenddate,fixusetimes,chargeparty,
               freetime,createtime,canceltime,firstusetime,lastusetime,
               tastestarttime,tasteendtime,pausetime,resumetime,
               subscribeopid,cancelreason,lastrent,msisdntype,pseudocode,pproductofferid,
               varifee,eventid,isexperience,subscribetype,chargetime
        into   v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
               v_serviceindex,v_serviceid,v_productindex,v_productid,v_propkgindex,
               v_propkgid,v_contentindex,v_contentid,v_corpindex,v_corpid,v_cpindex,
               v_cpid,v_subscribemode,v_subscribechannel,v_subscribeoptype,
               v_pausemode,v_resumemode,v_productsubstatus,v_autocontinue,v_subscriber,v_usercode,
               v_payuser,v_pushid,v_substarttime,v_cursubendtime,v_lastrenttime,
               v_nextrentdate,v_payfordate,v_returnvalues,v_returntype,
               v_returnstartdate,v_returnenddate,v_fixusetimes,v_chargeparty,
               v_freetime,v_createtime,v_canceltime,v_firstusetime,v_lastusetime,
               v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,
               v_subscribeopid,v_cancelreason,v_lastrent,v_msisdntype,v_pseudocode,v_pproductofferid,
               v_varifee,v_eventid,v_isexperience,v_subscribetype,v_chargetime
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and serviceid = v_serviceid;
    exception when no_data_found then
        o_retcode   := 1201;
        o_debugpos := 50;
        o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_serviceid ='||v_serviceid||', the subscription dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 51;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
else
    begin
        select subscriptionindex,subscriptionid,servicetype,subcapability,
               serviceindex,serviceid,productindex,productid,productpkgindex,
               productpkgid,contentindex,contentid,corpindex,corpid,cpindex,
               cpid,subscribemode,subscribechannel,subscribeoptype,
               pausemode,resumemode,status,autocontinue,subscriber,usercode,
               payuser,pushid,starttime,endtime,lastrenttime,
               nextrentdate,payfordate,returnvalues,returntype,
               returnstartdate,returnenddate,fixusetimes,chargeparty,
               freetime,createtime,canceltime,firstusetime,lastusetime,
               tastestarttime,tasteendtime,pausetime,resumetime,
               subscribeopid,cancelreason,lastrent,msisdntype,pseudocode,pproductofferid,
               varifee,eventid,isexperience,subscribetype,chargetime
        into   v_productsubindex,v_productsubid,v_servicetype,v_subcapability,
               v_serviceindex,v_serviceid,v_productindex,v_productid,v_propkgindex,
               v_propkgid,v_contentindex,v_contentid,v_corpindex,v_corpid,v_cpindex,
               v_cpid,v_subscribemode,v_subscribechannel,v_subscribeoptype,
               v_pausemode,v_resumemode,v_productsubstatus,v_autocontinue,v_subscriber,v_usercode,
               v_payuser,v_pushid,v_substarttime,v_cursubendtime,v_lastrenttime,
               v_nextrentdate,v_payfordate,v_returnvalues,v_returntype,
               v_returnstartdate,v_returnenddate,v_fixusetimes,v_chargeparty,
               v_freetime,v_createtime,v_canceltime,v_firstusetime,v_lastusetime,
               v_tastestarttime,v_tasteendtime,v_pausetime,v_resumetime,
               v_subscribeopid,v_cancelreason,v_lastrent,v_msisdntype,v_pseudocode,v_pproductofferid,
               v_varifee,v_eventid,v_isexperience,v_subscribetype,v_chargetime
        from   zxdbm_200.s200_user_subscription
        where  usercode = v_usemsisdn and productid = v_productid;
    exception when no_data_found then
        o_retcode   := 1201;
        o_debugpos := 52;
        o_debuginfo := 'v_usemsisdn ='||v_usemsisdn||', v_productid ='||v_productid||', the subscription dose not exist.';
        return;
    when others then
        o_retcode   := 506;
        o_debugpos := 53;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
end if;

if v_productsubstatus in (4,5) then
    o_retcode   := 1202;
    o_debugpos := 54;
    o_debuginfo := 'status of the subscription is abnormal.';
    return;
elsif (v_productsubstatus = 6) or (v_cursubendtime < v_sysdate14) then
    o_retcode   := 1201;
    o_debugpos := 55;
    o_debuginfo := 'The subscription does not exist.';
    return;
end if;

--added by youqunxia20130609   order2.07.10
-- 判断是否属于捆绑品
if trim(v_pproductofferid) is not null and i_cmdchannel <> 40 then
    if i_actiontype = 10 then
        null;
    else
        o_retcode   := 1001229;
        o_debugpos  := 58;
        o_debuginfo := 'The product is binding,unsubscribe illegal .';
        return;
    end if;
end if;

-- 如果流媒体 (天翼视讯业务) 产品在试用期内退订,须要立刻失效;试用期外退订,则按产品属性判断
if (i_servicetype = 5) and v_freeuseflag in (1,2) and (v_freetime > v_sysdate14) then
    v_invalidmode := 0;
elsif (i_servicetype = 5) then
    v_invalidmode := 1; --MVS 业务门户上不显示该字段,缺省退订都为下帐期失效
end if;
--added by youqunxia20130910 order3.02.01
--VSOP 侧发动捆绑类套餐、增值产品的订购激活、变更激活及退订,ISMP 中增值子产品订购关系立刻失效(包含订购、退订及变更), 不以增值产品属性判断失效工夫;/*
if (i_cmdchannel = 40) and (i_effectiveswitch = 1)then
    v_invalidmode := 0;
end if;
*/

-- 缄默用户清理订购关系判断
if i_cmdchannel = 20 then
    if v_lastusetime = '00000000000000' then
        v_silentdays := to_date(v_sysdate14,'yyyymmddhh24miss') - to_date(v_substarttime,'yyyymmddhh24miss');
    else
        v_silentdays := to_date(v_sysdate14,'yyyymmddhh24miss') - to_date(v_lastusetime,'yyyymmddhh24miss');
    end if;

    if (v_silentdays < 30) then
        o_retcode   := 1001224;        -- 不满足缄默用户清理订购关系条件
        o_debugpos := 58;
        o_debuginfo := 'v_lastusetime ='||v_lastusetime||', it is not allowed to delete subscription of silent user.';
        return;
    end if;
end if;

--(除 CRM 发动的退订)套餐下的产品不容许独自退订
if  (v_propkgindex <> 0 and i_cmdchannel not in (9,35,39,40)) then
    o_retcode   := 1001214;
    o_debugpos := 59;
    o_debuginfo := 'the product in pkg is not allowed to be unsubscribed alone.';
    return;
end if;
o_paymsisdn  :=  v_payuser;
-- 依据 i_needreplay 决定鉴权是否持续
if (i_needreplay = 1) then
    begin
        v_tmpint  := dbms_random.value(1,9999999999);
        o_linknum := v_sysdate14 || '655380' || lpad(to_char(v_tmpint),10,'0');
    exception when others then
        o_retcode   := 506;
        o_debugpos := 60;
        o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
        return;
    end;
    return;
end if;
-- 获取计费方
if (v_productpayparty = 1) then
    v_paymsisdn     := v_usecorpid;
    o_paytype       := 0;
    o_paymsisdn     := v_paymsisdn;
    v_payuserindex  := v_corpindex;
    o_cityid        := trim(' ');
else
    -- 赠送时,订购关系只能由应用方退订,此时须要将付费方的信息带出存储过程
    if (v_payuser <> v_usemsisdn) then
        v_paymsisdn := v_payuser;
        o_paymsisdn := v_paymsisdn;
        begin
            select msisdntype,paytype,oppaytype,cityid
            into   v_paymsisdntype,v_paypaytype,v_payoppaytype,v_payusercityid
            from   zxdbm_ismp.susr_basic
            where  usercode = v_payuser;
        exception when no_data_found then
            o_retcode   := 1001;
            o_debugpos := 61;
            o_debuginfo := 'v_payuser ='||v_payuser||', user dose not exist.';
            return;
        when others then
            o_retcode   := 506;
            o_debugpos := 62;
            o_debuginfo := 'db error'||',sqlcode='||to_char(sqlcode)||'.';
            return;
        end;
        o_paytype := v_paypaytype;
        o_oppaytype := v_payoppaytype;
        o_paymsisdntype := v_paymsisdntype;
        o_cityid        := trim(v_payusercityid);
    end if;
end if;

-- 设置产品订购关系生效工夫、产品订购关系状态
if i_servicetype = 5 then
    -- 对 MVS 业务的订购关系生效工夫做非凡解决
    if v_chargetype in (3,6,8) and v_cyctype = 0 then -- 如果为非周期性
        v_subendtime := v_cursubendtime;
    elsif v_chargetype in (3,6,8) then
        -- 如果为周期性(MVS 的包周期计费只存在包天形式)v_subendtime := to_char(to_date(v_nextrentdate,'yyyymmdd') - 1,'yyyymmdd') || '235959';
    elsif v_chargetype in (2,5,7) then
        if v_invalidmode = 0 then
            v_subendtime := v_sysdate14;
        elsif v_invalidmode = 1 then
            v_subendtime := v_curmonthendtime;
        end if;
    end if;
else
    if (v_invalidmode = 0) then
        v_subendtime := v_sysdate14;
    else
        v_subendtime := v_curmonthendtime;
    end if;
end if;
o_subendtime := v_subendtime;

-- 设置话单计费开始,完结工夫

if substr(v_substarttime,1,6) = substr(v_sysdate8,1,6) then
    o_cdrbegintime := v_substarttime;
else
    if(v_subendtime < o_cdrendtime) then
        o_cdrendtime := v_subendtime;
    end if;
end if;

end slp_200_telicomprecancel;
/

clear buffer;
spool off;
exit;

正文完
 0