Merge branch 'dev'

This commit is contained in:
zpc 2025-04-25 19:30:30 +08:00
commit 7e770991fb
7 changed files with 300 additions and 20 deletions

View File

@ -839,5 +839,85 @@ class Order extends Base
exit;
}
/**
* 未支付订单
*/
public function unpaid_order()
{
$user_id = trim(input('get.user_id'));
$mobile = trim(input('get.mobile'));
$order_num = trim(input('get.order_num'));
$addtime = trim(input('get.addtime'));
$whe = array();
$whe[] = ['status', '=', 0];
$whe[] = ['kd_is', '=', 0];
if ($user_id) {
// 将UID转换为用户ID
$user_id = $this->convertUidToUserId($user_id);
$whe[] = ['user_id', '=', $user_id];
}
if ($mobile) {
$mobile = User::field('id')->where('mobile', '=', $mobile)->value('id');
$whe[] = ['user_id', '=', $mobile];
}
if ($order_num) {
$whe[] = ['order_num', '=', $order_num];
}
if ($addtime) {
$time = explode(' - ', $addtime);
$start_time = strtotime($time[0]);
$end_time = strtotime($time[1]) - 1;
if ($start_time > $end_time) {
$this->err('开始时间不能大于结束时间');
}
$whe[] = ['addtime', 'BETWEEN', array($start_time, $end_time)];
$str_addtime = $start_time . '_' . $end_time;
} else {
$str_addtime = 0;
}
$field = '*';
$order = 'id desc';
$data = OrderModel::getList($whe, $field, $order, $this->page);
// 获取对应的订单回调验证信息
$order_nums = array_column($data['list'], 'order_num');
$notify_info = [];
if (!empty($order_nums)) {
$notify_list = Db::name('order_notify')
->whereIn('order_no', $order_nums)
->where('status', 2) // 回调失败的记录
->select()
->toArray();
foreach ($notify_list as $notify) {
$notify_info[$notify['order_no']] = $notify;
}
}
foreach ($data['list'] as &$value) {
$user_info = User::field('nickname,headimg,mobile,uid')->where(['id' => $value['user_id']])->find();
$value['nickname'] = $user_info['nickname'];
$value['headimg'] = $user_info['headimg'];
$value['mobile'] = $user_info['mobile'];
$value['uid'] = $user_info['uid'] ?: $value['user_id'];
// 标记回调验证失败的订单
$value['notify_failed'] = isset($notify_info[$value['order_num']]) ? 1 : 0;
if ($value['notify_failed']) {
$value['notify_info'] = $notify_info[$value['order_num']];
}
}
View::assign('list', $data['list']);
View::assign('count', $data['count']);
View::assign('page', $data['page']);
View::assign('user_id', $user_id ? $user_id : 0);
View::assign('mobile', $mobile ? $mobile : 0);
View::assign('order_num', $order_num ? $order_num : 0);
View::assign('str_addtime', $str_addtime ? $str_addtime : 0);
return View::fetch('Order/unpaid_order');
}
}

View File

