增加了充值记录页

This commit is contained in:
1215525055@qq.com 2025-08-19 15:26:17 +08:00
parent 4f31892d7c
commit 633c21bff8
7 changed files with 456 additions and 2 deletions

View File

@ -151,6 +151,24 @@ public class AccountRechargeController extends DefaultBaseController {
return accountRechargeService.listPage(page);
}
@ApiOperation(value = "账户充值分页列表", notes = "账户充值分页列表接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"),
@ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"),
@ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String")
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("listpage2")
public SuccessResultList<List<AccountRechargeDTO>> listPage2(ListPage page) {
Map<String, Object> params = requestParams();
params.put("rechargeCheck", "2");
params.put("reconciliationStatus", "1");
page.setParams(params);
return accountRechargeService.listPage(page);
}
@ApiOperation(value = "账户充值分页列表", notes = "账户充值分页列表接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"),
@ -165,7 +183,7 @@ public class AccountRechargeController extends DefaultBaseController {
Map<String, Object> params = requestParams();
params.put("rechargeCheck", "2");
params.put("reconciliationStatus", "1");
params.put("accountId", params.get("accountId") == null ? "-1" : params.get("accountId"));
params.put("accountId", params.get("accountId") == null ? "" : params.get("accountId"));
page.setParams(params);
return accountRechargeService.listPage(page);
}
@ -177,5 +195,12 @@ public class AccountRechargeController extends DefaultBaseController {
Map<String, Object> params = requestParams();
return new SuccessResultData<>(accountRechargeService.count(params));
}
@ApiOperation(value = "账户充值统计", notes = "账户充值统计接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("total-sum")
SuccessResultData<Double> totalSum() {
Map<String, Object> params = requestParams();
return new SuccessResultData<>(accountRechargeService.totalSum(params));
}
}

View File

