Files
2021-01-12 22:04:24 +08:00

311 lines
13 KiB
XML

<?xml version='1.0' encoding='UTF-8'?>
<Application name="lps" trace="yes">
<!--POS圈存-->
<Transaction code="2141010" log_switch="1">
<!-- 验证卡片合法性 -->
<DynSentence name="CHK_LPSTCRD_INFO">
<Sentence>
SELECT UPPER(CRD_EMK_SEQ) PRE_EMK_SEQ,CRD_STS,USR_NO,CRD_STSW,MAIN_AC,MBL_NO
FROM LPSTCRD
WHERE SUB_AC=? AND CRD_STS!='2' FOR UPDATE
</Sentence>
<Fields>SUB_AC|</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_EMKSTS">
<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="CHK_LPSTCRD_INFO"/>
</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>
<Else>
<If condition="OR(IS_NOEQUAL_STRING($CRD_STS,1),IS_NOEQUAL_STRING(SUBSTR($CRD_STSW,1,4),0000))"> <!-- 卡片状态异常 -->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20086"/>
<Arg name="MsgDat" value="卡片状态异常无法进行充值交易"/>
</Exec>
<Return/>
</If>
</Else>
<!--实时风控检查开始-->
<Set>RISK_DAT.MBL_NO=$MBL_NO</Set>
<Set>RISK_DAT.RISK_SWITCH=C</Set>
<Set>RISK_DAT.TX_AMT=$REAL_TX_AMT</Set>
<Set>RISK_DAT.TX_AMT_TOT=FADD($REAL_TX_AMT,$REAL_CRD_BAL,2)</Set>
<Call package="LPS_PUB" function="LpsRiskControl">
<Input>RISK_DAT|GWA|</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>
<!--实时风控检查结束-->
<!--用户-用户状态检查-->
<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))">
<Set>~MSG_DAT=用户状态异常</Set>
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
</Exec>
<Return/>
</If>
<!-- 保留OUT_DAT参数,累计检查需要 -->
<Set>CI_NO=@O.OUT_DAT.CI_NO</Set>
<Set>U_NO=@O.OUT_DAT.USR_NO</Set>
<!-- 记录用户归属省份 -->
<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="ISNULL($PRE_EMK_SEQ)"> <!--卡片尚未进行过充值交易-->
<Set>PRE_EMK_SEQ=$CRD_EMK_SEQ</Set>
</If>
<!-- 平台记录的卡片联机交易序号大于卡片上送的联机交易序号(暂未考虑POS充值冲正没有上送的情况) -->
<Else>
<If condition="INTCMP(STRCMP($PRE_EMK_SEQ,$CRD_EMK_SEQ),6,0)">
<!--调用风控-加入灰名单-->
<Set>RISK_DAT.MBL_NO=$MBL_NO</Set>
<Set>RISK_DAT.RISK_SWITCH=G</Set>
<Set>RISK_DAT.RISK_RSN=ILLEGAL_EMK_SEQ</Set> <!--该笔进行确认的交易在平台无记录-->
<Set>RISK_DAT.RISK_TYPE=ILLEGAL_CRD</Set>
<Set>RISK_DAT.RISK_SEQ=$GWA.JRN_SEQ</Set>
<Set>RISK_DAT.TX_AMT=$REAL_TX_AMT</Set>
<Set>RISK_DAT.TX_TYP=06</Set> <!-- 圈存 -->
<Call package="LPS_PUB" function="LpsRiskControl">
<Input>RISK_DAT|GWA|</Input>
<Output>MSG_CD|</Output>
</Call>
<If condition="NOT(IS_SUCC(@O.MSG_CD))">
<Exec func="PUB:GWAAddMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
</Exec>
</If>
</If>
</Else>
<!-- 验证圈存序号合法性 结束 -->
<!-- 登记圈存记录表 开始 -->
<Set>LAST_EMK_CMD=1</Set> <!-- 充值请求 -->
<Set>ORD_DT=$GWA.TX_DT</Set> <!-- 订单日期 -->
<Set>ORD_NO=$GWA.JRN_NO</Set> <!-- 平台内部订单号 -->
<Set>EMK_STS=4</Set> <!-- 平台扣款失败(失败) -->
<Set>EMK_TYP=P</Set> <!-- POS圈存 -->
<Set>AC_DT=$GWA.AC_DT</Set> <!-- 记账日期 -->
<Set>BUS_CNL=POS</Set> <!-- 交易渠道 -->
<Set>RDM_NO=$RDM_NO1</Set> <!--卡片生成的随机数-->
<Set>POST_AC_DT=$GWA.AC_DT</Set> <!-- 充值记账会计日期 -->
<Set>POST_DT=$GWA.TX_DT</Set> <!-- 充值记账系统日期 -->
<Set>POST_TM=$GWA.TX_TM</Set> <!-- 充值记账系统时间 -->
<Set>TX_AMT=$REAL_TX_AMT</Set> <!--交易金额-->
<Set>CRD_BAL=$REAL_CRD_BAL</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>M_MAW.AC_NO=$MAIN_AC</Set>
<Set>M_MAW.CAP_TYP=1</Set>
<Set>M_MAW.AMT=$REAL_TX_AMT</Set>
<Set>M_MAW.TX_AMT=$REAL_TX_AMT</Set>
<Set>M_MAW.TX_DT=$GWA.TX_DT</Set>
<Set>M_MAW.TX_TM=$GWA.TX_TM</Set>
<Set>M_MAW.ORD_NO=$GWA.JRN_NO</Set>
<Set>M_MAW.TX_CD=2141010</Set>
<Set>M_MAW.ORD_TYP=07</Set>
<Set>M_MAW.TX_TYP=06</Set> <!-- 圈存 -->
<Set>M_MAW.BUS_TYP=0700</Set>
<Exec func="ACM:MainAccountWithdraw">
<Arg name="_I_INP_DAT" value="M_MAW"/>
<Arg name="_I_GWA" value="GWA"/>
<Arg name="_O_OUT_DAT" value="M_MAW_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>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.TX_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.ORD_NO=$GWA.JRN_NO</Set>
<Set>S_PAD.TX_CD=2141010</Set>
<Set>S_PAD.ORD_TYP=07</Set>
<Set>S_PAD.TX_TYP=06</Set> <!-- 圈存 -->
<Set>S_PAD.BUS_TYP=0700</Set>
<Exec func="ACM:PurseAccountDeposit">
<Arg name="_I_INP_DAT" value="S_PAD"/>
<Arg name="_I_GWA" value="GWA"/>
<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>
<!-- 账务处理结束 -->
<!-- 更新圈存记录表状态为平台扣款成功 -->
<Exec func="PUB:ExecSql" error="IGNORE">
<Arg name="SqlCmd" value="UPD_LPSTEMK_EMKSTS"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20089"/>
<Arg name="MsgDat" value="更新圈存记录状态失败"/>
</Exec>
<Return/>
</If>
<!-- 更新卡片信息表中的卡片联机交易序号 -->
<Set>NEW_CRD_EMK_SEQ=ADDCHAR(DEC2HEX(ADD(HEX2DEC($PRE_EMK_SEQ),1)),4,0,1)</Set>
<Exec func="PUB:ExecSql" error="IGNORE">
<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))"> <!-- 生成交易MAC失败 -->
<Set>~MSG_DAT=生成交易MAC失败</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>
<!-- 累计检查参数 -->
<Set>INP_CRR.PAY_CI_NO=$CI_NO</Set>
<Set>INP_CRR.PAY_USR_NO=$U_NO</Set>
<Set>INP_CRR.PAY_AC_TYP=100</Set>
<Set>INP_CRR.STL_CI_NO=$CI_NO</Set>
<Set>INP_CRR.STL_USR_NO=$U_NO</Set>
<Set>INP_CRR.STL_AC_TYP=101</Set>
<Set>INP_CRR.AMT_FLG=1</Set>
<Set>INP_CRR.BUS_CNL=$GWA.BUS_CNL</Set>
<Set>INP_CRR.RSV_FLG=N</Set>
<Set>INP_CRR.TOT_FLG=1</Set>
<Set>INP_CRR.TX_AMT1=$RISK_DAT.TX_AMT</Set>
<Set>INP_CRR.JRN_NO=$GWA.JRN_NO</Set>
<Set>INP_CRR.TX_DT=$GWA.TX_DT</Set>
<Set>INP_CRR.TX_TYP=06</Set>
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS00000"/>
</Exec>
</FlowCtrl>
</Transaction>
</Application>