合并:新增原材料应付页面

This commit is contained in:
WuYongJie 2026-07-22 13:36:25 +08:00
parent 274513598a
commit fa9444bbbe
27 changed files with 1529 additions and 2 deletions

View File

@ -191,10 +191,11 @@ return [
],
[
'slug' => 'lamination-factory-payables',
'title' => '原材-压贴厂应付',
'title' => '原材料-压贴厂应付',
'icon' => 'factory',
'pages' => [
['slug' => 'lamination-prices', 'title' => '压贴费价格'],
['slug' => 'finished-board-prices', 'title' => '成品板价格'],
['slug' => 'lamination-fees', 'title' => '压贴费'],
['slug' => 'finished-board-freight', 'title' => '成品板运费'],
['slug' => 'paper-stock-in', 'title' => '入库纸张'],
@ -203,6 +204,7 @@ return [
['slug' => 'raw-board-freight', 'title' => '素板运费'],
['slug' => 'invoice-tax-points', 'title' => '发票(税点)'],
['slug' => 'factory-compensation', 'title' => '赔付明细(压贴厂)'],
['slug' => 'factory-payables-details', 'title' => '压贴厂应付明细表'],
['slug' => 'factory-payables-report', 'title' => '压贴厂应付表'],
],
],

View File

@ -0,0 +1,175 @@
<style>
.edge-banding-page {
color: #1f2937;
}
.edge-banding-toolbar {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 0.75rem;
margin-bottom: 1rem;
padding: 1rem;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
background: #ffffff;
}
.edge-banding-field {
display: flex;
min-width: 9rem;
flex-direction: column;
gap: 0.35rem;
}
.edge-banding-field label {
color: #6b7280;
font-size: 0.75rem;
font-weight: 600;
}
.edge-banding-field input,
.edge-banding-field select {
height: 2.25rem;
min-width: 9rem;
padding: 0 0.65rem;
border: 1px solid #d1d5db;
border-radius: 0.375rem;
background: #ffffff;
color: #374151;
font-size: 0.8125rem;
outline: none;
}
.edge-banding-field input:focus,
.edge-banding-field select:focus {
border-color: #6366f1;
box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.12);
}
.edge-banding-table-card {
overflow: hidden;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
background: #ffffff;
}
.edge-banding-table-scroll {
overflow-x: auto;
}
.edge-banding-table {
width: 100%;
min-width: 68rem;
border-collapse: collapse;
font-size: 0.8125rem;
}
.edge-banding-table--details {
min-width: 128rem;
}
.edge-banding-table th,
.edge-banding-table td {
height: 2.75rem;
padding: 0.55rem 0.7rem;
border-right: 1px solid #e5e7eb;
border-bottom: 1px solid #e5e7eb;
text-align: left;
white-space: nowrap;
}
.edge-banding-table th:last-child,
.edge-banding-table td:last-child {
border-right: 0;
}
.edge-banding-table thead th {
background: #f4f6fa;
color: #374151;
font-weight: 700;
}
.edge-banding-table tbody tr:hover {
background: #f9fafb;
}
.edge-banding-table .is-number {
text-align: right;
}
.edge-banding-table .is-empty td {
height: 8rem;
color: #9ca3af;
text-align: center;
}
.edge-banding-table--compensation thead th:last-child {
background: #fff200;
color: #111827;
}
.edge-banding-table--payables {
min-width: 82rem;
}
.edge-banding-table--payables thead th,
.edge-banding-table--payables tfoot td {
border-color: #064b2a;
background: #08ad4f;
color: #062b19;
text-align: center;
white-space: normal;
}
.edge-banding-table--payables thead tr:first-child th {
height: 3.25rem;
font-size: 1.2rem;
font-weight: 500;
}
.edge-banding-table--payables tbody td {
text-align: right;
}
.edge-banding-table--payables tbody td:nth-child(2) {
text-align: left;
}
.edge-banding-table--payables tfoot td {
font-weight: 700;
text-align: right;
}
.edge-banding-table--payables tfoot td:first-child,
.edge-banding-table--payables tfoot td:last-child {
text-align: left;
}
.edge-banding-pagination {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 1rem;
color: #6b7280;
font-size: 0.8125rem;
}
@media (max-width: 640px) {
.edge-banding-toolbar {
align-items: stretch;
}
.edge-banding-field,
.edge-banding-field input,
.edge-banding-field select {
width: 100%;
}
.edge-banding-pagination {
align-items: flex-start;
flex-direction: column;
}
}
</style>

View File

