@if (is_string(session('success')))
{{ session('success') }}
@endif @if ($errors->has('import')) @endif @if ($errors->has('dingtalk_push') || $errors->has('dingtalk_webhook') || $errors->has('dingtalk_secret')) @endif
下载对账单模板 @canany(['read-purchases-vendors', 'create-purchases-vendors']) 厂家登录账号管理 @endcanany
@if ($supplierNotFound) @endif

比对口径:按「采购单号 + 日期 + 条码」核对,同一采购单号、日期和条码的多行先合并数量与金额。 数量、金额一致 → 正常结算;厂家多(我方没有)→ 不结算、退回修改; 数量或金额不一致 → 明确列出双方数量、单价、金额及厂家多算部分,取金额低的一方结算; 厂家少(我方有)→ 按厂家数据结算(不付款)。厂家未填采购单号时,仅在同日期+条码能唯一匹配我方一条数据时兜底。
厂家登录:在「厂家登录账号管理」新增供应商并勾选可登录,供应商名称必须与对账数据中的厂家名称完全一致; 厂家登录后只能查看自己的对账单上传记录、全部退货明细及导出数据。

@if ($detail) @php $differenceCount = (int) $detail['summary']['supplierExtra'] + (int) $detail['summary']['mismatch'] + (int) $detail['summary']['supplierMissing']; @endphp

{{ $selectedSupplier }} · 比对明细

月份 {{ $month !== '' ? $month : '全部' }} @if ($reconciler !== '') · 对账人 {{ $reconciler }} @endif @if (($uploads[$selectedSupplier]['uploaded_at'] ?? null) !== null) · 最近上传 {{ $uploads[$selectedSupplier]['uploaded_at'] }}({{ number_format((int) ($uploads[$selectedSupplier]['rows'] ?? 0)) }} 行) @else · 该厂家还没有上传对账单 @endif ← 返回供应商列表 导出比对汇总 下载对账单模板 @if ($differenceCount > 0)
@csrf
@csrf
@endif
厂家钉钉群机器人: {{ $robot['configured'] ? '已配置' : '未配置,配置后才能推送差异' }} @if ($robot['last_pushed_at'] !== '') · 上次推送 {{ $robot['last_pushed_at'] }}({{ $robot['last_push_count'] }} 条) @endif
@csrf

在厂家钉钉群的「群设置 → 智能群助手 → 添加机器人 → 自定义」中复制 Webhook;如机器人启用加签,请同时填写加签密钥。 如机器人使用关键词校验,请把关键词设为「货款对账」。 Webhook 和密钥保存后仅用于本系统推送,页面不会再次展示完整内容。

@else

各厂家上传情况(实时)

@forelse ($supplierNames as $supplier) @php $upload = $uploads[$supplier] ?? null; @endphp @empty @endforelse
供应商 最近上传时间 上传行数 比对
{{ $supplier }} {{ $upload['uploaded_at'] ?? '—' }} {{ $upload ? number_format((int) ($upload['rows'] ?? 0)) : '—' }} 查看比对
还没有可对账的供应商:请先在「供应商应付(终版)→ 货款对账」导入我方结算数据。
@endif @if ($detail)

比对汇总(我方 {{ number_format($detail['mineRows']) }} 行 / 厂家 {{ number_format($detail['theirsRows']) }} 行)

双方一致{{ $detail['summary']['match'] }}
厂家多(退回修改){{ $detail['summary']['supplierExtra'] }}
数量/金额不一致(按低结算){{ $detail['summary']['mismatch'] }}
厂家少(按厂家结算){{ $detail['summary']['supplierMissing'] }}
我方金额合计{{ number_format($detail['summary']['mineAmount'], 2) }}
厂家金额合计{{ number_format($detail['summary']['theirsAmount'], 2) }}
厂家多算金额{{ number_format($detail['summary']['supplierOverAmount'], 2) }}
按口径结算合计{{ number_format($detail['summary']['settleAmount'], 2) }}
差异金额{{ number_format($detail['summary']['differenceAmount'], 2) }}
@forelse ($detail['rows'] as $row) @php $tagClass = match ($row['type']) { '厂家多' => 'is-extra', '数量/金额不一致' => 'is-mismatch', '厂家少' => 'is-missing', default => 'is-match', }; @endphp @empty @endforelse
比对结果 采购单号 日期 条码 我方数量 我方单价 我方金额 厂家数量 厂家单价 厂家金额 数量差异(厂家-我方) 金额差异(厂家-我方) 结算口径 结算金额 推送
@if ($row['type'] !== '一致') @else — @endif {{ $row['type'] }} {{ $row['purchaseNo'] !== '' ? $row['purchaseNo'] : '—' }} {{ $row['date'] !== '' ? $row['date'] : '—' }} {{ $row['barcode'] }} @if (! empty($row['supplierBarcode'])) (厂家:{{ $row['supplierBarcode'] }}) @endif {{ $row['mineQty'] !== 0.0 ? number_format($row['mineQty'], 2) : '—' }} {{ $row['mineUnitPrice'] !== 0.0 ? number_format($row['mineUnitPrice'], 2) : '—' }} {{ $row['mineAmount'] !== 0.0 ? number_format($row['mineAmount'], 2) : '—' }} {{ $row['theirsQty'] !== 0.0 ? number_format($row['theirsQty'], 2) : '—' }} {{ $row['theirsUnitPrice'] !== 0.0 ? number_format($row['theirsUnitPrice'], 2) : '—' }} {{ $row['theirsAmount'] !== 0.0 ? number_format($row['theirsAmount'], 2) : '—' }} @if (abs($row['qtyDifference']) < 0.005) 一致 @else 厂家{{ $row['qtyDifference'] > 0 ? '多' : '少' }} {{ number_format(abs($row['qtyDifference']), 2) }} @endif @if (abs($row['amountDifference']) < 0.005) 一致 @else 厂家{{ $row['amountDifference'] > 0 ? '多' : '少' }} ¥{{ number_format(abs($row['amountDifference']), 2) }} @endif {{ $row['note'] }} {{ number_format($row['settleAmount'], 2) }} @if ($row['type'] !== '一致')
@csrf
@else — @endif
该厂家还没有上传对账单,或我方还没有这家供应商的结算数据。
@php $comparisonPageCount = max((int) ($detail['pages'] ?? 1), 1); $comparisonPageCurrent = min(max((int) ($detail['page'] ?? 1), 1), $comparisonPageCount); $comparisonPageStart = max(1, min($comparisonPageCurrent - 4, $comparisonPageCount - 8)); $comparisonPageEnd = min($comparisonPageCount, $comparisonPageStart + 8); $comparisonPageUrl = fn (int $number): string => route('business.pages.show', array_merge(request()->query(), [ 'section' => $section['slug'], 'page' => $page['slug'], 'compare_page' => $number, ])); @endphp 共 {{ number_format((int) ($detail['total_rows'] ?? 0)) }} 条 · 每页 {{ number_format((int) ($detail['per_page'] ?? 15)) }} 条 · 第 {{ $comparisonPageCurrent }} / {{ $comparisonPageCount }} 页 @if ($comparisonPageCurrent > 1) 上一页 @endif @if ($comparisonPageStart > 1) 1 @if ($comparisonPageStart > 2) … @endif @endif @for ($number = $comparisonPageStart; $number <= $comparisonPageEnd; $number++) {{ $number }} @endfor @if ($comparisonPageEnd < $comparisonPageCount) @if ($comparisonPageEnd < $comparisonPageCount - 1) … @endif {{ $comparisonPageCount }} @endif @if ($comparisonPageCurrent < $comparisonPageCount) 下一页 @endif
@php $returnAccounting = $financeReturnPanel['accounting_summary']; @endphp

