dev
parent
66e109e853
commit
17b32e9ea8
@ -0,0 +1,192 @@
|
||||
<template>
|
||||
<BasicModal
|
||||
v-bind="$attrs"
|
||||
@register="registerModal"
|
||||
:useWrapper="true"
|
||||
:title="getTitle"
|
||||
width="40%"
|
||||
@ok="handleSave"
|
||||
>
|
||||
<BasicForm @register="registerForm">
|
||||
<!-- <template #clientSelectSlot="{ model, field }">-->
|
||||
<!-- <a-input-search-->
|
||||
<!-- placeholder="请选择客户"-->
|
||||
<!-- v-model:value="model[field]"-->
|
||||
<!-- enter-button-->
|
||||
<!-- @search="onClientSearch"-->
|
||||
<!-- />-->
|
||||
<!-- </template> -->
|
||||
<template #storehouseSelectSlot="{ model, field }">
|
||||
<a-input-search
|
||||
placeholder="请选择仓库"
|
||||
v-model:value="model[field]"
|
||||
enter-button
|
||||
@search="onSearch"
|
||||
/>
|
||||
</template>
|
||||
</BasicForm>
|
||||
|
||||
<!--右下角按钮-->
|
||||
<template #footer>
|
||||
<a-button
|
||||
@click="closeModal"
|
||||
preIcon="ant-design:close-outlined"
|
||||
type="warning"
|
||||
:loading="loading"
|
||||
ghost
|
||||
style="margin-right: 0.8rem"
|
||||
>取消</a-button
|
||||
>
|
||||
<a-button
|
||||
@click="handleSave(false)"
|
||||
type="success"
|
||||
:loading="loading"
|
||||
preIcon="ant-design:check-outlined"
|
||||
style="margin-right: 0.8rem"
|
||||
>仅保存</a-button
|
||||
>
|
||||
<a-button
|
||||
@click="handleSave(true)"
|
||||
preIcon="ant-design:check-circle-outlined"
|
||||
type="primary"
|
||||
:loading="loading"
|
||||
>保存并关闭</a-button
|
||||
>
|
||||
</template>
|
||||
<StoreHouseSelectModal @register="registerSelectModal" @success="closeSelectModal" />
|
||||
</BasicModal>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref, computed, unref, h, useAttrs } from 'vue'
|
||||
import { BasicModal, useModal, useModalInner } from '/@/components/Modal'
|
||||
import { BasicForm, useForm } from '/@/components/Form/index'
|
||||
import { formSchema } from './columns'
|
||||
import { Divider } from 'ant-design-vue'
|
||||
import { getInfo, editInfo } from './api'
|
||||
import { useUserStore } from '/@/store/modules/user'
|
||||
import { useMessage } from '/@/hooks/web/useMessage'
|
||||
import StoreHouseSelectModal from '/@/views/wms/common/StoreHouseSelectModal.vue'
|
||||
import { getStoreHouseAreaList } from '/@/api/common'
|
||||
// 声明Emits
|
||||
const emit = defineEmits(['success', 'register'])
|
||||
const isUpdate = ref(true)
|
||||
const loading = ref(false)
|
||||
const rowId = ref('')
|
||||
const storeHouse = ref('')
|
||||
const dataSource = ref<any[]>([])
|
||||
const areaList = ref<any[]>([])
|
||||
const attrs = useAttrs()
|
||||
const { notification, createConfirm, createMessage } = useMessage()
|
||||
const [
|
||||
registerForm,
|
||||
{ resetFields, setFieldsValue, setProps, validate, updateSchema, getFieldsValue },
|
||||
] = useForm({
|
||||
labelWidth: 180,
|
||||
schemas: formSchema,
|
||||
showActionButtonGroup: false,
|
||||
})
|
||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
|
||||
resetFields()
|
||||
setModalProps({ confirmLoading: false, loading: true })
|
||||
isUpdate.value = !!data?.isUpdate
|
||||
if (unref(isUpdate)) {
|
||||
// setModalProps({ confirmLoading: true });
|
||||
rowId.value = data.record.id
|
||||
const res: API.DataResult = await getInfo({ id: unref(rowId) })
|
||||
if (res.succeeded) {
|
||||
setFieldsValue({
|
||||
...res.data,
|
||||
})
|
||||
loadAreaListData(res.data.storeHouse)
|
||||
}
|
||||
} else {
|
||||
await updateSchema([
|
||||
{
|
||||
field: 'areaCode',
|
||||
componentProps: {
|
||||
options: [],
|
||||
},
|
||||
},
|
||||
])
|
||||
}
|
||||
setModalProps({ loading: false })
|
||||
})
|
||||
const [registerSelectModal, { openModal }] = useModal()
|
||||
const onSearch = () => {
|
||||
openModal(true, {})
|
||||
}
|
||||
const closeSelectModal = (data: any) => {
|
||||
console.log('接收值', data)
|
||||
setFieldsValue({
|
||||
storeHouse: data.areacode,
|
||||
storeHouseName: data.areaname,
|
||||
})
|
||||
//更新
|
||||
loadAreaListData(data.areacode)
|
||||
}
|
||||
async function loadAreaListData(code: string) {
|
||||
const res: API.DataResult = await getStoreHouseAreaList({ code: code })
|
||||
console.log(res)
|
||||
if (res.succeeded) {
|
||||
let temp: any[] = []
|
||||
res.data.forEach((item) => {
|
||||
// console.log('当前文件', item)
|
||||
let info = {
|
||||
label: item.areaname,
|
||||
value: item.areacode,
|
||||
}
|
||||
temp.push(info)
|
||||
})
|
||||
areaList.value = temp
|
||||
} else {
|
||||
areaList.value = []
|
||||
}
|
||||
await updateSchema([
|
||||
{
|
||||
field: 'areaCode',
|
||||
componentProps: {
|
||||
options: areaList.value,
|
||||
},
|
||||
},
|
||||
])
|
||||
// console.log(dataSource.value)
|
||||
}
|
||||
const getTitle = computed(() => (!unref(isUpdate) ? '库位位置-新增' : '库位位置-编辑'))
|
||||
async function handleSave(exit) {
|
||||
try {
|
||||
const values = await validate()
|
||||
setModalProps({ confirmLoading: true, loading: true })
|
||||
loading.value = true
|
||||
const res: API.DataResult = await editInfo(values)
|
||||
console.log(res)
|
||||
if (res.succeeded) {
|
||||
notification.success({ message: res.message, duration: 3 })
|
||||
emit('success')
|
||||
//刷新页面
|
||||
if (!exit) {
|
||||
if (unref(isUpdate)) {
|
||||
await refresh()
|
||||
} else {
|
||||
rowId.value = res.data
|
||||
isUpdate.value = true
|
||||
await refresh()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
notification.error({ message: res.message, duration: 3 })
|
||||
}
|
||||
exit && closeModal()
|
||||
} finally {
|
||||
loading.value = false
|
||||
setModalProps({ confirmLoading: false, loading: false })
|
||||
}
|
||||
}
|
||||
async function refresh() {
|
||||
const res: API.DataResult = await getInfo({ id: unref(rowId) })
|
||||
if (res.succeeded) {
|
||||
await setFieldsValue({
|
||||
...res.data,
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,37 @@
|
||||
// @ts-ignore
|
||||
import { request } from '/@/utils/request'
|
||||
import { DataResult, PageRequest } from '/@/api/model/baseModel'
|
||||
enum Api {
|
||||
list = '/WmsStoreAreaPosition/GetAreaPositionList',
|
||||
getInfo = '/WmsStoreAreaPosition/GetAreaPositionInfo',
|
||||
editInfo = '/WmsStoreAreaPosition/EditAreaPositionInfo',
|
||||
delInfo = '/WmsStoreAreaPosition/DelAreaPosition',
|
||||
}
|
||||
export function getList(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.list,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
export function getInfo(query: { id: string }) {
|
||||
return request<DataResult>({
|
||||
url: Api.getInfo,
|
||||
method: 'get',
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
export function editInfo(data: any) {
|
||||
return request<DataResult>({
|
||||
url: Api.editInfo,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
export function delInfo(query: { id: string }) {
|
||||
return request<DataResult>({
|
||||
url: Api.delInfo,
|
||||
method: 'get',
|
||||
params: query,
|
||||
})
|
||||
}
|
@ -0,0 +1,167 @@
|
||||
import { BasicColumn, FormSchema } from '/@/components/Table'
|
||||
import { formatToDate } from '/@/utils/dateUtil'
|
||||
import { getStoreHouseSelect } from '/@/api/common'
|
||||
export const columns: BasicColumn[] = [
|
||||
{
|
||||
title: 'id',
|
||||
dataIndex: 'id',
|
||||
ifShow: false,
|
||||
},
|
||||
{
|
||||
title: '仓库',
|
||||
dataIndex: 'storeHouseName',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '库位',
|
||||
dataIndex: 'areaCode',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '行数',
|
||||
dataIndex: 'rowNum',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '列数',
|
||||
dataIndex: 'columnNum',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '列长',
|
||||
dataIndex: 'rowLength',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '列长',
|
||||
dataIndex: 'columnLength',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '创建日期',
|
||||
dataIndex: 'addTime',
|
||||
width: 80,
|
||||
customRender: ({ text }) => {
|
||||
return formatToDate(text)
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '备注',
|
||||
dataIndex: 'note',
|
||||
width: 200,
|
||||
},
|
||||
]
|
||||
export const searchFormSchema: FormSchema[] = [
|
||||
// {
|
||||
// field: 'GoodsTypeCode',
|
||||
// label: '类别编码:',
|
||||
// component: 'Input',
|
||||
// colProps: { span: 8 },
|
||||
// },
|
||||
// {
|
||||
// field: 'GoodsTypeName',
|
||||
// label: '类别名称:',
|
||||
// component: 'Input',
|
||||
// colProps: { span: 8 },
|
||||
// },
|
||||
{
|
||||
field: 'StoreHouse',
|
||||
label: '仓库:',
|
||||
component: 'ApiSelect',
|
||||
colProps: { span: 8 },
|
||||
componentProps: {
|
||||
// mode: 'multiple',
|
||||
api: getStoreHouseSelect,
|
||||
resultField: 'data',
|
||||
},
|
||||
},
|
||||
]
|
||||
export const formSchema: FormSchema[] = [
|
||||
{
|
||||
field: 'divider-selects',
|
||||
component: 'Divider',
|
||||
label: '基本信息',
|
||||
colProps: {
|
||||
span: 24,
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
field: 'id',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false,
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
field: 'storeHouse',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false,
|
||||
},
|
||||
{
|
||||
field: 'storeHouseName',
|
||||
label: '仓库',
|
||||
component: 'Input',
|
||||
required: true,
|
||||
colProps: {
|
||||
span: 12,
|
||||
},
|
||||
slot: 'storehouseSelectSlot',
|
||||
componentProps: {
|
||||
disabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'areaCode',
|
||||
label: '库位',
|
||||
component: 'Select',
|
||||
required: true,
|
||||
colProps: {
|
||||
span: 12,
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'rowNum',
|
||||
label: '行数',
|
||||
component: 'InputNumber',
|
||||
required: true,
|
||||
defaultValue: 1,
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
{
|
||||
field: 'columnNum',
|
||||
label: '列数',
|
||||
component: 'InputNumber',
|
||||
required: true,
|
||||
defaultValue: 1,
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
{
|
||||
field: 'rowLength',
|
||||
label: '行长',
|
||||
component: 'InputNumber',
|
||||
required: true,
|
||||
defaultValue: 1,
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
{
|
||||
field: 'columnLength',
|
||||
label: '列长',
|
||||
component: 'InputNumber',
|
||||
required: true,
|
||||
defaultValue: 1,
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
{
|
||||
field: 'note',
|
||||
label: '备注',
|
||||
component: 'InputTextArea',
|
||||
defaultValue: '',
|
||||
colProps: { span: 20 },
|
||||
componentProps: {
|
||||
placeholder: '',
|
||||
rows: 4,
|
||||
},
|
||||
},
|
||||
]
|
@ -0,0 +1,166 @@
|
||||
<template>
|
||||
<div class="p-4">
|
||||
<BasicTable @register="registerTable">
|
||||
<template #toolbar>
|
||||
<a-button
|
||||
type="primary"
|
||||
@click="handleCreate"
|
||||
preIcon="ant-design:plus-outlined"
|
||||
style="margin-right: 0.8rem"
|
||||
>新增库位位置</a-button
|
||||
>
|
||||
</template>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.key === 'goodsTypeName'">
|
||||
<span style="color: #0d84ff;" @click="handleEdit(record)">{{ record.areaName }}</span>
|
||||
</template>
|
||||
<template v-if="column.key === 'action'">
|
||||
<TableAction
|
||||
:actions="[
|
||||
{
|
||||
icon: 'clarity:note-edit-line',
|
||||
tooltip: '编辑',
|
||||
onClick: handleEdit.bind(null, record),
|
||||
},
|
||||
{
|
||||
icon: 'ant-design:delete-outlined',
|
||||
color: 'error',
|
||||
tooltip: '删除',
|
||||
popConfirm: {
|
||||
title: '是否确认删除',
|
||||
confirm: handleDel.bind(null, record),
|
||||
},
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</template>
|
||||
</template>
|
||||
</BasicTable>
|
||||
<AreaPositionModal @register="registerModal" @success="handleSuccess" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { BasicTable, useTable, TableAction, SorterResult } from '/@/components/Table'
|
||||
import { useModal } from '/@/components/Modal'
|
||||
import { getList, delInfo } from './api'
|
||||
import { columns, searchFormSchema } from './columns'
|
||||
import AreaPositionModal from './AreaPositionModal.vue'
|
||||
import { Tag } from 'ant-design-vue'
|
||||
import { useMessage } from '/@/hooks/web/useMessage'
|
||||
const { notification, createConfirm } = useMessage()
|
||||
let sortInfo: SorterResult = {}
|
||||
let filterInfo: Partial<Recordable<string[]>> = []
|
||||
const [registerModal, { openModal }] = useModal()
|
||||
const [registerTable, { reload, getForm, getPaginationRef }] = useTable({
|
||||
title: '库位位置列表',
|
||||
api: async (p) => {
|
||||
const res: API.DataResult = await getList(p)
|
||||
// console.log(items);
|
||||
return new Promise((resolve) => {
|
||||
resolve({ data: [...res.data], total: res.count })
|
||||
})
|
||||
},
|
||||
beforeFetch: () => {
|
||||
var currentPageInfo: any = getPaginationRef()
|
||||
// var data = getForm().getFieldsValue()
|
||||
const postParam: API.PageRequest = {
|
||||
queryCondition: '',
|
||||
pageCondition: {
|
||||
pageIndex: currentPageInfo.current,
|
||||
pageSize: currentPageInfo.pageSize,
|
||||
sortConditions: [],
|
||||
},
|
||||
}
|
||||
var data = getForm().getFieldsValue()
|
||||
/* 排序字段 */
|
||||
if (!!sortInfo.columnKey) {
|
||||
postParam.pageCondition.sortConditions.push({
|
||||
sortField: sortInfo.field,
|
||||
listSortDirection: sortInfo.order === 'ascend' ? 0 : 1,
|
||||
})
|
||||
} else {
|
||||
postParam.pageCondition.sortConditions.push({
|
||||
sortField: 'addTime',
|
||||
listSortDirection: 1,
|
||||
})
|
||||
}
|
||||
/* 检索字段 */
|
||||
let condition: API.ConditionItem[] = []
|
||||
if (!!data.StoreHouse) {
|
||||
condition.push({
|
||||
FieldName: 'StoreHouse',
|
||||
FieldValue: data.StoreHouse,
|
||||
ConditionalType: 1,
|
||||
})
|
||||
}
|
||||
// if (!!data.GoodsTypeName) {
|
||||
// condition.push({
|
||||
// FieldName: 'GoodsTypeName',
|
||||
// FieldValue: data.GoodsTypeName,
|
||||
// ConditionalType: 1,
|
||||
// })
|
||||
// }
|
||||
/* 筛选字段 */
|
||||
if (filterInfo === null) {
|
||||
} else {
|
||||
// if (!!filterInfo.status && filterInfo.status.length > 0) {
|
||||
// condition.push({
|
||||
// FieldName: 'INUSE',
|
||||
// FieldValue: filterInfo.status.join(),
|
||||
// ConditionalType: 6,
|
||||
// })
|
||||
// }
|
||||
}
|
||||
postParam.queryCondition = JSON.stringify(condition)
|
||||
// console.log(postParam);
|
||||
return postParam
|
||||
},
|
||||
columns: columns,
|
||||
sortFn: (sorter) => {
|
||||
// console.log('排序:' + sorter);
|
||||
sortInfo = sorter
|
||||
},
|
||||
filterFn: (filters) => {
|
||||
// console.log('筛选:' + filters);
|
||||
filterInfo = filters
|
||||
},
|
||||
bordered: true,
|
||||
useSearchForm: true,
|
||||
formConfig: {
|
||||
labelWidth: 120,
|
||||
schemas: searchFormSchema,
|
||||
},
|
||||
showTableSetting: true,
|
||||
tableSetting: { fullScreen: true },
|
||||
actionColumn: {
|
||||
width: 80,
|
||||
title: '操作',
|
||||
dataIndex: 'action',
|
||||
fixed: undefined,
|
||||
},
|
||||
})
|
||||
function handleCreate() {
|
||||
openModal(true, {
|
||||
isUpdate: false,
|
||||
})
|
||||
}
|
||||
async function handleDel(record: Recordable) {
|
||||
console.log(record)
|
||||
const res: API.DataResult = await delInfo({ id: record.id })
|
||||
if (res.succeeded) {
|
||||
notification.success({ message: res.message, duration: 3 })
|
||||
reload()
|
||||
} else {
|
||||
notification.error({ message: res.message, duration: 3 })
|
||||
}
|
||||
}
|
||||
function handleEdit(record: Recordable) {
|
||||
openModal(true, {
|
||||
record,
|
||||
isUpdate: true,
|
||||
})
|
||||
}
|
||||
function handleSuccess() {
|
||||
reload()
|
||||
}
|
||||
</script>
|
@ -0,0 +1,88 @@
|
||||
<template>
|
||||
<div>
|
||||
<template v-for="(item, index) in props.data" :key="index">
|
||||
<a-row :gutter="24" class="md:flex">
|
||||
<a-col
|
||||
style="margin-bottom: 10px"
|
||||
:lg="6"
|
||||
v-for="(area, index) in item.areaPositions"
|
||||
:key="index"
|
||||
>
|
||||
<Card size="small" :loading="props.loading" title="当前库位" :canExpan="false">
|
||||
<template #extra>
|
||||
<Tag color="green">{{ area.areaName }}</Tag>
|
||||
<a-button
|
||||
v-if="area.boxCount > 0"
|
||||
size="small"
|
||||
style="margin-left: 10px"
|
||||
@click="handleBox(area)"
|
||||
preIcon="ant-design:eye-outlined"
|
||||
type="primary"
|
||||
/>
|
||||
</template>
|
||||
<div class="py-4 px-4 flex justify-between">
|
||||
<CountTo :startVal="1" :endVal="area.boxCount" class="text-2xl" />
|
||||
<Icon icon="ant-design:database-outlined" :size="40" />
|
||||
</div>
|
||||
<div class="p-2 px-4 flex justify-between">
|
||||
<span>库位容量</span>
|
||||
<CountTo :startVal="1" :endVal="area.boxVolume" />
|
||||
</div>
|
||||
</Card>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<!-- <a-row type="flex" justify="space-around" align="top">-->
|
||||
<!-- <a-col-->
|
||||
<!-- style="margin-bottom: 10px"-->
|
||||
<!-- v-for="(area, index) in item.areaPositions"-->
|
||||
<!-- :key="index"-->
|
||||
<!-- :span="item.rowLength"-->
|
||||
<!-- >-->
|
||||
<!-- <Card size="small" :loading="props.loading" :title="area.areaName" :canExpan="false">-->
|
||||
<!-- <div class="py-4 px-4 flex justify-between">-->
|
||||
<!-- <CountTo :startVal="1" :endVal="area.boxCount" class="text-2xl" />-->
|
||||
<!-- <Icon icon="ant-design:database-outlined" :size="40" />-->
|
||||
<!-- </div>-->
|
||||
<!-- <div class="p-2 px-4 flex justify-between">-->
|
||||
<!-- <span>库位容量</span>-->
|
||||
<!-- <CountTo :startVal="1" :endVal="area.boxVolume" />-->
|
||||
<!-- </div>-->
|
||||
<!-- </Card>-->
|
||||
<!-- </a-col>-->
|
||||
<!-- </a-row>-->
|
||||
<!-- <a-row :gutter="24">-->
|
||||
<!-- <a-col :span="item.rowLength">-->
|
||||
<!-- <a-card :title="item.areaName" :bordered="false">-->
|
||||
<!-- <p>card content</p>-->
|
||||
<!-- </a-card>-->
|
||||
<!-- </a-col>-->
|
||||
<!-- </a-row>-->
|
||||
</template>
|
||||
<!-- <BoxList @register="registerModal" @success="handleSuccess" />-->
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { CountTo } from '/@/components/CountTo/index'
|
||||
import { Icon } from '/@/components/Icon'
|
||||
import { Tag, Card } from 'ant-design-vue'
|
||||
import { useModal } from '/@/components/Modal'
|
||||
import BoxList from './BoxList.vue'
|
||||
const [registerModal, { openModal }] = useModal()
|
||||
const props = defineProps({
|
||||
loading: {
|
||||
type: Boolean,
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
})
|
||||
function handleBox(record: Recordable) {
|
||||
openModal(true, {
|
||||
record,
|
||||
isUpdate: true,
|
||||
})
|
||||
}
|
||||
|
||||
console.log('数据', props.data)
|
||||
</script>
|
@ -0,0 +1,12 @@
|
||||
// @ts-ignore
|
||||
import { request } from '/@/utils/request'
|
||||
import { DataResult } from '/@/api/model/baseModel'
|
||||
enum Api {
|
||||
list = '/StoreQuery/GetAreaPositionInfo',
|
||||
}
|
||||
export function getList() {
|
||||
return request<DataResult>({
|
||||
url: Api.list,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
<template>
|
||||
<!-- <a-row type="flex" :gutter="10">-->
|
||||
<!-- <a-col style="margin-bottom: 10px">-->
|
||||
<div style="height: 100%; background-color: white">
|
||||
<!-- <a-tabs v-show="areaData.length != 0" defaultActiveKey="base-info">-->
|
||||
<!-- <a-tab-pane-->
|
||||
<!-- v-for="item in areaData"-->
|
||||
<!-- :tab="item.storeName"-->
|
||||
<!-- key="base-info"-->
|
||||
<!-- forceRender-->
|
||||
<!-- style="position: relative; margin-left: 50px"-->
|
||||
<!-- >-->
|
||||
<!-- <!– <AreaCard :loading="loading" :data="item.areaPositionMap.rowList" class="enter-y" />–>-->
|
||||
<!-- </a-tab-pane>-->
|
||||
<!-- </a-tabs>-->
|
||||
<a-tabs v-show="areaData.length != 0" v-model:activeKey="activeKey" style="margin-left: 10px">
|
||||
<!-- <a-tab-pane style="position: relative; margin-left: 50px" key="1" tab="Tab 1"-->
|
||||
<!-- >Content of Tab Pane 1</a-tab-pane-->
|
||||
<!-- >-->
|
||||
<!-- <a-tab-pane key="2" tab="Tab 2" force-render>Content of Tab Pane 2</a-tab-pane>-->
|
||||
<!-- <a-tab-pane key="3" tab="Tab 3">Content of Tab Pane 3</a-tab-pane>-->
|
||||
|
||||
<a-tab-pane
|
||||
v-for="item in areaData"
|
||||
:tab="item.storeName"
|
||||
:key="item.storeCode"
|
||||
forceRender
|
||||
style="position: relative"
|
||||
>
|
||||
<AreaCard :loading="loading" :data="item.areaPositionMap.rowList" class="enter-y" />
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</div>
|
||||
<!-- </a-col>-->
|
||||
<!-- <Tabs v-show="areaData.length != 0">-->
|
||||
<!-- <TabPane v-for="item in areaData" key="detailTab" :tab="item.storeName">-->
|
||||
<!-- <AreaCard :loading="loading" :data="item.areaPositionMap.rowList" class="enter-y" />-->
|
||||
<!-- </TabPane>-->
|
||||
<!-- </Tabs>-->
|
||||
<!-- </a-row>-->
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { getList } from './api'
|
||||
import AreaCard from './AreaCard.vue'
|
||||
import { TabPane, Tabs } from 'ant-design-vue'
|
||||
import { CollapseContainer } from '/@/components/Container'
|
||||
import { provide, ref } from 'vue'
|
||||
const areaData = ref([])
|
||||
const activeKey = ref('01L')
|
||||
// const areaList = ref([]);
|
||||
// 加载顶级部门信息
|
||||
async function loadData() {
|
||||
try {
|
||||
// loading.value = true;
|
||||
areaData.value = []
|
||||
const result = await getList()
|
||||
console.log('加载数据', result.data)
|
||||
|
||||
areaData.value = result.data.storeHouses
|
||||
console.log('areaData', areaData)
|
||||
// emit('rootTreeData', treeData.value);
|
||||
} finally {
|
||||
// loading.value = false;
|
||||
}
|
||||
}
|
||||
loadData()
|
||||
const loading = ref(true)
|
||||
|
||||
setTimeout(() => {
|
||||
loading.value = false
|
||||
}, 1500)
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
@ -0,0 +1,28 @@
|
||||
namespace DS.WMS.Core.BaseInfo.Dtos;
|
||||
|
||||
public class StoreAreaPositionInput
|
||||
{
|
||||
public string Id {get;set;}
|
||||
|
||||
/// <summary>
|
||||
/// 库位
|
||||
/// </summary>
|
||||
public string AreaCode { get; set; }
|
||||
/// <summary>
|
||||
/// 行数
|
||||
/// </summary>
|
||||
public int RowNum { get; set; }
|
||||
/// <summary>
|
||||
/// 列数
|
||||
/// </summary>
|
||||
public int ColumnNum { get; set; }
|
||||
/// <summary>
|
||||
/// 行长
|
||||
/// </summary>
|
||||
public int RowLength { get; set; }
|
||||
/// <summary>
|
||||
/// 列长
|
||||
/// </summary>
|
||||
public int ColumnLength { get; set; }
|
||||
public string Note { get; set; }
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
namespace DS.WMS.Core.BaseInfo.Dtos;
|
||||
|
||||
public class StoreAreaPositionViewModel
|
||||
{
|
||||
public string Id { get; set; }
|
||||
|
||||
public string StoreHouse { get; set; }
|
||||
/// <summary>
|
||||
/// 仓库
|
||||
/// </summary>
|
||||
public string StoreHouseName { get; set; }
|
||||
/// <summary>
|
||||
/// 库位
|
||||
/// </summary>
|
||||
public string AreaCode { get; set; }
|
||||
public string AreaName { get; set; }
|
||||
/// <summary>
|
||||
/// 行数
|
||||
/// </summary>
|
||||
public int RowNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 列数
|
||||
/// </summary>
|
||||
public int ColumnNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 行长
|
||||
/// </summary>
|
||||
public int RowLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 列长
|
||||
/// </summary>
|
||||
public int ColumnLength { get; set; }
|
||||
|
||||
public string Note { get; set; }
|
||||
|
||||
public DateTime AddTime { get; set; }
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
using DS.Module.Core.Data;
|
||||
|
||||
namespace DS.WMS.Core.BaseInfo.Entity;
|
||||
|
||||
[SqlSugar.SugarTable("op_WmsStoreAreaPosition")]
|
||||
public class WmsStoreAreaPosition:BaseModel<string>
|
||||
{
|
||||
/// <summary>
|
||||
/// 库位
|
||||
/// </summary>
|
||||
public string AreaCode { get; set; }
|
||||
/// <summary>
|
||||
/// 行数
|
||||
/// </summary>
|
||||
public int RowNum { get; set; }
|
||||
/// <summary>
|
||||
/// 列数
|
||||
/// </summary>
|
||||
public int ColumnNum { get; set; }
|
||||
/// <summary>
|
||||
/// 行长
|
||||
/// </summary>
|
||||
public int RowLength { get; set; }
|
||||
/// <summary>
|
||||
/// 列长
|
||||
/// </summary>
|
||||
public int ColumnLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公司Id
|
||||
/// </summary>
|
||||
public string CompanyId { get; set; }
|
||||
/// <summary>
|
||||
/// 租户Id
|
||||
/// </summary>
|
||||
public string TenantId { get; set; }
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
using DS.Module.Core;
|
||||
using DS.WMS.Core.BaseInfo.Dtos;
|
||||
|
||||
namespace DS.WMS.Core.BaseInfo.Interface;
|
||||
|
||||
public interface IWmsStoreAreaPositionService
|
||||
{
|
||||
/// <summary>
|
||||
/// 列表查询
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
DataResult<List<StoreAreaPositionViewModel>> GetListByPage(PageRequest request);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取信息
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
DataResult<StoreAreaPositionViewModel> GetStoreAreaPositionInfo(string id);
|
||||
|
||||
/// <summary>
|
||||
/// 编辑信息
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
DataResult EditStoreAreaPositionInfo(StoreAreaPositionInput model);
|
||||
/// <summary>
|
||||
/// 删除库位位置
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public DataResult DelStoreAreaPosition(string id);
|
||||
}
|
@ -0,0 +1,135 @@
|
||||
using DS.Module.Core;
|
||||
using DS.Module.Core.Extensions;
|
||||
using DS.Module.UserModule;
|
||||
using DS.WMS.Core.BaseInfo.Dtos;
|
||||
using DS.WMS.Core.BaseInfo.Entity;
|
||||
using DS.WMS.Core.BaseInfo.Interface;
|
||||
using Mapster;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using SqlSugar;
|
||||
|
||||
namespace DS.WMS.Core.BaseInfo.Method;
|
||||
|
||||
public class WmsStoreAreaPositionService:IWmsStoreAreaPositionService
|
||||
{
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ISqlSugarClient db;
|
||||
private readonly IUser user;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="serviceProvider"></param>
|
||||
public WmsStoreAreaPositionService(IServiceProvider serviceProvider)
|
||||
{
|
||||
_serviceProvider = serviceProvider;
|
||||
db = _serviceProvider.GetRequiredService<ISqlSugarClient>();
|
||||
user = _serviceProvider.GetRequiredService<IUser>();
|
||||
}
|
||||
|
||||
public DataResult<List<StoreAreaPositionViewModel>> GetListByPage(PageRequest request)
|
||||
{
|
||||
//序列化查询条件
|
||||
var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition);
|
||||
var data = db.Queryable<WmsStoreAreaPosition>()
|
||||
.LeftJoin<OP_WMS_STOREHOUSE_AREA>((a, b) => a.AreaCode == b.AREACODE)
|
||||
.LeftJoin<OP_WMS_STOREHOUSE>((a, b,c) => b.Pid == c.Id)
|
||||
.Select((a, b,c) => new StoreAreaPositionViewModel()
|
||||
{
|
||||
AreaCode = a.AreaCode,
|
||||
AreaName = b.AREANAME,
|
||||
StoreHouse = c.AREACODE,
|
||||
StoreHouseName = c.AREANAME, //手动指定一列在自动映射
|
||||
},
|
||||
true)
|
||||
.MergeTable()
|
||||
// .Select<StoreAreaPositionViewModel>()
|
||||
.Where(whereList).ToQueryPage(request.PageCondition);
|
||||
return data;
|
||||
}
|
||||
|
||||
public DataResult<StoreAreaPositionViewModel> GetStoreAreaPositionInfo(string id)
|
||||
{
|
||||
var data = db.Queryable<WmsStoreAreaPosition>().Where(a => a.Id == id)
|
||||
.LeftJoin<OP_WMS_STOREHOUSE_AREA>((a, b) => a.AreaCode == b.AREACODE)
|
||||
.LeftJoin<OP_WMS_STOREHOUSE>((a, b,c) => b.Pid == c.Id)
|
||||
.Select((a, b,c) => new StoreAreaPositionViewModel()
|
||||
{
|
||||
AreaCode = a.AreaCode,
|
||||
AreaName = b.AREANAME,
|
||||
StoreHouse = c.AREACODE,
|
||||
StoreHouseName = c.AREANAME, //手动指定一列在自动映射
|
||||
},
|
||||
true)
|
||||
.MergeTable()
|
||||
.First();
|
||||
return DataResult<StoreAreaPositionViewModel>.Success(data);
|
||||
}
|
||||
|
||||
public DataResult EditStoreAreaPositionInfo(StoreAreaPositionInput model)
|
||||
{
|
||||
if (model.Id.IsNullOrEmpty())
|
||||
{
|
||||
var isExist = db.Queryable<WmsStoreAreaPosition>().Where(x => x.AreaCode == model.AreaCode.Trim()).First();
|
||||
if (isExist != null)
|
||||
{
|
||||
return DataResult.Failed("库位编码重复,请检查!");
|
||||
}
|
||||
try
|
||||
{
|
||||
//开启事务
|
||||
db.Ado.BeginTran();
|
||||
var data = model.Adapt<WmsStoreAreaPosition>();
|
||||
var position = db.Insertable(data).ExecuteReturnEntity();
|
||||
db.Ado.CommitTran();
|
||||
return DataResult.Successed("添加成功!",position.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
db.Ado.RollbackTran();
|
||||
return DataResult.Failed("添加失败!" + ex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
//开启事务
|
||||
db.Ado.BeginTran();
|
||||
var info = db.Queryable<WmsStoreAreaPosition>().First(x => x.Id == model.Id);
|
||||
var data = model.Adapt(info);
|
||||
db.Updateable(data).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();
|
||||
|
||||
db.Ado.CommitTran();
|
||||
return DataResult.Successed("更新成功!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
db.Ado.RollbackTran();
|
||||
return DataResult.Failed("更新失败!" + ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public DataResult DelStoreAreaPosition(string id)
|
||||
{
|
||||
var info = db.Queryable<WmsStoreAreaPosition>().First(x => x.Id == id);
|
||||
if (info.IsNullOrEmpty())
|
||||
{
|
||||
return DataResult.Failed("信息不存在!");
|
||||
}
|
||||
try
|
||||
{
|
||||
//开启事务
|
||||
db.Ado.BeginTran();
|
||||
db.Deleteable(info).ExecuteCommand();
|
||||
db.Ado.CommitTran();
|
||||
return DataResult.Successed("删除成功!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
db.Ado.RollbackTran();
|
||||
return DataResult.Failed("删除失败!" + ex);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,98 @@
|
||||
namespace DS.WMS.Core.WmsModule.Dtos;
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class StoreAreaPositionInfo
|
||||
{
|
||||
public List<WmsStoreHouse> StoreHouses { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class WmsStoreHouse
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string StoreCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string StoreName { get; set; }
|
||||
|
||||
|
||||
public AreaPositionMap AreaPositionMap { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class AreaPosition
|
||||
{
|
||||
public string StoreHouse { get; set; }
|
||||
/// <summary>
|
||||
/// 仓库
|
||||
/// </summary>
|
||||
public string StoreHouseName { get; set; }
|
||||
|
||||
public string AreaCode { get; set; }
|
||||
|
||||
public string AreaName { get; set; }
|
||||
|
||||
public int RowNum { get; set; }
|
||||
|
||||
public int ColumnNum { get; set; }
|
||||
|
||||
public int RowLength { get; set; }
|
||||
|
||||
public int ColumnLength { get; set; }
|
||||
|
||||
public int BoxCount { get; set; }
|
||||
|
||||
public int BoxVolume { get; set; }
|
||||
}
|
||||
|
||||
public class AreaRow
|
||||
{
|
||||
public int RowNum { get; set; }
|
||||
|
||||
public List<AreaPosition> AreaPositions = new List<AreaPosition>();
|
||||
|
||||
public AreaPosition GetColumn(int column)
|
||||
{
|
||||
var res = new AreaPosition();
|
||||
res.ColumnNum = 0;
|
||||
if (AreaPositions.Count == 0)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
||||
if (AreaPositions.Where(x=>x.ColumnNum == column).Count()>0)
|
||||
{
|
||||
res = AreaPositions.First(x => x.ColumnNum == column);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public class AreaPositionMap
|
||||
{
|
||||
public List<AreaRow> RowList = new List<AreaRow>();
|
||||
|
||||
public AreaRow GetRow(int row)
|
||||
{
|
||||
var res = new AreaRow();
|
||||
res.RowNum = 0;
|
||||
if (RowList.Count == 0)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
||||
if (RowList.Where(x=>x.RowNum == row).Count()>0)
|
||||
{
|
||||
res = RowList.First(x => x.RowNum == row);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
using DS.Module.Core;
|
||||
using DS.WMS.Core.BaseInfo.Dtos;
|
||||
using DS.WMS.Core.BaseInfo.Interface;
|
||||
using DS.WMS.Core.System.Dtos;
|
||||
using DS.WMS.Core.System.Entity;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace DS.WMS.WebApi.Controllers;
|
||||
/// <summary>
|
||||
/// 库位位置服务
|
||||
/// </summary>
|
||||
public class WmsStoreAreaPositionController : ApiController
|
||||
{
|
||||
private readonly IWmsStoreAreaPositionService _invokeService;
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="invokeService"></param>
|
||||
public WmsStoreAreaPositionController(IWmsStoreAreaPositionService invokeService)
|
||||
{
|
||||
_invokeService = invokeService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 列表
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[Route("GetAreaPositionList")]
|
||||
public DataResult<List<StoreAreaPositionViewModel>> GetAreaPositionList([FromBody] PageRequest request)
|
||||
{
|
||||
var res = _invokeService.GetListByPage(request);
|
||||
return res;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 编辑
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[Route("EditAreaPositionInfo")]
|
||||
public DataResult EditStoreAreaPositionInfo([FromBody] StoreAreaPositionInput model)
|
||||
{
|
||||
var res = _invokeService.EditStoreAreaPositionInfo(model);
|
||||
return res;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 详情
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
[Route("GetAreaPositionInfo")]
|
||||
public DataResult<StoreAreaPositionViewModel> GetStoreAreaPositionInfo([FromQuery] string id)
|
||||
{
|
||||
var res = _invokeService.GetStoreAreaPositionInfo(id);
|
||||
return res;
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
[Route("DelAreaPosition")]
|
||||
public DataResult DelStoreAreaPosition([FromQuery] string id)
|
||||
{
|
||||
var res = _invokeService.DelStoreAreaPosition(id);
|
||||
return res;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue