增加出库单模块
parent
d3e251f3e4
commit
e77c661274
|
@ -1,7 +1,6 @@
|
||||||
import { baseRequest } from '@/utils/request'
|
import { baseRequest } from '@/utils/request'
|
||||||
|
|
||||||
const request = (url, ...arg) => baseRequest(`/inventory/inbound/` + url, ...arg)
|
const request = (url, ...arg) => baseRequest(`/inventory/inbound/` + url, ...arg)
|
||||||
const produceRequest = (url, ...arg) => baseRequest(`/produce/inbound/` + url, ...arg)
|
|
||||||
/**
|
/**
|
||||||
* 入库单Api接口管理器
|
* 入库单Api接口管理器
|
||||||
*
|
*
|
||||||
|
@ -19,7 +18,7 @@ export default {
|
||||||
},
|
},
|
||||||
// 获取入库单 条码列表
|
// 获取入库单 条码列表
|
||||||
inventoryInboundBarcodeTree(data) {
|
inventoryInboundBarcodeTree(data) {
|
||||||
return produceRequest('barcode/tree/list', data, 'get')
|
return request('barcode/tree/list', data, 'get')
|
||||||
},
|
},
|
||||||
// 获取入库单 条码(子级)列表
|
// 获取入库单 条码(子级)列表
|
||||||
inventoryInboundBarcodeTreeChildren(data) {
|
inventoryInboundBarcodeTreeChildren(data) {
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
import { baseRequest } from '@/utils/request'
|
||||||
|
|
||||||
|
const request = (url, ...arg) => baseRequest(`/inventory/outbound/` + url, ...arg)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出库单Api接口管理器
|
||||||
|
*
|
||||||
|
* @author Luck
|
||||||
|
* @date 2024/10/18 22:35
|
||||||
|
**/
|
||||||
|
export default {
|
||||||
|
// 获取出库单分页
|
||||||
|
inventoryOutboundPage(data) {
|
||||||
|
return request('page', data, 'get')
|
||||||
|
},
|
||||||
|
// 获取出库单明细信息列表
|
||||||
|
inventoryOutboundDetailList(data) {
|
||||||
|
return request('detail/list', data, 'get')
|
||||||
|
},
|
||||||
|
// 获取出库单 条码列表
|
||||||
|
inventoryOutboundBarcodeTree(data) {
|
||||||
|
return request('barcode/tree/list', data, 'get')
|
||||||
|
},
|
||||||
|
// 获取出库单 条码(子级)列表
|
||||||
|
inventoryOutboundBarcodeTreeChildren(data) {
|
||||||
|
return request('barcode/tree/childrenList', data, 'get')
|
||||||
|
},
|
||||||
|
// 删除出库单
|
||||||
|
inventoryOutboundDelete(data) {
|
||||||
|
return request('delete', data)
|
||||||
|
},
|
||||||
|
// 获取出库单详情
|
||||||
|
inventoryOutboundDetail(data) {
|
||||||
|
return request('detail', data, 'get')
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
export const tableColumns = [
|
||||||
|
{
|
||||||
|
title: '单号',
|
||||||
|
dataIndex: 'billNumber',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '业务日期',
|
||||||
|
dataIndex: 'businessDate',
|
||||||
|
align: 'center',
|
||||||
|
sorter: true,
|
||||||
|
sortDirections: ['descend', 'ascend'],
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '类型',
|
||||||
|
dataIndex: 'type',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 100,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '客户名称',
|
||||||
|
dataIndex: 'customerName',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '客户编码',
|
||||||
|
dataIndex: 'customerNumber',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '仓库',
|
||||||
|
dataIndex: 'storeName',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '仓库编码',
|
||||||
|
dataIndex: 'storeNumber',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 250,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '车牌号',
|
||||||
|
dataIndex: 'carNumber',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '备注',
|
||||||
|
dataIndex: 'remarks',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '创建人',
|
||||||
|
dataIndex: 'createUserName',
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
dataIndex: 'createTime',
|
||||||
|
sorter: true,
|
||||||
|
sortDirections: ['descend', 'ascend'],
|
||||||
|
align: 'center',
|
||||||
|
resizable: true,
|
||||||
|
width: 200,
|
||||||
|
ellipsis: true
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,148 @@
|
||||||
|
<template>
|
||||||
|
<a-page-header style="padding: 10px; font-size: 20px" @back="handleBack">
|
||||||
|
<template #extra>
|
||||||
|
<!-- <a-button v-if="route.query.type !== 'SEARCH'" key="1" type="primary" @click="onSubmitForm">保存</a-button>-->
|
||||||
|
</template>
|
||||||
|
</a-page-header>
|
||||||
|
|
||||||
|
<a-card :bordered="false" title="出库单">
|
||||||
|
<DynamicForm
|
||||||
|
:allDisabled="route.query.type === 'SEARCH'"
|
||||||
|
:formItems="unitFormItems"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
ref="formRef1"
|
||||||
|
/>
|
||||||
|
</a-card>
|
||||||
|
|
||||||
|
<a-card :bordered="false" class="mt-4" style="height: 100%">
|
||||||
|
<a-tabs v-model:activeKey="activeKey">
|
||||||
|
<a-tab-pane key="1" tab="出库明细" forceRender>
|
||||||
|
<a-table
|
||||||
|
:columns="detailColumns"
|
||||||
|
:data-source="detailDataSource"
|
||||||
|
:scroll="{
|
||||||
|
x: 100
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<template #bodyCell="{ column, record }">
|
||||||
|
<template v-if="column.dataIndex === 'action'">
|
||||||
|
<a type="primary" @click="handleOpenViewScan(record)">查看条码</a>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="2" tab="操作信息" v-if="route.query.type !== 'ADD'">
|
||||||
|
<OperationalInformation :detailData="inform" :colSpan="6"></OperationalInformation>
|
||||||
|
</a-tab-pane>
|
||||||
|
</a-tabs>
|
||||||
|
</a-card>
|
||||||
|
|
||||||
|
<!-- 产看条码 -->
|
||||||
|
<a-modal v-model:open="visible" title="查看条码" width="80%">
|
||||||
|
<a-table
|
||||||
|
style="height: 500px"
|
||||||
|
:columns="modalColumns"
|
||||||
|
:data-source="scanTableList"
|
||||||
|
:pagination="false"
|
||||||
|
:scroll="{ x: 100, y: 420 }"
|
||||||
|
:row-key="(record) => record.id"
|
||||||
|
@expand="columnsExpand"
|
||||||
|
bordered
|
||||||
|
/>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import produceReportApi from '@/api/production/produceTask/produceReportApi'
|
||||||
|
import useFormHandler from '@/hook/useFormHandler'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
import { unitFormItems, formRules } from '@/views/productionBusiness/productionCenter/report/formFields/detailFields'
|
||||||
|
import { detailColumns, modalColumns } from '@/views/productionBusiness/productionCenter/report/columns/detailColumns'
|
||||||
|
import { cloneDeep } from 'lodash-es'
|
||||||
|
import produceReportDetailApi from '@/api/production/produceTask/produceReportDetailApi'
|
||||||
|
import inventoryOutboundApi from '@/api/inventory/inventoryOutboundApi'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const formRef1 = ref(null)
|
||||||
|
const tableRef = ref(null)
|
||||||
|
let extendData = ref([])
|
||||||
|
let searchFormState = ref({})
|
||||||
|
|
||||||
|
let { formData, formRefs, inform, handleBack, fetchData, getExtendField } = useFormHandler(unitFormItems, {
|
||||||
|
getDetail: inventoryOutboundApi.inventoryOutboundDetail
|
||||||
|
})
|
||||||
|
|
||||||
|
let detailDataSource = ref([])
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
alert: {
|
||||||
|
show: true,
|
||||||
|
clear: () => {
|
||||||
|
selectedRowKeys.value = []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rowSelection: {
|
||||||
|
onChange: (selectedRowKey, selectedRows) => {
|
||||||
|
selectedRowKeys.value = selectedRowKey
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolConfig: { refresh: true, height: true, columnSetting: true, striped: false }
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
formRefs.value = [formRef1.value]
|
||||||
|
const detailData = await fetchData(route.query.type)
|
||||||
|
searchFormState.value.inboundId = detailData.id
|
||||||
|
// tableRef.value.refresh(true)
|
||||||
|
await loadData()
|
||||||
|
extendData.value = await getExtendField('MATERIAL')
|
||||||
|
})
|
||||||
|
|
||||||
|
// 获取产品包装条码控制器
|
||||||
|
const loadData = async () => {
|
||||||
|
const searchFormParam = cloneDeep(searchFormState.value)
|
||||||
|
return inventoryOutboundApi.inventoryOutboundDetailList(Object.assign(searchFormParam)).then((data) => {
|
||||||
|
detailDataSource.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let activeKey = ref('1')
|
||||||
|
|
||||||
|
// 查看条码
|
||||||
|
let visible = ref(false)
|
||||||
|
let scanTableList = ref([])
|
||||||
|
let recordTable = {}
|
||||||
|
const handleOpenViewScan = (record) => {
|
||||||
|
recordTable = record
|
||||||
|
visible.value = true
|
||||||
|
inventoryOutboundApi.inventoryOutboundBarcodeTree({
|
||||||
|
docsDetailId: record.id,
|
||||||
|
docsId: record.inboundId
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
scanTableList.value = res
|
||||||
|
scanTableList.value.forEach((item) => {
|
||||||
|
if (item.subAmount && item.subAmount > 0) item.children = []
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const columnsExpand = (expanded, record) => {
|
||||||
|
if (expanded) {
|
||||||
|
produceReportApi
|
||||||
|
.produceReportTreeChildrenList({
|
||||||
|
docsDetailId: recordTable.id,
|
||||||
|
docsId: record.docsId,
|
||||||
|
parentBarcode: record.barcode
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
record.children = res
|
||||||
|
record.children &&
|
||||||
|
record.children.forEach((item) => {
|
||||||
|
if (item.subAmount && item.subAmount > 0) item.children = []
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -0,0 +1,69 @@
|
||||||
|
import { required } from '@/utils/formRules'
|
||||||
|
import tool from '@/utils/tool'
|
||||||
|
|
||||||
|
export const unitFormItems = reactive([
|
||||||
|
{
|
||||||
|
label: '单号:',
|
||||||
|
name: 'billNumber',
|
||||||
|
type: 'a-input-number',
|
||||||
|
span: 6,
|
||||||
|
attrs: {
|
||||||
|
placeholder: '请输入编码',
|
||||||
|
allowClear: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '业务日期:',
|
||||||
|
name: 'businessDate',
|
||||||
|
type: 'a-date-picker',
|
||||||
|
span: 6,
|
||||||
|
attrs: {
|
||||||
|
placeholder: '请输入业务日期',
|
||||||
|
allowClear: true,
|
||||||
|
valueFormat: 'YYYY-MM-DD HH:mm:ss'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '状态:',
|
||||||
|
name: 'state',
|
||||||
|
type: 'a-select',
|
||||||
|
span: 6,
|
||||||
|
attrs: {
|
||||||
|
placeholder: '请选择可用状态',
|
||||||
|
options: tool.dictList('PRODUCE_REPORT_STATE')
|
||||||
|
},
|
||||||
|
defaultValue: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '类型:',
|
||||||
|
name: 'produceType',
|
||||||
|
type: 'a-select',
|
||||||
|
span: 6,
|
||||||
|
attrs: {
|
||||||
|
options: tool.dictList('PRODUCE_TYPE')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '生产线:',
|
||||||
|
name: 'productionLineName',
|
||||||
|
type: 'a-select',
|
||||||
|
span: 6,
|
||||||
|
attrs: {
|
||||||
|
placeholder: '请选择是否基本单位',
|
||||||
|
options: tool.dictList('YES_NO')
|
||||||
|
},
|
||||||
|
defaultValue: 'NO'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '备注:',
|
||||||
|
name: 'remarks',
|
||||||
|
type: 'a-textarea',
|
||||||
|
span: 24,
|
||||||
|
attrs: {
|
||||||
|
placeholder: '请输入备注',
|
||||||
|
allowClear: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
export const formRules = {}
|
|
@ -0,0 +1,31 @@
|
||||||
|
import tool from '@/utils/tool'
|
||||||
|
|
||||||
|
export const searchFields = [
|
||||||
|
{ name: 'billNumber', label: '单号', component: 'a-input', props: { placeholder: '请输入单号' } },
|
||||||
|
{
|
||||||
|
label: '类型:',
|
||||||
|
name: 'type',
|
||||||
|
component: 'a-select',
|
||||||
|
props: {
|
||||||
|
placeholder: '请选择类型',
|
||||||
|
allowClear: true,
|
||||||
|
options: tool.dictList('OUTBOUND_TYPE')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '仓库:',
|
||||||
|
name: 'storeId',
|
||||||
|
component: 'a-tree-select',
|
||||||
|
props: {
|
||||||
|
placeholder: '请选择仓库',
|
||||||
|
treeData: [],
|
||||||
|
fieldNames: {
|
||||||
|
children: 'children',
|
||||||
|
label: 'name',
|
||||||
|
value: 'id'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ name: 'customerName', label: '客户名称', component: 'a-input', props: { placeholder: '请输入客户名称' } },
|
||||||
|
{ name: 'customerNumber', label: '客户编码', component: 'a-input', props: { placeholder: '请输入客户编码' } }
|
||||||
|
]
|
|
@ -0,0 +1,91 @@
|
||||||
|
<template>
|
||||||
|
<AdvancedSearchForm
|
||||||
|
:formState="searchFormState"
|
||||||
|
:formFields="searchFieldsRef"
|
||||||
|
@search="tableRef.refresh()"
|
||||||
|
@reset="tableRef.refresh()"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<a-card :bordered="false" class="mt-4" style="height: 100%">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
<a-col :span="24">
|
||||||
|
<s-table
|
||||||
|
ref="tableRef"
|
||||||
|
:columns="columns"
|
||||||
|
:data="loadData"
|
||||||
|
:alert="options.alert.show"
|
||||||
|
bordered
|
||||||
|
:row-key="(record) => record.id"
|
||||||
|
:tool-config="options.toolConfig"
|
||||||
|
:scroll="{
|
||||||
|
x: 100
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<template #bodyCell="{ column, record }">
|
||||||
|
<template v-if="column.dataIndex === 'billNumber'">
|
||||||
|
<span style="color: #0d84ff">{{ record.billNumber }}</span>
|
||||||
|
</template>
|
||||||
|
<template v-if="column.dataIndex === 'type'">
|
||||||
|
<a-tag :color="tagColorList[record.type - 1]">{{
|
||||||
|
$TOOL.dictTypeData('OUTBOUND_TYPE', record.type || '')
|
||||||
|
}}</a-tag>
|
||||||
|
</template>
|
||||||
|
<template v-if="column.dataIndex === 'action'">
|
||||||
|
<a-space>
|
||||||
|
<a
|
||||||
|
@click="
|
||||||
|
navigateTo('/inventory/outbound/detail', {
|
||||||
|
type: 'SEARCH',
|
||||||
|
id: record.id
|
||||||
|
})
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<EyeOutlined />
|
||||||
|
查看
|
||||||
|
</a>
|
||||||
|
</a-space>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</s-table>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="inventoryInbound">
|
||||||
|
import inventoryOutboundApi from '@/api/inventory/inventoryOutboundApi'
|
||||||
|
|
||||||
|
import { useTableManagement } from '@/hook/useTableManagement'
|
||||||
|
import { searchFields } from '@/views/productionBusiness/inventory/outbound/formFields/searchFields'
|
||||||
|
import { tableColumns } from '@/views/productionBusiness/inventory/outbound/columns/tableColumn'
|
||||||
|
import sysStoreApi from '@/api/base/store/sysStoreApi'
|
||||||
|
|
||||||
|
const searchFieldsRef = ref(searchFields)
|
||||||
|
|
||||||
|
const tagColorList = ['warning', 'success', 'error', 'purple']
|
||||||
|
const {
|
||||||
|
searchFormState,
|
||||||
|
tableRef,
|
||||||
|
columns,
|
||||||
|
loadData,
|
||||||
|
options,
|
||||||
|
navigateTo
|
||||||
|
} = useTableManagement(
|
||||||
|
{
|
||||||
|
page: inventoryOutboundApi.inventoryOutboundPage
|
||||||
|
},
|
||||||
|
tableColumns,
|
||||||
|
['inventoryOutbound:view']
|
||||||
|
)
|
||||||
|
// 批量导出
|
||||||
|
const exportBatchVerify = () => {}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
const list = await sysStoreApi.sysStoreTree()
|
||||||
|
searchFieldsRef.value.forEach((item) => {
|
||||||
|
if (item.name === 'storeId') {
|
||||||
|
item.props.treeData = list
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
Loading…
Reference in New Issue