feat(merchant): 企业订单聚合列表与关联账号只读详情
- 新增 /merchant/orders,按主账号+关联账号聚合订单并支持状态筛选 - 新增企业订单页,展示订单归属账号(主账号/关联账号) - 工作台企业订单入口改到聚合列表,近期订单可点击查看 - 订单详情允许同商家账号查看,非下单账号隐藏操作按钮 - 报价选择仅下单账号可操作,防止关联账号/主账号误操作
这个提交包含在:
@@ -171,6 +171,58 @@ class Merchant extends Base
|
||||
$this->success('', ['months' => $months, 'orders' => $orders]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业订单:主账号 + 关联账号的全部订单
|
||||
*/
|
||||
public function orders()
|
||||
{
|
||||
$merchant = $this->requireMerchant();
|
||||
$uids = $this->merchantUserIds($merchant);
|
||||
$status = $this->request->param('status', 'all');
|
||||
$page = max(1, (int)$this->request->param('page', 1));
|
||||
$limit = min(50, max(1, (int)$this->request->param('limit', 20)));
|
||||
|
||||
$build = function () use ($uids, $status) {
|
||||
$q = Db::name('order')->where('user_id', 'in', $uids);
|
||||
if ($status === 'active') {
|
||||
$q->where('status', 'in', \app\common\library\OrderStatus::activeValues());
|
||||
} elseif ($status === 'completed') {
|
||||
$q->where('status', \app\common\library\OrderStatus::COMPLETED);
|
||||
} elseif ($status === 'cancelled') {
|
||||
$q->where('status', \app\common\library\OrderStatus::CANCELLED);
|
||||
} elseif ($status !== 'all' && $status !== '') {
|
||||
$q->where('status', (int)$status);
|
||||
}
|
||||
return $q;
|
||||
};
|
||||
|
||||
$total = $build()->count();
|
||||
$rows = $build()->order('id desc')->page($page, $limit)->select();
|
||||
$userMap = Db::name('user')->where('id', 'in', $uids)->column('id,nickname,mobile', 'id');
|
||||
|
||||
foreach ($rows as &$row) {
|
||||
$ownerUser = (int)$row['user_id'] === (int)$merchant['user_id'];
|
||||
$u = isset($userMap[(int)$row['user_id']]) ? $userMap[(int)$row['user_id']] : null;
|
||||
$mobile = $u ? (string)$u['mobile'] : '';
|
||||
$row['pay_amount'] = (float)$row['pay_amount'];
|
||||
$row['urgent'] = (int)$row['urgent'];
|
||||
$row['status_text'] = \app\common\library\OrderStatus::label((int)$row['status']);
|
||||
$row['appoint_text'] = $row['appoint_time'] ? date('m-d H:i', (int)$row['appoint_time']) : '尽快上门';
|
||||
$row['create_text'] = date('Y-m-d H:i', (int)$row['createtime']);
|
||||
$row['address_text'] = $row['province'] . $row['city'] . $row['district'] . $row['address'];
|
||||
$row['account_name'] = $u && $u['nickname'] ? $u['nickname'] : ('用户' . substr($mobile, -4));
|
||||
$row['account_role'] = $ownerUser ? 'owner' : 'member';
|
||||
$row['account_role_text'] = $ownerUser ? '主账号' : '关联账号';
|
||||
}
|
||||
unset($row);
|
||||
|
||||
$this->success('', [
|
||||
'list' => $rows,
|
||||
'total' => (int)$total,
|
||||
'page' => $page,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开票记录
|
||||
*/
|
||||
|
||||
@@ -216,7 +216,20 @@ class Order extends Base
|
||||
public function detail()
|
||||
{
|
||||
$orderId = (int)$this->request->param('id');
|
||||
$order = $this->ownOrder($orderId, 'user');
|
||||
if ($orderId <= 0) {
|
||||
$this->error('订单参数错误');
|
||||
}
|
||||
$order = Db::name('order')->where('id', $orderId)->find();
|
||||
if (!$order) {
|
||||
$this->error('订单不存在');
|
||||
}
|
||||
// 本人订单,或同一商家(主账号 + 关联账号)的订单
|
||||
if ((int)$order['user_id'] !== $this->uid()) {
|
||||
$uids = $this->currentMerchantUserIds();
|
||||
if (!in_array((int)$order['user_id'], $uids, true)) {
|
||||
$this->error('无权操作该订单', null, 403);
|
||||
}
|
||||
}
|
||||
|
||||
$logs = Db::name('order_log')->where('order_id', $orderId)->order('id asc')->select();
|
||||
foreach ($logs as &$log) {
|
||||
@@ -531,9 +544,36 @@ class Order extends Base
|
||||
'create_text' => date('Y-m-d H:i', (int)$row['createtime']),
|
||||
'urgent' => (int)$row['urgent'],
|
||||
'price_type_text' => $this->priceTypeText($row['price_type']),
|
||||
'is_order_owner' => (int)$row['user_id'] === $this->uid(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前用户所属商家的全部账号(主账号 + 关联账号)
|
||||
*/
|
||||
protected function currentMerchantUserIds()
|
||||
{
|
||||
$merchant = Db::name('merchant')->where('user_id', $this->uid())->find();
|
||||
if (!$merchant) {
|
||||
$bind = Db::name('merchant_member')->where('user_id', $this->uid())->find();
|
||||
if ($bind) {
|
||||
$merchant = Db::name('merchant')->where('id', (int)$bind['merchant_id'])->find();
|
||||
}
|
||||
}
|
||||
if (!$merchant) {
|
||||
return [];
|
||||
}
|
||||
$ids = [(int)$merchant['user_id']];
|
||||
$rows = Db::name('merchant_member')->where('merchant_id', (int)$merchant['id'])->column('user_id');
|
||||
foreach ($rows as $id) {
|
||||
$id = (int)$id;
|
||||
if ($id > 0 && !in_array($id, $ids, true)) {
|
||||
$ids[] = $id;
|
||||
}
|
||||
}
|
||||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计价方式文案(前后端与后台统一口径)
|
||||
*/
|
||||
|
||||
在新工单中引用
屏蔽一个用户