@ -0,0 +1,57 @@
<div class="edge-banding-page">
@include('business.pages.edge-banding-materials._styles')
<div class="edge-banding-toolbar" aria-label="封边条赔偿筛选">
<div class="edge-banding-field">
<label for="edge-compensation-order">单号</label>
<input id="edge-compensation-order" type="text" placeholder="请输入单号">
</div>
<div class="edge-banding-field">
<label for="edge-compensation-arrival-factory">到货厂商</label>
<input id="edge-compensation-arrival-factory" type="text" placeholder="请输入到货厂商">
</div>
<div class="edge-banding-field">
<label for="edge-compensation-date">创建日期</label>
<input id="edge-compensation-date" type="date">
</div>
<div class="edge-banding-field">
<label for="edge-compensation-raw-name">原料名称</label>
<input id="edge-compensation-raw-name" type="text" placeholder="请输入原料名称">
</div>
<div class="edge-banding-field">
<label for="edge-compensation-delivery-factory">送货厂商</label>
<input id="edge-compensation-delivery-factory" type="text" placeholder="请输入送货厂商">
</div>
</div>
<div class="edge-banding-table-card">
<div class="edge-banding-table-scroll">
<table class="edge-banding-table edge-banding-table--compensation">
<thead>
<tr>
<th>单号</th>
<th>到货厂商</th>
<th>创建日期</th>
<th>原料名称</th>
<th class="is-number">申领米数</th>
<th class="is-number">已出库米数</th>
<th>最新出库日期</th>
<th>送货厂商</th>
<th>事由</th>
<th class="is-number">超时天数</th>
<th class="is-number">违约金</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="11">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="edge-banding-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,81 @@
<div class="edge-banding-page">
@include('business.pages.edge-banding-materials._styles')
<div class="edge-banding-toolbar" aria-label="封边条明细筛选">
<div class="edge-banding-field">
<label for="edge-details-in-date">入库日期</label>
<input id="edge-details-in-date" type="date">
</div>
<div class="edge-banding-field">
<label for="edge-details-production-code">原料生产编号</label>
<input id="edge-details-production-code" type="text" placeholder="请输入生产编号">
</div>
<div class="edge-banding-field">
<label for="edge-details-raw-name">原料名称</label>
<input id="edge-details-raw-name" type="text" placeholder="请输入原料名称">
</div>
<div class="edge-banding-field">
<label for="edge-details-return-flag">退货标识</label>
<select id="edge-details-return-flag">
<option>全部</option>
<option>正常出库</option>
<option>退货</option>
</select>
</div>
<div class="edge-banding-field">
<label for="edge-details-out-factory">出库厂商</label>
<input id="edge-details-out-factory" type="text" placeholder="请输入出库厂商">
</div>
<div class="edge-banding-field">
<label for="edge-details-arrival-factory">到货厂商</label>
<input id="edge-details-arrival-factory" type="text" placeholder="请输入到货厂商">
</div>
<div class="edge-banding-field">
<label for="edge-details-out-number">出库单号</label>
<input id="edge-details-out-number" type="text" placeholder="请输入出库单号">
</div>
</div>
<div class="edge-banding-table-card">
<div class="edge-banding-table-scroll">
<table class="edge-banding-table edge-banding-table--details">
<thead>
<tr>
<th>入库日期</th>
<th>原料生产编号</th>
<th>原料名称</th>
<th class="is-number">出库数量</th>
<th>单位</th>
<th>退货标识</th>
<th>出库厂商</th>
<th>到货厂商</th>
<th>批次日期</th>
<th>出库单号</th>
<th>出库备注</th>
<th>申领单号</th>
<th>单号类型</th>
<th>送货单号</th>
<th class="is-number">实收数量</th>
<th class="is-number">对账金额</th>
<th class="is-number">运费</th>
<th class="is-number">封边条厂单价</th>
<th class="is-number">应付金额</th>
<th class="is-number">家具厂单价</th>
<th class="is-number">家具厂金额</th>
<th class="is-number">价格差</th>
<th class="is-number">利润</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="23">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="edge-banding-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,78 @@
<div class="edge-banding-page">
@include('business.pages.edge-banding-materials._styles')
<div class="edge-banding-toolbar" aria-label="封边条应付筛选">
<div class="edge-banding-field">
<label for="edge-payables-period">应付月份</label>
<input id="edge-payables-period" type="month" value="2026-06">
</div>
<div class="edge-banding-field">
<label for="edge-payables-supplier">供货单位</label>
<input id="edge-payables-supplier" type="text" placeholder="请输入供货单位">
</div>
</div>
<div class="edge-banding-table-card">
<div class="edge-banding-table-scroll">
<table class="edge-banding-table edge-banding-table--payables">
<thead>
<tr>
<th colspan="13">2026年公司应付封边条厂6月份货款</th>
</tr>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">供货单位</th>
<th rowspan="2">月初未付</th>
<th>加</th>
<th>加</th>
<th>减</th>
<th>加</th>
<th aria-hidden="true"></th>
<th aria-hidden="true"></th>
<th>单位:元</th>
<th aria-hidden="true"></th>
<th aria-hidden="true"></th>
<th rowspan="2">备注</th>
</tr>
<tr>
<th>货款</th>
<th>代垫付运费</th>
<th>赔付</th>
<th>封边条厂家回款</th>
<th>应付金额</th>
<th>已付金额</th>
<th>实际打款金额</th>
<th>对私打款</th>
<th>对公打款</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="13">暂无数据</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>合计</td>
<td></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>全部对公</td>
</tr>
</tfoot>
</table>
</div>
<div class="edge-banding-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,65 @@
<div class="edge-banding-page">
@include('business.pages.edge-banding-materials._styles')
<div class="edge-banding-toolbar" aria-label="封边条价格筛选">
<div class="edge-banding-field">
<label for="edge-price-type">价格类型</label>
<select id="edge-price-type">
<option>全部价格</option>
<option>封边条厂价格</option>
<option>家具厂价格</option>
</select>
</div>
<div class="edge-banding-field">
<label for="edge-price-raw-name">原料名称</label>
<input id="edge-price-raw-name" type="text" placeholder="请输入原料名称">
</div>
<div class="edge-banding-field">
<label for="edge-price-raw-code">原料编号</label>
<input id="edge-price-raw-code" type="text" placeholder="请输入原料编号">
</div>
<div class="edge-banding-field">
<label for="edge-price-production-code">生产编号</label>
<input id="edge-price-production-code" type="text" placeholder="请输入生产编号">
</div>
<div class="edge-banding-field">
<label for="edge-price-target-factory">目标厂商</label>
<input id="edge-price-target-factory" type="text" placeholder="请输入目标厂商">
</div>
<div class="edge-banding-field">
<label for="edge-price-factory-type">厂商类型</label>
<select id="edge-price-factory-type">
<option>全部厂商</option>
<option>封边条厂</option>
<option>家具厂</option>
</select>
</div>
</div>
<div class="edge-banding-table-card">
<div class="edge-banding-table-scroll">
<table class="edge-banding-table">
<thead>
<tr>
<th>价格类型</th>
<th>原料名称</th>
<th>原料编号</th>
<th>生产编号</th>
<th class="is-number">最新价格</th>
<th>目标厂商</th>
<th>厂商类型</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="7">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="edge-banding-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,47 @@
<div class="lamination-page" id="{{ $laminationPageId }}">
@include('business.pages.lamination-factory-payables._styles')
<div class="lamination-toolbar" aria-label="{{ $laminationToolbarLabel }}">
@foreach ($laminationFilters as $filter)
<div class="lamination-field">
<label for="{{ $filter['id'] }}">{{ $filter['label'] }}</label>
@if (($filter['type'] ?? 'text') === 'select')
<select id="{{ $filter['id'] }}">
@foreach ($filter['options'] as $option)
<option>{{ $option }}</option>
@endforeach
</select>
@else
<input
id="{{ $filter['id'] }}"
type="{{ $filter['type'] ?? 'text' }}"
@if (!empty($filter['placeholder'])) placeholder="{{ $filter['placeholder'] }}" @endif
>
@endif
</div>
@endforeach
</div>
<div class="lamination-table-card">
<div class="lamination-table-scroll">
<table class="lamination-table {{ $laminationTableModifier ?? '' }}">
<thead>
<tr>
@foreach ($laminationColumns as $column)
<th @class(['is-number' => !empty($column['numeric'])])>{{ $column['label'] }}</th>
@endforeach
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="{{ count($laminationColumns) }}">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="lamination-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,190 @@
<style>
.lamination-page {
color: #1f2937;
}
.lamination-toolbar {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 0.75rem;
margin-bottom: 1rem;
padding: 1rem;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
background: #ffffff;
}
.lamination-field {
display: flex;
min-width: 9rem;
flex-direction: column;
gap: 0.35rem;
}
.lamination-field label {
color: #6b7280;
font-size: 0.75rem;
font-weight: 600;
}
.lamination-field input,
.lamination-field select {
height: 2.25rem;
min-width: 9rem;
padding: 0 0.65rem;
border: 1px solid #d1d5db;
border-radius: 0.375rem;
background: #ffffff;
color: #374151;
font-size: 0.8125rem;
outline: none;
}
.lamination-field input:focus,
.lamination-field select:focus {
border-color: #6366f1;
box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.12);
}
.lamination-table-card {
overflow: hidden;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
background: #ffffff;
}
.lamination-table-scroll {
overflow-x: auto;
}
.lamination-table {
width: 100%;
min-width: 56rem;
border-collapse: collapse;
font-size: 0.8125rem;
}
.lamination-table--medium {
min-width: 76rem;
}
.lamination-table--wide {
min-width: 122rem;
}
.lamination-table th,
.lamination-table td {
height: 2.75rem;
padding: 0.55rem 0.7rem;
border-right: 1px solid #e5e7eb;
border-bottom: 1px solid #e5e7eb;
text-align: left;
white-space: nowrap;
}
.lamination-table th:last-child,
.lamination-table td:last-child {
border-right: 0;
}
.lamination-table thead th {
background: #f4f6fa;
color: #374151;
font-weight: 700;
}
.lamination-table tbody tr:hover {
background: #f9fafb;
}
.lamination-table .is-number {
text-align: right;
}
.lamination-table .is-empty td {
height: 8rem;
color: #9ca3af;
text-align: center;
}
.lamination-table--accent-first thead th:first-child {
background: #7ddbd4;
color: #123b38;
}
.lamination-table--green-header thead th {
background: #98d84e;
color: #163300;
}
.lamination-table--blue-header thead th {
background: #3c379f;
color: #ffffff;
}
.lamination-table--payables {
min-width: 116rem;
}
.lamination-table--payables thead th {
border-color: #064b2a;
background: #08ad4f;
color: #062b19;
text-align: center;
white-space: normal;
}
.lamination-table--payables thead tr:first-child th {
height: 3.25rem;
font-size: 1.2rem;
font-weight: 500;
}
.lamination-table--payables tbody td {
text-align: right;
}
.lamination-table--payables tbody td:nth-child(2) {
text-align: left;
}
.lamination-table--payables tfoot td {
border-color: #087ea4;
background: #12afe0;
color: #073b4c;
font-weight: 700;
text-align: right;
}
.lamination-table--payables tfoot td:nth-child(2) {
text-align: left;
}
.lamination-pagination {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 1rem;
color: #6b7280;
font-size: 0.8125rem;
}
@media (max-width: 640px) {
.lamination-toolbar {
align-items: stretch;
}
.lamination-field,
.lamination-field input,
.lamination-field select {
width: 100%;
}
.lamination-pagination {
align-items: flex-start;
flex-direction: column;
}
}
</style>

