320 lines
12 KiB
XML
320 lines
12 KiB
XML
<?xml version='1.0' encoding='UTF-8'?>
|
|
<Application name="lps" trace="yes">
|
|
|
|
<!-- 换卡圈存 -->
|
|
<Transaction code="2141030" log_switch="1">
|
|
<!-- 验证卡片合法性 -->
|
|
<DynSentence name="QRY_LPSTCRD_CRDSTS">
|
|
<Sentence>
|
|
SELECT CRD_STS,USR_NO,CRD_STSW,MAIN_AC,CRD_EMK_SEQ PRE_EMK_SEQ ,CRD_VER,MBL_NO
|
|
FROM LPSTCRD
|
|
WHERE SUB_AC=? AND CRD_STS!='2'
|
|
FOR UPDATE
|
|
</Sentence>
|
|
<Fields>SUB_AC|</Fields>
|
|
</DynSentence>
|
|
|
|
<!-- 查询换卡圈存金额 -->
|
|
<DynSentence name="QRY_LPSTBAL_AMT">
|
|
<Sentence>
|
|
SELECT CRD_BAL,HLD_NO
|
|
FROM LPSTBAL
|
|
WHERE HLD_NO IN
|
|
(SELECT MAX(HLD_NO) FROM LPSTBAL WHERE TX_TYP='C' AND PROC_RSL!='S' AND MAIN_AC=?)
|
|
AND MAIN_AC=?
|
|
FOR UPDATE
|
|
</Sentence>
|
|
<Fields>MAIN_AC|MAIN_AC|</Fields>
|
|
</DynSentence>
|
|
|
|
<!-- 更新卡余额处理结果 -->
|
|
<DynSentence name="UPD_LPSTBAL_RSL">
|
|
<Sentence>
|
|
UPDATE LPSTBAL SET PROC_RSL=?,PROC_DT=?,PROC_TM=?,ORD_NO=?,NEW_SUB_AC=?,TM_SMP=?
|
|
WHERE MAIN_AC=? AND PROC_RSL!='S' AND TX_TYP='C' AND HLD_NO=?
|
|
</Sentence>
|
|
<Fields>PROC_RSL|PROC_DT|PROC_TM|ORD_NO|SUB_AC|SYS_TM_SMP|MAIN_AC|HLD_NO|</Fields>
|
|
</DynSentence>
|
|
|
|
<!-- 更新卡片圈存序号 -->
|
|
<DynSentence name="UPD_LPSTCRD_EMKSEQ">
|
|
<Sentence>
|
|
UPDATE LPSTCRD SET CRD_EMK_SEQ=?,TM_SMP=? WHERE SUB_AC=?
|
|
</Sentence>
|
|
<Fields>NEW_CRD_EMK_SEQ|SYS_TM_SMP|SUB_AC|</Fields>
|
|
</DynSentence>
|
|
|
|
<!-- 更新卡片圈存序号 -->
|
|
<DynSentence name="UPD_LPSTEMK_STS">
|
|
<Sentence>
|
|
UPDATE LPSTEMK SET EMK_STS='0',TM_SMP=? WHERE ORD_NO=?
|
|
</Sentence>
|
|
<Fields>SYS_TM_SMP|ORD_NO|</Fields>
|
|
</DynSentence>
|
|
|
|
<FlowCtrl>
|
|
<!-- 金额类型转换 -->
|
|
<Set>TX_AMT=TOUPPER(ADDCHAR(DEC2HEX($TX_AMT),8,0,1))</Set>
|
|
<Set>REAL_TX_AMT=AMTSIMPLEFMT(HEX2DEC($TX_AMT))</Set>
|
|
<Set>REAL_CRD_BAL=AMTSIMPLEFMT(HEX2DEC($CRD_BAL))</Set>
|
|
|
|
<!-- 验证交易MAC -->
|
|
<Call package="LPS_PUB" function="CheckPOSTransactionMAC">
|
|
<Input>SUB_AC|RDM_NO1|CRD_BAL|TX_AMT|POS_TRM_ID|CRD_EMK_SEQ|MAC1|</Input>
|
|
<Output>MSG_CD|</Output>
|
|
</Call>
|
|
<If condition="NOT(IS_SUCC(@O.MSG_CD))">
|
|
<Set>~MSG_DAT=验证报文MAC失败</Set>
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="@O.MSG_CD"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!-- 检查商户是否为营业厅 -->
|
|
<Call package="LPS_PUB" function="CheckMercTyp">
|
|
<Input>MERC_ID|</Input>
|
|
<Output>MSG_CD|</Output>
|
|
</Call>
|
|
<If condition="NOT(IS_SUCC(@O.MSG_CD))">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="@O.MSG_CD"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!--检查钱包状态-->
|
|
<Exec func="PUB:ReadRecord">
|
|
<Arg name="SqlCmd" value="QRY_LPSTCRD_CRDSTS"/>
|
|
</Exec>
|
|
<If condition="~RetCod=2">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20055"/>
|
|
<Arg name="MsgDat" value="用户未开通手机钱包"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
<ElseIf condition="~RetCod!=0">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS00001"/>
|
|
<Arg name="MsgDat" value="数据库操作出错"/>
|
|
</Exec>
|
|
<Return/>
|
|
</ElseIf>
|
|
|
|
<!--用户-用户状态查询-->
|
|
<Set>INP_DAT.MBLNO_OR_LOGID=$MBL_NO</Set>
|
|
<Set>INP_DAT.TX_CD=$GWA.TX_CD</Set>
|
|
<Call package="URM_PUB" function="CHK_USER_STS">
|
|
<Input>INP_DAT|</Input>
|
|
<Output>OUT_DAT|MSG_CD|</Output>
|
|
</Call>
|
|
<If condition="NOT(IS_SUCC(@O.MSG_CD))">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="@O.MSG_CD"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!-- 记录用户归属省份 -->
|
|
<Set>USR_PROV=@O.OUT_DAT.USR_PROV</Set>
|
|
<Set>USR_CITY=@O.OUT_DAT.USR_CITY</Set>
|
|
<Set>CCY_CD=CNY</Set>
|
|
|
|
|
|
<!--验证卡片状态 (待讨论)-->
|
|
<If condition="IS_EQUAL_STRING($CRD_STS,3)">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20086"/>
|
|
<Arg name="MsgDat" value="卡片为销户或暂停状态,暂不能换卡圈存"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!--查询换卡圈存余额-->
|
|
<Exec func="PUB:ReadRecord">
|
|
<Arg name="SqlCmd" value="QRY_LPSTBAL_AMT"/>
|
|
</Exec>
|
|
<If condition="~RetCod=2">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20095"/>
|
|
<Arg name="MsgDat" value="未找到卡片余额信息"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
<ElseIf condition="~RetCod!=0">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS00001"/>
|
|
<Arg name="MsgDat" value="数据库操作出错"/>
|
|
</Exec>
|
|
<Return/>
|
|
</ElseIf>
|
|
|
|
<!-- 平台记录的待补登金额与POS上送的不相等 -->
|
|
<If condition="DOUBLECMP($CRD_BAL,4,$REAL_TX_AMT)">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20097"/>
|
|
<Arg name="MsgDat" value="充值金额与待补登金额不相符"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
|
|
<!--登记换卡圈存记录-->
|
|
<Set>ORD_NO=$GWA.JRN_NO</Set>
|
|
<Set>ORD_DT=$GWA.TX_DT</Set>
|
|
<Set>AC_DT=$GWA.AC_DT</Set>
|
|
<Set>BUS_CNL=POS</Set>
|
|
<Set>CRD_PPD_RSL=0000</Set> <!-- 卡充值结果初始化为0000 -->
|
|
<Set>EMK_STS=4</Set> <!--初始化状态为失败-->
|
|
<Set>EMK_TYP=P</Set>
|
|
<Set>TX_AMT=$REAL_TX_AMT</Set>
|
|
<Set>RDM_NO=$RDM_NO1</Set> <!-- 卡片生成的伪随机数 -->
|
|
<Set>POST_AC_DT=$GWA.AC_DT</Set> <!-- 充值记账会计日期 -->
|
|
<Set>LAST_EMK_CMD=1</Set> <!--充值请求指令-->
|
|
|
|
<Exec func="PUB:InsertRecord">
|
|
<Arg name="TblNam" value="LPSTEMK"/>
|
|
</Exec>
|
|
<If condition="~RetCod!=0">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20087"/>
|
|
<Arg name="MsgDat" value="登记换卡圈存记录失败"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<Exec func="PUB:CommitWork"/>
|
|
|
|
<!--换卡圈存账务处理 开始-->
|
|
<!--主账户解冻支取-->
|
|
<Set>INP_DAT.MBL_NO=$MBL_NO</Set>
|
|
<Set>INP_DAT.CAP_TYP1=1</Set>
|
|
<Set>INP_DAT.UN_HLD_AMT1=$REAL_TX_AMT</Set>
|
|
<Set>INP_DAT.AMT1=$REAL_TX_AMT</Set>
|
|
<Set>INP_DAT.HLD_NO=$HLD_NO</Set>
|
|
<Set>INP_DAT.TX_CD=$GWA.TX_CD</Set>
|
|
<Set>INP_DAT.ORD_NO=$GWA.JRN_NO</Set>
|
|
<Set>INP_DAT.HLD_CD=BD</Set> <!-- 冻结代码为补登 -->
|
|
<Set>INP_DAT.ORD_TYP=07</Set> <!-- 圈存订单类型 -->
|
|
<Set>INP_DAT.TX_TYP=06</Set> <!-- 圈存 -->
|
|
<Set>INP_DAT.BUS_TYP=HBD1</Set> <!-- 换卡待补登释放 -->
|
|
|
|
<Exec func="ACM:UserHoldWithdraw">
|
|
<Arg name="_I_GWA" value="GWA"/>
|
|
<Arg name="_I_INP_DAT" value="INP_DAT"/>
|
|
<Arg name="_O_OUT_DAT" value="OUT_DAT"/>
|
|
</Exec>
|
|
<Exec func="PUB:DumpDs"/>
|
|
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!--解冻支取失败 -->
|
|
<Set>~MSG_DAT=冻结支取失败</Set>
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="@O.MSG_CD"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!--子账户存入-->
|
|
<Set>S_PAD.USR_NO=$USR_NO</Set>
|
|
<Set>S_PAD.APP_SEQ_NO=$SUB_AC</Set>
|
|
<Set>S_PAD.AC_TYP=101</Set> <!-- 账户种类 -->
|
|
<Set>S_PAD.CAP_TYP=1</Set>
|
|
<Set>S_PAD.AMT=$REAL_TX_AMT</Set>
|
|
<Set>S_PAD.C_TX_DT=$GWA.TX_DT</Set>
|
|
<Set>S_PAD.TX_TM=$GWA.TX_TM</Set>
|
|
<Set>S_PAD.TX_CD=$GWA.TX_CD</Set>
|
|
<Set>S_PAD.ORD_NO=$GWA.JRN_NO</Set>
|
|
<Set>S_PAD.ORD_TYP=07</Set> <!-- 圈存 -->
|
|
<Set>S_PAD.TX_TYP=06</Set> <!-- 圈存 -->
|
|
<Set>S_PAD.BUS_TYP=HBD1</Set> <!-- 换卡待补登释放 -->
|
|
|
|
<Exec func="ACM:PurseAccountDeposit">
|
|
<Arg name="_I_GWA" value="GWA"/>
|
|
<Arg name="_I_INP_DAT" value="S_PAD"/>
|
|
<Arg name="_O_OUT_DAT" value="S_PAD_OUT"/>
|
|
</Exec>
|
|
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!--子账户存入失败 -->
|
|
<Set>~MSG_DAT=子账户存入失败</Set>
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="@O.MSG_CD"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
<!--账务处理 结束-->
|
|
|
|
<!--更新卡片余额状态-->
|
|
<Set>PROC_RSL=S</Set> <!-- 处理成功 -->
|
|
<Set>PROC_DT=$GWA.TX_DT</Set> <!-- 处理日期 -->
|
|
<Set>PROC_TM=$GWA.TX_TM</Set> <!-- 处理时间 -->
|
|
|
|
<Exec func="PUB:ExecSql" error="IGNORE">
|
|
<Arg name="SqlCmd" value="UPD_LPSTBAL_RSL"/>
|
|
</Exec>
|
|
<If condition="~RetCod!=0">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20098"/>
|
|
<Arg name="MsgDat" value="更新卡片余额处理结果失败"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!--更新圈存交易记录为成功-->
|
|
<Exec func="PUB:ExecSql" error="IGNORE">
|
|
<Arg name="SqlCmd" value="UPD_LPSTEMK_STS"/>
|
|
</Exec>
|
|
<If condition="~RetCod!=0">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20089"/>
|
|
<Arg name="MsgDat" value="更新圈存记录状态失败"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
|
|
|
|
<!-- 更新卡片圈存序号表 -->
|
|
<If condition="ISNULL($PRE_EMK_SEQ)"> <!--卡片刚刚开户-->
|
|
<Set>NEW_CRD_EMK_SEQ=ADDCHAR(DEC2HEX(ADD(HEX2DEC($CRD_EMK_SEQ),1)),4,0,1)</Set> <!--默认写卡成功-->
|
|
</If>
|
|
<Else> <!--卡片已经开户-->
|
|
<Set>NEW_CRD_EMK_SEQ=ADDCHAR(DEC2HEX(ADD(HEX2DEC($PRE_EMK_SEQ),1)),4,0,1)</Set> <!--默认写卡成功-->
|
|
</Else>
|
|
<Exec func="PUB:ExecSql">
|
|
<Arg name="SqlCmd" value="UPD_LPSTCRD_EMKSEQ"/>
|
|
</Exec>
|
|
<If condition="~RetCod!=0">
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS20093"/>
|
|
<Arg name="MsgDat" value="更新卡片联机交易序号失败"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<!--生成报文MAC2-->
|
|
<Set>TX_AMT=ADDCHAR(DEC2HEX(AMTPOWER($REAL_TX_AMT,2)),8,0,1)</Set>
|
|
<Call package="LPS_PUB" function="CreatePosTransactionMAC">
|
|
<Input>SUB_AC|RDM_NO1|CRD_EMK_SEQ|TX_AMT|POS_TRM_ID|GWA|</Input>
|
|
<Output>OUT_DAT|MSG_CD|</Output>
|
|
</Call>
|
|
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!--生成mac2失败 -->
|
|
<Set>~MSG_DAT=生成交易MAC2失败</Set>
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="@O.MSG_CD"/>
|
|
</Exec>
|
|
<Return/>
|
|
</If>
|
|
|
|
<Set>POS_CRD_EMK_SEQ=TOUPPER(ADDCHAR(DEC2HEX(ADD(HEX2DEC($CRD_EMK_SEQ),1)),4,0,1))</Set>
|
|
<Set>MAC2=@O.OUT_DAT.MAC2</Set>
|
|
<Set>C_TX_DT=@O.OUT_DAT.C_TX_DT</Set>
|
|
<Set>C_TX_TM=@O.OUT_DAT.C_TX_TM</Set>
|
|
|
|
<Exec func="PUB:GWASetMsg">
|
|
<Arg name="MsgCd" value="LPS00000"/>
|
|
</Exec>
|
|
|
|
</FlowCtrl>
|
|
</Transaction>
|
|
|
|
</Application>
|