feat(wms):减法,去掉 area 表

pull/878/head
YunaiV 2026-05-13 20:29:25 +08:00
parent c5948d405e
commit fdbb98fe65
34 changed files with 293 additions and 894 deletions

View File

@ -12,8 +12,6 @@ export interface InventoryHistoryVO {
skuName?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
quantity?: number
beforeQuantity?: number
afterQuantity?: number

View File

@ -12,8 +12,6 @@ export interface InventoryVO {
skuName?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
quantity?: number
remark?: string
createTime?: Date

View File

@ -1,50 +0,0 @@
import request from '@/config/axios'
// WMS 库区 VO
export interface WarehouseAreaVO {
id?: number
code?: string
name?: string
warehouseId?: number
warehouseName?: string
remark?: string
createTime?: Date
}
// WMS 库区 API
export const WarehouseAreaApi = {
// 查询库区分页
getWarehouseAreaPage: async (params: any) => {
return await request.get({ url: '/wms/warehouse-area/page', params })
},
// 查询库区精简列表
getWarehouseAreaSimpleList: async (warehouseId?: number) => {
return await request.get({ url: '/wms/warehouse-area/simple-list', params: { warehouseId } })
},
// 查询库区详情
getWarehouseArea: async (id: number) => {
return await request.get({ url: '/wms/warehouse-area/get?id=' + id })
},
// 新增库区
createWarehouseArea: async (data: WarehouseAreaVO) => {
return await request.post({ url: '/wms/warehouse-area/create', data })
},
// 修改库区
updateWarehouseArea: async (data: WarehouseAreaVO) => {
return await request.put({ url: '/wms/warehouse-area/update', data })
},
// 删除库区
deleteWarehouseArea: async (id: number) => {
return await request.delete({ url: '/wms/warehouse-area/delete?id=' + id })
},
// 导出库区
exportWarehouseArea: async (params) => {
return await request.download({ url: '/wms/warehouse-area/export-excel', params })
}
}

View File

@ -12,8 +12,6 @@ export interface CheckOrderDetailVO {
inventoryId?: number
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
batchNo?: string
productionDate?: Date
expirationDate?: Date

View File

@ -9,8 +9,6 @@ export interface CheckOrderVO {
remark?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
totalQuantity?: number
totalAmount?: number
details?: CheckOrderDetailVO[]

View File

@ -11,12 +11,8 @@ export interface MovementOrderDetailVO {
skuName?: string
sourceWarehouseId?: number
sourceWarehouseName?: string
sourceAreaId?: number
sourceAreaName?: string
targetWarehouseId?: number
targetWarehouseName?: string
targetAreaId?: number
targetAreaName?: string
batchNo?: string
productionDate?: Date
expirationDate?: Date

View File

@ -9,12 +9,8 @@ export interface MovementOrderVO {
remark?: string
sourceWarehouseId?: number
sourceWarehouseName?: string
sourceAreaId?: number
sourceAreaName?: string
targetWarehouseId?: number
targetWarehouseName?: string
targetAreaId?: number
targetAreaName?: string
totalQuantity?: number
totalAmount?: number
details?: MovementOrderDetailVO[]

View File

@ -11,8 +11,6 @@ export interface ReceiptOrderDetailVO {
skuName?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
batchNo?: string
productionDate?: Date
expirationDate?: Date

View File

@ -13,8 +13,6 @@ export interface ReceiptOrderVO {
remark?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
totalQuantity?: number
totalAmount?: number
details?: ReceiptOrderDetailVO[]

View File

@ -11,8 +11,6 @@ export interface ShipmentOrderDetailVO {
skuName?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
batchNo?: string
productionDate?: Date
expirationDate?: Date

View File

@ -13,8 +13,6 @@ export interface ShipmentOrderVO {
remark?: string
warehouseId?: number
warehouseName?: string
areaId?: number
areaName?: string
totalQuantity?: number
totalAmount?: number
details?: ShipmentOrderDetailVO[]

View File

@ -127,29 +127,6 @@ const remainingRouter: AppRouteRecordRaw[] = [
}
]
},
{
path: '/wms',
component: Layout,
name: 'Wms',
meta: {
hidden: true
},
children: [
{
path: 'md/warehouse/area/:warehouseId',
component: () => import('@/views/wms/md/warehouse/area/index.vue'),
name: 'WmsWarehouseArea',
meta: {
title: '库区管理',
noCache: true,
hidden: true,
canTo: true,
icon: '',
activeMenu: '/wms/md/warehouse'
}
}
]
},
{
path: '/codegen',
component: Layout,

View File

@ -0,0 +1,260 @@
<!-- WMS 库存选择器 -->
<template>
<Dialog
v-model="dialogVisible"
:append-to-body="true"
:scroll="true"
max-height="calc(100vh - 220px)"
title="库存选择"
width="80%"
>
<ContentWrap>
<el-form
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="80px"
>
<el-form-item label="商品名称" prop="itemName">
<el-input
v-model="queryParams.itemName"
class="!w-240px"
clearable
placeholder="请输入商品名称"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="商品编号" prop="itemCode">
<el-input
v-model="queryParams.itemCode"
class="!w-240px"
clearable
placeholder="请输入商品编号"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="规格名称" prop="skuName">
<el-input
v-model="queryParams.skuName"
class="!w-240px"
clearable
placeholder="请输入规格名称"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="规格编号" prop="skuCode">
<el-input
v-model="queryParams.skuCode"
class="!w-240px"
clearable
placeholder="请输入规格编号"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<ContentWrap class="!mb-0">
<el-table
ref="tableRef"
v-loading="loading"
:data="list"
:row-key="getRowKey"
:show-overflow-tooltip="true"
:stripe="true"
border
max-height="calc(100vh - 430px)"
@row-dblclick="handleRowDblClick"
@selection-change="handleSelectionChange"
>
<el-table-column :reserve-selection="true" align="center" type="selection" width="50" />
<el-table-column label="商品信息" min-width="220">
<template #default="{ row }">
<div>{{ row.itemName || '-' }}</div>
<div v-if="row.itemCode" class="text-12px text-gray-500">
商品编号{{ row.itemCode }}
</div>
</template>
</el-table-column>
<el-table-column label="规格信息" min-width="220">
<template #default="{ row }">
<div>{{ row.skuName || '-' }}</div>
<div v-if="row.skuCode" class="text-12px text-gray-500">
规格编号{{ row.skuCode }}
</div>
</template>
</el-table-column>
<el-table-column label="仓库" min-width="180">
<template #default="{ row }">
{{ row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column align="right" label="可用库存" width="130">
<template #default="{ row }">
{{ formatQuantity(row.availableQuantity) }}
</template>
</el-table-column>
</el-table>
<div class="overflow-hidden">
<Pagination
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
:total="total"
@pagination="getList"
/>
</div>
</ContentWrap>
<template #footer>
<el-button type="primary" @click="handleConfirm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import { ElTable } from 'element-plus'
import { InventoryApi, InventoryVO } from '@/api/wms/inventory'
import { formatQuantity } from '@/views/wms/utils/format'
export interface InventorySelectRow extends InventoryVO {
batchNo?: string
productionDate?: Date
expirationDate?: Date
amount?: number
availableQuantity?: number
}
/** WMS 库存选择器 */
defineOptions({ name: 'WmsInventorySelect' })
const props = defineProps<{
warehouseId?: number
}>()
const message = useMessage() //
const loading = ref(false) //
const dialogVisible = ref(false) //
const list = ref<InventorySelectRow[]>([]) //
const total = ref(0) //
const selectedMap = ref<Map<string, InventorySelectRow>>(new Map()) //
const tableRef = ref<InstanceType<typeof ElTable>>() // Ref
const queryFormRef = ref() //
const getDefaultQueryParams = () => ({
pageNo: 1,
pageSize: 10,
itemName: undefined as string | undefined,
itemCode: undefined as string | undefined,
skuName: undefined as string | undefined,
skuCode: undefined as string | undefined
})
const queryParams = reactive(getDefaultQueryParams())
const emit = defineEmits<{
change: [list: InventorySelectRow[]]
}>()
/** 打开弹窗 */
const open = async () => {
if (!props.warehouseId) {
message.warning('请先选择仓库')
return
}
dialogVisible.value = true
Object.assign(queryParams, getDefaultQueryParams())
selectedMap.value = new Map()
await nextTick()
tableRef.value?.clearSelection()
await getList()
}
defineExpose({ open })
/** 查询库存列表 */
const getList = async () => {
loading.value = true
try {
const params = {
...queryParams,
type: 'warehouse',
warehouseId: props.warehouseId,
minQuantity: 0.01
}
const data = await InventoryApi.getInventoryPage(params)
list.value = data.list.map((inventory: InventoryVO) => ({
...inventory,
availableQuantity: inventory.quantity
}))
total.value = data.total
await nextTick()
applySelection()
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
Object.assign(queryParams, getDefaultQueryParams())
queryFormRef.value?.resetFields()
getList()
}
/** 获得行唯一标识 */
const getRowKey = (row: InventorySelectRow) => {
return `inventory-${row.id || `${row.skuId}-${row.warehouseId}`}`
}
/** 恢复当前页选择状态 */
const applySelection = () => {
const table = tableRef.value
if (!table || selectedMap.value.size === 0) {
return
}
list.value.forEach((row) => {
if (selectedMap.value.has(getRowKey(row))) {
table.toggleRowSelection(row, true)
}
})
}
/** 选择行变化 */
const handleSelectionChange = (rows: InventorySelectRow[]) => {
const currentKeys = new Set(list.value.map((row) => getRowKey(row)))
currentKeys.forEach((key) => selectedMap.value.delete(key))
rows.forEach((row) => selectedMap.value.set(getRowKey(row), row))
}
/** 双击行直接选择 */
const handleRowDblClick = (row: InventorySelectRow) => {
selectedMap.value.set(getRowKey(row), row)
handleConfirm()
}
/** 确认选择 */
const handleConfirm = () => {
const selectedList = Array.from(selectedMap.value.values())
if (selectedList.length === 0) {
message.warning('请选择库存')
return
}
emit('change', selectedList)
dialogVisible.value = false
}
</script>

View File

@ -35,18 +35,7 @@
/>
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<WarehouseSelect
v-model="queryParams.warehouseId"
class="!w-240px"
@change="handleWarehouseChange"
/>
</el-form-item>
<el-form-item v-if="AREA_ENABLE" label="库区" prop="areaId">
<WarehouseAreaSelect
v-model="queryParams.areaId"
:warehouse-id="queryParams.warehouseId"
class="!w-240px"
/>
<WarehouseSelect v-model="queryParams.warehouseId" class="!w-240px" />
</el-form-item>
<el-form-item label="商品编号" prop="itemCode">
<el-input
@ -140,15 +129,9 @@
</div>
</template>
</el-table-column>
<el-table-column :label="AREA_ENABLE ? '仓库/库区' : '仓库'" min-width="160">
<el-table-column label="仓库" min-width="160">
<template #default="scope">
<template v-if="AREA_ENABLE">
<div>仓库{{ scope.row.warehouseName || '-' }}</div>
<div>库区{{ scope.row.areaName || '-' }}</div>
</template>
<template v-else>
{{ scope.row.warehouseName || '-' }}
</template>
{{ scope.row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column align="right" label="操作前" min-width="110">
@ -207,9 +190,7 @@
import { dateFormatter, defaultShortcuts, formatDate } from '@/utils/formatTime'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { InventoryHistoryApi, InventoryHistoryVO } from '@/api/wms/inventory/history'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { formatPrice, formatQuantity } from '@/views/wms/utils/format'
/** WMS 库存流水 */
@ -228,7 +209,6 @@ const queryParams = reactive({
skuCode: undefined as string | undefined,
skuName: undefined as string | undefined,
warehouseId: undefined as number | undefined,
areaId: undefined as number | undefined,
createTime: undefined as string[] | undefined
})
const queryFormRef = ref() //
@ -257,11 +237,6 @@ const resetQuery = () => {
handleQuery()
}
/** 仓库变化 */
const handleWarehouseChange = () => {
queryParams.areaId = undefined
}
/** 初始化 */
onMounted(async () => {
await getList()

View File

@ -21,18 +21,7 @@
</el-radio-group>
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<WarehouseSelect
v-model="queryParams.warehouseId"
class="!w-240px"
@change="handleWarehouseChange"
/>
</el-form-item>
<el-form-item v-if="isAreaQueryVisible" label="库区" prop="areaId">
<WarehouseAreaSelect
v-model="queryParams.areaId"
:warehouse-id="queryParams.warehouseId"
class="!w-240px"
/>
<WarehouseSelect v-model="queryParams.warehouseId" class="!w-240px" />
</el-form-item>
<el-form-item label="商品名称" prop="itemName">
<el-input
@ -105,23 +94,7 @@
{{ scope.row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column
v-if="queryParams.type === INVENTORY_DIMENSION.AREA"
label="库区"
min-width="160"
prop="areaId"
>
<template #default="scope">
{{ scope.row.areaName || '-' }}
</template>
</el-table-column>
<el-table-column
label="商品信息"
min-width="240"
:prop="
queryParams.type === INVENTORY_DIMENSION.WAREHOUSE ? 'warehouseItemId' : 'areaItemId'
"
>
<el-table-column label="商品信息" min-width="240" prop="warehouseItemId">
<template #default="scope">
<div>{{ scope.row.itemName || '-' }}</div>
<div v-if="scope.row.itemCode" class="text-12px text-gray-500">
@ -160,11 +133,6 @@
{{ scope.row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column v-if="AREA_ENABLE" label="所属库区" min-width="160" prop="areaId">
<template #default="scope">
{{ scope.row.areaName || '-' }}
</template>
</el-table-column>
</template>
<el-table-column align="right" label="库存" min-width="130" prop="quantity">
<template #default="scope">
@ -184,9 +152,7 @@
<script lang="ts" setup>
import { InventoryApi, InventoryVO } from '@/api/wms/inventory'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { formatQuantity } from '@/views/wms/utils/format'
/** WMS 库存统计 */
@ -194,24 +160,18 @@ defineOptions({ name: 'WmsInventory' })
const INVENTORY_DIMENSION = {
WAREHOUSE: 'warehouse',
AREA: 'area',
ITEM: 'item'
} as const
type InventoryDimension = (typeof INVENTORY_DIMENSION)[keyof typeof INVENTORY_DIMENSION]
const dimensionOptions = computed(() => [
{ label: '仓库', value: INVENTORY_DIMENSION.WAREHOUSE },
...(AREA_ENABLE ? [{ label: '库区', value: INVENTORY_DIMENSION.AREA }] : []),
{ label: '商品', value: INVENTORY_DIMENSION.ITEM }
])
const warehouseDimensionList: InventoryDimension[] = [
INVENTORY_DIMENSION.WAREHOUSE,
INVENTORY_DIMENSION.AREA
]
const warehouseDimensionList: InventoryDimension[] = [INVENTORY_DIMENSION.WAREHOUSE]
interface InventoryRow extends InventoryVO {
warehouseItemId?: string
areaItemId?: string
skuWarehouseId?: string
}
@ -234,8 +194,7 @@ const queryParams = reactive({
itemName: undefined as string | undefined,
skuCode: undefined as string | undefined,
skuName: undefined as string | undefined,
warehouseId: undefined as number | undefined,
areaId: undefined as number | undefined
warehouseId: undefined as number | undefined
})
const queryFormRef = ref() //
@ -245,14 +204,12 @@ const getList = async () => {
try {
const data = await InventoryApi.getInventoryPage({
...queryParams,
areaId: isAreaQueryVisible.value ? queryParams.areaId : undefined,
minQuantity: filterZero.value ? 1 : undefined
})
list.value = data.list.map((item: InventoryVO) => ({
...item,
//
warehouseItemId: `${item.warehouseId || 0}-${item.itemId || 0}`,
areaItemId: `${item.areaId || 0}-${item.itemId || 0}`,
skuWarehouseId: `${item.skuId || 0}-${item.warehouseId || 0}`
}))
total.value = data.total
@ -278,9 +235,6 @@ const resetQuery = () => {
/** 统计维度变化 */
const handleTypeChange = () => {
queryParams.pageNo = 1
if (queryParams.type === INVENTORY_DIMENSION.WAREHOUSE) {
queryParams.areaId = undefined
}
getList()
}
@ -290,16 +244,6 @@ const handleFilterZeroChange = () => {
getList()
}
/** 仓库变化 */
const handleWarehouseChange = () => {
queryParams.areaId = undefined
}
/** 是否展示库区搜索项 */
const isAreaQueryVisible = computed(() => {
return AREA_ENABLE && queryParams.type !== INVENTORY_DIMENSION.WAREHOUSE
})
/** 合并库存统计的维度单元格 */
const spanMethod = ({ column, rowIndex }: SpanMethodProps) => {
const property = column.property
@ -331,9 +275,6 @@ const getRowSpanProperties = () => {
if (queryParams.type === INVENTORY_DIMENSION.ITEM) {
return ['itemId', 'skuId', 'skuWarehouseId']
}
if (queryParams.type === INVENTORY_DIMENSION.AREA) {
return ['warehouseId', 'areaId', 'areaItemId']
}
return ['warehouseId', 'warehouseItemId']
}

View File

@ -1,120 +0,0 @@
<!-- WMS 库区表单 -->
<template>
<Dialog v-model="dialogVisible" :title="dialogTitle">
<el-form
ref="formRef"
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="100px"
>
<el-form-item label="所属仓库" prop="warehouseId">
<WarehouseSelect v-model="formData.warehouseId" placeholder="请选择所属仓库" />
</el-form-item>
<el-form-item label="库区名称" prop="name">
<el-input v-model="formData.name" maxlength="60" placeholder="请输入库区名称" />
</el-form-item>
<el-form-item label="库区编号" prop="code">
<el-input v-model="formData.code" maxlength="20" placeholder="请输入库区编号" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="formData.remark"
maxlength="255"
placeholder="请输入备注"
type="textarea"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import { WarehouseAreaApi, WarehouseAreaVO } from '@/api/wms/md/warehouse/area'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
/** WMS 库区表单 */
defineOptions({ name: 'WmsWarehouseAreaForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref<WarehouseAreaVO>({
id: undefined,
code: undefined,
name: undefined,
warehouseId: undefined,
remark: undefined
})
const formRules = reactive({
warehouseId: [{ required: true, message: '所属仓库不能为空', trigger: 'change' }],
code: [{ required: true, message: '库区编号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '库区名称不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number, warehouseId?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
if (warehouseId) {
formData.value.warehouseId = warehouseId
}
//
if (id) {
formLoading.value = true
try {
formData.value = await WarehouseAreaApi.getWarehouseArea(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as WarehouseAreaVO
if (formType.value === 'create') {
await WarehouseAreaApi.createWarehouseArea(data)
message.success(t('common.createSuccess'))
} else {
await WarehouseAreaApi.updateWarehouseArea(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
name: undefined,
warehouseId: undefined,
remark: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -1,229 +0,0 @@
<!-- WMS 库区管理 -->
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
>
<el-form-item label="所属仓库" prop="warehouseId">
<WarehouseSelect
v-model="queryParams.warehouseId"
class="!w-240px"
placeholder="请选择所属仓库"
@change="warehouseChange"
/>
</el-form-item>
<el-form-item label="库区名称" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入库区名称"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="库区编号" prop="code">
<el-input
v-model="queryParams.code"
class="!w-240px"
clearable
placeholder="请输入库区编号"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
<el-button
v-hasPermi="['wms:warehouse-area:create']"
plain
type="primary"
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
</el-button>
<el-button
v-hasPermi="['wms:warehouse-area:export']"
:loading="exportLoading"
plain
type="success"
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" />
导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" label="库区名称" prop="name" />
<el-table-column align="center" label="库区编号" prop="code" />
<el-table-column align="center" label="所属仓库" prop="warehouseName">
<template #default="scope">
{{ scope.row.warehouseName || getWarehouseName(scope.row.warehouseId) }}
</template>
</el-table-column>
<el-table-column align="center" label="备注" prop="remark" />
<el-table-column
:formatter="dateFormatter"
align="center"
label="创建时间"
prop="createTime"
width="180"
/>
<el-table-column align="center" label="操作" width="150">
<template #default="scope">
<el-button
v-hasPermi="['wms:warehouse-area:update']"
link
type="primary"
@click="openForm('update', scope.row.id)"
>
修改
</el-button>
<el-button
v-hasPermi="['wms:warehouse-area:delete']"
link
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
:total="total"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<WarehouseAreaForm ref="formRef" @success="getList" />
</template>
<script lang="ts" setup>
import { dateFormatter } from '@/utils/formatTime'
import { WarehouseApi, WarehouseVO } from '@/api/wms/md/warehouse'
import { WarehouseAreaApi, WarehouseAreaVO } from '@/api/wms/md/warehouse/area'
import WarehouseAreaForm from './WarehouseAreaForm.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import download from '@/utils/download'
/** WMS 库区管理 */
defineOptions({ name: 'WmsWarehouseArea' })
const message = useMessage() //
const { t } = useI18n() //
const route = useRoute() //
const loading = ref(true) //
const list = ref<WarehouseAreaVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
warehouseId: Number(route.params.warehouseId) || undefined,
code: undefined,
name: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const warehouseList = ref<WarehouseVO[]>([]) //
/** 查询库区列表 */
const getList = async () => {
loading.value = true
try {
const data = await WarehouseAreaApi.getWarehouseAreaPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 查询仓库精简列表 */
const getWarehouseList = async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
}
/** 获得仓库名称 */
const getWarehouseName = (warehouseId?: number) => {
return warehouseList.value.find((warehouse) => warehouse.id === warehouseId)?.name
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 所属仓库更改同时更新列表数据 */
const warehouseChange = () => {
handleQuery()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id, queryParams.warehouseId)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await WarehouseAreaApi.deleteWarehouseArea(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await WarehouseAreaApi.exportWarehouseArea(queryParams)
download.excel(data, '库区.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 */
onMounted(async () => {
await getWarehouseList()
await getList()
})
</script>

View File

@ -1,83 +0,0 @@
<!-- WMS 库区选择器 -->
<template>
<el-select
v-bind="$attrs"
v-model="selectValue"
:clearable="clearable"
:disabled="disabled"
:filter-method="handleFilter"
:placeholder="placeholder"
class="w-1/1"
filterable
@change="handleChange"
>
<el-option v-for="area in filteredList" :key="area.id!" :label="area.name" :value="area.id!" />
</el-select>
</template>
<script lang="ts" setup>
import { WarehouseAreaApi, WarehouseAreaVO } from '@/api/wms/md/warehouse/area'
/** WMS 库区选择器 */
defineOptions({ name: 'WmsWarehouseAreaSelect', inheritAttrs: false })
const props = withDefaults(
defineProps<{
modelValue?: number
warehouseId?: number
disabled?: boolean
clearable?: boolean
placeholder?: string
}>(),
{
disabled: false,
clearable: true,
placeholder: '请选择库区'
}
)
const emit = defineEmits<{
'update:modelValue': [value: number | undefined]
change: [area: WarehouseAreaVO | undefined]
}>()
const areaList = ref<WarehouseAreaVO[]>([]) //
const filteredList = ref<WarehouseAreaVO[]>([]) //
const selectValue = computed({
get: () => props.modelValue,
set: (value) => emit('update:modelValue', value)
})
/** 前端过滤 */
const handleFilter = (query: string) => {
if (!query) {
filteredList.value = areaList.value
return
}
const keyword = query.toLowerCase()
filteredList.value = areaList.value.filter((area) => area.name?.toLowerCase().includes(keyword))
}
/** 选中变化 */
const handleChange = (value: number | undefined) => {
emit(
'change',
areaList.value.find((area) => area.id === value)
)
}
/** 获得库区列表 */
const getAreaList = async () => {
try {
areaList.value = await WarehouseAreaApi.getWarehouseAreaSimpleList(props.warehouseId)
filteredList.value = areaList.value
} catch {
areaList.value = []
filteredList.value = []
}
}
/** 监听仓库变化 */
watch(() => props.warehouseId, getAreaList, { immediate: true })
</script>

View File

@ -75,14 +75,6 @@
/>
<el-table-column align="center" label="操作" width="210">
<template #default="scope">
<router-link
v-if="AREA_ENABLE"
:to="{ name: 'WmsWarehouseArea', params: { warehouseId: scope.row.id } }"
>
<el-button v-hasPermi="['wms:warehouse-area:query']" link type="primary">
库区
</el-button>
</router-link>
<el-button
v-hasPermi="['wms:warehouse:update']"
link
@ -118,7 +110,6 @@
<script lang="ts" setup>
import { dateFormatter } from '@/utils/formatTime'
import { WarehouseApi, WarehouseVO } from '@/api/wms/md/warehouse'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import WarehouseForm from './WarehouseForm.vue'
import download from '@/utils/download'

View File

@ -14,7 +14,6 @@
<span v-else>-</span>
</el-descriptions-item>
<el-descriptions-item label="仓库">{{ detailData.warehouseName || '-' }}</el-descriptions-item>
<el-descriptions-item v-if="AREA_ENABLE" label="库区">{{ detailData.areaName || '-' }}</el-descriptions-item>
<el-descriptions-item label="盈亏数量">
{{ formatQuantity(detailData.totalQuantity) || '-' }}
</el-descriptions-item>
@ -73,7 +72,6 @@ import { formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE } from '@/utils/dict'
import { CheckOrderApi, CheckOrderVO } from '@/api/wms/order/check'
import { CheckOrderDetailVO } from '@/api/wms/order/check/detail'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { formatPrice, formatQuantity, formatSumPrice, formatSumQuantity } from '@/views/wms/utils/format'
/** WMS 盘库单详情 */

View File

@ -13,11 +13,6 @@
<WarehouseSelect v-model="formData.warehouseId" @change="handleWarehouseChange" />
</el-form-item>
</el-col>
<el-col v-if="AREA_ENABLE" :span="8">
<el-form-item label="库区" prop="areaId">
<WarehouseAreaSelect v-model="formData.areaId" :warehouse-id="formData.warehouseId" @change="handleAreaChange" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="盈亏数量">
<el-input :model-value="formatQuantity(totalQuantity)" disabled />
@ -111,7 +106,6 @@
</el-table>
<InventorySelect
ref="inventorySelectRef"
:area-id="formData.areaId"
:warehouse-id="formData.warehouseId"
@change="handleSelectInventory"
/>
@ -152,9 +146,7 @@ import { FormRules } from 'element-plus'
import { CheckOrderApi, CheckOrderVO } from '@/api/wms/order/check'
import { CheckOrderDetailVO } from '@/api/wms/order/check/detail'
import InventorySelect, { InventorySelectRow } from '@/views/wms/inventory/components/InventorySelect.vue'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants'
import { formatQuantity, PRICE_PRECISION, QUANTITY_PRECISION, sumPrice } from '@/views/wms/utils/format'
import { generateOrderNo } from '@/views/wms/utils/order'
@ -175,7 +167,6 @@ const formData = ref<CheckOrderVO>({
no: undefined,
status: OrderStatusEnum.PREPARE,
warehouseId: undefined,
areaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,
@ -237,8 +228,6 @@ const buildDetail = (inventory: InventorySelectRow): CheckOrderDetailVO => ({
inventoryId: inventory.id,
warehouseId: inventory.warehouseId,
warehouseName: inventory.warehouseName,
areaId: inventory.areaId,
areaName: inventory.areaName,
batchNo: inventory.batchNo,
productionDate: inventory.productionDate,
expirationDate: inventory.expirationDate,
@ -268,11 +257,6 @@ const handleDeleteDetail = (index: number) => {
refreshTotalAmount()
}
const handleWarehouseChange = () => {
formData.value.areaId = undefined
formData.value.details = []
refreshTotalAmount()
}
const handleAreaChange = () => {
formData.value.details = []
refreshTotalAmount()
}
@ -291,10 +275,6 @@ const validateDetails = (required: boolean) => {
}
for (let i = 0; i < formData.value.details.length; i++) {
const detail = formData.value.details[i]
if (AREA_ENABLE && !detail.areaId) {
message.error(`${i + 1} 行明细请选择库区`)
return false
}
if (detail.checkQuantity === undefined || detail.checkQuantity < 0) {
message.error(`${i + 1} 行明细实盘数量不能小于 0`)
return false
@ -374,7 +354,6 @@ const resetForm = () => {
no: generateOrderNo('PK'),
status: OrderStatusEnum.PREPARE,
warehouseId: undefined,
areaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,

View File

@ -16,10 +16,7 @@
</el-select>
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<WarehouseSelect v-model="queryParams.warehouseId" class="!w-240px" @change="handleWarehouseChange" />
</el-form-item>
<el-form-item v-if="AREA_ENABLE" label="库区" prop="areaId">
<WarehouseAreaSelect v-model="queryParams.areaId" :warehouse-id="queryParams.warehouseId" class="!w-240px" />
<WarehouseSelect v-model="queryParams.warehouseId" class="!w-240px" />
</el-form-item>
<el-form-item label="单据日期" prop="orderDate">
<el-date-picker
@ -199,15 +196,11 @@
</el-table-column>
<el-table-column
v-if="isTableColumnVisible('warehouse')"
:label="AREA_ENABLE ? '仓库/库区' : '仓库'"
label="仓库"
min-width="180"
>
<template #default="{ row }">
<template v-if="AREA_ENABLE">
<div>仓库{{ row.warehouseName || '-' }}</div>
<div>库区{{ row.areaName || '-' }}</div>
</template>
<template v-else>{{ row.warehouseName || '-' }}</template>
{{ row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column v-if="isTableColumnVisible('quantityAmount')" label="盈亏数量/总金额(元)" min-width="180">
@ -272,9 +265,7 @@ import { defaultShortcuts, formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { CheckOrderApi, CheckOrderVO } from '@/api/wms/order/check'
import { CheckOrderDetailVO } from '@/api/wms/order/check/detail'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { OrderDeleteStatusList, OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants'
import { formatPrice, formatQuantity, PRICE_PRECISION, QUANTITY_PRECISION } from '@/views/wms/utils/format'
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'
@ -317,7 +308,6 @@ const getDefaultQueryParams = () => ({
no: undefined as string | undefined,
status: undefined as number | undefined,
warehouseId: undefined as number | undefined,
areaId: undefined as number | undefined,
orderDate: undefined as string[] | undefined,
totalQuantityMin: undefined as number | undefined,
totalQuantityMax: undefined as number | undefined,
@ -363,9 +353,6 @@ const resetQuery = () => {
Object.assign(queryParams, getDefaultQueryParams())
handleQuery()
}
const handleWarehouseChange = () => {
queryParams.areaId = undefined
}
const handleExpandChange = async (row: CheckOrderVO) => {
if (!row.id || detailMap[row.id]) return
detailMap[row.id] = await CheckOrderApi.getCheckOrderDetailListByOrderId(row.id)

View File

@ -13,17 +13,11 @@
/>
<span v-else>-</span>
</el-descriptions-item>
<el-descriptions-item :label="AREA_ENABLE ? '来源仓库/库区' : '来源仓库'">
<template v-if="AREA_ENABLE">
{{ detailData.sourceWarehouseName || '-' }} / {{ detailData.sourceAreaName || '-' }}
</template>
<template v-else>{{ detailData.sourceWarehouseName || '-' }}</template>
<el-descriptions-item label="来源仓库">
{{ detailData.sourceWarehouseName || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="AREA_ENABLE ? '目标仓库/库区' : '目标仓库'">
<template v-if="AREA_ENABLE">
{{ detailData.targetWarehouseName || '-' }} / {{ detailData.targetAreaName || '-' }}
</template>
<template v-else>{{ detailData.targetWarehouseName || '-' }}</template>
<el-descriptions-item label="目标仓库">
{{ detailData.targetWarehouseName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="总数量">
{{ formatQuantity(detailData.totalQuantity) || '-' }}
@ -80,7 +74,6 @@ import { formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE } from '@/utils/dict'
import { MovementOrderApi, MovementOrderVO } from '@/api/wms/order/movement'
import { MovementOrderDetailVO } from '@/api/wms/order/movement/detail'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { formatPrice, formatQuantity, formatSumPrice, formatSumQuantity } from '@/views/wms/utils/format'
/** WMS 移库单详情 */

View File

@ -13,29 +13,11 @@
<WarehouseSelect v-model="formData.sourceWarehouseId" @change="handleSourceWarehouseChange" />
</el-form-item>
</el-col>
<el-col v-if="AREA_ENABLE" :span="8">
<el-form-item label="来源库区" prop="sourceAreaId">
<WarehouseAreaSelect
v-model="formData.sourceAreaId"
:warehouse-id="formData.sourceWarehouseId"
@change="handleSourceAreaChange"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="目标仓库" prop="targetWarehouseId">
<WarehouseSelect v-model="formData.targetWarehouseId" @change="handleTargetWarehouseChange" />
</el-form-item>
</el-col>
<el-col v-if="AREA_ENABLE" :span="8">
<el-form-item label="目标库区" prop="targetAreaId">
<WarehouseAreaSelect
v-model="formData.targetAreaId"
:warehouse-id="formData.targetWarehouseId"
@change="handleTargetAreaChange"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="总数量">
<el-input :model-value="formatQuantity(totalQuantity)" disabled />
@ -84,7 +66,6 @@
<div v-if="row.skuCode" class="text-12px text-gray-500">{{ row.skuCode }}</div>
</template>
</el-table-column>
<el-table-column v-if="AREA_ENABLE" label="来源库区" min-width="140" prop="sourceAreaName" />
<el-table-column label="批号" min-width="140" prop="batchNo" />
<el-table-column align="right" label="可用库存" width="120">
<template #default="{ row }">{{ formatQuantity(row.availableQuantity) || '-' }}</template>
@ -127,7 +108,6 @@
</el-table>
<InventorySelect
ref="inventorySelectRef"
:area-id="formData.sourceAreaId"
:warehouse-id="formData.sourceWarehouseId"
@change="handleSelectInventory"
/>
@ -168,9 +148,7 @@ import { FormRules } from 'element-plus'
import { MovementOrderApi, MovementOrderVO } from '@/api/wms/order/movement'
import { MovementOrderDetailVO } from '@/api/wms/order/movement/detail'
import InventorySelect, { InventorySelectRow } from '@/views/wms/inventory/components/InventorySelect.vue'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants'
import { formatQuantity, PRICE_PRECISION, QUANTITY_PRECISION, sumPrice, sumQuantity } from '@/views/wms/utils/format'
import { generateOrderNo } from '@/views/wms/utils/order'
@ -191,9 +169,7 @@ const formData = ref<MovementOrderVO>({
no: undefined,
status: OrderStatusEnum.PREPARE,
sourceWarehouseId: undefined,
sourceAreaId: undefined,
targetWarehouseId: undefined,
targetAreaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,
@ -252,10 +228,7 @@ const buildDetail = (inventory: InventorySelectRow): MovementOrderDetailVO => ({
skuName: inventory.skuName,
sourceWarehouseId: inventory.warehouseId,
sourceWarehouseName: inventory.warehouseName,
sourceAreaId: inventory.areaId,
sourceAreaName: inventory.areaName,
targetWarehouseId: formData.value.targetWarehouseId,
targetAreaId: formData.value.targetAreaId,
batchNo: inventory.batchNo,
productionDate: inventory.productionDate,
expirationDate: inventory.expirationDate,
@ -283,8 +256,7 @@ const isInventorySelected = (inventory: InventorySelectRow) =>
(formData.value.details || []).some((detail) => {
return (
detail.skuId === inventory.skuId &&
detail.sourceWarehouseId === inventory.warehouseId &&
detail.sourceAreaId === inventory.areaId
detail.sourceWarehouseId === inventory.warehouseId
)
})
@ -294,24 +266,16 @@ const handleDeleteDetail = (index: number) => {
}
const handleSourceWarehouseChange = () => {
formData.value.sourceAreaId = undefined
formData.value.details = []
refreshTotalAmount()
}
const handleSourceAreaChange = () => {
formData.value.details = []
refreshTotalAmount()
}
const handleTargetWarehouseChange = () => {
formData.value.targetAreaId = undefined
refreshTargetToDetails()
}
const handleTargetAreaChange = () => refreshTargetToDetails()
const refreshTargetToDetails = () => {
const details = formData.value.details || []
details.forEach((detail) => {
detail.targetWarehouseId = formData.value.targetWarehouseId
detail.targetAreaId = formData.value.targetAreaId
})
}
const refreshTotalAmount = () => {
@ -320,6 +284,10 @@ const refreshTotalAmount = () => {
/** 校验明细 */
const validateDetails = (required: boolean) => {
if (formData.value.sourceWarehouseId === formData.value.targetWarehouseId) {
message.error('来源仓库和目标仓库不能相同')
return false
}
if (!formData.value.details?.length) {
if (required) {
message.error('至少包含一条移库明细')
@ -327,19 +295,8 @@ const validateDetails = (required: boolean) => {
}
return true
}
if (
formData.value.sourceWarehouseId === formData.value.targetWarehouseId &&
formData.value.sourceAreaId === formData.value.targetAreaId
) {
message.error('来源仓库库区和目标仓库库区不能相同')
return false
}
for (let i = 0; i < formData.value.details.length; i++) {
const detail = formData.value.details[i]
if (AREA_ENABLE && (!detail.sourceAreaId || !detail.targetAreaId)) {
message.error(`${i + 1} 行明细请选择来源和目标库区`)
return false
}
if (!detail.quantity || detail.quantity <= 0) {
message.error(`${i + 1} 行明细移库数量必须大于 0`)
return false
@ -423,9 +380,7 @@ const resetForm = () => {
no: generateOrderNo('YK'),
status: OrderStatusEnum.PREPARE,
sourceWarehouseId: undefined,
sourceAreaId: undefined,
targetWarehouseId: undefined,
targetAreaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,

View File

@ -199,28 +199,20 @@
</el-table-column>
<el-table-column
v-if="isTableColumnVisible('sourceWarehouse')"
:label="AREA_ENABLE ? '来源仓库/库区' : '来源仓库'"
label="来源仓库"
min-width="180"
>
<template #default="{ row }">
<template v-if="AREA_ENABLE">
<div>仓库{{ row.sourceWarehouseName || '-' }}</div>
<div>库区{{ row.sourceAreaName || '-' }}</div>
</template>
<template v-else>{{ row.sourceWarehouseName || '-' }}</template>
{{ row.sourceWarehouseName || '-' }}
</template>
</el-table-column>
<el-table-column
v-if="isTableColumnVisible('targetWarehouse')"
:label="AREA_ENABLE ? '目标仓库/库区' : '目标仓库'"
label="目标仓库"
min-width="180"
>
<template #default="{ row }">
<template v-if="AREA_ENABLE">
<div>仓库{{ row.targetWarehouseName || '-' }}</div>
<div>库区{{ row.targetAreaName || '-' }}</div>
</template>
<template v-else>{{ row.targetWarehouseName || '-' }}</template>
{{ row.targetWarehouseName || '-' }}
</template>
</el-table-column>
<el-table-column v-if="isTableColumnVisible('quantityAmount')" label="总数量/总金额(元)" min-width="180">
@ -286,7 +278,6 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { MovementOrderApi, MovementOrderVO } from '@/api/wms/order/movement'
import { MovementOrderDetailVO } from '@/api/wms/order/movement/detail'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { OrderDeleteStatusList, OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants'
import { formatPrice, formatQuantity, PRICE_PRECISION, QUANTITY_PRECISION } from '@/views/wms/utils/format'
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'

View File

@ -30,9 +30,6 @@
<el-descriptions-item label="业务单号">
{{ detailData.bizOrderNo || '-' }}
</el-descriptions-item>
<el-descriptions-item v-if="AREA_ENABLE" label="库区">
{{ detailData.areaName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="总数量">
{{ formatQuantity(detailData.totalQuantity) || '-' }}
</el-descriptions-item>
@ -74,7 +71,6 @@
</div>
</template>
</el-table-column>
<el-table-column v-if="AREA_ENABLE" label="库区" min-width="140" prop="areaName" />
<el-table-column label="批号" min-width="140" prop="batchNo" />
<el-table-column label="生产日期" width="140">
<template #default="scope">
@ -112,7 +108,6 @@ import { formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE } from '@/utils/dict'
import { ReceiptOrderApi, ReceiptOrderVO } from '@/api/wms/order/receipt'
import { ReceiptOrderDetailVO } from '@/api/wms/order/receipt/detail'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import {
formatPrice,
formatQuantity,

View File

@ -42,16 +42,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="仓库" prop="warehouseId">
<WarehouseSelect v-model="formData.warehouseId" @change="handleWarehouseChange" />
</el-form-item>
</el-col>
<el-col v-if="AREA_ENABLE" :span="8">
<el-form-item label="库区" prop="areaId">
<WarehouseAreaSelect
v-model="formData.areaId"
:warehouse-id="formData.warehouseId"
@change="handleAreaChange"
/>
<WarehouseSelect v-model="formData.warehouseId" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -71,7 +62,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="AREA_ENABLE ? 8 : 16">
<el-col :span="16">
<el-form-item label="备注" prop="remark">
<el-input
v-model="formData.remark"
@ -116,16 +107,6 @@
</div>
</template>
</el-table-column>
<el-table-column v-if="AREA_ENABLE" label="库区" min-width="180">
<template #default="scope">
<WarehouseAreaSelect
v-model="scope.row.areaId"
:disabled="!formData.warehouseId || !!formData.areaId"
:warehouse-id="formData.warehouseId"
placeholder="请选择库区"
/>
</template>
</el-table-column>
<el-table-column label="批号" min-width="160">
<template #default="scope">
<el-input v-model="scope.row.batchNo" maxlength="64" placeholder="请输入批号" />
@ -232,9 +213,7 @@ import { ReceiptOrderDetailVO } from '@/api/wms/order/receipt/detail'
import { ItemSkuVO } from '@/api/wms/md/item/sku'
import ItemSkuSelect from '@/views/wms/md/item/sku/components/ItemSkuSelect.vue'
import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vue'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants'
import {
formatQuantity,
@ -264,7 +243,6 @@ const formData = ref<ReceiptOrderVO>({
bizOrderNo: undefined,
merchantId: undefined,
warehouseId: undefined,
areaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,
@ -325,7 +303,6 @@ const buildDetail = (sku: ItemSkuVO): ReceiptOrderDetailVO => ({
skuId: sku.id,
skuCode: sku.code,
skuName: sku.name,
areaId: formData.value.areaId,
batchNo: undefined,
productionDate: undefined,
expirationDate: undefined,
@ -355,17 +332,6 @@ const handleDeleteDetail = (index: number) => {
refreshTotalAmount()
}
/** 仓库变化 */
const handleWarehouseChange = () => {
formData.value.areaId = undefined
formData.value.details?.forEach((detail) => (detail.areaId = undefined))
}
/** 库区变化 */
const handleAreaChange = () => {
formData.value.details?.forEach((detail) => (detail.areaId = formData.value.areaId))
}
/** 明细金额变化 */
const handleDetailAmountChange = () => {
refreshTotalAmount()
@ -391,10 +357,6 @@ const validateDetails = (required: boolean) => {
message.error(`${i + 1} 行明细请选择商品规格`)
return false
}
if (AREA_ENABLE && !detail.areaId) {
message.error(`${i + 1} 行明细请选择库区`)
return false
}
if (!detail.quantity || detail.quantity <= 0) {
message.error(`${i + 1} 行明细入库数量必须大于 0`)
return false
@ -487,7 +449,6 @@ const resetForm = () => {
bizOrderNo: undefined,
merchantId: undefined,
warehouseId: undefined,
areaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,

View File

@ -13,7 +13,6 @@
<div>供应商{{ printData.merchantName || '-' }}</div>
<div>业务单号{{ printData.bizOrderNo || '-' }}</div>
<div>仓库{{ printData.warehouseName || '-' }}</div>
<div v-if="AREA_ENABLE">{{ printData.areaName || '-' }}</div>
<div>总数量{{ formatQuantity(printData.totalQuantity) || '-' }}</div>
<div>总金额{{ formatPrice(printData.totalAmount) || '-' }}</div>
<div>创建时间{{ formatNullableDate(printData.createTime) }}</div>
@ -24,12 +23,6 @@
<tr>
<th class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left">商品信息</th>
<th class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left">规格信息</th>
<th
v-if="AREA_ENABLE"
class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left"
>
库区
</th>
<th
class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left"
>
@ -60,9 +53,6 @@
<div>{{ detail.skuName || '-' }}</div>
<div v-if="detail.skuCode" class="text-12px">{{ detail.skuCode }}</div>
</td>
<td v-if="AREA_ENABLE" class="border border-solid border-#dcdfe6 p-8px">
{{ detail.areaName || '-' }}
</td>
<td class="border border-solid border-#dcdfe6 p-8px">
{{ detail.batchNo || '-' }}
</td>
@ -98,7 +88,6 @@
import { formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { ReceiptOrderApi, ReceiptOrderVO } from '@/api/wms/order/receipt'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { formatPrice, formatQuantity } from '@/views/wms/utils/format'
/** WMS 入库单打印 */
@ -106,7 +95,7 @@ defineOptions({ name: 'WmsReceiptOrderPrint' })
const printData = ref<ReceiptOrderVO>({}) //
const printButtonRef = ref<HTMLButtonElement>() //
const tableColumnCount = computed(() => 8 + (AREA_ENABLE ? 1 : 0))
const tableColumnCount = 8
const printObj = ref({
id: 'wmsReceiptOrderPrint',
popTitle: '&nbsp',

View File

@ -237,13 +237,6 @@
</div>
</template>
</el-table-column>
<el-table-column
v-if="AREA_ENABLE"
align="center"
label="库区"
min-width="140"
prop="areaName"
/>
<el-table-column align="center" label="批号" min-width="140" prop="batchNo" />
<el-table-column label="生产日期/过期日期" min-width="180">
<template #default="detailScope">
@ -305,17 +298,11 @@
</el-table-column>
<el-table-column
v-if="isTableColumnVisible('warehouse')"
:label="AREA_ENABLE ? '仓库/库区' : '仓库'"
label="仓库"
min-width="160"
>
<template #default="scope">
<template v-if="AREA_ENABLE">
<div>仓库{{ scope.row.warehouseName || '-' }}</div>
<div>库区{{ scope.row.areaName || '-' }}</div>
</template>
<template v-else>
{{ scope.row.warehouseName || '-' }}
</template>
{{ scope.row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column
@ -422,7 +409,6 @@ import { ReceiptOrderApi, ReceiptOrderVO } from '@/api/wms/order/receipt'
import { ReceiptOrderDetailVO } from '@/api/wms/order/receipt/detail'
import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import {
OrderDeleteStatusList,
OrderStatusEnum,

View File

@ -30,9 +30,6 @@
<el-descriptions-item label="业务单号">
{{ detailData.bizOrderNo || '-' }}
</el-descriptions-item>
<el-descriptions-item v-if="AREA_ENABLE" label="库区">
{{ detailData.areaName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="总数量">
{{ formatQuantity(detailData.totalQuantity) || '-' }}
</el-descriptions-item>
@ -74,7 +71,6 @@
</div>
</template>
</el-table-column>
<el-table-column v-if="AREA_ENABLE" label="库区" min-width="140" prop="areaName" />
<el-table-column label="批号" min-width="140" prop="batchNo" />
<el-table-column label="生产日期" width="140">
<template #default="scope">
@ -112,7 +108,6 @@ import { formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE } from '@/utils/dict'
import { ShipmentOrderApi, ShipmentOrderVO } from '@/api/wms/order/shipment'
import { ShipmentOrderDetailVO } from '@/api/wms/order/shipment/detail'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import {
formatPrice,
formatQuantity,

View File

@ -45,15 +45,6 @@
<WarehouseSelect v-model="formData.warehouseId" @change="handleWarehouseChange" />
</el-form-item>
</el-col>
<el-col v-if="AREA_ENABLE" :span="8">
<el-form-item label="库区" prop="areaId">
<WarehouseAreaSelect
v-model="formData.areaId"
:warehouse-id="formData.warehouseId"
@change="handleAreaChange"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="总数量">
<el-input :model-value="formatQuantity(totalQuantity)" disabled />
@ -71,7 +62,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="AREA_ENABLE ? 8 : 16">
<el-col :span="16">
<el-form-item label="备注" prop="remark">
<el-input
v-model="formData.remark"
@ -116,11 +107,6 @@
</div>
</template>
</el-table-column>
<el-table-column v-if="AREA_ENABLE" label="库区" min-width="140">
<template #default="scope">
{{ scope.row.areaName || '-' }}
</template>
</el-table-column>
<el-table-column label="批号" min-width="160">
<template #default="scope">
{{ scope.row.batchNo || '-' }}
@ -179,7 +165,6 @@
</el-table>
<InventorySelect
ref="inventorySelectRef"
:area-id="formData.areaId"
:warehouse-id="formData.warehouseId"
@change="handleSelectInventory"
/>
@ -226,10 +211,8 @@ import InventorySelect, {
InventorySelectRow
} from '@/views/wms/inventory/components/InventorySelect.vue'
import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vue'
import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { formatNullableDate } from '@/utils/formatTime'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants'
import {
formatQuantity,
@ -259,7 +242,6 @@ const formData = ref<ShipmentOrderVO>({
bizOrderNo: undefined,
merchantId: undefined,
warehouseId: undefined,
areaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,
@ -322,8 +304,6 @@ const buildDetail = (inventory: InventorySelectRow): ShipmentOrderDetailVO => ({
skuName: inventory.skuName,
warehouseId: inventory.warehouseId,
warehouseName: inventory.warehouseName,
areaId: inventory.areaId,
areaName: inventory.areaName,
batchNo: inventory.batchNo,
productionDate: inventory.productionDate,
expirationDate: inventory.expirationDate,
@ -358,8 +338,7 @@ const isInventorySelected = (inventory: InventorySelectRow) => {
return (formData.value.details || []).some((detail) => {
return (
detail.skuId === inventory.skuId &&
detail.warehouseId === inventory.warehouseId &&
detail.areaId === inventory.areaId
detail.warehouseId === inventory.warehouseId
)
})
}
@ -372,13 +351,6 @@ const handleDeleteDetail = (index: number) => {
/** 仓库变化 */
const handleWarehouseChange = () => {
formData.value.areaId = undefined
formData.value.details = []
refreshTotalAmount()
}
/** 库区变化 */
const handleAreaChange = () => {
formData.value.details = []
refreshTotalAmount()
}
@ -408,10 +380,6 @@ const validateDetails = (required: boolean) => {
message.error(`${i + 1} 行明细请选择商品规格`)
return false
}
if (AREA_ENABLE && !detail.areaId) {
message.error(`${i + 1} 行明细请选择库区`)
return false
}
if (!detail.quantity || detail.quantity <= 0) {
message.error(`${i + 1} 行明细出库数量必须大于 0`)
return false
@ -508,7 +476,6 @@ const resetForm = () => {
bizOrderNo: undefined,
merchantId: undefined,
warehouseId: undefined,
areaId: undefined,
totalQuantity: 0,
totalAmount: 0,
remark: undefined,

View File

@ -13,7 +13,6 @@
<div>客户{{ printData.merchantName || '-' }}</div>
<div>业务单号{{ printData.bizOrderNo || '-' }}</div>
<div>仓库{{ printData.warehouseName || '-' }}</div>
<div v-if="AREA_ENABLE">{{ printData.areaName || '-' }}</div>
<div>总数量{{ formatQuantity(printData.totalQuantity) || '-' }}</div>
<div>总金额{{ formatPrice(printData.totalAmount) || '-' }}</div>
<div>创建时间{{ formatNullableDate(printData.createTime) }}</div>
@ -24,12 +23,6 @@
<tr>
<th class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left">商品信息</th>
<th class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left">规格信息</th>
<th
v-if="AREA_ENABLE"
class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left"
>
库区
</th>
<th
class="border border-solid border-#dcdfe6 bg-#f5f7fa p-8px text-left"
>
@ -60,9 +53,6 @@
<div>{{ detail.skuName || '-' }}</div>
<div v-if="detail.skuCode" class="text-12px">{{ detail.skuCode }}</div>
</td>
<td v-if="AREA_ENABLE" class="border border-solid border-#dcdfe6 p-8px">
{{ detail.areaName || '-' }}
</td>
<td class="border border-solid border-#dcdfe6 p-8px">
{{ detail.batchNo || '-' }}
</td>
@ -98,7 +88,6 @@
import { formatNullableDate } from '@/utils/formatTime'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { ShipmentOrderApi, ShipmentOrderVO } from '@/api/wms/order/shipment'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import { formatPrice, formatQuantity } from '@/views/wms/utils/format'
/** WMS 出库单打印 */
@ -106,7 +95,7 @@ defineOptions({ name: 'WmsShipmentOrderPrint' })
const printData = ref<ShipmentOrderVO>({}) //
const printButtonRef = ref<HTMLButtonElement>() //
const tableColumnCount = computed(() => 8 + (AREA_ENABLE ? 1 : 0))
const tableColumnCount = 8
const printObj = ref({
id: 'wmsShipmentOrderPrint',
popTitle: '&nbsp',

View File

@ -237,13 +237,6 @@
</div>
</template>
</el-table-column>
<el-table-column
v-if="AREA_ENABLE"
align="center"
label="库区"
min-width="140"
prop="areaName"
/>
<el-table-column align="center" label="批号" min-width="140" prop="batchNo" />
<el-table-column label="生产日期/过期日期" min-width="180">
<template #default="detailScope">
@ -305,17 +298,11 @@
</el-table-column>
<el-table-column
v-if="isTableColumnVisible('warehouse')"
:label="AREA_ENABLE ? '仓库/库区' : '仓库'"
label="仓库"
min-width="160"
>
<template #default="scope">
<template v-if="AREA_ENABLE">
<div>仓库{{ scope.row.warehouseName || '-' }}</div>
<div>库区{{ scope.row.areaName || '-' }}</div>
</template>
<template v-else>
{{ scope.row.warehouseName || '-' }}
</template>
{{ scope.row.warehouseName || '-' }}
</template>
</el-table-column>
<el-table-column
@ -422,7 +409,6 @@ import { ShipmentOrderApi, ShipmentOrderVO } from '@/api/wms/order/shipment'
import { ShipmentOrderDetailVO } from '@/api/wms/order/shipment/detail'
import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vue'
import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue'
import { AREA_ENABLE } from '@/views/wms/utils/config'
import {
OrderDeleteStatusList,
OrderStatusEnum,

View File

@ -1,10 +0,0 @@
/**
* WMS
*
* yudao.wms.*
*/
// ==================== 后端镜像(与 WmsProperties 默认值对齐) ====================
/** 是否启用库区模式(对齐 yudao.wms.area-enable */
export const AREA_ENABLE = true