调整部分前端布局和后端增删改逻辑

This commit is contained in:
焦龙言
2026-09-20 10:38:10 +08:00
parent acddc8a237
commit 3edba99d2d
227 changed files with 122871 additions and 839 deletions
+2 -2
View File
@@ -1,8 +1,8 @@
# 页面标题
VITE_APP_TITLE = vfadmin管理系统
VITE_APP_TITLE = 智链云枢管理系统
# 开发环境配置
VITE_APP_ENV = 'development'
# vfadmin管理系统/开发环境
# 智链云枢管理系统/开发环境
VITE_APP_BASE_API = '/dev-api'
+3 -3
View File
@@ -1,11 +1,11 @@
# 页面标题
VITE_APP_TITLE = vfadmin管理系统
VITE_APP_TITLE = 智链云枢管理系统
# 生产环境配置
VITE_APP_ENV = 'docker'
# vfadmin管理系统/生产环境
# 智链云枢管理系统/生产环境
VITE_APP_BASE_API = '/docker-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip
VITE_BUILD_COMPRESS = gzip
+3 -3
View File
@@ -1,11 +1,11 @@
# 页面标题
VITE_APP_TITLE = vfadmin管理系统
VITE_APP_TITLE = 智链云枢管理系统
# 生产环境配置
VITE_APP_ENV = 'production'
# vfadmin管理系统/生产环境
# 智链云枢管理系统/生产环境
VITE_APP_BASE_API = '/prod-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip
VITE_BUILD_COMPRESS = gzip
+3 -3
View File
@@ -1,11 +1,11 @@
# 页面标题
VITE_APP_TITLE = vfadmin管理系统
VITE_APP_TITLE = 智链云枢管理系统
# 生产环境配置
VITE_APP_ENV = 'staging'
# vfadmin管理系统/生产环境
# 智链云枢管理系统/生产环境
VITE_APP_BASE_API = '/stage-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip
VITE_BUILD_COMPRESS = gzip
@@ -1076,14 +1076,65 @@ test('重复扫码仅在相同值和时间窗口内成立', async () => {
assert.equal(isDuplicateScan('qr-a', 'qr-b', 1200, 1000, 500), false)
})
test('幂等键由 Web Crypto randomUUID 生成且不降级为伪随机值', async () => {
test('幂等键优先使用 Web Crypto randomUUID', async () => {
const palletScanPath = path.join(frontendRoot, 'src/utils/palletScan.js')
const source = await readFile(palletScanPath, 'utf8')
const { createIdempotencyKey } = await import('../src/utils/palletScan.js')
let getRandomValuesCalled = false
const expectedKey = '12345678-1234-4123-8123-123456789abc'
assert.match(source, /globalThis\.crypto\.randomUUID\(\)/)
const actualKey = createIdempotencyKey({
randomUUID: () => expectedKey,
getRandomValues: () => {
getRandomValuesCalled = true
throw new Error('存在 randomUUID 时不应调用 getRandomValues')
}
})
assert.equal(actualKey, expectedKey)
assert.equal(getRandomValuesCalled, false)
assert.doesNotMatch(source, /Date\.now|Math\.random|new Date/)
assert.match(createIdempotencyKey(), /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i)
})
test('局域网 HTTP 环境缺少 randomUUID 时使用安全随机数生成 UUID v4', async () => {
const { createIdempotencyKey } = await import('../src/utils/palletScan.js')
const cryptoProvider = {
getRandomValues(bytes) {
bytes.fill(0)
return bytes
}
}
assert.equal(createIdempotencyKey(cryptoProvider), '00000000-0000-4000-8000-000000000000')
})
test('首次入库确认由业务幂等键保护,不被通用短时重复提交规则拦截', async () => {
const source = await readFile(path.join(frontendRoot, 'src/api/business/inbound.js'), 'utf8')
const confirmInboundSource = extractNamedFunction(source, 'confirmInbound')
assert.match(confirmInboundSource, /headers\s*:\s*\{\s*repeatSubmit\s*:\s*false\s*\}/)
})
test('首次入库确认重试前清理旧错误,并明确重试会再次请求服务端', async () => {
const source = await readFile(path.join(frontendRoot, 'src/views/business/inbound/index.vue'), 'utf8')
const confirmSource = extractNamedFunction(source, 'handleConfirm')
const confirmCatch = extractPromiseCallback(confirmSource, 'catch')
const clearErrorIndex = confirmSource.indexOf("loadError.value = ''")
assert.ok(clearErrorIndex >= 0, '入库确认缺少旧错误状态清理')
assert.ok(
clearErrorIndex < confirmSource.indexOf('proxy.$modal.confirm('),
'打开确认框前必须清理上一次的失败状态'
)
assert.match(confirmCatch, /再次确认将重新请求服务端,并复用本次幂等键/)
})
test('首次入库确认失败后取消重试不丢弃原幂等键', async () => {
const source = await readFile(path.join(frontendRoot, 'src/views/business/inbound/index.vue'), 'utf8')
const confirmSource = extractNamedFunction(source, 'handleConfirm')
const confirmCatch = extractPromiseCallback(confirmSource, 'catch')
assert.doesNotMatch(confirmCatch, /clearConfirmIdempotency\(\)|handleConfirmCancellation\(/)
})
test('17 个 API 文件逐一匹配硬编码请求契约', async (t) => {
@@ -0,0 +1,79 @@
import test from 'node:test'
import assert from 'node:assert/strict'
import fs from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const scriptDir = path.dirname(fileURLToPath(import.meta.url))
const dashboardPath = path.resolve(scriptDir, '../src/views/dashboard/index.vue')
const dashboardSource = fs.readFileSync(dashboardPath, 'utf8')
test('首页包含仓储运营总览的核心模块', () => {
for (const label of [
'仓储运营总览',
'当前库存托盘',
'剩余包数',
'今日入库单',
'今日出库单',
'待确认单据',
'新增入库',
'托盘填充',
'发货出库',
'托盘使用',
'托盘退回',
'托盘追踪',
'近 7 天入库 / 出库趋势',
'托盘流转状态分布',
'仓库库存排行',
'最近入库单',
'最近出库单',
'扫码异常',
'待确认业务'
]) {
assert.match(dashboardSource, new RegExp(label.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')))
}
})
test('首页不再包含通用模板示例内容', () => {
for (const sample of [
'项目数',
'团队内排名',
'项目访问',
'Alipay',
'Angular',
'Ant Design',
'XX 指数',
'吴彦祖'
]) {
assert.doesNotMatch(dashboardSource, new RegExp(sample.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')))
}
})
test('首页使用现有业务报表接口并保留空状态策略', () => {
for (const dependency of [
'@/api/business/inbound',
'@/api/business/shipment',
'@/api/business/return',
'@/api/report/palletInventory',
'@/api/report/shipment'
]) {
assert.match(dashboardSource, new RegExp(dependency.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')))
}
assert.match(dashboardSource, /暂无扫码异常记录/)
assert.match(dashboardSource, /loadDashboardData/)
})
test('首页快捷入口使用动态菜单注册的页面路径', () => {
for (const route of [
'/businessOperation/inbound',
'/businessOperation/filling',
'/businessOperation/shipment',
'/businessOperation/usage',
'/businessOperation/return',
'/businessReport/palletInventory',
'/businessReport/palletTrace',
'/businessMaster/warehouse'
]) {
assert.match(dashboardSource, new RegExp(route.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&')))
}
})
@@ -65,6 +65,7 @@ export function confirmInbound(inboundId, data) {
return request({
url: '/business/inbound/' + inboundId + '/confirm',
method: 'put',
data: data
data: data,
headers: { repeatSubmit: false }
})
}
@@ -0,0 +1,180 @@
/* 三个业务菜单的统一工作区视觉与响应式规则 */
.app-container.business-page,
.app-container.master-page,
.app-container.report-page {
min-height: 100%;
padding: 18px 20px 24px;
background: #f5f7fb;
}
.business-page .page-filter,
.master-page .page-filter,
.report-page .page-filter {
margin: 0 0 14px;
padding: 14px 16px 2px;
border: 1px solid #e7ebf2;
border-radius: 12px;
background: #fff;
box-shadow: 0 3px 14px rgba(31, 55, 88, 0.05);
}
.business-page .page-filter .el-form-item,
.master-page .page-filter .el-form-item,
.report-page .page-filter .el-form-item {
margin-bottom: 12px;
}
.business-page .page-filter .el-input,
.business-page .page-filter .el-select,
.business-page .page-filter .el-input-number,
.master-page .page-filter .el-input,
.master-page .page-filter .el-select,
.master-page .page-filter .el-input-number,
.report-page .page-filter .el-input,
.report-page .page-filter .el-select,
.report-page .page-filter .el-input-number,
.report-page .page-filter .el-date-editor {
min-width: 190px;
}
.business-page .page-toolbar,
.master-page .page-toolbar,
.report-page .page-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 38px;
margin: 0 0 12px;
}
.business-page .page-toolbar .el-row,
.master-page .page-toolbar .el-row,
.report-page .page-toolbar .el-row {
margin: 0 !important;
}
.business-page .data-table,
.master-page .data-table,
.report-page .data-table {
width: 100%;
border: 1px solid #e7ebf2;
border-radius: 12px;
overflow: hidden;
background: #fff;
box-shadow: 0 3px 14px rgba(31, 55, 88, 0.04);
}
.business-page .data-table .el-table__header th,
.master-page .data-table .el-table__header th,
.report-page .data-table .el-table__header th {
height: 46px !important;
background: #f7f9fc !important;
color: #344054;
font-weight: 650;
}
.business-page .data-table .el-table__body td,
.master-page .data-table .el-table__body td,
.report-page .data-table .el-table__body td {
height: 52px;
}
.business-page .data-table .el-table__body tr:nth-child(even) > td,
.master-page .data-table .el-table__body tr:nth-child(even) > td,
.report-page .data-table .el-table__body tr:nth-child(even) > td {
background: #fbfcfe;
}
.business-page .data-table .el-table__inner-wrapper::before,
.master-page .data-table .el-table__inner-wrapper::before,
.report-page .data-table .el-table__inner-wrapper::before {
height: 0;
}
.business-page .el-alert,
.master-page .el-alert,
.report-page .el-alert {
border-radius: 10px;
}
.business-page .pagination-container,
.master-page .pagination-container,
.report-page .pagination-container {
margin-top: 14px;
padding: 0 2px;
}
.business-page .operation-card {
border-radius: 12px;
box-shadow: 0 3px 14px rgba(31, 55, 88, 0.05);
}
@media (max-width: 767px) {
.app-container.business-page,
.app-container.master-page,
.app-container.report-page {
padding: 12px;
}
.business-page .page-filter,
.master-page .page-filter,
.report-page .page-filter {
padding: 14px 14px 2px;
}
.business-page .page-filter .el-form-item,
.master-page .page-filter .el-form-item,
.report-page .page-filter .el-form-item {
display: block;
margin-right: 0;
}
.business-page .page-filter .el-form-item__label,
.master-page .page-filter .el-form-item__label,
.report-page .page-filter .el-form-item__label {
display: block;
width: 100% !important;
margin-bottom: 6px;
text-align: left;
}
.business-page .page-filter .el-form-item__content,
.master-page .page-filter .el-form-item__content,
.report-page .page-filter .el-form-item__content {
margin-left: 0 !important;
}
.business-page .page-filter .el-input,
.business-page .page-filter .el-select,
.business-page .page-filter .el-input-number,
.master-page .page-filter .el-input,
.master-page .page-filter .el-select,
.master-page .page-filter .el-input-number,
.report-page .page-filter .el-input,
.report-page .page-filter .el-select,
.report-page .page-filter .el-input-number,
.report-page .page-filter .el-date-editor {
width: 100% !important;
min-width: 0;
}
.business-page .page-toolbar,
.master-page .page-toolbar,
.report-page .page-toolbar {
align-items: stretch;
flex-direction: column;
}
.business-page .page-toolbar .el-button,
.master-page .page-toolbar .el-button,
.report-page .page-toolbar .el-button {
min-height: 40px;
}
.business-page .data-table,
.master-page .data-table,
.report-page .data-table {
overflow-x: auto;
}
}
@@ -5,6 +5,8 @@
@use './btn.scss';
@use './shierfeng.scss';
@use './data-pages.scss';
body {
height: 100%;
margin: 0;
@@ -12,14 +12,6 @@
<template v-if="appStore.device !== 'mobile'">
<header-search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<shi-er-feng-git id="shierfeng-git" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<shi-er-feng-doc id="shierfeng-doc" class="right-menu-item hover-effect" />
</el-tooltip>
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<el-tooltip content="主题模式" effect="dark" placement="bottom">
@@ -67,8 +59,6 @@ import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import HeaderSearch from '@/components/HeaderSearch'
import ShiErFengGit from '@/components/ShiErFeng/Git'
import ShiErFengDoc from '@/components/ShiErFeng/Doc'
import useAppStore from '@/store/modules/app'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
@@ -12,6 +12,17 @@ export function isDuplicateScan(value, lastValue, scannedAt, lastScannedAt, dupl
return value === lastValue && elapsed >= 0 && elapsed <= duplicateWindowMs
}
export function createIdempotencyKey() {
return globalThis.crypto.randomUUID()
export function createIdempotencyKey(cryptoProvider = globalThis.crypto) {
if (typeof cryptoProvider?.randomUUID === 'function') {
return cryptoProvider.randomUUID()
}
if (typeof cryptoProvider?.getRandomValues !== 'function') {
throw new Error('当前浏览器不支持安全随机数,请使用 HTTPS 或 localhost 访问系统')
}
const bytes = cryptoProvider.getRandomValues(new Uint8Array(16))
bytes[6] = (bytes[6] & 0x0f) | 0x40
bytes[8] = (bytes[8] & 0x3f) | 0x80
const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`
}
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container business-page business-filling">
<el-form ref="queryRef" :model="queryParams" :inline="true" class="page-filter">
<el-form-item label="装填单号" prop="fillingNo">
<el-input v-model="queryParams.fillingNo" placeholder="请输入装填单号" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -16,7 +16,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 page-toolbar">
<el-col :span="1.5">
<el-button
v-if="canAddFilling"
@@ -32,7 +32,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="fillingList">
<el-table v-loading="loading" empty-text="暂无数据" :data="fillingList" class="data-table">
<el-table-column label="装填单号" prop="fillingNo" min-width="170" :show-overflow-tooltip="true" />
<el-table-column label="托盘" min-width="120">
<template #default="scope">{{ scope.row.palletCode || `#${scope.row.palletId}` }}</template>
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container business-page business-inbound">
<el-form ref="queryRef" :model="queryParams" :inline="true" class="page-filter">
<el-form-item label="入库单号" prop="inboundNo">
<el-input
v-model="queryParams.inboundNo"
@@ -25,7 +25,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 page-toolbar">
<el-col :span="1.5">
<el-button
v-if="canAddInbound"
@@ -41,7 +41,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="inboundList">
<el-table v-loading="loading" empty-text="暂无数据" :data="inboundList" class="data-table">
<el-table-column label="入库单号" prop="inboundNo" min-width="170" :show-overflow-tooltip="true" />
<el-table-column label="仓库" min-width="120">
<template #default="scope">{{ optionLabel(warehouseOptions, scope.row.warehouseId) }}</template>
@@ -569,20 +569,13 @@ function ensureConfirmIdempotencyKey(inboundId) {
return confirmIdempotency.key
}
function handleConfirmCancellation(error) {
if (error === 'cancel' || error === 'close') {
clearConfirmIdempotency()
return true
}
return false
}
function handleConfirm(row) {
if (row.status !== 'DRAFT') {
proxy.$modal.msgWarning('只有草稿入库单可以确认')
return
}
if (operationPending.value) return
loadError.value = ''
confirmLoading.value = true
proxy.$modal.confirm(`确认后入库单“${row.inboundNo || `#${row.inboundId}`}”将不可编辑或删除,是否继续?`).then(() => {
const idempotencyKey = ensureConfirmIdempotencyKey(row.inboundId)
@@ -595,10 +588,9 @@ function handleConfirm(row) {
getList()
}).catch((error) => {
if (error === 'cancel' || error === 'close') {
handleConfirmCancellation(error)
return
}
loadError.value = '入库确认失败;再次确认会复用本次幂等键'
loadError.value = '入库确认失败;再次确认将重新请求服务端,并复用本次幂等键'
}).finally(() => {
confirmLoading.value = false
})
@@ -1,5 +1,5 @@
<template>
<div class="app-container return-page">
<div class="app-container business-page return-page">
<el-row v-if="canRequestReturn || canConfirmReturn" :gutter="18" class="return-operations">
<el-col v-if="canRequestReturn" :xs="24" :lg="12">
<el-card shadow="never" class="operation-card">
@@ -150,7 +150,7 @@
<el-divider v-if="canRequestReturn || canConfirmReturn" />
<el-form ref="queryRef" :model="queryParams" :inline="true">
<el-form ref="queryRef" :model="queryParams" :inline="true" class="page-filter">
<el-form-item label="退回单号" prop="returnNo">
<el-input v-model="queryParams.returnNo" placeholder="请输入退回单号" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -173,7 +173,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="returnList">
<el-table v-loading="loading" empty-text="暂无数据" :data="returnList" class="data-table">
<el-table-column label="退回单号" prop="returnNo" min-width="170" :show-overflow-tooltip="true" />
<el-table-column label="来源现场" min-width="120">
<template #default="scope">#{{ scope.row.sourceSiteId }}</template>
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container business-page business-shipment">
<el-form ref="queryRef" :model="queryParams" :inline="true" class="page-filter">
<el-form-item label="发货单号" prop="shipmentNo">
<el-input v-model="queryParams.shipmentNo" placeholder="请输入发货单号" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -22,7 +22,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 page-toolbar">
<el-col :span="1.5">
<el-button
v-if="canAddShipment"
@@ -38,7 +38,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="shipmentList">
<el-table v-loading="loading" empty-text="暂无数据" :data="shipmentList" class="data-table">
<el-table-column label="发货单号" prop="shipmentNo" min-width="170" :show-overflow-tooltip="true" />
<el-table-column label="来源仓库" min-width="130">
<template #default="scope">{{ optionLabel(warehouseOptions, scope.row.sourceWarehouseId) }}</template>
@@ -1,5 +1,5 @@
<template>
<div class="app-container usage-page">
<div class="app-container business-page usage-page">
<el-card v-if="canAddUsage" class="usage-operation" shadow="never">
<template #header>
<div class="usage-operation__header">
@@ -92,7 +92,7 @@
<el-divider v-if="canAddUsage" />
<el-form ref="queryRef" :model="queryParams" :inline="true">
<el-form ref="queryRef" :model="queryParams" :inline="true" class="page-filter">
<el-form-item label="使用记录号" prop="usageNo">
<el-input v-model="queryParams.usageNo" placeholder="请输入使用记录号" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -112,7 +112,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="usageList">
<el-table v-loading="loading" empty-text="暂无数据" :data="usageList" class="data-table">
<el-table-column label="使用记录号" prop="usageNo" min-width="170" :show-overflow-tooltip="true" />
<el-table-column label="托盘" min-width="120">
<template #default="scope">{{ scope.row.palletCode || `#${scope.row.palletId}` }}</template>
File diff suppressed because it is too large Load Diff
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container master-page">
<el-form ref="queryRef" class="master-query page-filter" :model="queryParams" :inline="true">
<el-form-item label="客户编码" prop="customerCode">
<el-input v-model="queryParams.customerCode" placeholder="请输入客户编码" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -18,7 +18,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 master-toolbar">
<el-col :span="1.5"><el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['master:customer:add']">新增</el-button></el-col>
<el-col :span="1.5">
<el-button
@@ -31,7 +31,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="customerList" @selection-change="handleSelectionChange">
<el-table class="master-table data-table" v-loading="loading" empty-text="暂无数据" :data="customerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="客户ID" prop="customerId" align="center" />
<el-table-column label="客户编码" prop="customerCode" align="center" :show-overflow-tooltip="true" />
@@ -99,6 +99,19 @@
</div>
</template>
<style scoped>
.master-query { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 14px; padding:16px 18px 4px; margin-bottom:14px; background:var(--el-bg-color); border:1px solid var(--el-border-color-lighter); border-radius:8px; }
.master-query :deep(.el-form-item) { margin-right:0; width:100%; }
.master-query :deep(.el-input), .master-query :deep(.el-select) { width:100% !important; }
.master-query :deep(.el-form-item:last-child) { align-self:end; }
.master-toolbar { display:flex; flex-wrap:wrap; gap:8px; }
.master-toolbar :deep(.el-col) { width:auto; }
.master-table :deep(.el-table__header th) { background:var(--el-fill-color-light); font-weight:600; }
.master-table :deep(.el-table__cell) { padding:10px 0; }
.master-table :deep(.fixed-width) { position:sticky; right:0; z-index:2; background:var(--el-bg-color); box-shadow:-4px 0 8px rgba(0,0,0,.04); }
@media (max-width:768px) { .master-query { grid-template-columns:1fr; padding:14px 14px 2px; } .master-query :deep(.el-form-item:last-child) { margin-bottom:12px; } .master-toolbar :deep(.el-button) { margin-left:0; } }
</style>
<script setup name="Customer">
import { addCustomer, delCustomer, getCustomer, listCustomer, updateCustomer } from "@/api/master/customer";
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container master-page">
<el-form ref="queryRef" class="master-query page-filter" :model="queryParams" :inline="true">
<el-form-item label="现场ID" prop="siteId">
<el-input-number v-model="queryParams.siteId" :min="1" :step="1" step-strictly controls-position="right" placeholder="请输入现场ID" />
</el-form-item>
@@ -21,7 +21,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 master-toolbar">
<el-col :span="1.5"><el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['master:line:add']">新增</el-button></el-col>
<el-col :span="1.5">
<el-button
@@ -34,7 +34,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="lineList" @selection-change="handleSelectionChange">
<el-table class="master-table data-table" v-loading="loading" empty-text="暂无数据" :data="lineList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="产线ID" prop="lineId" align="center" />
<el-table-column label="现场ID" prop="siteId" align="center" />
@@ -106,6 +106,14 @@
</div>
</template>
<style scoped>
.master-query { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 14px; padding:16px 18px 4px; margin-bottom:14px; background:var(--el-bg-color); border:1px solid var(--el-border-color-lighter); border-radius:8px; }
.master-query :deep(.el-form-item) { margin-right:0; width:100%; } .master-query :deep(.el-input), .master-query :deep(.el-select) { width:100% !important; } .master-query :deep(.el-form-item:last-child) { align-self:end; }
.master-toolbar { display:flex; flex-wrap:wrap; gap:8px; } .master-toolbar :deep(.el-col) { width:auto; }
.master-table :deep(.el-table__header th) { background:var(--el-fill-color-light); font-weight:600; } .master-table :deep(.el-table__cell) { padding:10px 0; } .master-table :deep(.fixed-width) { position:sticky; right:0; z-index:2; background:var(--el-bg-color); box-shadow:-4px 0 8px rgba(0,0,0,.04); }
@media (max-width:768px) { .master-query { grid-template-columns:1fr; padding:14px 14px 2px; } .master-query :deep(.el-form-item:last-child) { margin-bottom:12px; } .master-toolbar :deep(.el-button) { margin-left:0; } }
</style>
<script setup name="Line">
import { addLine, delLine, getLine, listLine, updateLine } from "@/api/master/line";
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container master-page">
<el-form ref="queryRef" class="master-query page-filter" :model="queryParams" :inline="true">
<el-form-item label="托盘编码" prop="palletCode">
<el-input v-model="queryParams.palletCode" placeholder="请输入托盘编码" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -15,7 +15,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 master-toolbar">
<el-col :span="1.5"><el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['master:pallet:add']">新增</el-button></el-col>
<el-col :span="1.5">
<el-button
@@ -28,7 +28,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="palletList" @selection-change="handleSelectionChange">
<el-table class="master-table data-table" v-loading="loading" empty-text="暂无数据" :data="palletList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="托盘ID" prop="palletId" align="center" />
<el-table-column label="托盘编码" prop="palletCode" align="center" :show-overflow-tooltip="true" />
@@ -106,6 +106,14 @@
</div>
</template>
<style scoped>
.master-query { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 14px; padding:16px 18px 4px; margin-bottom:14px; background:var(--el-bg-color); border:1px solid var(--el-border-color-lighter); border-radius:8px; }
.master-query :deep(.el-form-item) { margin-right:0; width:100%; } .master-query :deep(.el-input), .master-query :deep(.el-select) { width:100% !important; } .master-query :deep(.el-form-item:last-child) { align-self:end; }
.master-toolbar { display:flex; flex-wrap:wrap; gap:8px; } .master-toolbar :deep(.el-col) { width:auto; }
.master-table :deep(.el-table__header th) { background:var(--el-fill-color-light); font-weight:600; } .master-table :deep(.el-table__cell) { padding:10px 0; } .master-table :deep(.fixed-width) { position:sticky; right:0; z-index:2; background:var(--el-bg-color); box-shadow:-4px 0 8px rgba(0,0,0,.04); }
@media (max-width:768px) { .master-query { grid-template-columns:1fr; padding:14px 14px 2px; } .master-query :deep(.el-form-item:last-child) { margin-bottom:12px; } .master-toolbar :deep(.el-button) { margin-left:0; } }
</style>
<script setup name="Pallet">
import { addPallet, delPallet, getPallet, getPalletQrcode, listPallet, updatePallet } from "@/api/master/pallet";
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container master-page">
<el-form ref="queryRef" class="master-query page-filter" :model="queryParams" :inline="true">
<el-form-item label="客户ID" prop="customerId">
<el-input-number v-model="queryParams.customerId" :min="1" :step="1" step-strictly controls-position="right" placeholder="请输入客户ID" />
</el-form-item>
@@ -21,7 +21,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 master-toolbar">
<el-col :span="1.5"><el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['master:site:add']">新增</el-button></el-col>
<el-col :span="1.5">
<el-button
@@ -35,7 +35,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="siteList" @selection-change="handleSelectionChange">
<el-table class="master-table data-table" v-loading="loading" empty-text="暂无数据" :data="siteList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="现场ID" prop="siteId" align="center" />
<el-table-column label="客户ID" prop="customerId" align="center" />
@@ -114,6 +114,14 @@
</div>
</template>
<style scoped>
.master-query { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 14px; padding:16px 18px 4px; margin-bottom:14px; background:var(--el-bg-color); border:1px solid var(--el-border-color-lighter); border-radius:8px; }
.master-query :deep(.el-form-item) { margin-right:0; width:100%; } .master-query :deep(.el-input), .master-query :deep(.el-select) { width:100% !important; } .master-query :deep(.el-form-item:last-child) { align-self:end; }
.master-toolbar { display:flex; flex-wrap:wrap; gap:8px; } .master-toolbar :deep(.el-col) { width:auto; }
.master-table :deep(.el-table__header th) { background:var(--el-fill-color-light); font-weight:600; } .master-table :deep(.el-table__cell) { padding:10px 0; } .master-table :deep(.fixed-width) { position:sticky; right:0; z-index:2; background:var(--el-bg-color); box-shadow:-4px 0 8px rgba(0,0,0,.04); }
@media (max-width:768px) { .master-query { grid-template-columns:1fr; padding:14px 14px 2px; } .master-query :deep(.el-form-item:last-child) { margin-bottom:12px; } .master-toolbar :deep(.el-button) { margin-left:0; } }
</style>
<script setup name="Site">
import BusinessUserAssignDialog from "@/components/BusinessUserAssignDialog";
import { addSite, delSite, getSite, listSite, updateSite } from "@/api/master/site";
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container master-page">
<el-form ref="queryRef" class="master-query page-filter" :model="queryParams" :inline="true">
<el-form-item label="菌种编码" prop="strainCode">
<el-input v-model="queryParams.strainCode" placeholder="请输入菌种编码" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -18,7 +18,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 master-toolbar">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['master:strain:add']">新增</el-button>
</el-col>
@@ -41,7 +41,7 @@
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="strainList" @selection-change="handleSelectionChange">
<el-table class="master-table data-table" v-loading="loading" empty-text="暂无数据" :data="strainList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="菌种ID" prop="strainId" align="center" />
<el-table-column label="菌种编码" prop="strainCode" align="center" :show-overflow-tooltip="true" />
@@ -123,6 +123,14 @@
</div>
</template>
<style scoped>
.master-query { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 14px; padding:16px 18px 4px; margin-bottom:14px; background:var(--el-bg-color); border:1px solid var(--el-border-color-lighter); border-radius:8px; }
.master-query :deep(.el-form-item) { margin-right:0; width:100%; } .master-query :deep(.el-input), .master-query :deep(.el-select) { width:100% !important; } .master-query :deep(.el-form-item:last-child) { align-self:end; }
.master-toolbar { display:flex; flex-wrap:wrap; gap:8px; } .master-toolbar :deep(.el-col) { width:auto; }
.master-table :deep(.el-table__header th) { background:var(--el-fill-color-light); font-weight:600; } .master-table :deep(.el-table__cell) { padding:10px 0; } .master-table :deep(.fixed-width) { position:sticky; right:0; z-index:2; background:var(--el-bg-color); box-shadow:-4px 0 8px rgba(0,0,0,.04); }
@media (max-width:768px) { .master-query { grid-template-columns:1fr; padding:14px 14px 2px; } .master-query :deep(.el-form-item:last-child) { margin-bottom:12px; } .master-toolbar :deep(.el-button) { margin-left:0; } }
</style>
<script setup name="Strain">
import { addStrain, delStrain, getStrain, listStrain, updateStrain } from "@/api/master/strain";
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true">
<div class="app-container master-page">
<el-form ref="queryRef" class="master-query page-filter" :model="queryParams" :inline="true">
<el-form-item label="仓库编码" prop="warehouseCode">
<el-input v-model="queryParams.warehouseCode" placeholder="请输入仓库编码" clearable maxlength="64" @keyup.enter="handleQuery" />
</el-form-item>
@@ -18,7 +18,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb8 master-toolbar">
<el-col :span="1.5"><el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['master:warehouse:add']">新增</el-button></el-col>
<el-col :span="1.5">
<el-button
@@ -32,7 +32,7 @@
</el-row>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" empty-text="暂无数据" :data="warehouseList" @selection-change="handleSelectionChange">
<el-table class="master-table data-table" v-loading="loading" empty-text="暂无数据" :data="warehouseList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="仓库ID" prop="warehouseId" align="center" />
<el-table-column label="仓库编码" prop="warehouseCode" align="center" :show-overflow-tooltip="true" />
@@ -107,6 +107,14 @@
</div>
</template>
<style scoped>
.master-query { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 14px; padding:16px 18px 4px; margin-bottom:14px; background:var(--el-bg-color); border:1px solid var(--el-border-color-lighter); border-radius:8px; }
.master-query :deep(.el-form-item) { margin-right:0; width:100%; } .master-query :deep(.el-input), .master-query :deep(.el-select) { width:100% !important; } .master-query :deep(.el-form-item:last-child) { align-self:end; }
.master-toolbar { display:flex; flex-wrap:wrap; gap:8px; } .master-toolbar :deep(.el-col) { width:auto; }
.master-table :deep(.el-table__header th) { background:var(--el-fill-color-light); font-weight:600; } .master-table :deep(.el-table__cell) { padding:10px 0; } .master-table :deep(.fixed-width) { position:sticky; right:0; z-index:2; background:var(--el-bg-color); box-shadow:-4px 0 8px rgba(0,0,0,.04); }
@media (max-width:768px) { .master-query { grid-template-columns:1fr; padding:14px 14px 2px; } .master-query :deep(.el-form-item:last-child) { margin-bottom:12px; } .master-toolbar :deep(.el-button) { margin-left:0; } }
</style>
<script setup name="Warehouse">
import BusinessUserAssignDialog from "@/components/BusinessUserAssignDialog";
import { addWarehouse, delWarehouse, getWarehouse, listWarehouse, updateWarehouse } from "@/api/master/warehouse";
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true" label-width="76px">
<div class="app-container report-page">
<el-form ref="queryRef" class="report-filter page-filter" :model="queryParams" :inline="true" label-width="76px">
<el-form-item label="使用时间">
<el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
@@ -29,7 +29,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="reportList">
<el-table v-loading="loading" class="report-table data-table" stripe border height="calc(100vh - 330px)" :data="reportList">
<template #empty><el-empty description="暂无产线消耗数据" /></template>
<el-table-column label="使用记录号" prop="usageNo" min-width="150" :show-overflow-tooltip="true" />
<el-table-column label="使用时间" prop="occurredAt" width="180">
@@ -65,6 +65,15 @@
</div>
</template>
<style scoped>
.report-page { min-width: 0; }
.report-filter { padding: 16px 16px 4px; margin-bottom: 12px; background: var(--el-bg-color); border: 1px solid var(--el-border-color-lighter); border-radius: 6px; }
.report-filter :deep(.el-form-item) { margin-bottom: 12px; }
.report-table :deep(.el-table__header th) { background: var(--el-fill-color-light); font-weight: 600; }
.report-table :deep(.el-table__cell) { padding: 10px 0; }
@media (max-width: 900px) { .report-filter :deep(.el-form-item) { width: 100%; } .report-filter :deep(.el-input), .report-filter :deep(.el-input-number), .report-filter :deep(.el-select), .report-filter :deep(.el-date-editor) { width: 100%; } }
</style>
<script setup name="ReportConsumption">
import { listConsumptionReport } from '@/api/report/consumption'
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true" label-width="76px">
<div class="app-container report-page">
<el-form ref="queryRef" class="report-filter page-filter" :model="queryParams" :inline="true" label-width="76px">
<el-form-item label="装填时间">
<el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
@@ -23,7 +23,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="reportList">
<el-table v-loading="loading" class="report-table data-table" stripe border height="calc(100vh - 330px)" :data="reportList">
<template #empty><el-empty description="暂无装填记录" /></template>
<el-table-column label="装填单号" prop="fillingNo" min-width="160" :show-overflow-tooltip="true" />
<el-table-column label="装填时间" prop="operatedAt" width="180">
@@ -54,6 +54,15 @@
</div>
</template>
<style scoped>
.report-page { min-width: 0; }
.report-filter { padding: 16px 16px 4px; margin-bottom: 12px; background: var(--el-bg-color); border: 1px solid var(--el-border-color-lighter); border-radius: 6px; }
.report-filter :deep(.el-form-item) { margin-bottom: 12px; }
.report-table :deep(.el-table__header th) { background: var(--el-fill-color-light); font-weight: 600; }
.report-table :deep(.el-table__cell) { padding: 10px 0; }
@media (max-width: 900px) { .report-filter :deep(.el-form-item) { width: 100%; } .report-filter :deep(.el-input), .report-filter :deep(.el-input-number), .report-filter :deep(.el-select), .report-filter :deep(.el-date-editor) { width: 100%; } }
</style>
<script setup name="ReportFilling">
import { listFillingReport } from '@/api/report/filling'
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true" label-width="76px">
<div class="app-container report-page">
<el-form ref="queryRef" class="report-filter page-filter" :model="queryParams" :inline="true" label-width="76px">
<el-form-item label="更新时间">
<el-date-picker
v-model="dateRange"
@@ -41,7 +41,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="reportList">
<el-table v-loading="loading" class="report-table data-table" stripe border height="calc(100vh - 330px)" :data="reportList">
<template #empty><el-empty description="暂无托盘库存数据" /></template>
<el-table-column label="托盘编号" prop="palletCode" min-width="140" :show-overflow-tooltip="true" />
<el-table-column label="状态" prop="flowState" min-width="150">
@@ -73,6 +73,10 @@
</div>
</template>
<style scoped>
.report-page { min-width: 0; } .report-filter { padding: 16px 16px 4px; margin-bottom: 12px; background: var(--el-bg-color); border: 1px solid var(--el-border-color-lighter); border-radius: 6px; } .report-filter :deep(.el-form-item) { margin-bottom: 12px; } .report-table :deep(.el-table__header th) { background: var(--el-fill-color-light); font-weight: 600; } .report-table :deep(.el-table__cell) { padding: 10px 0; } @media (max-width: 900px) { .report-filter :deep(.el-form-item) { width: 100%; } .report-filter :deep(.el-input), .report-filter :deep(.el-input-number), .report-filter :deep(.el-select), .report-filter :deep(.el-date-editor) { width: 100%; } }
</style>
<script setup name="ReportPalletInventory">
import { listPalletInventory } from '@/api/report/palletInventory'
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true" label-width="76px">
<div class="app-container report-page">
<el-form ref="queryRef" class="report-filter page-filter" :model="queryParams" :inline="true" label-width="76px">
<el-form-item label="发生时间">
<el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
@@ -19,7 +19,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="reportList">
<el-table v-loading="loading" class="report-table data-table" stripe border height="calc(100vh - 330px)" :data="reportList">
<template #empty><el-empty description="暂无托盘追溯数据" /></template>
<el-table-column label="发生时间" prop="occurredAt" width="180">
<template #default="scope">{{ parseTime(scope.row.occurredAt) }}</template>
@@ -62,6 +62,10 @@
</div>
</template>
<style scoped>
.report-page { min-width: 0; } .report-filter { padding: 16px 16px 4px; margin-bottom: 12px; background: var(--el-bg-color); border: 1px solid var(--el-border-color-lighter); border-radius: 6px; } .report-filter :deep(.el-form-item) { margin-bottom: 12px; } .report-table :deep(.el-table__header th) { background: var(--el-fill-color-light); font-weight: 600; } .report-table :deep(.el-table__cell) { padding: 10px 0; } @media (max-width: 900px) { .report-filter :deep(.el-form-item) { width: 100%; } .report-filter :deep(.el-input), .report-filter :deep(.el-input-number), .report-filter :deep(.el-select), .report-filter :deep(.el-date-editor) { width: 100%; } }
</style>
<script setup name="ReportPalletTrace">
import { listPalletTrace } from '@/api/report/palletTrace'
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true" label-width="88px">
<div class="app-container report-page">
<el-form ref="queryRef" class="report-filter page-filter" :model="queryParams" :inline="true" label-width="88px">
<el-form-item label="申请时间">
<el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
@@ -29,7 +29,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="reportList">
<el-table v-loading="loading" class="report-table data-table" stripe border height="calc(100vh - 330px)" :data="reportList">
<template #empty><el-empty description="暂无退回仓库数据" /></template>
<el-table-column label="退回单号" prop="returnNo" min-width="160" :show-overflow-tooltip="true" />
<el-table-column label="状态" prop="status" width="100">
@@ -63,6 +63,10 @@
</div>
</template>
<style scoped>
.report-page { min-width: 0; } .report-filter { padding: 16px 16px 4px; margin-bottom: 12px; background: var(--el-bg-color); border: 1px solid var(--el-border-color-lighter); border-radius: 6px; } .report-filter :deep(.el-form-item) { margin-bottom: 12px; } .report-table :deep(.el-table__header th) { background: var(--el-fill-color-light); font-weight: 600; } .report-table :deep(.el-table__cell) { padding: 10px 0; } @media (max-width: 900px) { .report-filter :deep(.el-form-item) { width: 100%; } .report-filter :deep(.el-input), .report-filter :deep(.el-input-number), .report-filter :deep(.el-select), .report-filter :deep(.el-date-editor) { width: 100%; } }
</style>
<script setup name="ReportReturn">
import { listReturnReport } from '@/api/report/return'
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form ref="queryRef" :model="queryParams" :inline="true" label-width="88px">
<div class="app-container report-page">
<el-form ref="queryRef" class="report-filter page-filter" :model="queryParams" :inline="true" label-width="88px">
<el-form-item label="确认时间">
<el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
@@ -23,7 +23,7 @@
</el-form>
<el-alert v-if="loadError" :title="loadError" type="error" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="reportList">
<el-table v-loading="loading" class="report-table data-table" stripe border height="calc(100vh - 330px)" :data="reportList">
<template #empty><el-empty description="暂无发货出库数据" /></template>
<el-table-column label="发货单号" prop="shipmentNo" min-width="160" :show-overflow-tooltip="true" />
<el-table-column label="确认时间" prop="confirmedAt" width="180">
@@ -54,6 +54,10 @@
</div>
</template>
<style scoped>
.report-page { min-width: 0; } .report-filter { padding: 16px 16px 4px; margin-bottom: 12px; background: var(--el-bg-color); border: 1px solid var(--el-border-color-lighter); border-radius: 6px; } .report-filter :deep(.el-form-item) { margin-bottom: 12px; } .report-table :deep(.el-table__header th) { background: var(--el-fill-color-light); font-weight: 600; } .report-table :deep(.el-table__cell) { padding: 10px 0; } @media (max-width: 900px) { .report-filter :deep(.el-form-item) { width: 100%; } .report-filter :deep(.el-input), .report-filter :deep(.el-input-number), .report-filter :deep(.el-select), .report-filter :deep(.el-date-editor) { width: 100%; } }
</style>
<script setup name="ReportShipment">
import { listShipmentReport } from '@/api/report/shipment'