金融宝

编程入门 行业动态 更新时间:2024-10-24 15:19:27

<a href=https://www.elefans.com/category/jswz/34/1770046.html style=金融宝"/>

金融宝

管理端显示投资记录

一、后端接口

1、Controller

创建 AdminLendItemController

@Api(tags = "标的的投资")
@RestController
@RequestMapping("/admin/core/lendItem")
@Slf4j
public class AdminLendItemController {@Resourceprivate LendItemService lendItemService;@ApiOperation("获取列表")@GetMapping("/list/{lendId}")public R list(@ApiParam(value = "标的id", required = true)@PathVariable Long lendId) {List<LendItem> list = lendItemService.selectByLendId(lendId);return R.ok().data("list", list);}
}

2、Service

接口:LendItemService

List<LendItem> selectByLendId(Long lendId);

实现:LendItemServiceImpl

@Override
public List<LendItem> selectByLendId(Long lendId) {QueryWrapper<LendItem> queryWrapper = new QueryWrapper();queryWrapper.eq("lend_id", lendId);List<LendItem> lendItemList = baseMapper.selectList(queryWrapper);return lendItemList;
}

二、前端

1、创建api

api/core/lend-item.js

import request from '@/utils/request'export default {getList(lendId) {return request({url: `/admin/core/lendItem/list/` + lendId,method: 'get'})}
}

2、页面脚本

views/core/lend/detail.vue

