pay/admin/ps_order.php
2025-11-28 10:08:12 +08:00

483 lines
16 KiB
PHP
Raw 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.

<?php
/**
* 分账记录
**/
include("../includes/common.php");
$title='分账记录';
include './head.php';
if($islogin==1){}else exit("<script language='javascript'>window.location.href='./login.php';</script>");
?>
<style>
.tips {cursor: pointer;}
.dates{max-width: 120px;}
@media screen and (max-width: 767px) {
.table-responsive {
overflow-y: auto;
}
}
</style>
<link href="../assets/css/datepicker.css" rel="stylesheet">
<div class="container" style="padding-top:70px;">
<div class="col-md-12 center-block" style="float: none;">
<form onsubmit="return searchSubmit()" method="GET" class="form-inline" id="searchToolbar">
<div class="form-group">
<label>搜索</label>
<select name="column" class="form-control"><option value="trade_no">系统订单号</option><option value="api_trade_no">接口订单号</option><option value="money">分账金额</option></select>
</div>
<div class="form-group">
<input type="text" class="form-control" name="value" placeholder="搜索内容">
</div>
<div class="form-group">
<input type="text" class="form-control" name="rid" style="width: 80px;" placeholder="分账规则" value="">
</div>
<div class="input-group input-daterange">
<input type="text" id="starttime" name="starttime" class="form-control dates" placeholder="开始日期" autocomplete="off" title="留空则不限时间范围">
<span class="input-group-addon" onclick="$('#starttime').val('');$('#endtime').val('');" title="清除"><i class="fa fa-chevron-right"></i></span>
<input type="text" id="endtime" name="endtime" class="form-control dates" placeholder="结束日期" autocomplete="off" title="留空则不限时间范围">
</div>
<div class="form-group">
<select name="dstatus" class="form-control"><option value="-1">全部状态</option><option value="0">待分账</option><option value="1">已提交</option><option value="2">分账成功</option><option value="3">分账失败</option><option value="4">已取消</option></select>
</div>
<button type="submit" class="btn btn-primary">搜索</button>
<a href="javascript:searchClear()" class="btn btn-default" title="刷新记录列表"><i class="fa fa-refresh"></i></a>
<div class="btn-group" role="group">
<button type="button" id="batchAction" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="javascript:batch_act('submit')" data-action-type="submit">批量分账</a></li>
<li><a href="javascript:batch_act('return')" data-action-type="return">批量回退</a></li>
<li><a href="javascript:batch_act('unfreeze')" data-action-type="unfreeze">批量取消</a></li>
<li role="separator" class="divider"></li>
<li><a href="javascript:operation('2')" data-action-type="2">改为成功</a></li>
<li><a href="javascript:operation('3')" data-action-type="3">改为失败</a></li>
<li><a href="javascript:operation('4')" data-action-type="4">改为取消</a></li>
<li><a href="javascript:operation('5')" data-action-type="5">删除</a></li>
</ul>
</div>
<button type="button" onclick="statistics()" class="btn btn-default">&nbsp;统计&nbsp;</button>
</form>
<table id="listTable">
</table>
</div>
</div>
<div class="modal" id="modal-statistics" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static">
<div class="modal-dialog">
<div class="modal-content animated flipInX">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
<h4 class="modal-title">分账统计概况</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<template id="statistics-template">
<ul class="list-inline" style="margin-bottom: 0;padding-bottom: 10px;border-bottom: 1px solid #dddddd;">
<li>分账总金额:<span style="font-weight: 600;">¥ {totalMoney}</span></li>
<li>成功分账:<span style="font-weight: 600;">¥ {successMoney}</span></li>
<li>失败金额:<span style="font-weight: 600;">¥ {failMoney}</span></li>
</ul>
<ul class="list-inline" style="padding-top:10px;margin-bottom: 0;">
<li>分账总数:<span style="font-weight: 600;">{totalCount}</span></li>
<li>成功分账:<span style="font-weight: 600;">{successCount}</span></li>
<li>分账失败:<span style="font-weight: 600;">{failCount}</span></li>
<li>成功率:<span style="font-weight: 600;">{successRate}%</span></li>
</ul>
</template>
<script src="<?php echo $cdnpublic?>layer/3.1.1/layer.min.js"></script>
<script src="<?php echo $cdnpublic?>bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js"></script>
<script src="<?php echo $cdnpublic?>bootstrap-datepicker/1.9.0/locales/bootstrap-datepicker.zh-CN.min.js"></script>
<script src="../assets/js/bootstrap-table.min.js"></script>
<script src="../assets/js/bootstrap-table-page-jump-to.min.js"></script>
<script src="../assets/js/custom.js"></script>
<script>
$.action_arr = {
'submit': '提交分账',
'return': '分账回退',
'unfreeze': '取消分账',
'query': '查询结果',
};
$(document).ready(function(){
updateToolbar();
const defaultPageSize = 30;
const pageNumber = typeof window.$_GET['pageNumber'] != 'undefined' ? parseInt(window.$_GET['pageNumber']) : 1;
const pageSize = typeof window.$_GET['pageSize'] != 'undefined' ? parseInt(window.$_GET['pageSize']) : defaultPageSize;
$("#listTable").bootstrapTable({
url: 'ajax_profitsharing.php?act=orderList',
pageNumber: pageNumber,
pageSize: pageSize,
classes: 'table table-striped table-hover table-bordered',
uniqueId: 'id',
columns: [
{
field: '',
checkbox: true
},
{
field: 'trade_no',
title: '系统订单号',
formatter: function(value, row, index) {
return '<b><a href="./order.php?column=trade_no&value='+value+'" target="_blank">'+value+'</a></b>';
}
},
{
field: 'rid',
title: '分账规则'
},
{
field: 'channelid',
title: '支付通道',
formatter: function(value, row, index) {
return value + '__' + row.channelname;
}
},
{
field: 'money',
title: '分账金额',
formatter: function(value, row, index) {
if(row.status == '0' || row.status == '3'){
return '<a href="javascript:editmoney('+row.id+', \''+value+'\')" title="修改分账金额">'+value+'</a>';
}
return value;
}
},
{
field: 'addtime',
title: '时间'
},
{
field: 'status',
title: '分账状态',
formatter: function(value, row, index) {
if(value == '1'){
return '<font color=orange>已提交</font>';
}else if(value == '2'){
return '<font color=green>分账成功</font>';
}else if(value == '3'){
return '<font color=red>分账失败</font>' + (row.result ? ' <span onclick="showmsg(\''+row.result+'\')" class="tips" title="失败原因"><i class="fa fa-info-circle"></i></span>' : '');
}else if(value == '4'){
return '<font color=grey>已取消</font>';
}else{
return '<font color=blue>待分账</font>';
}
}
},
{
field: 'status',
title: '操作',
formatter: function(value, row, index) {
if(value == '1'){
return '<a href="javascript:do_query('+row.id+')" class="btn btn-info btn-xs">查询结果</a>';
}else if(value == '2'){
return '<a href="javascript:do_return('+row.id+')" class="btn btn-danger btn-xs">分账回退</a>';
}else if(value == '3'){
return '<a href="javascript:do_submit('+row.id+')" class="btn btn-primary btn-xs">重试</a>&nbsp;<a href="javascript:do_unfreeze('+row.id+')" class="btn btn-danger btn-xs">取消</a>';
}else if(value == '0'){
return '<a href="javascript:do_submit('+row.id+')" class="btn btn-primary btn-xs">提交分账</a>&nbsp;<a href="javascript:do_unfreeze('+row.id+')" class="btn btn-danger btn-xs">取消</a>';
}
}
},
]
})
})
function operation(status){
var selected = $('#listTable').bootstrapTable('getSelections');
if(selected.length == 0){
layer.msg('未选择订单', {time:1500});return;
}
var checkbox = new Array();
$.each(selected, function(key, item){
checkbox.push(item.id)
})
if(status == 5 && !confirm('确定要删除已选中的'+checkbox.length+'个订单吗?')) return;
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=operation',
data : {status:status, checkbox:checkbox},
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
searchSubmit();
layer.alert(data.msg);
}else{
layer.alert(data.msg);
}
},
error:function(data){
layer.msg('请求超时');
searchSubmit();
}
});
return false;
}
function batch_act(action){
var selected = $('#listTable').bootstrapTable('getSelections');
if(selected.length == 0){
layer.msg('未选择订单', {time:1500});return;
}
var checkbox = getBatchOperateData(selected, 'id')[action];
if(checkbox.length == 0){
layer.msg('要处理的订单数量为0', {time:1500});return;
}
var content_arr = {
'submit': '是否将这'+checkbox.length+'条订单进行分账?',
'return': '是否将这'+checkbox.length+'条已分账的订单回退?资金将从分账接收方的账户回退给分账方。',
'unfreeze': '是否将这'+checkbox.length+'条订单取消分账?取消分账后将解冻资金到商户号,后续无法再次发起分账。'
};
var confirmobj = layer.confirm(content_arr[action], {
title: $.action_arr[action],
btn: ['确定','取消'],
icon:0
}, function(){
batch_act_order(checkbox, 0, action);
}, function(){
layer.close(confirmobj);
});
}
function batch_act_order(ids, index, action){
if (index >= ids.length) {
layer.alert('已成功'+$.action_arr[action]+ids.length+'条订单!', {icon: 1}, function(){
layer.closeAll();searchSubmit();
});
return;
}
var id = ids[index];
var row = $("#listTable").bootstrapTable('getRowByUniqueId', id);
var ii = layer.msg('正在' + $.action_arr[action] + row.trade_no + ''+row.money+'元)', {icon: 16, shade: 0.3, time: 0});
var url_arr = {
'submit': 'ajax_profitsharing.php?act=submit',
'return': 'ajax_profitsharing.php?act=return',
'unfreeze': 'ajax_profitsharing.php?act=unfreeeze'
};
$.ajax({
type : 'POST',
url : url_arr[action],
data : {id:id},
dataType : 'json',
success : function(data) {
layer.close(ii);
index > 0 && searchSubmit();
if(data.code == 0){
batch_act_order(ids, index + 1, action);
}else{
layer.alert(row.trade_no + $.action_arr[action] + '失败:' + data.msg, {icon:7});
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
}
function getBatchOperateData(selections, field) {
var counts = {
'submit': field ? [] : 0, // 批量分账
'return': field ? [] : 0, // 批量回退
'unfreeze': field ? [] : 0, // 批量取消
};
selections.forEach(function(row) {
var status = parseInt(row.status);
if (status == 0) {
if (field) {
counts['submit'].push(row[field]);
counts['unfreeze'].push(row[field]);
} else {
counts['submit']++;
counts['unfreeze']++;
}
} else if (status == 2) {
if (field) {
counts['return'].push(row[field]);
} else {
counts['return']++;
}
} else if (status == 3) {
if (field) {
counts['submit'].push(row[field]);
counts['unfreeze'].push(row[field]);
} else {
counts['submit']++;
counts['unfreeze']++;
}
}
});
return counts;
}
function do_submit(id){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=submit',
data : {id:id},
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code >= 0){
layer.alert(data.msg, {icon: 1}, function(){layer.closeAll();searchSubmit()});
}else{
layer.alert(data.msg, {icon: 2});
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
}
function do_query(id){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=query',
data : {id:id},
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
var msg = '查询结果:正在分账';
if(data.status == 1) msg = '查询结果:分账成功';
else if(data.status == 2) msg = '查询结果:分账失败,原因:'+data.reason;
layer.alert(msg, {icon: 1}, function(){layer.closeAll();searchSubmit()});
}else{
layer.alert('查询失败:'+data.msg, {icon: 2});
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
}
function do_unfreeze(id){
var confirmobj = layer.confirm('取消分账后将解冻资金到商户号,后续无法再次发起分账,是否继续?', {
btn: ['确定','取消']
}, function(){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=unfreeeze',
data : {id:id},
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
layer.alert(data.msg, {icon: 1}, function(){layer.closeAll();searchSubmit()});
}else{
layer.alert('解冻剩余资金失败:'+data.msg, {icon: 2});
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
});
}
function do_return(id){
var confirmobj = layer.confirm('将已分账的资金从分账接收方的账户回退给分账方,是否继续?', {
btn: ['确定','取消']
}, function(){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=return',
data : {id:id},
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
layer.alert(data.msg, {icon: 1}, function(){layer.closeAll();searchSubmit()});
}else{
layer.alert('退分账失败:'+data.msg, {icon: 2});
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
});
}
function showmsg(result){
layer.alert(result, {title:'失败原因'});
}
function editmoney(id, money){
layer.prompt({title: '修改分账金额', value: money, formType: 0}, function(text, index){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=editmoney',
data : {id:id,money:text},
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
layer.closeAll();
layer.msg('修改成功', {time:800});
searchSubmit()
}else{
layer.alert(data.msg, {icon: 2});
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
});
}
function statistics(){
var ii = layer.load(2, {shade:[0.1,'#fff']});
$.ajax({
type : 'POST',
url : 'ajax_profitsharing.php?act=statistics',
data: $('#searchToolbar').serializeArray(),
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
var element = $('#modal-statistics');
var htmlContent = $("#statistics-template").html().replace(/\{(\w+)\}/g, function (match, key) {
return data.data[key] || '';
});
element.find('.modal-body').html(htmlContent);
element.modal('show');
}else{
layer.alert(data.msg);
}
},
error:function(data){
layer.close(ii);
layer.msg('服务器错误');
}
});
}
$(document).ready(function(){
$('.input-datepicker, .input-daterange').datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
clearBtn: true,
language: 'zh-CN'
});
$("#batchAction").click(function(e) {
e.preventDefault();
var selections = $('#listTable').bootstrapTable('getSelections'),
button = $(this);
var counts = getBatchOperateData(selections);
button.next('.dropdown-menu').find('a[data-action-type]').each(function() {
var actionType = $(this).data('action-type');
var count = counts[actionType];
if(typeof count == 'undefined') return;
var originalText = $(this).text().split('(')[0];
$(this).text(originalText + (count > 0 ? ' (可执行' + count + '条)' : ' (0)'));
});
});
})
</script>