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

429 lines
18 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version='1.0' encoding='UTF-8'?>
<Application name="lps" trace="yes">
<!--退货(POS)-->
<Transaction code="2111020" log_switch="1">
<!-- 验证卡片合法性 -->
<DynSentence name="CHK_LPSTCRD_INFO">
<Sentence>
SELECT CRD_STS,USR_NO,MAIN_AC,MBL_NO FROM LPSTCRD WHERE SUB_AC=?
</Sentence>
<Fields>SUB_AC|</Fields>
</DynSentence>
<!--查询脱机消费交易状态-->
<DynSentence name="QRY_LPSTOFP_INFO">
<Sentence>
SELECT LP_ORD_STS ,PROC_RSL,TX_AMT OCSM_TX_AMT,RFD_FEE_PRC_MOD,CHG_FEE_FLG,FEE_AMT,RFD_FEE_PRC_MOD,CHG_FEE_DT,MERC_FEE_MOD,
MERC_TYP,USR_CITY,USR_PROV,USR_CITY_NM,MERC_CITY_NM
FROM LPSTOFP
WHERE SUB_AC=? AND POS_TRM=? AND MERC_ID=? AND POS_JRN=? AND TRM_TX_DT=? AND TRM_TX_TM=? AND CLR_STS='1'
FOR UPDATE
</Sentence>
<Fields>SUB_AC|OCSM_POS_TRM|OCSM_MERC|OCSM_POS_JRN|OCSM_TRM_DT|OCSM_TRM_TM|</Fields>
</DynSentence>
<!--更新脱机消费记录表状态为退货-->
<DynSentence name="UPD_LPSTOFP_ORDSTS">
<Sentence>
UPDATE LPSTOFP
SET LP_ORD_STS=?,TM_SMP=?,RFD_GRS=?,RFD_FEE_GRS=?,TX_TYP='20',RFD_DT=?
WHERE SUB_AC=? AND POS_TRM=? AND MERC_ID=? AND POS_JRN=? AND TRM_TX_DT=? AND TRM_TX_TM=?
</Sentence>
<Fields>LP_ORD_STS|SYS_TM_SMP|TX_AMT|REAL_FEE_AMT|TX_DT|SUB_AC|OCSM_POS_TRM|OCSM_MERC|OCSM_POS_JRN|OCSM_TRM_DT|OCSM_TRM_TM|</Fields>
</DynSentence>
<!--更新退货记录表状态为成功-->
<DynSentence name="UPD_LPSTRVS_BILSTS">
<Sentence>
UPDATE LPSTRVS SET BIL_STS='1',TM_SMP=?,MSG_CD='LPS00000' WHERE JRN_NO=?
</Sentence>
<Fields>SYS_TM_SMP|JRN_NO|</Fields>
</DynSentence>
<!-- 更新消费撤销记录具体错误信息码 -->
<DynSentence name="UPD_LPSTRVS_MSGCD">
<Sentence>
UPDATE LPSTRVS SET MSG_CD=?,TM_SMP=? WHERE JRN_NO=?
</Sentence>
<Fields>GWA.MSG_CD|SYS_TM_SMP|JRN_NO|</Fields>
</DynSentence>
<FlowCtrl>
<!--验证交易TAC-->
<If condition="NOT(ISNULL($TAC_BLOCK))">
<Set>TAC_CRD_OWN_FLG=SUBSTR($TAC_BLOCK,1,16)</Set>
<Set>TAC_MK_IDX=SUBSTR($TAC_BLOCK,17,2)</Set>
<Set>TAC_MK_VER=SUBSTR($TAC_BLOCK,19,2)</Set>
<Set>TAC=SUBSTR($TAC_BLOCK,21,8)</Set>
<Set>TAC_AMT=SUBSTR($TAC_BLOCK,29,8)</Set>
<Set>TAC_POS_TX_TYP=SUBSTR($TAC_BLOCK,37,2)</Set>
<Set>TAC_OCSM_TRM=SUBSTR($TAC_BLOCK,39,12)</Set>
<Set>TAC_OCSM_TRM_SEQ=SUBSTR($TAC_BLOCK,51,8)</Set>
<Set>TAC_OTX_DT=SUBSTR($TAC_BLOCK,59,8)</Set>
<Set>TAC_OTX_TM=SUBSTR($TAC_BLOCK,67,6)</Set>
<Set>TAC_CRD_BAL=SUBSTR($TAC_BLOCK,73,8)</Set>
<!-- 验证交易TAC -->
<Call package="LPS_PUB" function="CheckTransactionTAC">
<Input>SUB_AC|TAC_AMT|TAC_POS_TX_TYP|TAC_OCSM_TRM|TAC_OCSM_TRM_SEQ|TAC_OTX_DT|TAC_OTX_TM|TAC|</Input>
<Output>MSG_CD|</Output>
</Call>
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!-- 生成交易TAC失败 -->
<Set>~MSG_DAT=生成交易TAC失败</Set>
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
</Exec>
<Return/>
</If>
</If>
<!--验证卡片合法性-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<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>
<!--用户-商户状态查询-->
<Set>INP_DAT.MERC_ID=$OCSM_MERC</Set>
<Set>INP_DAT.MERC_TX_TYP=07</Set>
<Set>INP_DAT.TX_CD=2111020</Set>
<Set>INP_DAT.MERC_CAP_TYP=1</Set>
<Set>INP_DAT.DC_PTY_FLG=D</Set> <!-- 转账交易-商户为付款方 -->
<Call package="URM_PUB" function="CHK_MER_STS">
<Input>INP_DAT|GWA|</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>
<!-- 商户黑名单控制 -->
<Set>CBL_IN.USR_NO=@O.OUT_DAT.USR_NO</Set>
<Set>CBL_IN.TX_TYP=20</Set> <!-- 退货 -->
<Exec func="RRC:ChkBlackLst">
<Arg name="_I_INP_DAT" value="CBL_IN"/>
<Arg name="_O_OUT_DAT" value="CBL_OUT"/>
</Exec>
<Exec func="PUB:DumpDs"/>
<If condition="NOT(IS_SUCC(@O.MSG_CD))">
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
<Arg name="MsgDat" value="商户黑名单检查失败"/>
</Exec>
<Return/>
</If>
<!-- 主账户状态检查 -->
<Set>INP_DAT.MBLNO_OR_LOGID=$MBL_NO</Set>
<Set>INP_DAT.DC_PTY_FLG=C</Set> <!-- 收款方 -->
<Set>INP_DAT.TX_CD=$GWA.TX_CD</Set>
<Call package="URM" 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"/>
<Arg name="MsgDat" value="主账户状态异常"/>
</Exec>
<Return/>
</If>
<!--查询原脱机交易处理状态-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_LPSTOFP_INFO"/>
</Exec>
<If condition="~RetCod=2">
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20079"/>
<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>
<If condition="IS_NOEQUAL_STRING($PROC_RSL,00)"> <!-- 此笔退货记录清分失败 -->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20080"/>
<Arg name="MsgDat" value="此笔退货记录清分失败,无法退货"/>
</Exec>
<Return/>
</If>
<Else>
<If condition="IS_EQUAL_STRING($LP_ORD_STS,R)"> <!-- 交易状态为退货 -->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20082"/>
<Arg name="MsgDat" value="此笔交易已完成退货,无法再次退货"/>
</Exec>
<Return/>
</If>
<ElseIf condition="IS_EQUAL_STRING($LP_ORD_STS,C)"> <!-- 交易已撤销 -->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20077"/>
<Arg name="MsgDat" value="此笔消费已经进行过消费撤销"/>
</Exec>
<Return/>
</ElseIf>
</Else>
<!--判断交易金额是否合法-->
<If condition="DOUBLECMP($OCSM_TX_AMT,4,AMTSIMPLEFMT($TX_AMT))"> <!--退款金额不等于交易金额-->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20083"/>
<Arg name="MsgDat" value="退款金额与交易金额不相等"/>
</Exec>
<Return/>
</If>
<!-- 查询商户基本信息 -->
<Set>QMI_IN.MERC_ID=$OCSM_MERC</Set>
<Exec func="URM:QueryMerchInfo">
<Arg name="_I_INP_DAT" value="QMI_IN"/>
<Arg name="_O_OUT_DAT" value="QMI_OUT"/>
</Exec>
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!-- 查询商户信息失败 -->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
</Exec>
<Return/>
</If>
<!--登记消费撤销/退货记录表-->
<Set>JRN_NO=$GWA.JRN_NO</Set>
<Set>MERC_ID=$OCSM_MERC</Set>
<Set>TX_DT=$GWA.TX_DT</Set>
<Set>TX_TM=$GWA.TX_TM</Set>
<Set>TRM_TX_DT=$OCSM_TRM_DT</Set>
<Set>TRM_TX_TM=$OCSM_TRM_TM</Set>
<Set>RVS_FLG=R</Set> <!-- 消费退货 -->
<Set>BIL_STS=2</Set> <!-- 记录退货初始状态为失败 -->
<Set>CLR_STS=1</Set> <!-- 记录清分状态为已清分 -->
<Set>AC_DT=$GWA.AC_DT</Set> <!-- 清分会计日期 -->
<Set>OCSM_TRM=$TAC_OCSM_TRM</Set> <!-- 原终端机编号 -->
<Set>OCSM_TRM_LOG=$TAC_OCSM_TRM_SEQ</Set> <!-- 原终端机交易序号 -->
<Set>CRD_BAL=AMTSIMPLEFMT(HEX2DEC($TAC_CRD_BAL))</Set> <!-- 卡片交易余额 -->
<Set>TX_AMT=AMTSIMPLEFMT($OTX_AMT)</Set>
<Set>OTX_AMT=$TX_AMT</Set> <!-- 原交易金额 -->
<Set>MSG_CD=LPS99999</Set>
<!-- 商户信息参数 -->
<Set>MERC_ABBR=@O.QMI_OUT.MERC_ABBR</Set> <!-- 商户简称 -->
<Set>CLR_MERC=@O.QMI_OUT.CLR_MERC</Set> <!-- 清算商户号 -->
<Set>MERC_PROV=@O.QMI_OUT.MERC_PROV</Set> <!-- 商户归属省 -->
<Set>MERC_CITY=@O.QMI_OUT.MERC_CITY</Set> <!-- 商户归属市 -->
<Set>TXN_ATTR=2</Set> <!-- 交易属性 0:完整收款 1 非完整 2完整退款-->
<Set>RFD_FEE_PRC_MOD=@O.QMI_OUT.RFD_FEE_PRC_MOD</Set>
<Set>FEE_DT=$CHG_FEE_DT</Set>
<Exec func="PUB:InsertRecord" error="IGNORE">
<Arg name="TblNam" value="LPSTRVS"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20084"/>
<Arg name="MsgDat" value="登记退货记录失败"/>
</Exec>
<Return/>
</If>
<Exec func="PUB:CommitWork"/>
<!--退货账务处理 开始-->
<!--检查商户是否退还手续费-->
<If condition="IS_EQUAL_STRING($RFD_FEE_PRC_MOD,0)"> <!--退还手续费-->
<If condition="IS_EQUAL_STRING($MERC_FEE_MOD,3)"> <!-- 汇总计算汇总收取(待讨论手续费计算方式)-->
<Set>REAL_FEE_AMT=0.00</Set>
</If>
<Else>
<Set>REAL_FEE_AMT=$FEE_AMT</Set>
</Else>
</If>
<ElseIf condition="IS_EQUAL_STRING($RFD_FEE_PRC_MOD,1)"> <!--不退还手续费-->
<Set>REAL_FEE_AMT=0.00</Set>
</ElseIf>
<Else> <!--全额退还后退手续费(暂未用到)-->
</Else>
<If condition="DOUBLECMP($REAL_FEE_AMT,6,0.00)"> <!--实际退费手续费大于0-->
<!--计算商户交易服务费获取内部用户号-->
<Set>CMF_IN.MERC_ID=$OCSM_MERC</Set>
<Set>CMF_IN.CAP_TYP=1</Set>
<Set>CMF_IN.TX_MOD=1</Set> <!--现场脱机-->
<Set>CMF_IN.FEE_TYP=01</Set> <!--消费佣金-->
<Set>CMF_IN.ORD_AMT=$TX_AMT</Set>
<Set>CMF_IN.RCV_AMT1=$TX_AMT</Set>
<Set>CMF_IN.RCV_AMT2=0</Set>
<Set>CMF_IN.RCV_AMT3=0</Set>
<Set>CMF_IN.TOT_CALL_FLG=1</Set> <!--单笔结算-->
<Set>CMF_IN.RED_COUPON_FEE_TYP=0</Set> <!--红包代金券均不收取手续费-->
<Exec func="URM:ComputeMerchFee">
<Arg name="_I_INP_DAT" value="CMF_IN"/>
<Arg name="_O_OUT_DAT" value="CMF_OUT"/>
</Exec>
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!--计算交易服务费失败-->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
<Arg name="MsgDat" value="计算交易服务费失败"/>
</Exec>
<Return/>
</If>
<!--记录服务费信息-->
<Set>AC_TYP=@O.CMF_OUT.FEE_IAC_TYP</Set> <!--内部账户类型 -->
<Set>AC_NO=@O.CMF_OUT.FEE_AC_NO</Set> <!-- 内部账户号 -->
<Set>AC_CD=REPSTR($AC_NO,$AC_TYP,"")</Set> <!-- 账户代码 -->
<!--内部用户支出-->
<Set>IAW_IN.AC_NO=$AC_NO</Set>
<Set>IAW_IN.AC_TYP=$AC_TYP</Set>
<Set>IAW_IN.AC_NM=现场脱机消费服务费</Set>
<Set>IAW_IN.CAP_TYP=1</Set>
<Set>IAW_IN.TX_CD=$GWA.TX_CD</Set>
<Set>IAW_IN.TX_TYP=32</Set> <!-- 手续费 -->
<Set>IAW_IN.BUS_TYP=0061</Set> <!-- 批量扣交易服务费 -->
<Set>IAW_IN.AMT=$REAL_FEE_AMT</Set>
<Set>IAW_IN.TX_DT=$OCSM_TRM_DT</Set>
<Set>IAW_IN.TX_TM=$OCSM_TRM_TM</Set>
<Set>IAW_IN.TX_CD=$GWA.TX_CD</Set>
<Set>IAW_IN.ORD_TYP=05</Set>
<Set>IAW_IN.ORD_NO=$GWA.JRN_NO</Set>
<!--调用账户内部账户存入-->
<Exec func="ACM:InnerAccountWithdraw">
<Arg name="_I_GWA" value="GWA"/>
<Arg name="_I_INP_DAT" value="IAW_IN"/>
<Arg name="_O_OUT_DAT" value="IAW_OUT"/>
</Exec>
<If condition="NOT(IS_SUCC(@O.MSG_CD))"> <!--内部账户存入失败-->
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="@O.MSG_CD"/>
<Arg name="MsgDat" value="内部账户存入失败"/>
</Exec>
<Return/>
</If>
</If>
<!--调用账户-商户支出-->
<Set>MER_MW.MERC_ID1=$CLR_MERC</Set>
<Set>MER_MW.CAP_TYP1=1</Set>
<Set>MER_MW.AMT1=FSUB($TX_AMT,$REAL_FEE_AMT,2)</Set>
<Set>MER_MW.TX_OPP_ID=$MAIN_AC</Set>
<Set>MER_MW.ORD_TYP=05</Set>
<Set>MER_MW.TX_CD=$GWA.TX_CD</Set>
<Set>MER_MW.ORD_NO=$GWA.JRN_NO</Set>
<Set>MER_MW.TX_OPP_TYP=0</Set>
<Set>MER_MW.TX_TYP=20</Set> <!-- 消费退款 -->
<Set>MER_MW.BUS_TYP=0052</Set>
<Exec func="ACM:MercWithdraw">
<Arg name="_I_GWA" value="GWA"/>
<Arg name="_I_INP_DAT" value="MER_MW"/>
<Arg name="_O_OUT_DAT" value="MER_MW_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>
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_LPSTRVS_MSGCD"/>
</Exec>>
<Return/>
</If>
<!-- 调用账户-主账户存入 -->
<Set>M_MAD.AC_NO=$MAIN_AC</Set>
<Set>M_MAD.CAP_TYP=1</Set>
<Set>M_MAD.TX_DT=$GWA.TX_DT</Set>
<Set>M_MAD.TX_TM=$GWA.TX_TM</Set>
<Set>M_MAD.ORD_NO=$GWA.JRN_NO</Set>
<Set>M_MAD.AMT=$TX_AMT</Set>
<Set>M_MAD.TX_OPP_CD=$OCSM_MERC</Set>
<Set>M_MAD.MAX_CHK_FLG=N</Set> <!--主账户存入时,暂定最高限额不做检查 -->
<Set>M_MAD.ORD_TYP=05</Set>
<Set>M_MAD.TX_CD=$GWA.TX_CD</Set>
<Set>M_MAD.TX_OPP_TYP=1</Set>
<Set>M_MAD.TX_TYP=20</Set> <!-- 消费退款 -->
<Set>M_MAD.BUS_TYP=0052</Set>
<Exec func="ACM:MainAccountDeposit">
<Arg name="_I_GWA" value="GWA"/>
<Arg name="_I_INP_DAT" value="M_MAD"/>
<Arg name="_O_OUT_DAT" value="M_MAD_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>
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_LPSTRVS_MSGCD"/>
</Exec>>
<Return/>
</If>
<!--退货账务处理 结束-->
<!--更新原交易状态为退货-->
<If condition="IS_EQUAL_STRING($RFD_FEE_PRC_MOD,0)"> <!-- 商户退还手续费 -->
<Set>FEE_AMT=0.00</Set> <!-- 手续费置为0 -->
</If>
<Set>LP_ORD_STS=R</Set>
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_LPSTOFP_ORDSTS"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20085"/>
<Arg name="MsgDat" value="更新原脱机消费记录状态失败"/>
</Exec>
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_LPSTRVS_MSGCD"/>
</Exec>>
<Return/>
</If>
<!-- 更新退货交易状态为成功 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_LPSTRVS_BILSTS"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS20078"/>
<Arg name="MsgDat" value="更新原脱机消费交易状态失败"/>
</Exec>
<Return/>
</If>
<Exec func="PUB:GWASetMsg">
<Arg name="MsgCd" value="LPS00000"/>
</Exec>
</FlowCtrl>
</Transaction>
</Application>