出入库优化

This commit is contained in:
朱昊天
2026-05-08 16:46:36 +08:00
parent 22ace156f9
commit b5f5815c71
18 changed files with 289 additions and 639 deletions

View File

@@ -45,54 +45,17 @@ export function delStockIoOrder(orderId) {
})
}
export function submitStockIoOrder(orderId) {
export function confirmInStockIoOrder(orderId) {
return request({
url: '/gear/stockIoOrder/submit/' + orderId,
url: '/gear/stockIoOrder/confirmIn/' + orderId,
method: 'post'
})
}
export function auditStockIoOrder(orderId) {
export function revokeStockIoOrder(orderId, reason) {
return request({
url: '/gear/stockIoOrder/audit/' + orderId,
method: 'post'
})
}
export function executeStockIoOrder(orderId) {
return request({
url: '/gear/stockIoOrder/execute/' + orderId,
method: 'post'
})
}
export function arrivalStockIoOrder(orderId) {
return request({
url: '/gear/stockIoOrder/arrival/' + orderId,
method: 'post'
})
}
export function finishStockIoOrder(orderId) {
return request({
url: '/gear/stockIoOrder/finish/' + orderId,
method: 'post'
})
}
export function cancelStockIoOrder(orderId, reason) {
return request({
url: '/gear/stockIoOrder/cancel/' + orderId,
url: '/gear/stockIoOrder/revoke/' + orderId,
method: 'post',
data: { reason: reason || '' }
})
}
export function reverseStockIoOrder(orderId, reason) {
return request({
url: '/gear/stockIoOrder/reverse/' + orderId,
method: 'post',
data: { reason: reason || '' }
})
}

View File

@@ -4,8 +4,7 @@
<slot name="trigger">
<el-button v-if="!materialId" type="primary" size="small">选择配料</el-button>
<el-tag v-else type="info" closable @close="handleClear">
{{ currentMaterial.materialName }}({{ currentMaterial.spec }})[{{ currentMaterial.model }}] - {{
currentMaterial.factory }}库存{{ currentMaterial.currentStock }}{{ currentMaterial.unit }}
{{ currentMaterial.materialName }} - {{ currentMaterial.factory }}库存{{ currentMaterial.currentStock }}{{ currentMaterial.unit }}
</el-tag>
</slot>
</div>
@@ -23,12 +22,6 @@
<el-option label="辅料" value="1" />
</el-select>
</el-form-item>
<el-form-item label="配料规格">
<el-input v-model="searchForm.spec" placeholder="请输入配料规格" clearable @keyup.enter="fetchMaterialList" />
</el-form-item>
<el-form-item label="配料型号">
<el-input v-model="searchForm.model" placeholder="请输入配料型号" clearable @keyup.enter="fetchMaterialList" />
</el-form-item>
<el-form-item label="生产厂家">
<el-input v-model="searchForm.factory" placeholder="请输入生产厂家" clearable @keyup.enter="fetchMaterialList" />
</el-form-item>
@@ -57,8 +50,6 @@
{{ scope.row.materialType === 1 ? '辅料' : scope.row.materialType === 2 ? '主材' : '-' }}
</template>
</el-table-column>
<el-table-column prop="spec" label="配料规格" min-width="100" align="center" />
<el-table-column prop="model" label="配料型号" min-width="100" align="center" />
<el-table-column prop="factory" label="生产厂家" min-width="120" align="center" />
<el-table-column prop="currentStock" label="现存库存" min-width="80" align="center">
<template #default="scope">
@@ -92,12 +83,6 @@
<el-option label="辅材" :value="1" />
</el-select>
</el-form-item>
<el-form-item label="规格" prop="spec">
<el-input v-model="addForm.spec" placeholder="请输入规格" />
</el-form-item>
<el-form-item label="型号" prop="model">
<el-input v-model="addForm.model" placeholder="请输入型号" />
</el-form-item>
<el-form-item label="厂家" prop="factory">
<el-input v-model="addForm.factory" placeholder="请输入厂家" />
</el-form-item>
@@ -163,8 +148,6 @@ const addFormRef = ref()
const addForm = ref({
materialName: '',
materialType: undefined,
spec: '',
model: '',
factory: '',
unit: '',
remark: ''
@@ -178,8 +161,6 @@ const addRules = {
const searchForm = ref({
materialName: '',
materialType: '',
spec: '',
model: '',
factory: ''
});
@@ -206,8 +187,6 @@ async function fetchMaterialList() {
pageSize: pageSize.value,
materialName: searchForm.value.materialName,
materialType: searchForm.value.materialType,
spec: searchForm.value.spec,
model: searchForm.value.model,
factory: searchForm.value.factory
};
@@ -234,8 +213,6 @@ function resetSearch() {
searchForm.value = {
materialName: '',
materialType: '',
spec: '',
model: '',
factory: ''
};
pageNum.value = 1;
@@ -275,8 +252,6 @@ function openAdd() {
addForm.value = {
materialName: searchForm.value.materialName || '',
materialType: searchForm.value.materialType ? Number(searchForm.value.materialType) : undefined,
spec: '',
model: '',
factory: '',
unit: '',
remark: ''

View File

@@ -5,12 +5,6 @@
<el-form-item label="辅料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入辅料名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="辅料规格" prop="spec">
<el-input v-model="queryParams.spec" placeholder="请输入辅料规格" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="辅料型号" prop="model">
<el-input v-model="queryParams.model" placeholder="请输入辅料型号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="厂家" prop="factory">
<el-input v-model="queryParams.factory" placeholder="请输入厂家" clearable @keyup.enter="handleQuery" />
</el-form-item>
@@ -51,8 +45,6 @@
{{ scope.row.materialType === 1 ? '辅料' : '原料' }}
</template>
</el-table-column>
<el-table-column label="辅料规格" align="center" prop="spec" />
<el-table-column label="辅料型号" align="center" prop="model" />
<el-table-column label="厂家" align="center" prop="factory" />
<el-table-column label="计量单位" align="center" prop="unit" />
<el-table-column label="现存库存" align="center" prop="currentStock">
@@ -88,12 +80,6 @@
<el-option label="辅料" value="1" />
</el-select>
</el-form-item>
<el-form-item label="辅料规格" prop="spec">
<el-input v-model="form.spec" placeholder="请输入辅料规格" />
</el-form-item>
<el-form-item label="辅料型号" prop="model">
<el-input v-model="form.model" placeholder="请输入辅料型号" />
</el-form-item>
<el-form-item label="厂家" prop="factory">
<el-input v-model="form.factory" placeholder="请输入厂家" />
</el-form-item>

View File

@@ -4,12 +4,6 @@
<el-form-item label="配料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入配料名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="配料规格" prop="spec">
<el-input v-model="queryParams.spec" placeholder="请输入配料规格" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="配料型号" prop="model">
<el-input v-model="queryParams.model" placeholder="请输入配料型号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="厂家" prop="factory">
<el-input v-model="queryParams.factory" placeholder="请输入厂家" clearable @keyup.enter="handleQuery" />
</el-form-item>
@@ -55,8 +49,6 @@
{{ scope.row.materialType === 1 ? '辅料' : '主材' }}
</template>
</el-table-column>
<el-table-column label="配料规格" align="center" prop="spec" />
<el-table-column label="配料型号" align="center" prop="model" />
<el-table-column label="厂家" align="center" prop="factory" />
<el-table-column label="计量单位" align="center" prop="unit" />
<el-table-column label="现存库存" align="center" prop="currentStock">
@@ -92,12 +84,6 @@
<el-option label="主材" value="2" />
</el-select>
</el-form-item>
<el-form-item label="配料规格" prop="spec">
<el-input v-model="form.spec" placeholder="请输入配料规格" />
</el-form-item>
<el-form-item label="配料型号" prop="model">
<el-input v-model="form.model" placeholder="请输入配料型号" />
</el-form-item>
<el-form-item label="厂家" prop="factory">
<el-input v-model="form.factory" placeholder="请输入厂家" />
</el-form-item>

View File

@@ -10,9 +10,6 @@
<el-form-item label="责任人" prop="responsibleName">
<el-input v-model="queryParams.responsibleName" placeholder="请输入责任人" clearable />
</el-form-item>
<el-form-item label="来源单号" prop="sourceNo">
<el-input v-model="queryParams.sourceNo" placeholder="请输入来源单号" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -24,10 +21,13 @@
<el-button type="primary" plain icon="Plus" size="mini" @click="handleAdd">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Clock" size="mini" :disabled="single" @click="handleArrival()">到货确认</el-button>
<el-button type="success" plain icon="CircleCheck" size="mini" :disabled="single" @click="handleConfirm()">确认入库</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="RefreshLeft" size="mini" :disabled="single" @click="handleReverse()">撤回</el-button>
<el-button type="danger" plain icon="RefreshLeft" size="mini" :disabled="single" @click="handleRevoke()">撤回</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
@@ -51,12 +51,18 @@
<el-table-column label="业务类型" align="center" prop="bizType" min-width="120" />
<el-table-column label="责任人" align="center" prop="responsibleName" min-width="120" />
<el-table-column label="实际到货" align="center" prop="actualArrivalTime" min-width="160" />
<el-table-column label="来源单号" align="center" prop="sourceNo" min-width="140" />
<el-table-column label="状态" align="center" width="90">
<template #default="scope">
<el-tag v-if="scope.row.revokeFlag === '1'" type="danger">已撤回</el-tag>
<el-tag v-else-if="scope.row.confirmInFlag === '1'" type="success">已确认</el-tag>
<el-tag v-else type="info">正常</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
<template #default="scope">
<el-button size="mini" type="text" icon="Document" @click="showDetail(scope.row)">明细</el-button>
<el-button size="mini" type="text" icon="Clock" @click="handleArrival(scope.row)">到货确认</el-button>
<el-button size="mini" type="text" icon="RefreshLeft" @click="handleReverse(scope.row)">撤回</el-button>
<el-button size="mini" type="text" icon="CircleCheck" :disabled="scope.row.revokeFlag === '1' || scope.row.confirmInFlag === '1'" @click="handleConfirm(scope.row)">确认入库</el-button>
<el-button size="mini" type="text" icon="RefreshLeft" :disabled="scope.row.revokeFlag === '1' || scope.row.confirmInFlag === '1'" @click="handleRevoke(scope.row)">撤回</el-button>
</template>
</el-table-column>
</el-table>
@@ -87,11 +93,6 @@
<el-input v-model="editForm.responsibleName" placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="来源单号" prop="sourceNo">
<el-input v-model="editForm.sourceNo" placeholder="请输入来源单号" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="editForm.remark" placeholder="请输入备注" />
@@ -180,10 +181,12 @@
<el-descriptions-item label="业务类型">{{ detailData.order.bizType }}</el-descriptions-item>
<el-descriptions-item label="责任人">{{ detailData.order.responsibleName }}</el-descriptions-item>
<el-descriptions-item label="实际到货">{{ detailData.order.actualArrivalTime || '-' }}</el-descriptions-item>
<el-descriptions-item label="确认入库人">{{ detailData.order.confirmInBy || '-' }}</el-descriptions-item>
<el-descriptions-item label="撤回人">{{ detailData.order.revokeBy || '-' }}</el-descriptions-item>
</el-descriptions>
<div style="margin: 12px 0; text-align: right;">
<el-button type="warning" size="small" @click="handleArrival(detailData.order)">到货确认</el-button>
<el-button type="danger" size="small" @click="handleReverse(detailData.order)">撤回</el-button>
<el-button type="success" size="small" :disabled="detailData.order.revokeFlag === '1' || detailData.order.confirmInFlag === '1'" @click="handleConfirm(detailData.order)">确认入库</el-button>
<el-button type="danger" size="small" :disabled="detailData.order.revokeFlag === '1' || detailData.order.confirmInFlag === '1'" @click="handleRevoke(detailData.order)">撤回</el-button>
</div>
<el-table :data="detailData.details || []" border style="width: 100%">
<el-table-column label="行号" prop="lineNo" width="70" align="center" />
@@ -211,8 +214,8 @@ import {
listStockIoOrder,
getStockIoOrderWithDetail,
addStockIoOrderWithDetail,
arrivalStockIoOrder,
reverseStockIoOrder
confirmInStockIoOrder,
revokeStockIoOrder
} from '@/api/wms/stockIoOrder'
export default {
@@ -235,8 +238,7 @@ export default {
orderCode: undefined,
ioType: 'I',
bizType: undefined,
responsibleName: undefined,
sourceNo: undefined
responsibleName: undefined
},
editOpen: false,
editTitle: '',
@@ -291,11 +293,39 @@ export default {
this.single = selection.length !== 1
this.multiple = !selection.length
},
handleExport() {
this.download(
'/gear/stockIoOrder/export',
{
...this.queryParams
},
`stockIoOrder_in_${new Date().getTime()}.xlsx`
)
},
handleConfirm(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认入库前将进行数据校验,确认继续?')
.then(() => {
this.buttonLoading = true
return confirmInStockIoOrder(target.orderId)
})
.then(() => {
this.$modal.msgSuccess('确认成功')
this.getList()
if (this.detailOpen && this.detailData && this.detailData.order) {
return getStockIoOrderWithDetail(this.detailData.order.orderId).then((res) => (this.detailData = res.data))
}
})
.finally(() => {
this.buttonLoading = false
})
},
resetEdit() {
this.editForm = {
ioType: 'I',
bizType: undefined,
sourceNo: undefined,
responsibleName: undefined,
remark: undefined
}
@@ -316,36 +346,21 @@ export default {
this.detailData = res.data
})
},
handleArrival(row) {
handleRevoke(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认到货?')
.confirm('确认撤回该入库单据?撤回后将标记为已撤回。')
.then(() => {
this.buttonLoading = true
return arrivalStockIoOrder(target.orderId)
return revokeStockIoOrder(target.orderId, '')
})
.then(() => {
this.$modal.msgSuccess('已确认到货')
this.getList()
})
.finally(() => {
this.buttonLoading = false
})
},
handleReverse(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认冲销该单据?系统将创建一张反向单据并自动执行。')
.then(() => {
this.buttonLoading = true
return reverseStockIoOrder(target.orderId, '')
})
.then((res) => {
const newId = res.data
this.$modal.msgSuccess('冲销成功冲销单ID' + newId)
this.$modal.msgSuccess('撤回成功')
this.getList()
if (this.detailOpen) {
this.detailOpen = false
}
})
.finally(() => {
this.buttonLoading = false
@@ -417,6 +432,7 @@ export default {
lineNo,
itemType: 'material',
itemId: d.itemId,
materialTypeSnapshot: d._materialType,
itemName: d.itemName,
quantity: quantity,
unit: d.unit,
@@ -493,6 +509,9 @@ export default {
onMaterialPicked(row, material) {
if (material && material.materialName) {
row.itemName = material.materialName
if (material.materialType != null) {
row._materialType = material.materialType
}
if (!row.unit && material.unit) {
row.unit = material.unit
}

View File

@@ -23,6 +23,9 @@
<el-col :span="1.5">
<el-button type="danger" plain icon="RefreshLeft" size="mini" :disabled="single" @click="handleRevoke()">撤回</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
@@ -44,10 +47,16 @@
</el-table-column>
<el-table-column label="业务类型" align="center" prop="bizType" min-width="120" />
<el-table-column label="责任人" align="center" prop="responsibleName" min-width="120" />
<el-table-column label="状态" align="center" width="90">
<template #default="scope">
<el-tag v-if="scope.row.revokeFlag === '1'" type="danger">已撤回</el-tag>
<el-tag v-else type="info">正常</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
<template #default="scope">
<el-button size="mini" type="text" icon="Document" @click="showDetail(scope.row)">明细</el-button>
<el-button size="mini" type="text" icon="RefreshLeft" @click="handleRevoke(scope.row)">撤回</el-button>
<el-button size="mini" type="text" icon="RefreshLeft" :disabled="scope.row.revokeFlag === '1'" @click="handleRevoke(scope.row)">撤回</el-button>
</template>
</el-table-column>
</el-table>
@@ -78,11 +87,6 @@
<el-input v-model="editForm.responsibleName" placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="来源单号" prop="sourceNo">
<el-input v-model="editForm.sourceNo" placeholder="请输入来源单号" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="editForm.remark" placeholder="请输入备注" />
@@ -127,7 +131,7 @@
</el-table-column>
<el-table-column label="数量" min-width="120" align="center">
<template #default="scope">
<el-input v-model="scope.row.quantity" placeholder="请输入数量" @input="recalcAmount(scope.row)" />
<el-input v-model="scope.row.quantity" placeholder="请输入数量" />
</template>
</el-table-column>
<el-table-column label="单位" width="90" align="center">
@@ -140,16 +144,6 @@
<el-input v-model="scope.row.batchNo" placeholder="批次号" />
</template>
</el-table-column>
<el-table-column label="单价" min-width="110" align="center">
<template #default="scope">
<el-input v-model="scope.row.unitPrice" placeholder="单价" @input="recalcAmount(scope.row)" />
</template>
</el-table-column>
<el-table-column label="金额" min-width="110" align="center">
<template #default="scope">
<el-input v-model="scope.row.amount" placeholder="金额" />
</template>
</el-table-column>
<el-table-column label="备注" min-width="140" align="center">
<template #default="scope">
<el-input v-model="scope.row.remark" placeholder="备注" />
@@ -170,9 +164,10 @@
<el-descriptions-item label="类型">出库</el-descriptions-item>
<el-descriptions-item label="业务类型">{{ detailData.order.bizType }}</el-descriptions-item>
<el-descriptions-item label="责任人">{{ detailData.order.responsibleName }}</el-descriptions-item>
<el-descriptions-item label="撤回人">{{ detailData.order.revokeBy || '-' }}</el-descriptions-item>
</el-descriptions>
<div style="margin: 12px 0; text-align: right;">
<el-button type="danger" size="small" @click="handleRevoke(detailData.order)">撤回</el-button>
<el-button type="danger" size="small" :disabled="detailData.order.revokeFlag === '1'" @click="handleRevoke(detailData.order)">撤回</el-button>
</div>
<el-table :data="detailData.details || []" border style="width: 100%">
<el-table-column label="行号" prop="lineNo" width="70" align="center" />
@@ -200,7 +195,7 @@ import {
listStockIoOrder,
getStockIoOrderWithDetail,
addStockIoOrderWithDetail,
reverseStockIoOrder
revokeStockIoOrder
} from '@/api/wms/stockIoOrder'
export default {
@@ -276,11 +271,19 @@ export default {
this.ids = selection.map((r) => r.orderId)
this.single = selection.length !== 1
},
handleExport() {
this.download(
'/gear/stockIoOrder/export',
{
...this.queryParams
},
`stockIoOrder_out_${new Date().getTime()}.xlsx`
)
},
resetEdit() {
this.editForm = {
ioType: 'O',
bizType: undefined,
sourceNo: undefined,
responsibleName: undefined,
remark: undefined
}
@@ -305,15 +308,17 @@ export default {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认撤回该出库?系统将创建一张反向单据并自动执行。')
.confirm('确认撤回该出库单据?撤回后将标记为已撤回。')
.then(() => {
this.buttonLoading = true
return reverseStockIoOrder(target.orderId, '')
return revokeStockIoOrder(target.orderId, '')
})
.then((res) => {
const newId = res.data
this.$modal.msgSuccess('撤回成功撤回单ID' + newId)
.then(() => {
this.$modal.msgSuccess('撤回成功')
this.getList()
if (this.detailOpen) {
this.detailOpen = false
}
})
.finally(() => {
this.buttonLoading = false
@@ -358,7 +363,6 @@ export default {
const hasAny =
(d.itemId != null && String(d.itemId) !== '') ||
(d.quantity != null && String(d.quantity) !== '') ||
(d.unitPrice != null && String(d.unitPrice) !== '') ||
(d.batchNo != null && String(d.batchNo) !== '') ||
(d.remark != null && String(d.remark) !== '') ||
(d.itemName != null && String(d.itemName) !== '')
@@ -381,20 +385,17 @@ export default {
.filter((d) => d && d.itemId != null && String(d.itemId) !== '' && this.toNumber(d.quantity) > 0)
.map((d, idx) => {
const lineNo = d.lineNo != null ? d.lineNo : idx + 1
const unitPrice = this.toNumber(d.unitPrice)
const quantity = this.toNumber(d.quantity)
const amount = d.amount != null && String(d.amount) !== '' ? this.toNumber(d.amount) : unitPrice * quantity
return {
detailId: d.detailId,
lineNo,
itemType: 'material',
itemId: d.itemId,
materialTypeSnapshot: d._materialType,
itemName: d.itemName,
quantity: quantity,
unit: d.unit,
batchNo: d.batchNo,
unitPrice: unitPrice,
amount: amount,
remark: d.remark
}
})
@@ -413,8 +414,6 @@ export default {
quantity: undefined,
unit: undefined,
batchNo: undefined,
unitPrice: undefined,
amount: undefined,
remark: undefined
})
this.rebuildLineNo()
@@ -446,8 +445,7 @@ export default {
const r = this.editDetails[0]
const empty =
(r.itemId == null || String(r.itemId) === '') &&
(r.quantity == null || String(r.quantity) === '') &&
(r.unitPrice == null || String(r.unitPrice) === '')
(r.quantity == null || String(r.quantity) === '')
if (empty) {
r.itemId = rows[0].materialId
this.onMaterialPicked(r, rows[0])
@@ -465,22 +463,14 @@ export default {
onMaterialPicked(row, material) {
if (material && material.materialName) {
row.itemName = material.materialName
if (material.materialType != null) {
row._materialType = material.materialType
}
if (!row.unit && material.unit) {
row.unit = material.unit
}
if (material.unitPrice != null && row.unitPrice == null) {
row.unitPrice = material.unitPrice
}
this.recalcAmount(row)
}
},
recalcAmount(row) {
const qty = this.toNumber(row.quantity)
const unitPrice = this.toNumber(row.unitPrice)
if (qty > 0 || unitPrice > 0) {
row.amount = String(unitPrice * qty)
}
}
}
}
</script>

View File

@@ -30,9 +30,6 @@
<el-form-item label="责任人" prop="responsibleName">
<el-input v-model="queryParams.responsibleName" placeholder="请输入责任人" clearable />
</el-form-item>
<el-form-item label="来源单号" prop="sourceNo">
<el-input v-model="queryParams.sourceNo" placeholder="请输入来源单号" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -50,22 +47,7 @@
<el-button type="danger" plain icon="Delete" size="mini" :disabled="multiple" @click="handleDelete">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="CircleCheck" size="mini" :disabled="single" @click="handleAudit()">审核</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Check" size="mini" :disabled="single" @click="handleExecute()">执行</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Clock" size="mini" :disabled="single" @click="handleArrival()">到货确认</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Finished" size="mini" :disabled="single" @click="handleFinish()">完成</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="RefreshLeft" size="mini" :disabled="single" @click="handleReverse()">冲销</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Close" size="mini" :disabled="single" @click="handleCancel()">作废</el-button>
<el-button type="warning" plain icon="Download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
@@ -101,7 +83,6 @@
<el-tag :type="delayStatusTag(scope.row.delayStatus)">{{ delayStatusLabel(scope.row.delayStatus) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="来源单号" align="center" prop="sourceNo" min-width="140" />
<el-table-column label="执行流水ID" align="center" prop="sourceIoId" min-width="120" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
<template #default="scope">
@@ -140,11 +121,6 @@
<el-input v-model="editForm.responsibleName" placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="来源单号" prop="sourceNo">
<el-input v-model="editForm.sourceNo" placeholder="请输入来源单号" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="主仓库" prop="warehouseId">
<WarehouseSelect v-model="editForm.warehouseId" placeholder="请选择仓库" />
@@ -281,14 +257,9 @@
<el-descriptions-item label="已执行">{{ detailData.order.execFlag === '1' ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="责任人">{{ detailData.order.responsibleName }}</el-descriptions-item>
<el-descriptions-item label="延迟">{{ delayStatusLabel(detailData.order.delayStatus) }}</el-descriptions-item>
<el-descriptions-item label="确认入库人">{{ detailData.order.confirmInBy || '-' }}</el-descriptions-item>
<el-descriptions-item label="撤回人">{{ detailData.order.revokeBy || '-' }}</el-descriptions-item>
</el-descriptions>
<div style="margin: 12px 0; text-align: right;">
<el-button type="primary" size="small" @click="handleAudit(detailData.order)">审核</el-button>
<el-button type="primary" size="small" @click="handleExecute(detailData.order)">执行</el-button>
<el-button type="warning" size="small" @click="handleArrival(detailData.order)">到货确认</el-button>
<el-button type="success" size="small" @click="handleFinish(detailData.order)">完成</el-button>
<el-button type="danger" size="small" @click="handleReverse(detailData.order)">冲销</el-button>
</div>
<el-table :data="detailData.details || []" border style="width: 100%">
<el-table-column label="行号" prop="lineNo" width="70" align="center" />
<el-table-column label="物料类型" prop="itemType" width="110" align="center" />
@@ -321,13 +292,7 @@ import {
getStockIoOrderWithDetail,
addStockIoOrderWithDetail,
updateStockIoOrderWithDetail,
delStockIoOrder,
auditStockIoOrder,
executeStockIoOrder,
arrivalStockIoOrder,
finishStockIoOrder,
cancelStockIoOrder,
reverseStockIoOrder
delStockIoOrder
} from '@/api/wms/stockIoOrder'
export default {
@@ -378,8 +343,7 @@ export default {
execFlag: undefined,
reversalFlag: undefined,
delayStatus: undefined,
responsibleName: undefined,
sourceNo: undefined
responsibleName: undefined
},
editOpen: false,
editTitle: '',
@@ -466,7 +430,6 @@ export default {
ioType: this.ioType || 'I',
bizType: undefined,
sourceType: undefined,
sourceNo: undefined,
sourceOrderId: undefined,
responsibleId: undefined,
responsibleName: undefined,
@@ -503,6 +466,9 @@ export default {
}
this.editDetails = (data.details || []).map((d) => {
const next = Object.assign({}, d)
if (next._materialType == null && next.materialTypeSnapshot != null) {
next._materialType = next.materialTypeSnapshot
}
if (this.fixedMaterialMode) {
next.itemType = 'material'
}
@@ -538,6 +504,16 @@ export default {
this.loading = false
})
},
handleExport() {
const type = this.queryParams && this.queryParams.ioType ? String(this.queryParams.ioType) : 'all'
this.download(
'/gear/stockIoOrder/export',
{
...this.queryParams
},
`stockIoOrder_${type}_${new Date().getTime()}.xlsx`
)
},
showDetail(row) {
this.detailOpen = true
this.detailData = null
@@ -545,122 +521,6 @@ export default {
this.detailData = res.data
})
},
handleAudit(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认审核该单据?')
.then(() => {
this.buttonLoading = true
return auditStockIoOrder(target.orderId)
})
.then(() => {
this.$modal.msgSuccess('审核成功')
this.getList()
if (this.detailOpen && this.detailData && this.detailData.order) {
return getStockIoOrderWithDetail(this.detailData.order.orderId).then((res) => (this.detailData = res.data))
}
})
.finally(() => {
this.buttonLoading = false
})
},
handleExecute(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认执行该单据?执行后将影响库存。')
.then(() => {
this.buttonLoading = true
return executeStockIoOrder(target.orderId)
})
.then(() => {
this.$modal.msgSuccess('执行成功')
this.getList()
if (this.detailOpen && this.detailData && this.detailData.order) {
return getStockIoOrderWithDetail(this.detailData.order.orderId).then((res) => (this.detailData = res.data))
}
})
.finally(() => {
this.buttonLoading = false
})
},
handleArrival(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认到货?')
.then(() => {
this.buttonLoading = true
return arrivalStockIoOrder(target.orderId)
})
.then(() => {
this.$modal.msgSuccess('已确认到货')
this.getList()
if (this.detailOpen && this.detailData && this.detailData.order) {
return getStockIoOrderWithDetail(this.detailData.order.orderId).then((res) => (this.detailData = res.data))
}
})
.finally(() => {
this.buttonLoading = false
})
},
handleFinish(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认完成该单据?')
.then(() => {
this.buttonLoading = true
return finishStockIoOrder(target.orderId)
})
.then(() => {
this.$modal.msgSuccess('已完成')
this.getList()
if (this.detailOpen && this.detailData && this.detailData.order) {
return getStockIoOrderWithDetail(this.detailData.order.orderId).then((res) => (this.detailData = res.data))
}
})
.finally(() => {
this.buttonLoading = false
})
},
handleCancel(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认作废该单据?')
.then(() => {
this.buttonLoading = true
return cancelStockIoOrder(target.orderId, '')
})
.then(() => {
this.$modal.msgSuccess('已作废')
this.getList()
this.detailOpen = false
})
.finally(() => {
this.buttonLoading = false
})
},
handleReverse(row) {
const target = row || (this.rows && this.rows[0])
if (!target || !target.orderId) return
this.$modal
.confirm('确认冲销该单据?系统将创建一张反向单据并自动执行。')
.then(() => {
this.buttonLoading = true
return reverseStockIoOrder(target.orderId, '')
})
.then((res) => {
const newId = res.data
this.$modal.msgSuccess('冲销成功冲销单ID' + newId)
this.getList()
})
.finally(() => {
this.buttonLoading = false
})
},
submitEdit() {
this.$refs.editFormRef.validate((valid) => {
if (!valid) return
@@ -695,6 +555,7 @@ export default {
lineNo,
itemType: this.fixedMaterialMode ? 'material' : d.itemType,
itemId: d.itemId,
materialTypeSnapshot: d._materialType,
itemName: d.itemName,
specName: d.specName,
warehouseId: d.warehouseId,