文件
xionggeshop/application/admin/controller/shopro/regional_agent/Order.php

195 行
7.5 KiB
PHP

<?php
namespace app\admin\controller\shopro\regional_agent;
use app\admin\controller\shopro\Base;
use app\admin\model\shopro\regional_agent\Agent;
use addons\shopro\library\Export;
use think\Db;
class Order extends Base
{
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\shopro\regional_agent\Order;
}
public function index()
{
$this->request->filter(['strip_tags']);
if ($this->request->isAjax()) {
$nobuildfields = ['order_sn', 'agent_nickname', 'area_name', 'createtime'];
list($where, $sort, $order, $offset, $limit) = $this->custombuildparams(null, $nobuildfields);
$query = $this->buildSearch();
$total = $query->where($where)->count();
$list = $this->buildSearch()
->with(['buyer' => function ($q) {
$q->field('id,nickname,mobile,avatar');
}, 'agent', 'agentUser' => function ($q) {
$q->field('id,nickname,mobile,avatar');
}, 'order' => function ($q) {
$q->field('id,order_sn,status,pay_fee,createtime');
}, 'reward'])
->where($where)
->order($sort, $order)
->limit($offset, $limit)
->select();
$rows = collection($list)->toArray();
foreach ($rows as &$row) {
$rowCommission = 0;
$rowCommissioned = 0;
foreach ($row['reward'] as $reward) {
$rowCommission += $reward['commission'];
if ($reward['status'] == 1) {
$rowCommissioned += $reward['commission'];
}
}
$row['commission_total'] = number_format($rowCommission, 2, '.', '');
$row['commissioned_total'] = number_format($rowCommissioned, 2, '.', '');
}
$waitingIds = $this->buildSearch()->where($where)->where('commission_reward_status', 0)->column('id');
$commissionWaiting = 0;
if ($waitingIds) {
$commissionWaiting = \app\admin\model\shopro\regional_agent\Reward::where('regional_order_id', 'in', $waitingIds)->sum('commission');
}
$settledIds = $this->buildSearch()->where($where)->where('commission_reward_status', 1)->column('id');
$commissioned = 0;
if ($settledIds) {
$commissioned = \app\admin\model\shopro\regional_agent\Reward::where('regional_order_id', 'in', $settledIds)->where('status', 1)->sum('commission');
}
return $this->success('区域公司订单', null, [
'total' => $total,
'rows' => $rows,
'commission_waiting_total' => number_format($commissionWaiting, 2, '.', ''),
'commissioned_total' => number_format($commissioned, 2, '.', ''),
]);
}
return $this->view->fetch();
}
public function export()
{
$nobuildfields = ['order_sn', 'agent_nickname', 'area_name', 'createtime'];
list($where, $sort, $order) = $this->custombuildparams(null, $nobuildfields);
$expCellName = [
'id' => 'ID',
'order_sn' => '订单号',
'area_name' => '公司区域',
'agent_nickname' => '公司用户',
'amount' => '结算金额',
'commission_total' => '差价',
'status_text' => '结算状态',
'createtime' => '创建时间',
];
$list = $this->buildSearch()
->with(['agent', 'agentUser', 'order', 'reward'])
->where($where)
->order($sort, $order)
->limit(5000)
->select();
if (!$list) {
$this->error('导出数据为空');
}
$exportData = [];
foreach ($list as $row) {
$commission = 0;
foreach ($row['reward'] as $reward) {
$commission += $reward['commission'];
}
$statusMap = [0 => '待结算', 1 => '已结算', -1 => '已退回'];
$exportData[] = [
'id' => $row['id'],
'order_sn' => $row['order']['order_sn'] ?? $row['order_id'],
'area_name' => $row['agent']['area_name'] ?? '',
'agent_nickname' => $row['agent_user']['nickname'] ?? '',
'amount' => $row['amount'],
'commission_total' => number_format($commission, 2, '.', ''),
'status_text' => $statusMap[$row['commission_reward_status']] ?? '-',
'createtime' => date('Y-m-d H:i:s', $row['createtime']),
];
}
$export = new Export();
$export->exportExcel('区域公司订单', $expCellName, $exportData);
}
public function runCommission($id = null)
{
if (!$id) {
$id = $this->request->post('id');
}
$row = $this->model->get($id);
if (!$row) {
$this->error('订单不存在');
}
$result = Db::transaction(function () use ($row) {
return (new \addons\shopro\library\regional_agent\Reward())->settleByRegionalOrder($row->id, 'admin');
});
$result ? $this->success('结算成功') : $this->error('订单已结算或没有要结算的差价');
}
public function backCommission($id = null)
{
if (!$id) {
$id = $this->request->post('id');
}
$row = $this->model->get($id);
if (!$row) {
$this->error('订单不存在');
}
$result = Db::transaction(function () use ($row) {
return (new \addons\shopro\library\regional_agent\Reward())->backByRegionalOrder($row->id, 'admin');
});
$result ? $this->success('退回成功') : $this->error('订单已退回或未结算');
}
protected function buildSearch()
{
$filter = (array) json_decode($this->request->get('filter', ''), true);
$query = $this->model;
if (!empty($filter['order_sn'])) {
$orderIds = \app\admin\model\shopro\order\Order::where('order_sn', 'like', '%' . $filter['order_sn'] . '%')->column('id');
$query = $query->where('order_id', 'in', $orderIds ?: [0]);
}
if (!empty($filter['agent_nickname'])) {
$userIds = \app\admin\model\shopro\user\User::where('nickname', 'like', '%' . $filter['agent_nickname'] . '%')->column('id');
$query = $query->where('agent_user_id', 'in', $userIds ?: [0]);
}
if (!empty($filter['area_name'])) {
$query = $query->whereExists(function ($q) use ($filter) {
$agentTable = (new Agent())->getQuery()->getTable();
$orderTable = (new \app\admin\model\shopro\regional_agent\Order())->getQuery()->getTable();
$q->table($agentTable)->where($agentTable . '.id=' . $orderTable . '.agent_id')
->where('area_name', 'like', '%' . $filter['area_name'] . '%');
});
}
if (!empty($filter['createtime'])) {
$parts = explode(' - ', $filter['createtime']);
if (count($parts) === 2) {
$start = strtotime($parts[0]);
$end = strtotime($parts[1] . ' 23:59:59');
if ($start && $end) {
$query->where('createtime', 'between', [$start, $end]);
}
}
}
return $query;
}
}