feat(finance): 实现发票管理页面与子页面

This commit is contained in:
2026-03-04 15:58:08 +08:00
parent 15d4272d1f
commit 5fd5d0d2f2
28 changed files with 3322 additions and 157 deletions

View File

@@ -0,0 +1,24 @@
/**
* 文件职责:发票管理页面基础样式。
*/
.page-finance-invoice {
.ant-card {
border-radius: 10px;
}
}
.fi-page {
display: flex;
flex-direction: column;
gap: 12px;
}
.fi-tab-panel {
display: flex;
flex-direction: column;
gap: 12px;
}
.fi-mono {
font-family: ui-monospace, sfmono-regular, menlo, consolas, monospace;
}

View File

@@ -0,0 +1,135 @@
/**
* 文件职责:发票抽屉样式。
*/
.page-finance-invoice {
.ant-drawer {
.ant-drawer-header {
padding: 14px 18px;
border-bottom: 1px solid #f0f0f0;
}
.ant-drawer-body {
padding: 16px 20px;
}
.ant-drawer-footer {
padding: 12px 20px;
border-top: 1px solid #f0f0f0;
}
}
}
.fi-section {
margin-bottom: 20px;
}
.fi-section-title {
padding-left: 10px;
margin-bottom: 14px;
font-size: 14px;
font-weight: 600;
color: rgb(0 0 0 / 88%);
border-left: 3px solid #1677ff;
}
.fi-info-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px 20px;
font-size: 13px;
.label {
color: rgb(0 0 0 / 45%);
}
.full {
grid-column: 1 / -1;
}
}
.fi-amount-strong {
font-weight: 600;
color: rgb(0 0 0 / 88%);
}
.fi-drawer-footer {
display: flex;
gap: 8px;
justify-content: flex-end;
}
.fi-timeline {
position: relative;
padding-left: 22px;
}
.fi-timeline-item {
position: relative;
display: flex;
gap: 8px;
align-items: center;
padding-bottom: 18px;
font-size: 13px;
&::before {
position: absolute;
top: 5px;
left: -22px;
width: 10px;
height: 10px;
content: '';
background: #1677ff;
border: 2px solid #d6e4ff;
border-radius: 50%;
}
&::after {
position: absolute;
top: 17px;
left: -18px;
width: 2px;
height: calc(100% - 12px);
content: '';
background: #e8e8e8;
}
&:last-child {
padding-bottom: 0;
&::after {
display: none;
}
}
.text {
font-weight: 500;
color: rgb(0 0 0 / 88%);
}
.time {
color: rgb(0 0 0 / 45%);
}
}
.fi-remark-box {
display: flex;
flex-direction: column;
gap: 8px;
padding: 10px 14px;
font-size: 13px;
color: rgb(0 0 0 / 65%);
background: #fafafa;
border: 1px solid #f0f0f0;
border-radius: 8px;
}
.fi-remark-line {
display: flex;
gap: 8px;
.label {
width: 70px;
flex-shrink: 0;
color: rgb(0 0 0 / 45%);
}
}

View File

@@ -0,0 +1,9 @@
/**
* 文件职责:发票管理页面样式聚合入口。
*/
@import './base.less';
@import './layout.less';
@import './table.less';
@import './drawer.less';
@import './modal.less';
@import './responsive.less';

View File

