feat: 新增发票抬头、晒单、钱包日志等模型及后台管理功能

- 新增 invoice_title、showcase、wallet_log 模型及对应语言包
- 新增后台控制器、视图及搜索字段配置
- 修复服务类目删除保护逻辑
- 优化后台登录页面文案及样式
- 新增前端角色切换逻辑及页面拦截
- 新增 SVG 图标及样式变量
- 修复接口权限及下拉框默认值问题
这个提交包含在:
2026-11-11 17:02:35 +08:00
父节点 5908cf6b16
当前提交 fafddceaf2
共有 332 个文件被更改,包括 33892 次插入 和 8835 次删除

查看文件

@@ -41,69 +41,64 @@ class OrderRecycle extends Command
$recycled = 0;
foreach ($orders as $order) {
$orderId = (int)$order['id'];
$masterId = (int)$order['master_id'];
$now = time();
Db::startTrans();
try {
// 1. 退回待接单状态(公海接单大厅)
$lockedOrder = Db::name('order')->where('id', $orderId)->lock(true)->find();
if (!$lockedOrder || (int)$lockedOrder['status'] !== OrderStatus::ACCEPTED || !empty($lockedOrder['contact_time'])) {
Db::rollback();
continue;
}
$masterId = (int)$lockedOrder['master_id'];
$toStatus = $lockedOrder['price_type'] === 'quote' ? OrderStatus::QUOTING : OrderStatus::PENDING_ACCEPT;
// 1. 退回待接单/报价中状态(公海接单大厅)
Db::name('order')->where('id', $orderId)->update([
'status' => OrderStatus::PENDING_ACCEPT,
'status' => $toStatus,
'master_id' => 0,
'accept_time' => 0,
'updatetime' => time(),
'accept_time' => null,
'updatetime' => $now,
]);
// 2. 插入订单状态变迁日志
if ($lockedOrder['price_type'] === 'quote') {
Db::name('order_quote')
->where('order_id', $orderId)
->where('status', 'accept')
->update(['status' => 'wait']);
}
// 2. 插入订单状态变迁日志(严格对齐 fa_order_log 真实列名)
Db::name('order_log')->insert([
'order_id' => $orderId,
'from_status'=> OrderStatus::ACCEPTED,
'to_status' => OrderStatus::PENDING_ACCEPT,
'remark' => '师傅接单后超2小时未联系客户,系统自动退回公海大厅',
'operator' => 'system',
'op_id' => 0,
'createtime' => time(),
'order_id' => $orderId,
'status' => $toStatus,
'remark' => '师傅接单后超2小时未联系客户,系统自动退回公海大厅',
'operator_type' => 'system',
'operator_id' => 0,
'createtime' => $now,
]);
// 3. 对原接单师傅扣减信用分(扣 2 分)与推送警告
// 3. 给原接单师傅发送超时退单警告通知(严格对齐 fa_message 真实列名,receive_id 传 fa_master.id)
if ($masterId > 0) {
$master = Db::name('master')->where('id', $masterId)->lock(true)->find();
$master = Db::name('master')->where('id', $masterId)->find();
if ($master) {
$newScore = max(0, (float)$master['credit_score'] - 2.0);
Db::name('master')->where('id', $masterId)->update([
'credit_score' => $newScore,
'updatetime' => time(),
]);
// 记录信誉流水表(如表存在)
if (Db::query("SHOW TABLES LIKE '%master_credit_log%'")) {
Db::name('master_credit_log')->insert([
'master_id' => $masterId,
'type' => 'contact_timeout',
'score' => -2.0,
'balance' => $newScore,
'order_id' => $orderId,
'remark' => '接单后超2小时未首联,违规扣除信誉分',
'createtime' => time(),
]);
}
// 给师傅发送通知
Db::name('message')->insert([
'user_type' => 'master',
'user_id' => (int)$master['user_id'],
'title' => '接单超时退单警告',
'content' => "订单 {$order['order_no']} 因超过2小时未联系客户,已被系统回收退回公海,扣除信誉分 2 分",
'type' => 'order',
'target_id' => $orderId,
'is_read' => 0,
'createtime' => time(),
'receive_type' => 'master',
'receive_id' => (int)$master['id'],
'type' => 'order',
'title' => '接单超时退单警告',
'content' => "订单 {$lockedOrder['order_no']} 因超过2小时未联系客户,已被系统回收退回接单大厅",
'order_id' => $orderId,
'is_read' => 0,
'createtime' => $now,
]);
}
}
Db::commit();
$recycled++;
$output->writeln(" [OK] 订单 #{$orderId} ({$order['order_no']}) 超时退单成功,已重置回公海大厅");
$output->writeln(" [OK] 订单 #{$orderId} ({$lockedOrder['order_no']}) 超时退单成功,已重置回公海大厅");
} catch (\Exception $e) {
Db::rollback();
$output->writeln(" [FAIL] 订单 #{$orderId} 超时退单失败: " . $e->getMessage());