import lendItemApi from '@/api/core/lend-item'
data() {return {......,lendItemList: [] //投资列表}
},created() {if (this.$route.params.id) {......// 投资记录this.fetchLendItemList()}
},
methods
fetchLendItemList() {lendItemApi.getList(this.$route.params.id).then(response => {this.lendItemList = response.data.list})
}

3、页面模板

views/core/lend/detail.vue
将投资记录放在借款人信息后面

<h4>投资记录</h4>
<el-table :data="lendItemList" stripe style="width: 100%" border><el-table-column type="index" label="序号" width="70" align="center" /><el-table-column prop="lendItemNo" label="投资编号" /><el-table-column prop="investName" label="投资用户" /><el-table-column prop="investAmount" label="投资金额" /><el-table-column label="年化利率"><template slot-scope="scope">{{ scope.row.lendYearRate * 100 }}%</template></el-table-column><el-table-column prop="investTime" label="投资时间" /><el-table-column prop="lendStartDate" label="开始日期" /><el-table-column prop="lendEndDate" label="结束日期" /><el-table-column prop="expectAmount" label="预期收益" /><el-table-column prop="investTime" label="投资时间" />
</el-table>

网站端显示投资记录

一、后端接口

Controller
LendItemController

@ApiOperation("获取列表")
@GetMapping("/list/{lendId}")
public R list(@ApiParam(value = "标的id", required = true)@PathVariable Long lendId) {List<LendItem> list = lendItemService.selectByLendId(lendId);return R.ok().data("list", list);
}

二、前端

页面脚本
pages/lend/_id.vue

async asyncData({ $axios, params }) {......//投资记录let responseLendItemList = await $axios.$get('/api/core/lendItem/list/' + lendId)return {......,lendItemList: responseLendItemList.data.list, //投资记录}
},

管理端显示还款计划

一、后端接口

1、Controller

创建AdminLendReturnController

@Api(tags = "还款记录")
@RestController
@RequestMapping("/admin/core/lendReturn")
@Slf4j
public class AdminLendReturnController {@Resourceprivate LendReturnService lendReturnService;@ApiOperation("获取列表")@GetMapping("/list/{lendId}")public R list(@ApiParam(value = "标的id", required = true)@PathVariable Long lendId) {List<LendReturn> list = lendReturnService.selectByLendId(lendId);return R.ok().data("list", list);}
}

2、Service

接口:LendReturnService

List<LendReturn> selectByLendId(Long lendId);

实现:LendReturnServiceImpl

@Override
public List<LendReturn> selectByLendId(Long lendId) {QueryWrapper<LendReturn> queryWrapper = new QueryWrapper();queryWrapper.eq("lend_id", lendId);List<LendReturn> lendReturnList = baseMapper.selectList(queryWrapper);return lendReturnList;
}

二、前端

1、创建api

api/core/lend-return.js

import request from '@/utils/request'export default {getList(lendId) {return request({url: `/admin/core/lendReturn/list/` + lendId,method: 'get'})}
}

2、页面脚本

views/core/lend/detail.vue

import lendReturnApi from '@/api/core/lend-return'
data() {return {......,lendReturnList: [] //还款计划列表}
},created() {if (this.$route.params.id) {......// 还款计划this.fetchLendReturnList()}
},
methods
fetchLendReturnList() {lendReturnApi.getList(this.$route.params.id).then(response => {this.lendReturnList = response.data.list})
}

3、页面模板

views/core/lend/detail.vue
将还款计划放在投资记录后面

<h4>还款计划</h4>
<el-table :data="lendReturnList" stripe style="width: 100%" border><el-table-column type="index" label="序号" width="70" align="center" /><el-table-column prop="currentPeriod" label="当前的期数" /><el-table-column prop="principal" label="本金" /><el-table-column prop="interest" label="利息" /><el-table-column prop="total" label="本息" /><el-table-column prop="returnDate" label="还款日期" width="150" /><el-table-column prop="realReturnTime" label="实际还款时间" /><el-table-column label="是否逾期"><template slot-scope="scope"><span v-if="scope.row.overdue">是(逾期金额:{{ scope.row.overdueTotal }}元)</span><span v-else>否</span></template></el-table-column><el-table-column label="状态" width="80"><template slot-scope="scope">{{ scope.row.status === 0 ? '未还款' : '已还款' }}</template></el-table-column>
</el-table>

网站端显示还款计划

一、后端接口

Controller
创建 LendReturnController

@Api(tags = "还款计划")
@RestController
@RequestMapping("/api/core/lendReturn")
@Slf4j
public class LendReturnController {@Resourceprivate LendReturnService lendReturnService;@ApiOperation("获取列表")@GetMapping("/list/{lendId}")public R list(@ApiParam(value = "标的id", required = true)@PathVariable Long lendId) {List<LendReturn> list = lendReturnService.selectByLendId(lendId);return R.ok().data("list", list);}
}

二、前端

页面脚本
pages/lend/_id.vue

async asyncData({ $axios, params }) {......//还款计划let responseLendReturnList = await $axios.$get('/api/core/lendReturn/list/' + lendId)return {......,lendReturnList: responseLendReturnList.data.list, //还款计划}
},

一、后端接口

Controller
创建 LendItemReturnController

@Api(tags = "回款计划")
@RestController
@RequestMapping("/api/core/lendItemReturn")
@Slf4j
public class LendItemReturnController {@Resourceprivate LendItemReturnService lendItemReturnService;@ApiOperation("获取列表")@GetMapping("/auth/list/{lendId}")public R list(@ApiParam(value = "标的id", required = true)@PathVariable Long lendId, HttpServletRequest request) {String token = request.getHeader("token");Long userId = JwtUtils.getUserId(token);List<LendItemReturn> list = lendItemReturnService.selectByLendId(lendId, userId);return R.ok().data("list", list);}
}

2、Service

接口:LendItemReturnService

List<LendItemReturn> selectByLendId(Long lendId, Long userId);

实现:LendItemReturnServiceImpl

@Override
public List<LendItemReturn> selectByLendId(Long lendId, Long userId) {QueryWrapper<LendItemReturn> queryWrapper = new QueryWrapper<>();queryWrapper.eq("lend_id", lendId).eq("invest_user_id", userId).orderByAsc("current_period");return baseMapper.selectList(queryWrapper);
}

二、前端

1、页面脚本

pages/lend/_id.vue

data() {return {......,lendItemReturnList: [], //回款计划}
},mounted() {......//回款计划this.fetchLendItemReturnList()
},
methods
//回款计划
fetchLendItemReturnList() {this.$axios.$get('/api/core/lendItemReturn/auth/list/' + this.$route.params.id).then((response) => {this.lendItemReturnList = response.data.list})
},

2、页面模板

pages/lend/_id.vue

<!-- 回款计划 -->
<div class="item-detail-body clearfix mrt30 ui-tab"><div class="ui-tab-nav hd"><ul><li class="nav_li active"><a href="javascript:;">回款计划</a></li></ul></div><div class="bd"><div class="ui-tab-item active" style="display: block;"><div class="repayment-list"><table border="0" cellpadding="0" cellspacing="0" width="100%"><thead><tr><th>期数</th><th>本金(元)</th><th>利息(元)</th><th>本息(元)</th><th>计划回款日期</th><th>实际回款日期</th><th>状态</th><th>是否逾期</th></tr></thead><tbody id="repayment_content"><trv-for="lendItemReturn in lendItemReturnList":key="lendItemReturn.id"><td>{{ lendItemReturn.currentPeriod }}</td><td class="c-orange">¥{{ lendItemReturn.principal }}</td><td class="c-orange">¥{{ lendItemReturn.interest }}</td><td class="c-orange">¥{{ lendItemReturn.total }}</td><td>{{ lendItemReturn.returnDate }}</td><td>{{ lendItemReturn.realReturnTime }}</td><td>{{ lendItemReturn.status === 0 ? '未还款' : '已还款' }}</td><td><span v-if="lendItemReturn.overdue">是(逾期金额:{{ lendReturn.overdueTotal }}元)</span><span v-else>否</span></td></tr></tbody></table></div></div></div>
</div>

提现

一、前端整合

pages/user/withdraw.vue

<script>
export default {data() {return {fetchAmt: 0,}},methods: {commitWithdraw() {this.$alert('<div style="size: 18px;color: red;">您即将前往汇付宝提现</div>','前往汇付宝资金托管平台',{dangerouslyUseHTMLString: true,confirmButtonText: '立即前往',callback: (action) => {if (action === 'confirm') {this.$axios.$post('/api/core/userAccount/auth/commitWithdraw/' + this.fetchAmt).then((response) => {document.write(response.data.formStr)})}},})},},
}
</script>

二、提现接口

1、Controller

UserAccountController

@ApiOperation("用户提现")
@PostMapping("/auth/commitWithdraw/{fetchAmt}")
public R commitWithdraw(@ApiParam(value = "金额", required = true)@PathVariable BigDecimal fetchAmt, HttpServletRequest request) {String token = request.getHeader("token");Long userId = JwtUtils.getUserId(token);String formStr = userAccountServicemitWithdraw(fetchAmt, userId);return R.ok().data("formStr", formStr);
}

2、Service

接口:UserAccountService

String commitWithdraw(BigDecimal fetchAmt, Long userId);

实现:UserAccountServiceImpl

@Resource
private UserBindService userBindService;@Resource
private UserAccountService userAccountService;@Override
public String commitWithdraw(BigDecimal fetchAmt, Long userId) {//账户可用余额充足:当前用户的余额 >= 当前用户的提现金额BigDecimal amount = userAccountService.getAccount(userId);//获取当前用户的账户余额Assert.isTrue(amount.doubleValue() >= fetchAmt.doubleValue(),ResponseEnum.NOT_SUFFICIENT_FUNDS_ERROR);String bindCode = userBindService.getBindCodeByUserId(userId);Map<String, Object> paramMap = new HashMap<>();paramMap.put("agentId", HfbConst.AGENT_ID);paramMap.put("agentBillNo", LendNoUtils.getWithdrawNo());paramMap.put("bindCode", bindCode);paramMap.put("fetchAmt", fetchAmt);paramMap.put("feeAmt", new BigDecimal(0));paramMap.put("notifyUrl", HfbConst.WITHDRAW_NOTIFY_URL);paramMap.put("returnUrl", HfbConst.WITHDRAW_RETURN_URL);paramMap.put("timestamp", RequestHelper.getTimestamp());String sign = RequestHelper.getSign(paramMap);paramMap.put("sign", sign);//构建自动提交表单String formStr = FormHelper.buildForm(HfbConst.WITHDRAW_URL, paramMap);return formStr;
}

三、回调接口

1、Controller

UserAccountController
@ApiOperation("用户提现异步回调")
@PostMapping("/notifyWithdraw")
public String notifyWithdraw(HttpServletRequest request) {Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());log.info("提现异步回调:" + JSON.toJSONString(paramMap));//校验签名if(RequestHelper.isSignEquals(paramMap)) {//提现成功交易if("0001".equals(paramMap.get("resultCode"))) {userAccountService.notifyWithdraw(paramMap);} else {log.info("提现异步回调充值失败:" + JSON.toJSONString(paramMap));return "fail";}} else {log.info("提现异步回调签名错误:" + JSON.toJSONString(paramMap));return "fail";}return "success";
}

2、Service

接口:UserAccountService

void notifyWithdraw(Map<String, Object> paramMap);

实现:UserAccountServiceImpl

@Transactional(rollbackFor = Exception.class)
@Override
public void notifyWithdraw(Map<String, Object> paramMap) {log.info("提现成功");String agentBillNo = (String)paramMap.get("agentBillNo");boolean result = transFlowService.isSaveTransFlow(agentBillNo);if(result){log.warn("幂等性返回");return;}String bindCode = (String)paramMap.get("bindCode");String fetchAmt = (String)paramMap.get("fetchAmt");//根据用户账户修改账户金额baseMapper.updateAccount(bindCode, new BigDecimal("-" + fetchAmt), new BigDecimal(0));//增加交易流水TransFlowBO transFlowBO = new TransFlowBO(agentBillNo,bindCode,new BigDecimal(fetchAmt),TransTypeEnum.WITHDRAW,"提现");transFlowService.saveTransFlow(transFlowBO);
}

还款

一、前端整合

1、还款按钮

pages/lend/_id.vue

<td><a href="javascript:" @click="commitReturn(lendReturn.id)">{{ lendReturn.status === 0 ? '还款' : '' }}</a>
</td>

2、脚本

pages/lend/_id.vue

commitReturn(lendReturnId) {this.$alert('<div style="size: 18px;color: red;">您即将前往汇付宝确认还款</div>','前往汇付宝资金托管平台',{dangerouslyUseHTMLString: true,confirmButtonText: '立即前往',callback: (action) => {if (action === 'confirm') {this.$axios.$post('/api/core/lendReturn/auth/commitReturn/' + lendReturnId).then((response) => {document.write(response.data.formStr)})}},})
}

二、还款接口

1、Controller

LendReturnController

@ApiOperation("用户还款")
@PostMapping("/auth/commitReturn/{lendReturnId}")
public R commitReturn(@ApiParam(value = "还款计划id", required = true)@PathVariable Long lendReturnId, HttpServletRequest request) {String token = request.getHeader("token");Long userId = JwtUtils.getUserId(token);String formStr = lendReturnServicemitReturn(lendReturnId, userId);return R.ok().data("formStr", formStr);
}

2、Service

接口:LendReturnService

String commitReturn(Long lendReturnId, Long userId);

实现:LendReturnServiceImpl

@Resource
private UserAccountService userAccountService;@Resource
private LendMapper lendMapper;@Resource
private UserBindService userBindService;@Resource
private LendItemReturnService lendItemReturnService;@Transactional(rollbackFor = Exception.class)
@Override
public String commitReturn(Long lendReturnId, Long userId) {//获取还款记录LendReturn lendReturn = baseMapper.selectById(lendReturnId);//判断账号余额是否充足BigDecimal amount = userAccountService.getAccount(userId);Assert.isTrue(amount.doubleValue() >= lendReturn.getTotal().doubleValue(),ResponseEnum.NOT_SUFFICIENT_FUNDS_ERROR);//获取借款人codeString bindCode = userBindService.getBindCodeByUserId(userId);//获取lendLong lendId = lendReturn.getLendId();Lend lend = lendMapper.selectById(lendId);Map<String, Object> paramMap = new HashMap<>();paramMap.put("agentId", HfbConst.AGENT_ID);//商户商品名称paramMap.put("agentGoodsName", lend.getTitle());//批次号paramMap.put("agentBatchNo",lendReturn.getReturnNo());//还款人绑定协议号paramMap.put("fromBindCode", bindCode);//还款总额paramMap.put("totalAmt", lendReturn.getTotal());paramMap.put("note", "");//还款明细List<Map<String, Object>> lendItemReturnDetailList = lendItemReturnService.addReturnDetail(lendReturnId);paramMap.put("data", JSONObject.toJSONString(lendItemReturnDetailList));paramMap.put("voteFeeAmt", new BigDecimal(0));paramMap.put("notifyUrl", HfbConst.BORROW_RETURN_NOTIFY_URL);paramMap.put("returnUrl", HfbConst.BORROW_RETURN_RETURN_URL);paramMap.put("timestamp", RequestHelper.getTimestamp());String sign = RequestHelper.getSign(paramMap);paramMap.put("sign", sign);//构建自动提交表单String formStr = FormHelper.buildForm(HfbConst.BORROW_RETURN_URL, paramMap);return formStr;
}

3、还款明细Service

根据还款id获取回款列表

LendReturnService接口:
List<Map<String, Object>> addReturnDetail(Long lendReturnId);
LendReturnServiceImpl实现:
@Resource
private UserBindService userBindService;@Resource
private LendItemMapper lendItemMapper;@Resource
private LendMapper lendMapper;@Resource
private LendReturnMapper lendReturnMapper;/**
* 添加还款明细
* @param lendReturnId
*/
@Override
public List<Map<String, Object>> addReturnDetail(Long lendReturnId) {//获取还款记录LendReturn lendReturn = lendReturnMapper.selectById(lendReturnId);//获取标的信息Lend lend = lendMapper.selectById(lendReturn.getLendId());//根据还款id获取回款列表List<LendItemReturn> lendItemReturnList = this.selectLendItemReturnList(lendReturnId);List<Map<String, Object>> lendItemReturnDetailList = new ArrayList<>();for(LendItemReturn lendItemReturn : lendItemReturnList) {LendItem lendItem = lendItemMapper.selectById(lendItemReturn.getLendItemId());String bindCode = userBindService.getBindCodeByUserId(lendItem.getInvestUserId());Map<String, Object> map = new HashMap<>();//项目编号map.put("agentProjectCode", lend.getLendNo());//出借编号map.put("voteBillNo", lendItem.getLendItemNo());//收款人(出借人)map.put("toBindCode", bindCode);//还款金额map.put("transitAmt", lendItemReturn.getTotal());//还款本金map.put("baseAmt", lendItemReturn.getPrincipal());//还款利息map.put("benifitAmt", lendItemReturn.getInterest());//商户手续费map.put("feeAmt", new BigDecimal("0"));lendItemReturnDetailList.add(map);}return lendItemReturnDetailList;
}

根据还款计划id获取对应的回款计划列表
接口:

List<LendItemReturn> selectLendItemReturnList(Long lendReturnId);

实现:

@Override
public List<LendItemReturn> selectLendItemReturnList(Long lendReturnId) {QueryWrapper<LendItemReturn> queryWrapper = new QueryWrapper<>();queryWrapper.eq("lend_return_id", lendReturnId);List<LendItemReturn> lendItemReturnList = baseMapper.selectList(queryWrapper);return lendItemReturnList;
}

三、回调接口

1、Controller

LendReturnController

@ApiOperation("还款异步回调")
@PostMapping("/notifyUrl")
public String notifyUrl(HttpServletRequest request) {Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());log.info("还款异步回调:" + JSON.toJSONString(paramMap));//校验签名if(RequestHelper.isSignEquals(paramMap)) {if("0001".equals(paramMap.get("resultCode"))) {lendReturnService.notify(paramMap);} else {log.info("还款异步回调失败:" + JSON.toJSONString(paramMap));return "fail";}} else {log.info("还款异步回调签名错误:" + JSON.toJSONString(paramMap));return "fail";}return "success";
}

2、Service

接口:LendReturnService

void notify(Map<String, Object> paramMap);

实现:LendReturnServiceImpl

@Resource
private TransFlowService transFlowService;@Resource
private UserAccountMapper userAccountMapper;@Resource
private LendItemReturnMapper lendItemReturnMapper;@Resource
private LendItemMapper lendItemMapper;@Transactional(rollbackFor = Exception.class)
@Override
public void notify(Map<String, Object> paramMap) {log.info("还款成功");//还款编号String agentBatchNo = (String)paramMap.get("agentBatchNo");boolean result = transFlowService.isSaveTransFlow(agentBatchNo);if(result){log.warn("幂等性返回");return;}//获取还款数据String voteFeeAmt = (String)paramMap.get("voteFeeAmt");QueryWrapper lendReturnQueryWrapper = new QueryWrapper<LendReturn>();lendReturnQueryWrapper.eq("return_no", agentBatchNo);LendReturn lendReturn = baseMapper.selectOne(lendReturnQueryWrapper);;//更新还款状态lendReturn.setStatus(1);lendReturn.setFee(new BigDecimal(voteFeeAmt));lendReturn.setRealReturnTime(LocalDateTime.now());baseMapper.updateById(lendReturn);//更新标的信息Lend lend = lendMapper.selectById(lendReturn.getLendId());//最后一次还款更新标的状态if(lendReturn.getLast()) {lend.setStatus(LendStatusEnum.PAY_OK.getStatus());lendMapper.updateById(lend);}//借款账号转出金额BigDecimal totalAmt = new BigDecimal((String)paramMap.get("totalAmt"));//还款金额String bindCode = userBindService.getBindCodeByUserId(lend.getUserId());userAccountMapper.updateAccount(bindCode, totalAmt.negate(), new BigDecimal(0));//借款人交易流水TransFlowBO transFlowBO = new TransFlowBO(agentBatchNo,bindCode,totalAmt,TransTypeEnum.RETURN_DOWN,"借款人还款扣减,项目编号:" + lend.getLendNo() + ",项目名称:" + lend.getTitle());transFlowService.saveTransFlow(transFlowBO);//获取回款明细List<LendItemReturn> lendItemReturnList = lendItemReturnService.selectLendItemReturnList(lendReturn.getId());lendItemReturnList.forEach(item -> {//更新回款状态item.setStatus(1);item.setRealReturnTime(LocalDateTime.now());lendItemReturnMapper.updateById(item);//更新出借信息LendItem lendItem = lendItemMapper.selectById(item.getLendItemId());lendItem.setRealAmount(item.getInterest());lendItemMapper.updateById(lendItem);//投资账号转入金额String investBindCode = userBindService.getBindCodeByUserId(item.getInvestUserId());userAccountMapper.updateAccount(investBindCode, item.getTotal(), new BigDecimal(0));//投资账号交易流水TransFlowBO investTransFlowBO = new TransFlowBO(LendNoUtils.getReturnItemNo(),investBindCode,item.getTotal(),TransTypeEnum.INVEST_BACK,"还款到账,项目编号:" + lend.getLendNo() + ",项目名称:" + lend.getTitle());transFlowService.saveTransFlow(investTransFlowBO);});
}

更多推荐

金融宝

本文发布于:2024-02-17 10:24:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693689.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:金融

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!