@ -102,6 +102,11 @@ public class AccountRechargeRouteController extends DefaultBaseController {
return mv;
}
@GetMapping("recharge-list")
public ModelAndView rechargeList() {
return new ModelAndView("accountrecharge/recharge-list");
}
@GetMapping("list")
public ModelAndView list() {
return new ModelAndView("accountrecharge/list");

View File

@ -128,4 +128,6 @@ public interface IAccountRechargeDao {
Integer getTodayByAccountId(String userId);
List<AccountRechargeInvoiceDTO> getCanIsSueInvoices(Map<String, Object> params);
Double totalSum(Map<String, Object> params);
}

View File

@ -26,9 +26,9 @@ public interface IAccountRechargeService {
/**
* 新增账户充值
*
* @param accountRechargeVO
* @return
*/
Double totalSum(Map<String, Object> params);
void save(AccountRechargeVO accountRechargeVO);
void saveSystemReduce(AccountRechargeVO accountRechargeVO);

View File

@ -118,6 +118,12 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
return new SuccessResultList<>(accountRechargeDTOs, pageInfo.getPageNum(), pageInfo.getTotal());
}
@Override
public Double totalSum(Map<String, Object> params) {
Double totalSum = accountRechargeDao.totalSum(params);
return totalSum;
}
@Override
public void save(AccountRechargeVO accountRechargeVO) {
saveReturnId(accountRechargeVO);
@ -471,6 +477,7 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
PageHelper.startPage(page.getPage(), page.getRows());
List<AccountRechargeDTO> accountRechargeDTOs = accountRechargeDao.list(page.getParams());
Map<String, UserInfoDTO> user = new HashMap<>();
for(AccountRechargeDTO dto : accountRechargeDTOs) {
if (user.get(dto.getCreator()) != null) {

View File

@ -576,6 +576,66 @@
#{selectedRechargeIds[${index}]}
</foreach>
</if>
<if test="orderMode != null and orderMode != ''">
t1.recharge_money ${orderMode}
</if>
<if test="orderMode == null or orderMode == ''">
t1.id DESC
</if>
</select>
<select id="totalSum" parameterType="map" resultType="java.lang.Double">
SELECT
SUM(recharge_money)
FROM
operator_account_recharge t1
WHERE
t1.is_delete = 0
<if test="accountId != null and accountId != ''">
AND t1.account_id = #{accountId}
</if>
<if test="rechargeType != null and rechargeType != ''">
AND t1.recharge_type = #{rechargeType}
</if>
<if test="thirdParty != null and thirdParty != ''">
AND t1.third_party = #{thirdParty}
</if>
<if test="thirdPartyNo != null and thirdPartyNo != ''">
AND t1.third_party_no LIKE CONCAT('%', #{thirdPartyNo}, '%')
</if>
<if test="reconciliationStatus != null and reconciliationStatus != ''">
AND t1.reconciliation_status = #{reconciliationStatus}
</if>
<if test="rechargeCheck != null and rechargeCheck != ''">
AND t1.recharge_check = #{rechargeCheck}
</if>
<if test="keywords != null and keywords != ''">
AND (
<!-- 这里添加其他条件 -->
t1.recharge_check_remark LIKE CONCAT('%', #{keywords}, '%')
)
</if>
<if test="startTime != null and startTime != ''">
AND
LEFT(t1.gmt_create, 10) <![CDATA[ >= ]]> #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND
LEFT(t1.gmt_create, 10) <![CDATA[ <= ]]> #{endTime}
</if>
<if test="accountRechargeIds != null and accountRechargeIds.size > 0">
AND
t1.account_recharge_id IN
<foreach collection="accountRechargeIds" index="index" open="(" separator="," close=")">
#{accountRechargeIds[${index}]}
</foreach>
</if>
ORDER BY
<if test="selectedRechargeIds != null and selectedRechargeIds.size > 0">
<foreach collection="selectedRechargeIds" index="index" open=" FIELD (t1.account_recharge_id , " separator="," close=") DESC ,">
#{selectedRechargeIds[${index}]}
</foreach>
</if>
t1.id DESC
</select>

View File

@ -0,0 +1,355 @@
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'}">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<style>
.search-item .layui-form-select .layui-input {width: 140px;}
</style>
</head>
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-row">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="test-table-reload-btn" style="margin-bottom: 10px;">
<div class="layui-inline">
<input type="text" style="cursor: pointer" id="startTime" class="layui-input search-item" placeholder="开始时间" readonly>
</div>
<div class="layui-inline">
<input type="text" style="cursor: pointer" id="endTime" class="layui-input search-item" placeholder="结束时间" readonly>
</div>
<div class="layui-inline layui-form search-item">
<select id="rechargeType" name="rechargeType">
<option value="">选择类型</option>
<option value="1">线下充值</option>
<option value="2">线上充值</option>
</select>
</div>
<div class="layui-inline layui-form search-item" >
<select id="thirdParty" name="thirdParty">
<option value="">选择名称</option>
<option value="系统">系统</option>
<option value="微信">微信</option>
<option value="支付宝">支付宝</option>
<option value="百度">百度</option>
<option value="对公转账">对公转账</option>
</select>
</div>
<input type="radio" name="orderMode" value="" checked title="默认">
<input type="radio" name="orderMode" value="DESC" title="金额从高到低">
<input type="radio" name="orderMode" value="ASC" title="金额从低到高">
<button type="button" id="search" class="layui-btn layui-btn-sm">
<i class="fa fa-lg fa-search"></i> 搜索
</button>
<span id="totalSum"></span>
</div>
</form>
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
<script type="text/html" id="headerToolBar">
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm" lay-event="closeBatchEvent">
<i class="fa fa-close"></i> 批量关闭
</button>
</div>
</script>
</div>
</div>
</div>
</div>
</div>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'table', 'laydate', 'common'], function() {
var $ = layui.$;
var $win = $(window);
var table = layui.table;
var admin = layui.admin;
var laydate = layui.laydate;
var common = layui.common;
var resizeTimeout = null;
var query = top.restAjax.params(window.location.href);
var accountId = query.accountId;
var tableUrl = `api/accountrecharge/listpage2`;
// 初始化表格
function initTable() {
getSum({});
table.render({
elem: '#dataTable',
id: 'dataTable',
url: top.restAjax.path(tableUrl, []),
width: admin.screen() > 1 ? '100%' : '',
height: $win.height() - 60,
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
defaultToolbar: [],
// toolbar: '#headerToolBar',
request: {
pageName: 'page',
limitName: 'rows'
},
cols: [
[
{type:'checkbox', fixed: 'left'},
{field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field: 'rechargeType', width: 100, title: '类型', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(rowData === '1') {
return '线下';
}
if(rowData === '2') {
return '线上';
}
return '错误';
}
},
{field: 'userInfoDTO', width: 300, title: '用户名/手机', align:'center',
templet: function(row) {
var rowData = row[this.field];
return "【" + rowData.userInfoName + '】' + rowData.userUsername;
}
},
{field: 'thirdParty', width: 120, title: '充值名称', align:'center',
templet: function(row) {
var rowData = row[this.field];
return rowData;
}
},
{field: 'rechargeMoney', width: 120, title: '金额', align:'center',
templet: function(row) {
var rowData = row[this.field];
return `¥${rowData}`;
}
},
{field: 'gmtCreate', width: 180, title: '创建时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
return rowData;
}
},
{field: 'rechargeFinalTime', width: 180, title: '充值时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'reconciliationTime', width: 180, title: '到账时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'thirdPartyNo', width: 250, title: '三方订单号', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'accountItemId', width: 250, title: '关联流水号', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
/*{field: 'operate', width: 80, title: '操作', align:'center', fixed: 'right',
templet: function(row) {
if(row.rechargeCheck === '1') {
return '<button type="button" class="layui-btn layui-btn-xs layui-btn-normal" lay-event="showEvent">核对</button>'
}
return '<button type="button" class="layui-btn layui-btn-xs layui-btn-primary" lay-event="showEvent">查看</button>'
}
},*/
]
],
page: true,
parseData: function(data) {
return {
'code': 0,
'msg': '',
'count': data.total,
'data': data.rows
};
}
});
}
// 重载表格
function reloadTable(currentPage) {
// 修复:使用正确的选择器获取单选按钮的值
var orderMode = $('input[name="orderMode"]:checked').val();
var data = {
startTime: $('#startTime').val(),
orderMode: orderMode,
endTime: $('#endTime').val(),
rechargeType: $('#rechargeType').val(),
thirdParty: $('#thirdParty').val(),
/* reconciliationStatus: $('#reconciliationStatus').val(),
rechargeCheck: $('#rechargeCheck').val(),*/
};
table.reload('dataTable', {
url: top.restAjax.path(tableUrl, []),
where: data,
page: {
curr: currentPage
},
});
getSum(data);
}
// 初始化日期
function initDate() {
// 日期选择
laydate.render({
elem: '#startTime',
format: 'yyyy-MM-dd'
});
laydate.render({
elem: '#endTime',
format: 'yyyy-MM-dd'
});
}
function getSum(params) {
var loadLayerIndex;
top.restAjax.get(top.restAjax.path('api/accountrecharge/total-sum', []), params, null, function(code, data) {
$("#totalSum").html(`共计 : ${data.data}元`);
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
}
initTable();
initDate();
// 事件 - 页面变化
$win.on('resize', function() {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(function() {
reloadTable();
}, 500);
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
reloadTable(1);
});
function closeRecharge(idArray) {
top.dialog.msg('确认关闭吗', {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.put(top.restAjax.path('api/accountrecharge/update-close', []), {
ids: idArray
}, null, function (code, data) {
top.dialog.msg('关闭成功', {time: 1000});
reloadTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg('', {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
// 事件 - 增删改
table.on('toolbar(dataTable)', function(obj) {
var layEvent = obj.event;
var checkStatus = table.checkStatus('dataTable');
var checkDatas = checkStatus.data;
if(layEvent === 'closeBatchEvent') {
if(checkDatas.length === 0) {
top.dialog.msg('选择要批量关闭的数据');
} else {
var ids = [];
for(var i = 0, item; item = checkDatas[i++];) {
ids.push(item['accountRechargeId']);
}
closeRecharge(ids);
}
}
if(layEvent === 'confirmEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += '_';
}
ids += item['accountRechargeId'];
}
top.dialog.msg('将选中的这些记录确认充值到账', {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
className: 'my-custom-class',
btnAlign: 'c',
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.put(top.restAjax.path('api/accountrecharge/confirm/{ids}', [ids]), {}, null, function (code, data) {
top.dialog.msg("核对完成", {time: 1000});
reloadTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg("正在核对中...", {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
}
});
table.on('tool(dataTable)', function(obj) {
var event = obj.event;
var data = obj.data;
if(event === 'showEvent') {
top.dialog.open({
url: top.restAjax.path('route/accountrecharge/update?accountRechargeId={accountRechargeId}', [data.accountRechargeId]),
title: '资金详情',
width: '800px',
height: '70%',
onClose: function() {
reloadTable();
}
})
}
})
});
</script>
</body>
</html>