存管系统小结(改造):

2023-10-27 21:59
文章标签 系统 小结 改造 存管

本文主要是介绍存管系统小结(改造):,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.全资管理财系统存管接入:

    1.总体思路:

        业务系统现已实现标准版(公司结算系统),存管版(民泰银行存管)两种模式的存管系统,系统通过配置文件的形式识别当前的交易模式。----代码在一个分支中开发,实现多配置切换。

    2.功能页面:

        功能页面影响主要有

            2.1. 功能菜单不同,例如标准版有些菜单有,存管有些没有

            2.2. 页面元素不同,比如有些按钮在标准版可以展示,在存管中不展示

            2.3. 页面交互,数据项的控制不同,比如标准支持T+0,存管支持T+1

        对于第1,2两项:

            可通过两套菜单实现,前端只需识别当前的交易模式,并获取对应的菜单,交互图如下:

            104631_dYCU_3110937.png        

        对于第3:

        可采用模板页面的方式,将同一功能的差异化实现,分写到两个或多个模板页面中,加载页面时按需加载

104848_XQYV_3110937.png 

loadModal: function (selector, url, title, callback){$.ajax({"url" : "pages/"+url,method : "get","async" : false,success : function(html){$(selector).html(html);var _title = title ? title : $(selector + " .modal-title").html();$(selector + " .modal").modal({backdrop: 'static'}).find('.modal-title').html(_title);callback();}});},

 

    3.接口方案:

        目前系统中接口分三类:

            3.1 前端用户使用的接口(app端)

            3.2 后台管理系统所需的接口

            3.3 接收结算回调通知的接口    

    本次存管适配中,三类接口都将有所调整,考虑到兼容性,对于存管的适配,在接口前添加depository的标识

    例如:修改密码:

        标准版:POST mimosa/client/investor/baseaccount/editpaypwd

        存管版:POST mimosa/depository/client/investor/baseaccount/editpaypwd

 

    4.代码结构:

        在后台业务代码中,对需要差异化实现的功能,抽提出公共的接口,采用多实现类的方式来实现标准版和存管版的不同逻辑处理

        如下:

        105531_IXOT_3110937.png

        此实现类在实例化的时候,通过springboot的自动装配@Condition实现选择性实例化,如下:

#application.properties配置项
trade.mode=depository/*** Description:交易模式匹配器-存管版* @author ddyin* @date 2017/12/7*/
public class TradeModeDepositoryCondition implements Condition{@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {return conditionContext.getEnvironment().getProperty("trade.mode").contains("depository");}
}/*** Description:交易模式匹配器-标准版** @author ddyin* @date 2017/12/7*/
public class TradeModeStandardCondition implements Condition{@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {return conditionContext.getEnvironment().getProperty("trade.mode").contains("standard");}
}public interface UserInterface {public void say();
}/*** Description:用户服务-标准版实现** @author ddyin* @date 2017/12/7*/
@Service
@Conditional(value = TradeModeStandardCondition.class)
public class UserSettlementImpl implements UserInterface{@Overridepublic void say() {System.out.println("11111111");}
}/*** Description:用户服务-存管版实现** @author ddyin* @date 2017/12/7*/
@Service
@Conditional(value = TradeModeDepositoryCondition.class)
public class UserDepositoryImpl implements UserInterface{@Overridepublic void say() {System.out.println("2222222");}
}

            

    5.交互流程;

        由于对接存管后,交易密码的存储和校验需要跳转到存管系统页面来操作,且交易的提交需要传递密码校验通过后的密文。

        故,涉及交易密码的功能,在系统交互上会增加交互步骤,以申购为例,系统通讯图如下:

110431_tIur_3110937.png

 

            5.1 第三步申购信息的缓存,生成一个UUID作为key,请求参数作为value存入redis中

            5.2 第四步传递的callbackurl带上key,业务系统提供统一的密码交易通知接口

            5.3 第八步获取传回的key,从redis取请求参数(即请求参数存redis)

    6.功能设计:

        6.1 实名绑卡

            需要跳转存管页面的功能包含:

                实名绑卡,交易密码修改,交易密码重置,交易密码确认(跟随业务操作跳转)

            以下跳转是需要输入交易密码:

                充值,体现,申购,赎回,还款(发行人和融资人)

            以绑卡为例:

111729_QuBd_3110937.png

 

        以申购为例描述序列流程:

111815_8LQs_3110937.png

 

        6.2 标的的建立和标的的结标:

            在业务流程上通过埋点的方式调用存管接口,无设计上的变更。

                6.2.1 标的的建立----埋点在产品审核通过

                6.2.2 标的的结标----埋点在产品清算状态变更

        6.3 轧差:

            6.3.1 将活期和定期分开轧差处理

                活期轧差继续使用t_money_platform_publisher_offset以时间批次,产品维度进行轧差

                定期轧差继续使用t_money_platform_publisher_product_offset以产品编号维度轧差处理

            6.3.2 份额确认结算合并之份额确认结算---流程如下:

114009_cITn_3110937.png

            6.3.3 份额确认结算合并之份额确认不退款

114245_iXsc_3110937.png

 

    7.接口设计:

        7.1 实名绑卡:

请求路径:/mimosa/depository/client/investor/baseaccount/bindcardapply

            7.1.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

realName

用户名

String(32)

 

非空

48293819282382

certificateNo

身份证号

String(32)

 

非空

410101199109091234

bankName

银行名称

String(32)

 

非空

中国银行

cardNo

银行卡号

String(32)

 

非空

234589987653456

phone

手机号

String(32)

 

非空

15029203949

bankBranchNo

开户行行号

String(32)

 

非空

 

bankBranchName

开户行名称

String(50)

 

非空

 

callbackUrl

页面回跳URL

String(1000)

 

非空

 
            7.1.2 响应

参数

参数名称

类型

参数说明

是否可空

样例

errorCode

错误码

String(32)

 

非空

 

errorMessage

错误描述

String(1000)

 

可空

 

redirectUrl

跳转URL

String(1000)

 

非空

http://ip/xxx.do

            

        7.2 修改交易密码:

请求路径:/mimosa/depository/client/investor/baseaccount/editpaypwd

            7.2.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

callbackUrl

页面回跳URL

String(1000)

 

非空

 
            7.2.2 响应

参数

参数名称

类型

参数说明

是否可空

样例

errorCode

错误码

String(32)

 

非空

 

errorMessage

错误描述

String(1000)

 

可空

 

redirectUrl

跳转URL

String(1000)

 

非空

http://ip/xxx.do

        7.3 重置交易密码:

请求路径:/mimosa/depository/client/investor/baseaccount/forgetpaypwd

            7.3.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

callbackUrl

页面回跳URL

String(1000)

 

非空

 
            7.3.2 响应

参数

参数名称

类型

参数说明

是否可空

样例

errorCode

错误码

String(32)

 

非空

 

errorMessage

错误描述

String(1000)

 

可空

 

redirectUrl

跳转URL

String(1000)

 

非空

http://ip/xxx.do

 

        7.4 申购:

请求路径:/mimosa/depository/client/tradeorder/invest

            7.4.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

productOid

产品oid

String(32)

 

非空

3ef6a51a78e84cb588a78a478a74d008

moneyVolume

投资额度

String(32)

 

非空

3000

cid

渠道cId

String(32)

 

非空

123456

ckey

渠道ckey

String(32)

 

非空

123456

couponId

卡券OId

String(32)

 

非空

3ef6a51a78e84cb588a78a478a74d008

couponType

卡券类型

String(32)

 

非空

 

couponDeductibleAmount

卡券优惠金额

String(32)

 

非空

200

couponAmount

卡券金额

String(32)

 

非空

200

payAmouont

实际支付金额

String(32)

 

非空

2800

            7.4.2 响应

参数

参数名称

类型

参数说明

是否可空

样例

errorCode

错误码

String(32)

 

非空

 

errorMessage

错误描述

String(1000)

 

可空

 

redirectUrl

跳转URL