@@ -0,0 +1,166 @@
/**
* 文件职责:发票管理页面布局样式。
*/
.fi-seg-wrap {
margin-bottom: 2px;
}
.fi-stats {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.fi-stat-card {
padding: 18px 20px;
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 10px;
box-shadow: 0 2px 8px rgb(15 23 42 / 6%);
transition: all 0.2s ease;
&:hover {
box-shadow: 0 6px 14px rgb(15 23 42 / 10%);
transform: translateY(-1px);
}
&.warn .fi-stat-val {
color: #fa8c16;
}
&.danger .fi-stat-val {
color: #ff4d4f;
}
}
.fi-stat-label {
display: flex;
gap: 6px;
align-items: center;
margin-bottom: 8px;
font-size: 13px;
color: rgb(0 0 0 / 45%);
}
.fi-stat-icon {
width: 16px;
height: 16px;
}
.fi-stat-val {
font-size: 24px;
font-weight: 700;
line-height: 1.2;
color: rgb(0 0 0 / 88%);
}
.fi-stat-sub {
margin-top: 4px;
font-size: 12px;
color: rgb(0 0 0 / 45%);
}
.fi-toolbar {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
padding: 14px 16px;
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 10px;
box-shadow: 0 2px 8px rgb(15 23 42 / 6%);
.fi-date-input {
width: 146px;
}
.fi-status-select,
.fi-type-select {
width: 124px;
}
.fi-date-sep {
font-size: 13px;
line-height: 32px;
color: rgb(0 0 0 / 45%);
}
.fi-toolbar-spacer {
flex: 1;
}
.fi-search {
width: 220px;
}
.fi-search-icon {
width: 14px;
height: 14px;
color: rgb(0 0 0 / 45%);
}
.ant-select-selector,
.ant-input,
.ant-input-affix-wrapper {
height: 32px;
font-size: 13px;
}
.ant-input-affix-wrapper .ant-input {
height: 100%;
}
}
.fi-settings {
display: flex;
flex-direction: column;
gap: 12px;
}
.fi-section-hd {
padding-left: 10px;
margin-bottom: 16px;
font-size: 15px;
font-weight: 600;
color: rgb(0 0 0 / 88%);
border-left: 3px solid #1677ff;
}
.fi-form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px 24px;
}
.fi-toggle-row {
display: flex;
gap: 10px;
align-items: center;
margin-bottom: 14px;
}
.fi-toggle-label {
font-size: 13px;
font-weight: 500;
color: rgb(0 0 0 / 88%);
}
.fi-toggle-hint {
font-size: 12px;
color: rgb(0 0 0 / 45%);
}
.fi-auto-form {
max-width: 340px;
}
.fi-max-amount-input {
width: 100%;
}
.fi-save-bar {
display: flex;
gap: 8px;
justify-content: flex-end;
}

View File

@@ -0,0 +1,63 @@
/**
* 文件职责:发票弹窗样式。
*/
.fi-void-modal,
.fi-issue-result,
.fi-settings-confirm {
display: flex;
flex-direction: column;
gap: 12px;
}
.fi-void-warning {
margin: 0;
font-size: 13px;
color: #cf1322;
}
.fi-void-summary,
.fi-result-list,
.fi-settings-list {
display: flex;
flex-direction: column;
gap: 8px;
padding: 12px 14px;
background: #fafafa;
border: 1px solid #f0f0f0;
border-radius: 8px;
}
.fi-void-line,
.fi-result-line,
.fi-settings-line {
display: flex;
gap: 16px;
justify-content: space-between;
font-size: 13px;
.label {
color: rgb(0 0 0 / 45%);
}
.value {
color: rgb(0 0 0 / 88%);
text-align: right;
}
}
.fi-result-title {
font-size: 15px;
font-weight: 600;
color: #1677ff;
}
.fi-result-footer {
display: flex;
justify-content: flex-end;
}
.fi-settings-desc {
margin: 0;
font-size: 13px;
color: rgb(0 0 0 / 65%);
}

View File

@@ -0,0 +1,47 @@
/**
* 文件职责:发票管理页面响应式样式。
*/
@media (max-width: 1600px) {
.fi-stats {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 768px) {
.fi-stats {
grid-template-columns: 1fr;
}
.fi-toolbar {
padding: 14px 12px;
.fi-date-input,
.fi-status-select,
.fi-type-select,
.fi-search {
width: 100%;
}
.fi-date-sep,
.fi-toolbar-spacer {
display: none;
}
}
.fi-form-grid,
.fi-info-grid {
grid-template-columns: 1fr;
.full {
grid-column: auto;
}
}
.fi-save-bar {
justify-content: stretch;
.ant-btn {
flex: 1;
}
}
}

View File

@@ -0,0 +1,62 @@
/**
* 文件职责:发票记录表格样式。
*/
.fi-table-card {
overflow: hidden;
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 10px;
.ant-table-wrapper {
.ant-table-thead > tr > th {
font-size: 13px;
white-space: nowrap;
}
.ant-table-tbody > tr > td {
font-size: 13px;
vertical-align: middle;
}
}
.ant-pagination {
margin: 14px 16px;
}
}
.fi-company-cell {
display: flex;
flex-direction: column;
gap: 2px;
.fi-applicant {
font-weight: 500;
color: rgb(0 0 0 / 88%);
}
.fi-company {
font-size: 12px;
color: rgb(0 0 0 / 45%);
}
}
.fi-amount {
font-weight: 600;
color: rgb(0 0 0 / 88%);
}
.fi-time {
font-size: 12px;
color: rgb(0 0 0 / 45%);
white-space: nowrap;
}
.fi-link-action {
padding-inline: 0;
}
.fi-action-wrap {
display: inline-flex;
gap: 8px;
align-items: center;
}