调整部分前端布局和后端增删改逻辑
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# 页面标题
|
||||
VITE_APP_TITLE = vfadmin管理系统
|
||||
VITE_APP_TITLE = 智链云枢管理系统
|
||||
|
||||
# 开发环境配置
|
||||
VITE_APP_ENV = 'development'
|
||||
|
||||
# vfadmin管理系统/开发环境
|
||||
# 智链云枢管理系统/开发环境
|
||||
VITE_APP_BASE_API = '/dev-api'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user