退货扣减 · 财务与厂家同步

直接读取「应付款终版 → 退货对账」同一数据集;修改退货数量、备注、标题后,财务端和厂家门户同时更新。
退货行数{{ number_format($returnAccounting['count']) }}
厂家净扣减¥{{ number_format($returnAccounting['supplier_amount'], 2) }}
转物流记账{{ number_format($returnAccounting['logistics_qty'], 2) }} 件
转物流金额¥{{ number_format($returnAccounting['logistics_amount'], 2) }}
不记账行数{{ number_format($returnAccounting['no_bookkeeping_rows']) }}
@if ($returnAccounting['logistics_rows'] > 0)

已识别 {{ number_format($returnAccounting['logistics_rows']) }} 行“不扣本厂家、转物流记账” @if (! empty($returnAccounting['logistics_companies'])) ,物流公司:{{ implode('、', $returnAccounting['logistics_companies']) }} @endif 。厂家端显示相同备注和“转物流记账”标记,厂家扣减金额按调整后的净数量/金额计算。

@endif
@forelse ($financeReturnPanel['rows'] as $row) $row['_accounting_target'] === '物流'])> @empty @endforelse
发货时间条形码商品名称 厂家扣减数量厂家扣减金额记账归属 物流记账数量物流记账金额物流公司 备注快递单号对账人确认状态
{{ $row['send_time'] ?? '—' }} {{ $row['barcode'] ?? '—' }} {{ $row['sku_name'] ?? '—' }} {{ $row['_accounting_target'] === '不记账' ? '—' : number_format($row['_supplier_qty'], 2) }} {{ $row['_accounting_target'] === '不记账' ? '—' : number_format($row['_supplier_amount'], 2) }} {{ $row['_accounting_label'] }} @if ($row['_accounting_note'] !== '按厂家退货扣减')
{{ $row['_accounting_note'] }}
@endif
{{ $row['_logistics_qty'] > 0 ? number_format($row['_logistics_qty'], 2) : '—' }} {{ $row['_logistics_amount'] > 0 ? number_format($row['_logistics_amount'], 2) : '—' }} {{ $row['_logistics_company'] !== '' ? $row['_logistics_company'] : '—' }} {{ $row['remark'] ?? '—' }} {{ $row['express_no'] ?? '—' }} {{ $row['reconciler'] ?? '—' }} @if ($row['status'] === 'confirmed') 已确认 @elseif ($row['status'] === 'disputed') 异议中 @else 待确认 @endif
当前月份和对账人筛选下没有退货数据。
@if ($financeReturnPanel['pages'] > 1) @php $returnPageCount = $financeReturnPanel['pages']; $returnPageCurrent = $financeReturnPanel['page']; $returnPageStart = max(1, min($returnPageCurrent - 4, $returnPageCount - 8)); $returnPageEnd = min($returnPageCount, $returnPageStart + 8); $returnPageUrl = fn (int $number): string => route('business.pages.show', array_filter([ 'section' => $section['slug'], 'page' => $page['slug'], 'supplier' => $selectedSupplier, 'month' => $month, 'reconciler' => $reconciler, 'finance_return_page' => $number, ], static fn (mixed $value): bool => $value !== null && $value !== '')); @endphp
第 {{ $returnPageCurrent }} / {{ $returnPageCount }} 页(每页 {{ $financeReturnPanel['per_page'] }} 行) @if ($returnPageCurrent > 1) 上一页 @endif @for ($number = $returnPageStart; $number <= $returnPageEnd; $number++) {{ $number }} @endfor @if ($returnPageCurrent < $returnPageCount) 下一页 @endif
@endif
@endif
@if ($detail && $differenceCount > 0) @endif