String(1000)

 

非空

http://ip/xxx.do

      

        7.5 赎回:

请求路径:/mimosa/depository/client/tradeorder/redeem

            7.5.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

productOid

产品oid

String(32)

 

非空

3ef6a51a78e84cb588a78a478a74d008

orderAmount

赎回金额

String(32)

 

非空

3000

cid

渠道cid

String(32)

 

非空

123456

ckey

渠道ckey

String(32)

 

非空

123456

            7.5.2 响应

参数

参数名称

类型

参数说明

是否可空

样例

errorCode

错误码

String(32)

 

非空

 

errorMessage

错误描述

String(1000)

 

可空

 

redirectUrl

跳转URL

String(1000)

 

非空

http://ip/xxx.do

 

        7.6 接收存管跳转地址:

请求路径:/mimosa/depository/boot/callback     

            7.6.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

tradeCode

交易编码

String(32)

 

非空

invest、redeem、deposit、withdraw

key

交易标识

String(32)

 

非空

1h843vgf3234jgffg3234332

            7.6.2 响应

                        HTML

        7.7 后台查询交易模式:

请求路径:GET /mimosa/boot/config/tradeMode

            7.7.1 请求

参数

参数名称

类型

参数说明

是否可空

样例

     
            7.7.2. 响应

参数

参数名称

类型

参数说明

是否可空

样例

errorCode

错误码

String(32)

 

非空

 

errorMessage

错误描述

String(1000)

 

可空

 

tradeMode

交易模式

String(32)

 

非空

standard标准版

depository存管版

        

 

二.存管兼容需求:(存管化需求)

    1.总原则:

        1.1 部署到存管方时,去除不适宜的部分,页面上不显示,具体查看上面文档内容

        1.2 App内充值仅开放:线下充值不在我们的app功能覆盖范围内

        1.3 mimosa后台给发行人充值仅开放:网银充值和线下入金确认,其中网银充值会有待核销金额问题,只影响发行人的可提现金额,普通个人投资者没有这个问题

        1.4 不支持T+0产品,不支持活转定,不支持续投,T+0可通过输入0来控制,活转定和续投只需app端没有入口即可

        1.5 mimosa后台添加的发行人是机构会员,app端注册的投资者天然是个人会员,机构会员不支持投资,个人会员不支持募资,在注册的时候,上传会员类型需要写死,包括绑卡走不同的流程

        1.6 平台子账号涉及的事件归属:

子账户类型

事件

投资冻结子账户

申购;

退款(募集失败);

放款;

充值补单;

还款冻结子账户

赎回;

清盘赎回;

还本付息;

现金分红;

还款;

充值补单;

收益子账户

提现(平台服务费);

转出;

充值补单;

红包子账户

申购(代金券);

退款(代金券);

转出;

充值补单;

佣金子账户

现金红包;

赎回(体验金收益);

还本付息(加息券收益);

返佣;

充值补单;

    2.平台页面更改:(仅存管部署,基线仍保留原有平台逻辑)

            场景:由于存管系统给平台子账户充值都是直接充值,而xx系统给基本账户充值,再转账给备付金;存管系统没有平台基本户,但有投资冻结户,还款冻结户

    3.轧差逻辑变更:(轧差逻辑和流程调整到基线,存管和基线由于账户设置不同,在登账事件上会有不同,面向存管时,登账时间需要单独一套)

 

 

 

 

三.理财前端适应存管需求改造方案:

        1.改造对应的原型:

https://pqdsox.axshare.com/#g=1&p=%E6%88%91%E7%9A%84__%E4%B8%89%E6%96%B9%E5%AD%98%E7%AE%A1_

        2.存管方案中,充值投资前需要开设存管账户,充值提现等交易资金结算通过第三方存管机构完成。

        3.存管开户流程,所需资料,对接方式需要根据三方存管要求进行配置,这里对接民泰银行

        开设民泰银行账户时,存管开户,绑定银行卡,设置交易密码一起完成,原有方案任务之前的准备中的认证绑卡修改为存管开户,平台投资操作流程如下:

094452_dNc4_3110937.png

 

投资者资金资产流转如下图:

095214_V3TM_3110937.png

 

4.存管需求对理财端前端的影响主要体现在:

    4.1 注册:

注册成功后的页面,准备投资按钮调整成跳转存管页面进行开户,引导注册成功用户进行开户操作。

 

    4.2 存管开户:

存管开户有两种对接方式:

        4.2.1 对接三方页面,直接跳转存管页面进行开户(民泰银行)。

        4.2.2 对接存管的数据接口,在平台页面提交开户所有资料。

民泰银行选择第一种对接方式,跳转民泰银行存管开户页面,开户提交后返回平台结果页,开户成功后引导用户充值和风险测评,失败则提示失败原因,并支持用户重复开户。

根据三方存管银行接口或者平台的特殊需求,存管开户分两套模板来适应不同的客户需求,一种是上传身份证照片,一种是不需要上传身份证照片。

            4.2.2.1 需上传身份证照片:存管开户时增加身份证上传页面显示,要求拍照上传身份证正反面照片,上传成功之后保存图片并进入绑卡页面,根据用户已上传身份证件OCR识别出的信息进行回显,姓名允许编辑身份证号不允许编辑

            4.2.2.2 无需上传身份证照片:存管开户时不显示身份证上传页面,身份认证与绑卡一步完成,允许手动输入或图像扫描两种形式录入身份证和银行卡信息,通过相机扫描身份证和银行卡信息时只识别提取信息,不保存图像。

 

    4.3 交易验证:    

        4.3.1 充值、提现、申购、赎回交易流程中,交易密码到三方存管页面进行输入,提交后返回平台页面,根据三方返回验证结果进行处理,验证通过后生成订单并根据订单处理结果则进入结果提示页,验证失败则不生成订单,增加验证失败提示页,并允许用户重新输入交易密码或重新发起交易。

        4.3.2充值不再需要校验短信验证码,取消短信验证码环节,提交充值之后直接跳转至三方存管页面输入交易密码,密码验证通过后充值订单提交成功。

 

    4.4 提现:

        提现提交成功页面,提现到账时间根据对接的第三方存管机构提现到账情况进行显示,如T+0时显示1个工作日内,T+1显示2个工作日内。

 

    4.5 设置:

        我的银行卡一栏显示修改为“存管账户”,未开通存管账户时,显示“去开通”,点击进入存管开户页面;已完成存管开户时,显示“已开通”,点击进入银行卡管理页面,银行卡管理页面显示与平台存管方案一样。

存管账户多卡绑定和解绑卡的需求与平台存管一致,银行卡在解除绑定之后不影响已开通的存管账户,如需投资引导用户至绑卡流程,要求重新绑卡,不需要再走投资前准备流程,充值和提现也一样。

交易密码一栏在未开通存管账户之前默认显示“去设置”,点击进入存管开户页面。存管账户开通之后显示“重置”,点击进入存管银行对应流程页。

 

    4.6 资产统计:

            存管方案中,投资订单的份额确认和结算合并处理,对于投资者来说不存在已份额确认未结算的情况,因此原方案中记录此阶段资金的“在途资金”去掉,赎回、退款、还本付息确认成功后直接增加投资者可用余额;

投资人提现由存管银行进行处理,无需平台审核,不存在提现冻结金额,因此原方案中的“提现冻结金额”去掉,提现提交成功之后直接扣减可用余额。

总资产=可用余额+持有活期+持有定期+申请中资产

 

存管方案APP原型变更:https://pqdsox.axshare.com

转载于:https://my.oschina.net/u/3110937/blog/1633277

这篇关于存管系统小结(改造):的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/288681

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Ollama Python 使用小结

《OllamaPython使用小结》Ollama提供了PythonSDK,使得开发者能够在Python环境中轻松集成和使用本地运行的模型进行自然语言处理任务,具有一定的参考价值,感兴趣的可以了解一... 目录安装 python SDK启动本地服务使用 Ollama 的 Python SDK 进行推理自定义客

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用