View File

@ -0,0 +1,13 @@
@php
$laminationPageId = 'factory-compensation-page';
$laminationToolbarLabel = '压贴厂赔付筛选';
$laminationFilters = [
['id' => 'factory-compensation-name', 'label' => '厂家', 'placeholder' => '请输入厂家'],
['id' => 'factory-compensation-reason', 'label' => '事由', 'placeholder' => '请输入事由'],
];
$laminationColumns = [
['label' => '厂家'], ['label' => '事由'], ['label' => '补款金额', 'numeric' => true],
['label' => '来源金额', 'numeric' => true],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,24 @@
@php
$laminationPageId = 'factory-payables-details-page';
$laminationToolbarLabel = '压贴厂应付明细筛选';
$laminationTableModifier = 'lamination-table--wide';
$laminationFilters = [
['id' => 'payables-details-date', 'label' => '入库日期', 'type' => 'date'],
['id' => 'payables-details-lamination-factory', 'label' => '压贴厂', 'placeholder' => '请输入压贴厂'],
['id' => 'payables-details-furniture-factory', 'label' => '家具厂', 'placeholder' => '请输入家具厂'],
['id' => 'payables-details-spec', 'label' => '规格', 'placeholder' => '请输入规格'],
['id' => 'payables-details-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
];
$laminationColumns = [
['label' => '入库日期'], ['label' => '压贴厂'], ['label' => '家具厂'], ['label' => '规格'],
['label' => '原料名称'], ['label' => '单位'], ['label' => '实收数量', 'numeric' => true],
['label' => '单价', 'numeric' => true], ['label' => '金额', 'numeric' => true], ['label' => '出库备注'],
['label' => '纸张1单价', 'numeric' => true], ['label' => '纸张2单价', 'numeric' => true],
['label' => '纸张合计', 'numeric' => true], ['label' => '压贴费', 'numeric' => true],
['label' => '压贴费合计', 'numeric' => true], ['label' => '垫付纸运费', 'numeric' => true],
['label' => '垫付纸运费合计', 'numeric' => true], ['label' => '素板', 'numeric' => true],
['label' => '素板金额', 'numeric' => true], ['label' => '成品板运费', 'numeric' => true],
['label' => '成品板运费合计', 'numeric' => true],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,81 @@
<div class="lamination-page">
@include('business.pages.lamination-factory-payables._styles')
<div class="lamination-toolbar" aria-label="压贴厂应付表筛选">
<div class="lamination-field">
<label for="factory-payables-period">应付月份</label>
<input id="factory-payables-period" type="month" value="2026-05">
</div>
<div class="lamination-field">
<label for="factory-payables-supplier">供货单位</label>
<input id="factory-payables-supplier" type="text" placeholder="请输入供货单位">
</div>
</div>
<div class="lamination-table-card">
<div class="lamination-table-scroll">
<table class="lamination-table lamination-table--payables">
<thead>
<tr>
<th colspan="19">2026年公司应付压贴厂5月份货款</th>
</tr>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">供货单位</th>
<th rowspan="2">月初未付</th>
<th>加</th>
<th>加</th>
<th>加</th>
<th>加</th>
<th>加</th>
<th>加</th>
<th>减</th>
<th>减</th>
<th>加</th>
<th>加</th>
<th aria-hidden="true"></th>
<th aria-hidden="true"></th>
<th>单位:元</th>
<th aria-hidden="true"></th>
<th aria-hidden="true"></th>
<th rowspan="2">备注</th>
</tr>
<tr>
<th>出库纸张金额</th>
<th>压贴费金额</th>
<th>代垫付运费</th>
<th>垫付纸运费</th>
<th>素板</th>
<th>成品板运费</th>
<th>入库纸张金额</th>
<th>赔付</th>
<th>压贴厂回款</th>
<th>其他补款</th>
<th>应付金额</th>
<th>已付金额</th>
<th>实际打款金额</th>
<th>对公打款</th>
<th>对私打款</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="19">暂无数据</td>
</tr>
</tbody>
<tfoot>
<tr>
<td></td>
<td>合计</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td>
<td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td></td>
</tr>
</tfoot>
</table>
</div>
<div class="lamination-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,15 @@
@php
$laminationPageId = 'factory-raw-boards-page';
$laminationToolbarLabel = '压贴厂素板筛选';
$laminationTableModifier = 'lamination-table--accent-first';
$laminationFilters = [
['id' => 'factory-board-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'factory-board-order-type', 'label' => '单号类型', 'type' => 'select', 'options' => ['全部类型', '申领单', '补料单']],
['id' => 'factory-board-claim-number', 'label' => '申领单号', 'placeholder' => '请输入申领单号'],
];
$laminationColumns = [
['label' => '原料名称'], ['label' => '纸张1', 'numeric' => true], ['label' => '纸张2', 'numeric' => true],
['label' => '纸张合计', 'numeric' => true], ['label' => '单号类型'], ['label' => '申领单号'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,17 @@
@php
$laminationPageId = 'finished-board-freight-page';
$laminationToolbarLabel = '成品板运费筛选';
$laminationTableModifier = 'lamination-table--accent-first';
$laminationFilters = [
['id' => 'finished-freight-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'finished-freight-spec', 'label' => '成品板规格', 'placeholder' => '请输入成品板规格'],
['id' => 'finished-freight-order-type', 'label' => '单号类型', 'type' => 'select', 'options' => ['全部类型', '申领单', '补料单']],
['id' => 'finished-freight-claim-number', 'label' => '申领单号', 'placeholder' => '请输入申领单号'],
];
$laminationColumns = [
['label' => '原料名称'], ['label' => '成品板规格'], ['label' => '数量', 'numeric' => true],
['label' => '单价', 'numeric' => true], ['label' => '金额', 'numeric' => true],
['label' => '单号类型'], ['label' => '申领单号'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,17 @@
@php
$laminationPageId = 'finished-board-prices-page';
$laminationToolbarLabel = '成品板价格筛选';
$laminationFilters = [
['id' => 'finished-price-type', 'label' => '价格类型', 'type' => 'select', 'options' => ['全部价格', '采购价格', '结算价格']],
['id' => 'finished-price-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'finished-price-material-code', 'label' => '原料编号', 'placeholder' => '请输入原料编号'],
['id' => 'finished-price-production-code', 'label' => '生产编号', 'placeholder' => '请输入生产编号'],
['id' => 'finished-price-target-factory', 'label' => '目标厂商', 'placeholder' => '请输入目标厂商'],
['id' => 'finished-price-factory-type', 'label' => '厂商类型', 'type' => 'select', 'options' => ['全部厂商', '压贴厂', '家具厂']],
];
$laminationColumns = [
['label' => '价格类型'], ['label' => '原料名称'], ['label' => '原料编号'], ['label' => '生产编号'],
['label' => '最新价格', 'numeric' => true], ['label' => '目标厂商'], ['label' => '厂商类型'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,20 @@
@php
$laminationPageId = 'invoice-tax-points-page';
$laminationToolbarLabel = '发票税点筛选';
$laminationTableModifier = 'lamination-table--medium lamination-table--blue-header';
$laminationFilters = [
['id' => 'tax-point-date', 'label' => '入库日期', 'type' => 'date'],
['id' => 'tax-point-arrival-factory', 'label' => '到货厂商', 'placeholder' => '请输入到货厂商'],
['id' => 'tax-point-out-factory', 'label' => '出库厂商', 'placeholder' => '请输入出库厂商'],
['id' => 'tax-point-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'tax-point-order-type', 'label' => '单号类型', 'type' => 'select', 'options' => ['全部类型', '申领单', '补料单']],
['id' => 'tax-point-claim-number', 'label' => '申领单号', 'placeholder' => '请输入申领单号'],
];
$laminationColumns = [
['label' => '入库日期'], ['label' => '到货厂商'], ['label' => '出库厂商'], ['label' => '原料名称'],
['label' => '单号类型'], ['label' => '实收数量', 'numeric' => true], ['label' => '单价', 'numeric' => true],
['label' => '对账金额', 'numeric' => true], ['label' => '备注'], ['label' => '运费', 'numeric' => true],
['label' => '申领单号'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,15 @@
@php
$laminationPageId = 'lamination-fees-page';
$laminationToolbarLabel = '压贴费筛选';
$laminationTableModifier = 'lamination-table--accent-first';
$laminationFilters = [
['id' => 'lamination-fee-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'lamination-fee-order-type', 'label' => '单号类型', 'type' => 'select', 'options' => ['全部类型', '申领单', '补料单']],
['id' => 'lamination-fee-claim-number', 'label' => '申领单号', 'placeholder' => '请输入申领单号'],
];
$laminationColumns = [
['label' => '原料名称'], ['label' => '数量', 'numeric' => true], ['label' => '单价', 'numeric' => true],
['label' => '金额', 'numeric' => true], ['label' => '单号类型'], ['label' => '申领单号'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,18 @@
@php
$laminationPageId = 'lamination-prices-page';
$laminationToolbarLabel = '压贴费价格筛选';
$laminationFilters = [
['id' => 'lamination-price-type', 'label' => '价格类型', 'type' => 'select', 'options' => ['全部价格', '标准价格', '临时价格']],
['id' => 'lamination-price-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'lamination-price-material-code', 'label' => '原料编码', 'placeholder' => '请输入原料编码'],
['id' => 'lamination-price-production-code', 'label' => '生产编号', 'placeholder' => '请输入生产编号'],
['id' => 'lamination-price-target-factory', 'label' => '目标厂商', 'placeholder' => '请输入目标厂商'],
['id' => 'lamination-price-factory-type', 'label' => '厂商类型', 'type' => 'select', 'options' => ['全部厂商', '压贴厂', '家具厂']],
['id' => 'lamination-price-date', 'label' => '执行日期', 'type' => 'date'],
];
$laminationColumns = [
['label' => '价格类型'], ['label' => '原料名称'], ['label' => '原料编码'], ['label' => '生产编号'],
['label' => '价格', 'numeric' => true], ['label' => '目标厂商'], ['label' => '厂商类型'], ['label' => '执行日期'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,13 @@
@php
$laminationPageId = 'paper-stock-in-page';
$laminationToolbarLabel = '入库纸张筛选';
$laminationFilters = [
['id' => 'paper-in-lamination-factory', 'label' => '压贴厂', 'placeholder' => '请输入压贴厂'],
['id' => 'paper-in-furniture-factory', 'label' => '家具厂', 'placeholder' => '请输入家具厂'],
['id' => 'paper-in-spec', 'label' => '规格', 'placeholder' => '请输入规格'],
];
$laminationColumns = [
['label' => '压贴厂'], ['label' => '家具厂'], ['label' => '规格'], ['label' => '价格', 'numeric' => true],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,18 @@
@php
$laminationPageId = 'paper-stock-out-page';
$laminationToolbarLabel = '出库纸张筛选';
$laminationTableModifier = 'lamination-table--green-header';
$laminationFilters = [
['id' => 'paper-out-date', 'label' => '入库日期', 'type' => 'date'],
['id' => 'paper-out-factory', 'label' => '出库厂商', 'placeholder' => '请输入出库厂商'],
['id' => 'paper-out-arrival-factory', 'label' => '到货厂商', 'placeholder' => '请输入到货厂商'],
['id' => 'paper-out-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'paper-out-claim-number', 'label' => '申领单号', 'placeholder' => '请输入申领单号'],
];
$laminationColumns = [
['label' => '入库日期'], ['label' => '出库厂商'], ['label' => '到货厂商'], ['label' => '原料名称'],
['label' => '实收数量', 'numeric' => true], ['label' => '压贴厂单价', 'numeric' => true],
['label' => '压贴厂金额', 'numeric' => true], ['label' => '申领单号'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,17 @@
@php
$laminationPageId = 'raw-board-freight-page';
$laminationToolbarLabel = '素板运费筛选';
$laminationTableModifier = 'lamination-table--accent-first';
$laminationFilters = [
['id' => 'raw-board-freight-material', 'label' => '原料名称', 'placeholder' => '请输入原料名称'],
['id' => 'raw-board-freight-spec', 'label' => '素板规格', 'placeholder' => '请输入素板规格'],
['id' => 'raw-board-freight-order-type', 'label' => '单号类型', 'type' => 'select', 'options' => ['全部类型', '申领单', '补料单']],
['id' => 'raw-board-freight-claim-number', 'label' => '申领单号', 'placeholder' => '请输入申领单号'],
];
$laminationColumns = [
['label' => '原料名称'], ['label' => '素板规格'], ['label' => '数量', 'numeric' => true],
['label' => '单价', 'numeric' => true], ['label' => '金额', 'numeric' => true],
['label' => '单号类型'], ['label' => '申领单号'],
];
@endphp
@include('business.pages.lamination-factory-payables._standard-page')

View File

@ -0,0 +1,177 @@
<style>
.paper-material-page {
color: #1f2937;
}
.paper-material-toolbar {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 0.75rem;
margin-bottom: 1rem;
padding: 1rem;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
background: #ffffff;
}
.paper-material-field {
display: flex;
min-width: 9rem;
flex-direction: column;
gap: 0.35rem;
}
.paper-material-field label {
color: #6b7280;
font-size: 0.75rem;
font-weight: 600;
}
.paper-material-field input,
.paper-material-field select {
height: 2.25rem;
min-width: 9rem;
padding: 0 0.65rem;
border: 1px solid #d1d5db;
border-radius: 0.375rem;
background: #ffffff;
color: #374151;
font-size: 0.8125rem;
outline: none;
}
.paper-material-field input:focus,
.paper-material-field select:focus {
border-color: #6366f1;
box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.12);
}
.paper-material-table-card {
overflow: hidden;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
background: #ffffff;
}
.paper-material-table-scroll {
overflow-x: auto;
}
.paper-material-table {
width: 100%;
min-width: 68rem;
border-collapse: collapse;
font-size: 0.8125rem;
}
.paper-material-table th,
.paper-material-table td {
height: 2.75rem;
padding: 0.55rem 0.7rem;
border-right: 1px solid #e5e7eb;
border-bottom: 1px solid #e5e7eb;
text-align: left;
white-space: nowrap;
}
.paper-material-table th:last-child,
.paper-material-table td:last-child {
border-right: 0;
}
.paper-material-table thead th {
background: #f4f6fa;
color: #374151;
font-weight: 700;
}
.paper-material-table tbody tr:hover {
background: #f9fafb;
}
.paper-material-table .is-number {
text-align: right;
}
.paper-material-table .is-empty td {
height: 8rem;
color: #9ca3af;
text-align: center;
}
.paper-material-table--penalty thead th:last-child {
background: #fff200;
color: #111827;
}
.paper-material-table--payables {
min-width: 76rem;
}
.paper-material-table--payables thead th {
border-color: #064b2a;
background: #08ad4f;
color: #062b19;
text-align: center;
white-space: normal;
}
.paper-material-table--payables thead tr:first-child th {
height: 3.25rem;
font-size: 1rem;
}
.paper-material-table--payables thead tr:first-child th:first-child {
font-size: 1.2rem;
font-weight: 500;
}
.paper-material-table--payables tbody td {
text-align: right;
}
.paper-material-table--payables tbody td:nth-child(2),
.paper-material-table--payables tfoot td:nth-child(2) {
text-align: left;
}
.paper-material-table--payables tfoot td {
border-color: #087ea4;
background: #12afe0;
color: #073b4c;
font-weight: 700;
text-align: right;
}
.paper-material-table--payables tfoot td:first-child {
text-align: left;
}
.paper-material-pagination {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 1rem;
color: #6b7280;
font-size: 0.8125rem;
}
@media (max-width: 640px) {
.paper-material-toolbar {
align-items: stretch;
}
.paper-material-field,
.paper-material-field input,
.paper-material-field select {
width: 100%;
}
.paper-material-pagination {
align-items: flex-start;
flex-direction: column;
}
}
</style>

View File

@ -0,0 +1,59 @@
<div class="paper-material-page">
@include('business.pages.paper-materials._styles')
<div class="paper-material-toolbar" aria-label="入库纸张筛选">
<div class="paper-material-field">
<label for="paper-details-out-date">出库日期</label>
<input id="paper-details-out-date" type="date">
</div>
<div class="paper-material-field">
<label for="paper-details-in-date">入库日期</label>
<input id="paper-details-in-date" type="date">
</div>
<div class="paper-material-field">
<label for="paper-details-out-factory">出库厂商</label>
<input id="paper-details-out-factory" type="text" placeholder="请输入出库厂商">
</div>
<div class="paper-material-field">
<label for="paper-details-arrival-factory">到货厂商</label>
<input id="paper-details-arrival-factory" type="text" placeholder="请输入到货厂商">
</div>
<div class="paper-material-field">
<label for="paper-details-raw-name">原料名称</label>
<input id="paper-details-raw-name" type="text" placeholder="请输入原料名称">
</div>
</div>
<div class="paper-material-table-card">
<div class="paper-material-table-scroll">
<table class="paper-material-table">
<thead>
<tr>
<th>出库日期</th>
<th>入库日期</th>
<th>出库厂商</th>
<th>到货厂商</th>
<th>原料名称</th>
<th class="is-number">实收数量</th>
<th class="is-number">纸厂单价</th>
<th class="is-number">应付金额</th>
<th class="is-number">压贴厂单价</th>
<th class="is-number">压贴厂金额</th>
<th class="is-number">价格差</th>
<th class="is-number">利润</th>
<th>申领单号</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="13">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="paper-material-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,73 @@
<div class="paper-material-page">
@include('business.pages.paper-materials._styles')
<div class="paper-material-toolbar" aria-label="纸厂应付筛选">
<div class="paper-material-field">
<label for="paper-payables-period">应付月份</label>
<input id="paper-payables-period" type="month" value="2026-06">
</div>
<div class="paper-material-field">
<label for="paper-payables-supplier">供货单位</label>
<input id="paper-payables-supplier" type="text" placeholder="请输入供货单位">
</div>
</div>
<div class="paper-material-table-card">
<div class="paper-material-table-scroll">
<table class="paper-material-table paper-material-table--payables">
<thead>
<tr>
<th colspan="12">2026年公司应付纸厂6月份货款</th>
</tr>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">供货单位</th>
<th rowspan="2">月初未付</th>
<th>本月采购金额</th>
<th>加</th>
<th>减</th>
<th>加</th>
<th>加</th>
<th>单位:元</th>
<th rowspan="2">对私打款</th>
<th rowspan="2">对公打款</th>
<th rowspan="2">备注</th>
</tr>
<tr>
<th>货款金额</th>
<th>应付金额</th>
<th>赔付</th>
<th>垫纸运费</th>
<th>纸加工票点</th>
<th>实际应付金额</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="12">暂无数据</td>
</tr>
</tbody>
<tfoot>
<tr>
<td></td>
<td>合计</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td></td>
</tr>
</tfoot>
</table>
</div>
<div class="paper-material-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,65 @@
<div class="paper-material-page">
@include('business.pages.paper-materials._styles')
<div class="paper-material-toolbar" aria-label="纸张价格筛选">
<div class="paper-material-field">
<label for="paper-price-type">价格类型</label>
<select id="paper-price-type">
<option>全部价格</option>
<option>纸厂价格</option>
<option>压贴厂价格</option>
</select>
</div>
<div class="paper-material-field">
<label for="paper-raw-name">原料名称</label>
<input id="paper-raw-name" type="text" placeholder="请输入原料名称">
</div>
<div class="paper-material-field">
<label for="paper-raw-code">原料编号</label>
<input id="paper-raw-code" type="text" placeholder="请输入原料编号">
</div>
<div class="paper-material-field">
<label for="paper-production-code">生产编号</label>
<input id="paper-production-code" type="text" placeholder="请输入生产编号">
</div>
<div class="paper-material-field">
<label for="paper-target-factory">目标厂商</label>
<input id="paper-target-factory" type="text" placeholder="请输入目标厂商">
</div>
<div class="paper-material-field">
<label for="paper-factory-type">厂商类型</label>
<select id="paper-factory-type">
<option>全部厂商</option>
<option>纸厂</option>
<option>压贴厂</option>
</select>
</div>
</div>
<div class="paper-material-table-card">
<div class="paper-material-table-scroll">
<table class="paper-material-table">
<thead>
<tr>
<th>价格类型</th>
<th>原料名称</th>
<th>原料编号</th>
<th>生产编号</th>
<th class="is-number">最新价格</th>
<th>目标厂商</th>
<th>厂商类型</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="7">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="paper-material-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -0,0 +1,56 @@
<div class="paper-material-page">
@include('business.pages.paper-materials._styles')
<div class="paper-material-toolbar" aria-label="赔付明细筛选">
<div class="paper-material-field">
<label for="paper-penalty-order">单号</label>
<input id="paper-penalty-order" type="text" placeholder="请输入单号">
</div>
<div class="paper-material-field">
<label for="paper-penalty-arrival-factory">到货厂商</label>
<input id="paper-penalty-arrival-factory" type="text" placeholder="请输入到货厂商">
</div>
<div class="paper-material-field">
<label for="paper-penalty-date">创建日期</label>
<input id="paper-penalty-date" type="date">
</div>
<div class="paper-material-field">
<label for="paper-penalty-raw-name">原料名称</label>
<input id="paper-penalty-raw-name" type="text" placeholder="请输入原料名称">
</div>
<div class="paper-material-field">
<label for="paper-penalty-delivery-factory">送货厂商</label>
<input id="paper-penalty-delivery-factory" type="text" placeholder="请输入送货厂商">
</div>
</div>
<div class="paper-material-table-card">
<div class="paper-material-table-scroll">
<table class="paper-material-table paper-material-table--penalty">
<thead>
<tr>
<th>单号</th>
<th>到货厂商</th>
<th>创建日期</th>
<th>原料名称</th>
<th class="is-number">申领数量</th>
<th class="is-number">超时天数</th>
<th>事由</th>
<th class="is-number">已出库数量</th>
<th>送货厂商</th>
<th class="is-number">违约金</th>
</tr>
</thead>
<tbody>
<tr class="is-empty">
<td colspan="10">暂无数据</td>
</tr>
</tbody>
</table>
</div>
<div class="paper-material-pagination">
<span>共 0 条记录</span>
<span>第 1 / 1 页</span>
</div>
</div>
</div>

View File

@ -71,6 +71,10 @@
background: #ffffff;
}
[v-cloak] {
display: none;
}
@media (min-width: 1280px) {
#main-body > .container {
margin-left: 2.5rem;
@ -104,10 +108,28 @@
</nav>
@endif
@if ($page && !empty($content) && !empty($content['view']))
@php
$pageView = null;
if ($page) {
$viewName = 'business.pages.' . $section['slug'] . '.' . $page['slug'];
if ($tabs->isNotEmpty()) {
$viewName .= '.' . ($activeTab['slug'] ?? '');
}
if (view()->exists($viewName)) {
$pageView = $viewName;
}
}
@endphp
@if (!empty($content) && !empty($content['view']))
<section class="business-content-section" aria-label="{{ $activeTab['title'] ?? ($page['title'] ?? $section['title']) }}">
@include($content['view'], $content)
</section>
@elseif ($pageView)
@include($pageView)
@else
<section class="business-blank-page" aria-label="{{ $activeTab['title'] ?? ($page['title'] ?? $section['title']) }}"></section>
@endif

View File

@ -0,0 +1,112 @@
<?php
namespace Tests\Feature\Business;
use App\Models\Auth\Permission;
use Tests\Feature\FeatureTestCase;
class PagesTest extends FeatureTestCase
{
public function testSupplierPayablesPageRendersItsSpecificContent()
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail()
);
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'supplier-payables',
'page' => 'payment-reconciliation',
]))
->assertOk()
->assertSee('id="goods-reconciliation-app"', false)
->assertSee('public/js/ecommerce-finance/goods-reconciliations.min.js', false)
->assertDontSee('class="business-blank-page"', false);
}
public function testPaperMaterialPagesRenderAsSeparateTables()
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail()
);
$pages = [
'paper-prices' => '价格类型',
'paper-details' => '压贴厂金额',
'penalty-details' => '违约金',
'paper-factory-payables' => '2026年公司应付纸厂6月份货款',
];
foreach ($pages as $page => $expectedHeader) {
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'paper-materials',
'page' => $page,
]))
->assertOk()
->assertSee($expectedHeader)
->assertSee('class="paper-material-table', false)
->assertDontSee('class="business-blank-page"', false);
}
}
public function testEdgeBandingMaterialPagesRenderAsSeparateTables()
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail()
);
$pages = [
'edge-banding-prices' => '价格类型',
'details' => '封边条厂单价',
'compensation' => '最新出库日期',
'edge-banding-payables' => '2026年公司应付封边条厂6月份货款',
];
foreach ($pages as $page => $expectedHeader) {
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'edge-banding-materials',
'page' => $page,
]))
->assertOk()
->assertSee($expectedHeader)
->assertSee('class="edge-banding-table', false)
->assertDontSee('class="business-blank-page"', false);
}
}
public function testLaminationFactoryPayablePagesRenderAsSeparateTables()
{
$this->user->attachPermission(
Permission::where('name', 'read-admin-panel')->firstOrFail()
);
$pages = [
'lamination-prices' => '执行日期',
'finished-board-prices' => '最新价格',
'lamination-fees' => '单号类型',
'finished-board-freight' => '成品板规格',
'paper-stock-in' => '家具厂',
'paper-stock-out' => '压贴厂金额',
'factory-raw-boards' => '纸张合计',
'raw-board-freight' => '素板规格',
'invoice-tax-points' => '对账金额',
'factory-compensation' => '来源金额',
'factory-payables-details' => '成品板运费合计',
'factory-payables-report' => '2026年公司应付压贴厂5月份货款',
];
foreach ($pages as $page => $expectedHeader) {
$this->loginAs()
->get(route('business.pages.show', [
'section' => 'lamination-factory-payables',
'page' => $page,
]))
->assertOk()
->assertSee($expectedHeader)
->assertSee('class="lamination-table', false)
->assertDontSee('class="business-blank-page"', false);
}
}
}