@ -775,7 +775,7 @@ class Statistics extends Base
];
// 计算利润和利润率
$data['profit'] = $data['use_money'] - $data['sc_money'];
$data['profit'] = $data['use_money'] - ($data['sc_money'] - $data['re_money']);
$data['profit_rate'] = $data['use_money'] > 0 ? round(($data['profit'] / $data['use_money']) * 100, 2) : 0;
$data['is_negative'] = $data['profit'] < 0;
@ -904,7 +904,7 @@ class Statistics extends Base
$totalFhMoney = floatval($fhMoneyQuery->sum('goodslist_money'));
// 计算总利润
$totalProfit = $totalIncome - $totalCost;
$totalProfit = $totalIncome - ($totalCost - $totalReMoney);
// 返回汇总数据
$data = [
@ -1339,7 +1339,7 @@ class Statistics extends Base
$totalFhMoney = floatval($fhMoneyQuery->sum('goodslist_money'));
// 计算总利润
$totalProfit = $totalIncome - $totalCost;
$totalProfit = $totalIncome - ($totalCost - $totalReMoney);
// 返回汇总数据
return [

View File

@ -221,6 +221,7 @@ Route::rule('buy_order_daochu', 'Order/buy_order_daochu');
Route::rule('recovery_order_daochu', 'Order/recovery_order_daochu');
Route::rule('send_order_daochu', 'Order/send_order_daochu');
Route::rule('send_order_dandufahuo', 'Order/send_order_dandufahuo');
Route::rule('unpaid_order', 'Order/unpaid_order');
#============================

View File

@ -0,0 +1,177 @@
{include file="Public:header2"/}
<body>
<div class="layui-fluid">
<div class="layui-card">
<form method="get" class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline" style="width: 150px;margin-left: 0px">
<input type="text" name="user_id" value="{$Request.get.user_id}" placeholder="请输入用户ID或UID" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline" style="width: 150px;margin-left: 0px">
<input type="text" name="mobile" value="{$Request.get.mobile}" placeholder="请输入手机号" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline" style="width: 300px;margin-left: 0px">
<input type="text" name="order_num" value="{$Request.get.order_num}" placeholder="请输入订单号" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline" >
<div class="layui-input-inline" style="width: 300px;margin-left: 0px">
<input type="text" id="addtime" name="addtime" value="{$Request.get.addtime}" class="layui-input" placeholder="时间" autocomplete="off" >
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layuiadmin-btn-useradmin" lay-submit lay-filter="LAY-user-front-search">
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
</button>
</div>
</div>
</form>
<div class="layui-card-body">
<xblock>
<div style="padding-bottom: 10px;">
<span style="line-height:40px;float:right;">共有数据: {$count}条</span>
</div>
</xblock>
<table class="layui-table">
<thead>
<tr>
<th>用户信息</th>
<th>订单号</th>
<th>盒子信息</th>
<th>类型</th>
<th>金额详情</th>
<th>时间</th>
<th>回调验证状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{volist name="list" id="vo"}
<tr {if condition="$vo.notify_failed eq 1"}style="background-color: #ffebee;"{/if}>
<td style="text-align: left">
<div style="display: flex;">
<div><img src="{:imageUrl($vo['headimg'])}" alt="" width="50px" height="50px"></div>
<div style="margin-left: 10px">
<p style="color: #e91e63;font-size: 9px">真实ID{$vo['user_id']}</p>
<p style="color: #e91e63;font-size: 9px">UID{:isset($vo['uid']) ? $vo['uid'] : $vo['user_id']}</p>
<p style="color: #666666ba;font-size: 9px">{$vo['mobile']}</p>
<p style="color: #666666ba;font-size: 9px">{$vo['nickname']}</p>
</div>
</div>
</td>
<td>{$vo['order_num']}</td>
<td style="text-align: left">
<div style="display: flex;">
<div><img src="{:imageUrl($vo['goods_imgurl'])}" alt="" width="50px" height="50px"></div>
<div style="margin-left: 10px">
<p style="color: #666666ba;font-size: 9px">{$vo['goods_title']}</p>
<p style="color: #e91e63;font-size: 9px">{if $vo['num']}箱号:{$vo['num']}{/if}</p>
</div>
</div>
</td>
<td>
{if $vo['order_type'] eq 1}
<button class="layui-btn layui-btn-info layui-btn-radius layui-btn-sm">一番赏</button>
{elseif $vo['order_type'] eq 2}
<button class="layui-btn layui-btn-info layui-btn-radius layui-btn-sm">无限赏</button>
{elseif $vo['order_type'] eq 3}
<button class="layui-btn layui-btn-info layui-btn-radius layui-btn-sm">擂台赏</button>
{elseif $vo['order_type'] eq 4}
<button class="layui-btn layui-btn-info layui-btn-radius layui-btn-sm">抽卡机</button>
{elseif $vo['order_type'] eq 5}
<button class="layui-btn layui-btn-info layui-btn-radius layui-btn-sm">积分赏</button>
{elseif $vo['order_type'] eq 7}
<button class="layui-btn layui-btn-info layui-btn-radius layui-btn-sm">抽奖券</button>
{/if}
</td>
<td style="text-align: left;width: 150px">
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">订单金额</p> {$vo['order_total']}</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">折扣</p> {$vo['zhe']*1}折</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">折扣金额</p> {$vo['order_zhe_total']}</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">微信支付</p> {$vo['price']}</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">钻石抵扣</p> {$vo['use_money']}</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">UU抵扣</p> {$vo['use_integral']}</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">达达券抵扣</p> {$vo['use_money2']}</div>
<div style="display: flex;font-weight: bold;"><p style="width: 60px;display: inline">优惠券抵扣</p> {$vo['use_coupon']}</div>
</td>
<td>{$vo['addtime']|date="Y-m-d H:i:s"}</td>
<td>
{if condition="$vo.notify_failed eq 1"}
<button class="layui-btn layui-btn-danger layui-btn-radius layui-btn-sm">回调验证失败</button>
{else /}
<button class="layui-btn layui-btn-normal layui-btn-radius layui-btn-sm">未支付</button>
{/if}
</td>
<td>
{if condition="$vo.notify_failed eq 1"}
<a onClick="viewNotifyInfo('{$vo.order_num}')" class="layui-btn layui-btn-danger layui-btn-xs">查看回调信息</a>
{/if}
</td>
</tr>
{/volist}
{if condition="empty($list)"}
<tr>
<td colspan='10' style="text-align:center;">暂时没有数据!</td>
</tr>
{/if}
</tbody>
</table>
<div class="my_page layui-box layui-laypage layui-laypage-default">
{$page|raw}
</div>
</div>
</div>
</div>
{include file="Public:footer"/}
<script type="text/javascript">
layui.use(['table', 'laydate'], function () {
//执行一个laydate实例
var laydate = layui.laydate;
laydate.render({
elem: '#addtime'
,type: 'datetime'
,range: true
});
});
//查看回调信息
function viewNotifyInfo(order_num) {
var notifyInfo = {};
{volist name="list" id="vo"}
{if condition="$vo.notify_failed eq 1"}
if ('{$vo.order_num}' === order_num) {
notifyInfo = {
'订单号': '{$vo.order_num}',
'回调URL': '{$vo.notify_info.notify_url|default=""}',
'支付时间': '{$vo.notify_info.pay_time|default=""}',
'支付金额': '{$vo.notify_info.pay_amount|default=""}',
'重试次数': '{$vo.notify_info.retry_count|default="0"}',
'最后回调时间': '{$vo.notify_info.last_notify_time|default=""}',
'备注': '{$vo.notify_info.remark|default=""}'
};
}
{/if}
{/volist}
var content = '<div style="padding: 20px;">';
for (var key in notifyInfo) {
content += '<div style="margin-bottom: 10px;"><span style="font-weight: bold;">' + key + '</span>' + notifyInfo[key] + '</div>';
}
content += '</div>';
layer.open({
type: 1,
title: '回调验证失败信息',
area: ['500px', '400px'],
content: content
});
}
</script>
</body>
</html>

View File

@ -87,10 +87,10 @@
<div class="layui-card-header">
总利润
<i class="layui-icon layui-icon-about" style="font-size: 14px; color: #5FB878;"
title="利润 = 收入 - 出货价值"></i>
title="利润 = 收入 - (出货价值 - 兑换成本)"></i>
</div>
<div class="layui-card-body" style="font-size: 24px;">
¥ <span id="totalProfit" class="profit-value">0.00</span>
¥ <span id="totalProfit" class="profit-value profit-detail">0.00</span>
</div>
</div>
</div>
@ -299,12 +299,14 @@
}
},
{
field: 'profit', title: '利润 <i class="layui-icon layui-icon-about" title="收入-出货价值"></i>', width: 110, templet: function (d) {
field: 'profit', title: '利润 <i class="layui-icon layui-icon-about" title="收入-(出货价值-兑换成本)"></i>', width: 110, templet: function (d) {
if (!d.loaded) {
return '<div><i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i></div>';
}
var colorClass = d.profit >= 0 ? 'layui-bg-green' : 'layui-bg-red';
return '<div><span class="layui-badge ' + colorClass + '">¥ ' + d.profit.toFixed(2) + '</span></div>';
// 构建详细计算公式展示
var detailCalc = d.use_money.toFixed(2) + ' - (' + d.sc_money.toFixed(2) + ' - ' + d.re_money.toFixed(2) + ') = ' + d.profit.toFixed(2);
return '<div><span class="layui-badge ' + colorClass + ' profit-detail" data-calculation="' + detailCalc + '">¥ ' + d.profit.toFixed(2) + '</span></div>';
}
},
{
@ -440,7 +442,7 @@
tr.find('td[data-field="single_box_profit_rate"] div').html('<span class="layui-badge ' + singleBoxColorClass + '">' + singleBoxProfitRate.toFixed(2) + '%</span>');
var profitColorClass = data.profit >= 0 ? 'layui-bg-green' : 'layui-bg-red';
tr.find('td[data-field="profit"] div').html('<span class="layui-badge ' + profitColorClass + '">¥ ' + data.profit.toFixed(2) + '</span>');
tr.find('td[data-field="profit"] div').html('<span class="layui-badge ' + profitColorClass + ' profit-detail" data-calculation="' + data.use_money.toFixed(2) + ' - (' + data.sc_money.toFixed(2) + ' - ' + data.re_money.toFixed(2) + ') = ' + data.profit.toFixed(2) + '">¥ ' + data.profit.toFixed(2) + '</span>');
var rateColorClass = data.profit_rate >= 0 ? 'layui-bg-green' : 'layui-bg-red';
tr.find('td[data-field="profit_rate"] div').html('<span class="layui-badge ' + rateColorClass + '">' + data.profit_rate.toFixed(2) + '%</span>');
@ -469,6 +471,10 @@
$('#totalReMoney').text(summary.totalReMoney.toFixed(2));
$('#totalFhMoney').text(summary.totalFhMoney.toFixed(2));
// 设置总利润的计算详情
var calcDetail = summary.totalIncome.toFixed(2) + ' - (' + summary.totalCost.toFixed(2) + ' - ' + summary.totalReMoney.toFixed(2) + ') = ' + summary.totalProfit.toFixed(2);
$('#totalProfit').attr('data-calculation', calcDetail);
// 设置利润颜色
var profitElem = $('#totalProfit');
if (summary.totalProfit >= 0) {
@ -577,6 +583,18 @@
time: 4000
});
});
// 为利润详情添加鼠标悬停事件(使用事件委托,处理动态加载的元素)
$(document).on('mouseenter', '.profit-detail', function () {
var that = this;
var calculation = $(that).data('calculation');
if (calculation) {
layer.tips(calculation, that, {
tips: [1, '#FF5722'],
time: 4000
});
}
});
}
});
</script>

View File

@ -42,15 +42,15 @@ class GoodsExtend extends Base
*/
public static function getGoodsExtendByGoodsId($goodsId, $goods_type)
{
// 生成缓存键
$redis = (new \app\common\server\RedisHelper())->getRedis();
$cache_key = "goods_extend:{$goodsId}:{$goods_type}";
// // 生成缓存键
// $redis = (new \app\common\server\RedisHelper())->getRedis();
// $cache_key = "goods_extend:{$goodsId}:{$goods_type}";
// 尝试从缓存获取数据
$cached_data = $redis->get($cache_key);
if ($cached_data) {
return json_decode($cached_data, true);
}
// // 尝试从缓存获取数据
// $cached_data = $redis->get($cache_key);
// if ($cached_data) {
// return json_decode($cached_data, true);
// }
$goods_extend = self::where('goods_id', $goodsId)->find();
if (!$goods_extend) {
@ -74,10 +74,10 @@ class GoodsExtend extends Base
}
}
// 将数据存入缓存设置5分钟过期时间
if ($goods_extend) {
$redis->set($cache_key, json_encode($goods_extend), 300);
}
// // 将数据存入缓存设置5分钟过期时间
// if ($goods_extend) {
// $redis->set($cache_key, json_encode($goods_extend), 300);
// }
return $goods_extend;
}

View File

@ -128,6 +128,10 @@ return [
'url' => '/admin/send_order',
'name' => '发货列表',
],
[
'url' => '/admin/unpaid_order',
'name' => '未支付订单',
]
],
],
[