feat(wms): 出库单不限制仓库,增加状态判断修改、出库,库存选择器增加筛选多次选择合并

dev
wanghao 4 weeks ago
parent cb09571d4e
commit a592418467

@ -111,12 +111,14 @@ export interface InventoryDetailsQuery extends PageQuery {
*/ */
locationCode?: string; locationCode?: string;
productCode?: string; productCode?: string;
externalBrand?: string;
productName?: string; productName?: string;
/** /**
* ID * ID
*/ */
warehouseId?: string | number; warehouseId?: string | number;
projectId?: string | number;
/** /**
* ID * ID

@ -1,6 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import {AxiosPromise} from 'axios'; import { AxiosPromise } from 'axios';
import {OutStockBillForm, OutStockBillQuery, OutStockBillVO} from '@/api/wms/outStockBill/types'; import { OutStockBillForm, OutStockBillQuery, OutStockBillVO } from '@/api/wms/outStockBill/types';
/** /**
* *
@ -83,3 +83,15 @@ export function getWmsOutStockBillList(query) {
params: query params: query
}); });
} }
/**
*
* @param query
* @returns {*}
*/
export function updateOutStockBillProject(query) {
return request({
url: '/wms/outStockBill/updateOutStockBillProject',
method: 'get',
params: query
});
}

@ -33,6 +33,7 @@ export interface OutStockDetailsVO {
* *
*/ */
outStockAmount: number; outStockAmount: number;
inventoryAmount: number;
/** /**
* *
@ -93,7 +94,6 @@ export interface OutStockDetailsVO {
* ID * ID
*/ */
inventoryDetailsId: string | number; inventoryDetailsId: string | number;
} }
export interface OutStockDetailsForm extends BaseEntity { export interface OutStockDetailsForm extends BaseEntity {
@ -106,7 +106,7 @@ export interface OutStockDetailsForm extends BaseEntity {
* ID * ID
*/ */
warehouseId?: string | number; warehouseId?: string | number;
inventoryAmount: number;
/** /**
* ID * ID
*/ */
@ -156,11 +156,9 @@ export interface OutStockDetailsForm extends BaseEntity {
* ID * ID
*/ */
inventoryDetailsId?: string | number; inventoryDetailsId?: string | number;
} }
export interface OutStockDetailsQuery extends PageQuery { export interface OutStockDetailsQuery extends PageQuery {
/** /**
* ID * ID
*/ */
@ -191,6 +189,3 @@ export interface OutStockDetailsQuery extends PageQuery {
*/ */
params?: any; params?: any;
} }

@ -7,13 +7,6 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px"> <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
<el-form-item label="物料编码" prop="materialCode">
<el-input v-model="queryParams.productCode" placeholder="请输入物料编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="queryParams.productName" placeholder="请输入物料名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="仓库" prop="warehouseId" v-if="!prop.warehouseId"> <el-form-item label="仓库" prop="warehouseId" v-if="!prop.warehouseId">
<el-select v-model="queryParams.warehouseId" placeholder="请选择仓库" clearable filterable> <el-select v-model="queryParams.warehouseId" placeholder="请选择仓库" clearable filterable>
<el-option <el-option
@ -24,11 +17,31 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="物料编码" prop="materialCode">
<el-input v-model="queryParams.productCode" placeholder="请输入物料编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="queryParams.productName" placeholder="请输入物料名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="品牌" prop="externalBrand">
<el-input v-model="queryParams.externalBrand" placeholder="请输入品牌" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="批次号" prop="batchNumber"> <el-form-item label="批次号" prop="batchNumber">
<el-input v-model="queryParams.batchNumber" placeholder="请输入批次号" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.batchNumber" placeholder="请输入批次号" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="项目" prop="projectId">
<el-select v-model="queryParams.projectId" placeholder="请选择项目" filterable clearable>
<el-option
v-for="item in projectInfoList"
:key="item.projectId"
:label="`${item.projectCode} - ${item.projectName}`"
:value="item.projectId"
></el-option>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button> <el-button type="primary" icon="Search" @click="handleQuery" :loading="loading">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button> <el-button icon="Refresh" @click="resetQuery"></el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -55,21 +68,20 @@
border border
show-overflow show-overflow
:data="inventoryDetailsList" :data="inventoryDetailsList"
:loading="loading"
:row-config="{ keyField: 'inventoryDetailsId', isHover: true }" :row-config="{ keyField: 'inventoryDetailsId', isHover: true }"
:checkbox-config="{ reserve: true, trigger: 'row', highlight: true, showHeader: prop.multiple }" :checkbox-config="{ reserve: true, trigger: 'row', highlight: true, showHeader: prop.multiple }"
@checkbox-all="handleCheckboxAll" @checkbox-all="handleCheckboxAll"
@checkbox-change="handleCheckboxChange" @checkbox-change="handleCheckboxChange"
> >
<vxe-column type="checkbox" width="50" align="center" /> <vxe-column type="checkbox" width="50" align="center" />
<vxe-column key="warehouseName" title="仓库" align="center" field="warehouseName" /> <vxe-column key="warehouseName" title="仓库" align="center" field="warehouseName" width="220px" />
<vxe-column key="batchNumber" title="批次号" align="center" field="batchNumber" /> <vxe-column key="batchNumber" title="批次号" align="center" field="batchNumber" />
<vxe-column key="productCode" title="物料编码" align="center" field="productCode" /> <vxe-column key="productCode" title="物料编码" align="center" field="productCode" />
<vxe-column key="productName" title="物料名称" align="center" field="productName" /> <vxe-column key="productName" title="物料名称" align="center" field="productName" />
<vxe-column key="productSpe" title="物料描述" align="center" field="productSpe" /> <vxe-column key="productSpe" title="物料描述" align="center" field="productSpe" />
<vxe-column key="externalBrand" title="外部品牌" align="center" field="externalBrand" /> <vxe-column key="externalBrand" title="品牌" align="center" field="externalBrand" />
<vxe-column key="inventoryAmount" title="库存数量" align="center" field="inventoryAmount" /> <vxe-column key="inventoryAmount" title="库存数量" align="center" field="inventoryAmount" />
<vxe-column key="unitPrice" title="单价" align="center" field="unitPrice" /> <!--<vxe-column key="unitPrice" title="单价" align="center" field="unitPrice" />-->
</vxe-table> </vxe-table>
<pagination <pagination
@ -98,6 +110,7 @@ import { InventoryDetailsQuery, InventoryDetailsVO } from '@/api/wms/inventoryDe
import { VxeTableInstance } from 'vxe-table'; import { VxeTableInstance } from 'vxe-table';
import useDialog from '@/hooks/useDialog'; import useDialog from '@/hooks/useDialog';
import { computed, getCurrentInstance, nextTick, ref, watch } from 'vue'; import { computed, getCurrentInstance, nextTick, ref, watch } from 'vue';
import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo';
interface PropType { interface PropType {
modelValue?: InventoryDetailsVO[] | InventoryDetailsVO | undefined; modelValue?: InventoryDetailsVO[] | InventoryDetailsVO | undefined;
@ -189,6 +202,17 @@ const getWarehouseList = async () => {
} }
}; };
//
const projectInfoList = ref([]);
/** 查询项目列表 */
const getProjectInfoList = async () => {
try {
const res = await getErpProjectInfoList(null);
projectInfoList.value = res.data || [];
} catch (error) {
console.error('查询项目列表失败:', error);
}
};
const pageList = async () => { const pageList = async () => {
await getList(); await getList();
const inventories = inventoryDetailsList.value.filter((item) => { const inventories = inventoryDetailsList.value.filter((item) => {
@ -285,6 +309,7 @@ watch(
await getList(); await getList();
await getWarehouseList(); await getWarehouseList();
await initSelectInventory(); await initSelectInventory();
await getProjectInfoList();
} else { } else {
tableRef.value?.clearCheckboxReserve(); tableRef.value?.clearCheckboxReserve();
tableRef.value?.clearCheckboxRow(); tableRef.value?.clearCheckboxRow();

@ -32,11 +32,11 @@
<el-option v-for="dict in wms_out_bill_status" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in wms_out_bill_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="仓库" prop="warehouseId"> <!--<el-form-item label="仓库" prop="warehouseId">-->
<el-select v-model="queryParams.warehouseId" placeholder="请选择仓库" clearable filterable> <!-- <el-select v-model="queryParams.warehouseId" placeholder="请选择仓库" clearable filterable>-->
<el-option v-for="item in warehouseInfoList" :key="item.warehouseId" :label="item.warehouseName" :value="item.warehouseId" /> <!-- <el-option v-for="item in warehouseInfoList" :key="item.warehouseId" :label="item.warehouseName" :value="item.warehouseId" />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!--</el-form-item>-->
<el-form-item label="创建时间" style="width: 308px"> <el-form-item label="创建时间" style="width: 308px">
<!-- <el-date-picker clearable v-model="queryParams.createTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建时间" />--> <!-- <el-date-picker clearable v-model="queryParams.createTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建时间" />-->
<el-date-picker <el-date-picker
@ -154,7 +154,7 @@
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="141">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wms:outStockBill:edit']"></el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wms:outStockBill:edit']"></el-button>
@ -186,10 +186,7 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1200px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="1200px" append-to-body>
<el-form ref="outStockBillFormRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="outStockBillFormRef" :model="form" :rules="rules" label-width="120px">
<el-row> <el-row>
<el-col :span="12"> <!--<el-col :span="12">
<!-- <el-form-item label="出库单号" prop="outStockCode">-->
<!-- <el-input v-model="form.outStockCode" placeholder="请输入出库单号" />-->
<!-- </el-form-item>-->
<el-form-item label="仓库" prop="warehouseId"> <el-form-item label="仓库" prop="warehouseId">
<el-select v-model="form.warehouseId" placeholder="请选择仓库" filterable :disabled="selectInventorys.length > 0"> <el-select v-model="form.warehouseId" placeholder="请选择仓库" filterable :disabled="selectInventorys.length > 0">
<el-option <el-option
@ -200,7 +197,7 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>-->
<el-col :span="12"> <el-col :span="12">
<el-form-item label="出库单类型" prop="outStockType"> <el-form-item label="出库单类型" prop="outStockType">
@ -209,6 +206,11 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="出库说明" prop="directions">
<el-input v-model="form.directions" type="textarea" :rows="1" placeholder="请输入出库说明" style="width: 100%" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row> <el-row>
@ -248,10 +250,6 @@
<!-- <el-form-item label="关联单号" prop="inventoryAmount">--> <!-- <el-form-item label="关联单号" prop="inventoryAmount">-->
<!-- <el-input v-model="form.inventoryAmount" placeholder="请输入关联单号" />--> <!-- <el-input v-model="form.inventoryAmount" placeholder="请输入关联单号" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="出库说明" prop="directions">
<el-input v-model="form.directions" type="textarea" :rows="3" placeholder="请输入出库说明" style="width: 100%" />
</el-form-item>
</el-form> </el-form>
<div> <div>
@ -299,7 +297,7 @@
</el-table> </el-table>
</div> </div>
</el-card> </el-card>
<wms-inventory-select ref="inventorySelectRef" :multiple="true" :warehouse-id="form.warehouseId" @confirmCallBack="handleInventorySelect" /> <wms-inventory-select ref="inventorySelectRef" :multiple="true" @confirmCallBack="handleInventorySelect" />
</div> </div>
<template #footer> <template #footer>
@ -339,7 +337,15 @@
</template> </template>
<script setup name="OutStockBill" lang="ts"> <script setup name="OutStockBill" lang="ts">
import { addOutStockBill, deliverOutStockBill, delOutStockBill, getOutStockBill, listOutStockBill, updateOutStockBill } from '@/api/wms/outStockBill'; import {
addOutStockBill,
deliverOutStockBill,
delOutStockBill,
getOutStockBill,
listOutStockBill,
updateOutStockBill,
updateOutStockBillProject
} from '@/api/wms/outStockBill';
import { OutStockBillForm, OutStockBillQuery, OutStockBillVO } from '@/api/wms/outStockBill/types'; import { OutStockBillForm, OutStockBillQuery, OutStockBillVO } from '@/api/wms/outStockBill/types';
import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo'; import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo';
import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo'; import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo';
@ -405,7 +411,7 @@ const columns = ref<FieldOption[]>([
{ key: 16, label: `创建人`, visible: false }, { key: 16, label: `创建人`, visible: false },
{ key: 17, label: `创建时间`, visible: true }, { key: 17, label: `创建时间`, visible: true },
{ key: 18, label: `更新人`, visible: false }, { key: 18, label: `更新人`, visible: false },
{ key: 19, label: `更新时间`, visible: false } { key: 19, label: `更新时间`, visible: true }
]); ]);
const initFormData: OutStockBillForm = { const initFormData: OutStockBillForm = {
@ -439,9 +445,9 @@ const data = reactive<PageData<OutStockBillForm, OutStockBillQuery>>({
}, },
rules: { rules: {
outStockBillId: [{ required: true, message: '出库单ID不能为空', trigger: 'blur' }], outStockBillId: [{ required: true, message: '出库单ID不能为空', trigger: 'blur' }],
warehouseId: [{ required: true, message: '请选择仓库', trigger: 'blur' }], // warehouseId: [{ required: true, message: '', trigger: 'blur' }],
outStockType: [{ required: true, message: '请选择出库单类型', trigger: 'blur' }], outStockType: [{ required: true, message: '请选择出库单类型', trigger: 'blur' }]
projectId: [{ required: true, message: '请选择项目', trigger: 'blur' }] // projectId: [{ required: true, message: '', trigger: 'blur' }]
} }
}); });
@ -498,17 +504,22 @@ const getWarehouseName = (warehouseId) => {
}; };
/** 打开库存选择器 */ /** 打开库存选择器 */
const openInventorySelect = () => { const openInventorySelect = () => {
if (!form.value.warehouseId) { // if (!form.value.warehouseId) {
ElMessage.warning('请先选择仓库'); // ElMessage.warning('');
return; // return;
} // }
inventorySelectRef.value.warehouseId = form.value.warehouseId; // inventorySelectRef.value.warehouseId = form.value.warehouseId;
inventorySelectRef.value.open(); inventorySelectRef.value.open();
}; };
/** 处理库存选择器确认选择 */ /** 处理库存选择器确认选择 */
const handleInventorySelect = (selectedInventorys) => { const handleInventorySelect = (selectedInventorys) => {
selectInventorys.value = selectedInventorys; selectedInventorys.forEach((newInventory) => {
console.log(selectedInventorys); // inventoryDetailsId
const exists = selectInventorys.value.some((existingInventory) => existingInventory.inventoryDetailsId === newInventory.inventoryDetailsId);
if (!exists) {
selectInventorys.value.push(newInventory);
}
});
}; };
/** 删除选中的出库明细 */ /** 删除选中的出库明细 */
const removeOutDetail = (index) => { const removeOutDetail = (index) => {
@ -597,16 +608,18 @@ const handleUpdate = async (row?: OutStockBillVO) => {
const _outStockBillId = row?.outStockBillId || ids.value[0]; const _outStockBillId = row?.outStockBillId || ids.value[0];
const res = await getOutStockBill(_outStockBillId); const res = await getOutStockBill(_outStockBillId);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
const chiildRes = await getWmsOutStockDetailsList({ outStockBillId: _outStockBillId });
selectInventorys.value = chiildRes.data || [];
dialog.visible = true; dialog.visible = true;
dialog.title = '修改出库单'; dialog.title = '修改出库单';
}; };
/** 补录 */ /** 补录 */
const handleProjectAdd = async (row?: OutStockBillVO) => { const handleProjectAdd = async (row?: OutStockBillVO) => {
// if (row.projectId) { if (row.projectId) {
// ElMessage.warning(''); ElMessage.warning('出库项目已维护');
// return; return;
// } }
reset(); reset();
const _outStockBillId = row?.outStockBillId || ids.value[0]; const _outStockBillId = row?.outStockBillId || ids.value[0];
@ -618,8 +631,15 @@ const handleProjectAdd = async (row?: OutStockBillVO) => {
/** 提交添加项目表单 */ /** 提交添加项目表单 */
const submitAddProjectForm = () => { const submitAddProjectForm = () => {
outStockBillFormRef.value?.validate(async (valid: boolean) => { outStockBillFormRef.value?.validate(async (valid: boolean) => {
if (valid && form.value.outStockBillId) { buttonLoading.value = true;
await updateOutStockBill(form.value).finally(() => (buttonLoading.value = false)); if (valid) {
await updateOutStockBillProject({
outStockBillId: form.value.outStockBillId,
projectId: form.value.projectId
}).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess('操作成功');
addProjectDialog.visible = false;
await getList();
} }
}); });
}; };
@ -638,14 +658,10 @@ const submitForm = () => {
return; return;
} }
buttonLoading.value = true; buttonLoading.value = true;
if (form.value.outStockBillId) {
ElMessage.error('暂不允许修改');
// await updateOutStockBill(form.value).finally(() => (buttonLoading.value = false));
} else {
const submitFlowData = { const submitFlowData = {
...form.value, ...form.value,
outStockDetailsList: selectInventorys.value.map((item) => ({ outStockDetailsList: selectInventorys.value.map((item) => ({
warehouseId: form.value.warehouseId, warehouseId: item.warehouseId,
materielId: item.materielId, materielId: item.materielId,
batchNumber: item.batchNumber, batchNumber: item.batchNumber,
// unitPrice: item.unitPrice, // unitPrice: item.unitPrice,
@ -658,6 +674,11 @@ const submitForm = () => {
oldInventoryAmount: item.inventoryAmount oldInventoryAmount: item.inventoryAmount
})) }))
}; };
console.log(submitFlowData.outStockDetailsList);
if (form.value.outStockBillId) {
// ElMessage.error('');
await updateOutStockBill(submitFlowData).finally(() => (buttonLoading.value = false));
} else {
await addOutStockBill(submitFlowData).finally(() => (buttonLoading.value = false)); await addOutStockBill(submitFlowData).finally(() => (buttonLoading.value = false));
} }
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');

Loading…
Cancel
Save