Files
ctg-app-cap/cap/etc/batch/BAT_GET_DISK_RESULT_CTL.XML
2021-12-16 17:14:52 +08:00

306 lines
13 KiB
XML

<?xml version='1.0' encoding='UTF-8'?>
<Tran>
<Transaction code="BAT_GET_DISK_RESULT" log_switch='1' desc="获取批量回盘">
<DynSentence name="QryBatLst">
<Sentence>
select DSK_NAM,RCV_DT||RCV_TM from capdskinf a where dsk_sts = '1' and ord_dt &gt;= ? and (dsk_nam,0) in
(select dsk_nam,sum(case when bat_sts not in ('4', '2') then 1 else 0 end) notfinal from capbatinf
where ord_dt = a.ord_dt and dsk_nam = a.DSK_NAM group by dsk_nam having sum(case when bat_sts not in ('4', '2') then 1 else 0 end) = 0)
union all select DSK_NAM ,RCV_DT||RCV_TM from CAPDSKINF a where a.dsk_sts = '9' and ORD_DT &gt;= ?
order by 2 asc
</Sentence>
<Fields>DT_BEFER|DT_BEFER|</Fields>
</DynSentence>
<DynSentence name="UpdCapdskinf">
<Sentence>
UPDATE CAPDSKINF SET dsk_sts = '4',
END_DT=?,
END_TM=?,
MD5_RESULT=?,
FILE_ID_RESULT=?
WHERE DSK_NAM = ?
AND dsk_sts in ('1','9')
</Sentence>
<Fields>END_DT|END_TM|MD5_RESULT|FILE_ID|DSK_NAM|</Fields>
</DynSentence>
<DynSentence name="UpdCapdskinf2">
<Sentence>
UPDATE CAPDSKINF SET
SUC_CNT = ?,
SUC_AMT = ?,
FAL_CNT = ?,
FAL_AMT = ?
WHERE DSK_NAM = ?
AND dsk_sts in ('1','9')
</Sentence>
<Fields>SUC_CNT|SUC_AMT|FAL_CNT|FAL_AMT|DSK_NAM|</Fields>
</DynSentence>
<DynSentence name="QRY_CAPDSKINF_DSK_NAM">
<Sentence>
SELECT DSK_NO,DSK_STS,ORD_DT,END_DT,END_TM ,ORN_CNT ,ORN_AMT,SUC_CNT,SUC_AMT,FAL_CNT,FAL_AMT,
FILE_ID_RESULT,MD5_RESULT,CUSTOMER_ID,DISK_DESC DISK_MESSAGE,TM_SMP FROM CAPDSKINF
WHERE dsk_sts in ('1','9') and DSK_NAM = ? for update skip locked
</Sentence>
<Fields>DSK_NAM|</Fields>
</DynSentence>
<DynSentence name="SUM_CAPTXNJNL">
<Sentence>
select sum(SUCC_TXN_CNT) SUCC_TXN_CNT,
sum(SUCC_TXN_AMT)*100 SUCC_TXN_AMT,
sum(FAIL_TXN_CNT) FAIL_TXN_CNT,
sum(FAIL_TXN_AMT)*100 FAIL_TXN_AMT
from (select
(case when TXN_STS = 'S' then 1 else 0 end) SUCC_TXN_CNT,
(case when TXN_STS = 'S' then TXN_AMT else 0 end) SUCC_TXN_AMT,
(case when TXN_STS = 'F' then 1 else 0 end) FAIL_TXN_CNT,
(case when TXN_STS = 'F' then TXN_AMT else 0 end) FAIL_TXN_AMT
from CAPTXNJNL WHERE DSK_NAM = ? AND ORD_DT = ?)
</Sentence>
<Fields>DSK_NAM|ORD_DT|</Fields>
</DynSentence>
<Function name="_before">
<Process>
<!-- 应用加锁,防止并发 -->
<!--Set>LockKey=BAT_GET_DISK_RESULT</Set>
<Exec func="PUB:Lock">
<Arg name="RecKey" value="$LockKey" error="IGNORE"/>
<Arg name="TimOut" value="1800"/>
<Arg name="AutoUnlock" value="no"/>
</Exec>
<If condition="~RetCod!=0">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=加锁失败</Set>
<Exit/>
</If>
<Set>IS_LOCKED=TRUE</Set-->
</Process>
</Function>
<Function name="_after">
<Process>
<!--If condition="IS_EQUAL_STRING($IS_LOCKED,TRUE)"-->
<!--解锁-->
<!--Exec func="PUB:UnLock">
<Arg name="RecKey" value="$LockKey"/>
</Exec>
</If-->
</Process>
</Function>
<FlowCtrl>
<Quote name="Init_CAP01"/> <!--交易初始化-->
<Set>DT_BEFER=CALCDATE(GETDATE(),-,d,7)</Set>
<Exec func="PUB:QueryInGroup" error="IGNORE" desc="查询待处理交易">
<Arg name="SqlCmd" value="QryBatLst" /> <!-- SQL -->
<Arg name="Limit" value="20" /> <!-- 每页多少行 -->
<Arg name="RecordName" value="REC" />
</Exec>
<If condition="~RetCod=2">
<Return/>
</If>
<ElseIf condition="~RetCod&lt;0">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=查询数据库错误</Set>
<Return/>
</ElseIf>
<Set>RecNo=0</Set>
<Set>FLG=0</Set>
<While condition="INTCMP($RecNo,1,$REC_NUM)">
<Set>RecNo=ADD($RecNo,1)</Set>
<Set>DSK_NAM=$REC[_$RecNo].DSK_NAM</Set>
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_CAPDSKINF_DSK_NAM"/>
</Exec>
<If condition="~RetCod=2">
<Continue />
</If>
<ElseIf condition="~RetCod=0">
<Set>FLG=1</Set>
<Break/>
</ElseIf>
<Else>
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=查询数据库错误</Set>
<Return/>
</Else>
</While>
<If condition="IS_EQUAL_STRING($FLG,0)">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=无需要处理的记录</Set>
<Return/>
</If>
<!--获取TOKEN-->
<Exec func="PUB:PARAM_GRP_GET" error="IGNORE">
<Arg name="ParamNam" value="CAPPARAMTER"/>
<Arg name="KeyNam" value="FIL_TOKEN"/>
<Arg name="GrpNam" value="CLOUD_SHIELD"/>
</Exec>
<Set>FIL_TOKEN=$CLOUD_SHIELD.P_VALUES</Set>
<Exec func="PUB:PARAM_GRP_GET" error="IGNORE">
<Arg name="ParamNam" value="CAPPARAMTER"/>
<Arg name="KeyNam" value="FIL_TOKEN_URL"/>
<Arg name="GrpNam" value="URL"/>
</Exec>
<Set>FIL_TOKEN_URL=$URL.P_VALUES</Set>
<!--统计成功笔数、失败笔数,成功金额,失败金额-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="SUM_CAPTXNJNL"/>
</Exec>
<If condition="~RetCod!=0">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=数据库错误</Set>
<Break/>
</If>
<Set>ORN_AMT1=AMTPOWER($ORN_AMT,2)</Set>
<Set>ORN_AMT2=ADD($SUCC_TXN_AMT,$FAIL_TXN_AMT)</Set>
<Set>ORN_CNT2=ADD($SUCC_TXN_CNT,$FAIL_TXN_CNT)</Set>
<If condition="OR(INTCMP($ORN_AMT1,4,$ORN_AMT2),INTCMP($ORN_CNT,4,$ORN_CNT2))">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=批次未完成</Set>
<Break/>
</If>
<Else>
<Set>SUC_CNT=$SUCC_TXN_CNT</Set>
<Set>SUC_AMT=FDIV($SUCC_TXN_AMT,100,2)</Set>
<Set>FAL_CNT=$FAIL_TXN_CNT</Set>
<Set>FAL_AMT=FDIV($FAIL_TXN_AMT,100,2)</Set>
</Else>
<!--更新批次状态为已完成(终态)-->
<Exec func="PUB:ExecSql" error="IGNORE">
<Arg name="SqlCmd" value="UpdCapdskinf2"/>
</Exec>
<If condition="~RetCod&lt;0">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg="数据库错误"</Set>
<Break/>
</If>
<!--所有参数由节点RTR_IN传进路由-->
<Set>RTR_IN.DSK_NAM=$DSK_NAM</Set>
<!--生成文件-->
<Call package="DISKRESULLT" function="GET_DISK_RESULT_FILE">
<Input>RTR_IN</Input>
<Output>MSG_CD|RTR_OUT</Output>
</Call>
<If condition="SUBSTR(@O.MSG_CD,4,5)!=00000">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=文件生成失败</Set>
<Break/>
</If>
<Set>MD5_RESULT=@O.RTR_OUT.MD5</Set>
<Set>ZIP_FIL_NAME=@O.RTR_OUT.ZIP_FIL_NAME</Set><!--压缩文件-->
<Set>END_TM=GETDATETIME(HHMISS)</Set> <!-- 交易时间 -->
<Set>END_DT=GETDATE()</Set> <!-- 交易日期 -->
<!--调用文件上传接口-->
<Exec func="CTG:uploadFile">
<Arg name="token" value="$FIL_TOKEN"/>
<Arg name="url" value="$FIL_TOKEN_URL"/>
<Arg name="filePath" value="$ZIP_FIL_NAME"/>
</Exec>
<If condition="~RetCod!=0">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg="系统异常"</Set>
<Break/>
</If>
<Set>FILE_ID=$OUT_DAT.FILE_ID</Set>
<If condition="ISNULL($FILE_ID)=1">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg=送盘文件上传失败</Set>
<Set>EVENT.DSK_NO=$DSK_NAM</Set>
<Set>EVENT.ERR_MSG=文件上传失败</Set>
<Set>EVENT.FID=$ZIP_FIL_NAME</Set>
<Set>EVT_TYP=EVT_DFS_UPLOAD_FAILURE</Set>
<Exec func="PUB:InvokeService" error="IGNORE">
<Arg name="ServiceName" value="PUSH_EVENT"/>
<Arg name='Mode' value='NOTIFY'/>
</Exec>
<Return/>
</If>
<!--更新批次状态为已完成(终态)-->
<Exec func="PUB:ExecSql" error="IGNORE">
<Arg name="SqlCmd" value="UpdCapdskinf"/>
</Exec>
<If condition="~RetCod&lt;0">
<Set>Rsp_Cd=80</Set>
<Set>Rsp_Msg="数据库错误"</Set>
<Break/>
</If>
<Set>DSK_STS=4</Set>
<Exec func="PUB:CommitWork"/>
<!--调用HRO送盘接口-->
<Set>DISK_NO=$DSK_NO</Set>
<If condition="IS_EQUAL_STRING($DSK_STS,9)">
<Set>DISK_STS=4</Set>
</If>
<ElseIf condition="IS_EQUAL_STRING($DSK_STS,4)">
<Set>DISK_STS=3</Set>
</ElseIf>
<Else>
<Set>DISK_STS=2</Set>
</Else>
<Set>DISK_MESSAGE=$DISK_MESSAGE</Set>
<Set>LAST_DATE=SUBSTR($TM_SMP,0,8)</Set>
<Set>LAST_TIME=SUBSTR($TM_SMP,9,6)</Set>
<Set>TOTAL_COUNT=$ORN_CNT</Set>
<Set>TOTAL_AMOUNT=FMUL($ORN_AMT,100,0)</Set>
<Set>SUCC_COUNT=$SUC_CNT</Set>
<Set>SUCC_AMOUNT=FMUL($SUC_AMT,100,0)</Set>
<Set>FAIL_COUNT=$FAL_CNT</Set>
<Set>FAIL_AMOUNT=FMUL($FAL_AMT,100,0)</Set>
<Set>FILE_PATH=$FILE_ID</Set>
<Set>MD5=$MD5_RESULT</Set>
<!--风控累计金额去除失败的部分-->
<Set>TXN_DT=$ORD_DT</Set>
<Set>TXN_AMT=FDIV($FAIL_AMOUNT,100,2)</Set>
<Set>TXN_COUNT=$FAIL_COUNT</Set>
<Set>CUSTOMER_ID=$CUSTOMER_ID</Set>
<Call package="SUMLMTRLR" function="DEL_SUMLMTRLR">
<Input>TXN_DT|TXN_AMT|TXN_COUNT|CUSTOMER_ID</Input>
<Output>MSG_CD|RTR_OUT</Output>
</Call>
<!--调用HRO送盘接口-->
<Exec func="PUB:CallThirdComm" error="IGNORE">
<Arg name="HTxnCd" value="diskNotify"/>
<Arg name="ObjSvr" value="SCAHRO3"/>
</Exec>
<!--删除关键域避免重复-->
<Delete>DISK_NO</Delete>
<Delete>DISK_STS</Delete>
<Delete>DISK_MESSAGE</Delete>
<Delete>LAST_DATE</Delete>
<Delete>LAST_TIME</Delete>
<Delete>TOTAL_COUNT</Delete>
<Delete>TOTAL_AMOUNT</Delete>
<Delete>SUCC_COUNT=</Delete>
<Delete>SUCC_AMOUNT</Delete>
<Delete>FAIL_COUNT</Delete>
<Delete>FAIL_AMOUNT</Delete>
<Delete>FILE_PATH</Delete>
<Delete>MD5</Delete>
<Delete>MD5_RESULT</Delete>
<Delete>END_TM</Delete>
<Delete>END_DT</Delete>
<Delete>OUT_DAT</Delete>
<Set>Rsp_Cd=00</Set>
<Set>Rsp_Msg=交易成功</Set>
</FlowCtrl>
</Transaction>
</Tran>