fix: 修正出库单字典加载与详情标识
This commit is contained in:
@@ -110,9 +110,9 @@ export function getIostorInvPage(params: PageParam) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 查询出入库单主表详情 */
|
/** 查询出入库单主表详情 */
|
||||||
export function getIostorInv(id: number) {
|
export function getIostorInv(id: string) {
|
||||||
return requestClient.get<WmsIostorInvApi.IostorInv>(
|
return requestClient.get<WmsIostorInvApi.IostorInv>(
|
||||||
`/wms/iostor-inv/get?id=${id}`,
|
`/wms/iostor-inv/get?id=${encodeURIComponent(id)}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ import type { WmsIostorInvApi } from '#/api/wms/iostorinv';
|
|||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
|
|
||||||
import { useVbenModal } from '@vben/common-ui';
|
import { useVbenModal } from '@vben/common-ui';
|
||||||
import { DICT_TYPE } from '@vben/constants';
|
|
||||||
import { getDictOptions } from '@vben/hooks';
|
|
||||||
|
|
||||||
import { Button, Input, InputNumber, message, Space, Table } from 'antdv-next';
|
import { Button, Input, InputNumber, message, Space, Table } from 'antdv-next';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
import { useVbenForm } from '#/adapter/form';
|
import { useVbenForm } from '#/adapter/form';
|
||||||
|
import { getSimpleDictDataList } from '#/api/system/dict/data';
|
||||||
import { getBsrealStorAttrSimpleList } from '#/api/wms/bsrealstorattr';
|
import { getBsrealStorAttrSimpleList } from '#/api/wms/bsrealstorattr';
|
||||||
import {
|
import {
|
||||||
createOutbound,
|
createOutbound,
|
||||||
@@ -25,6 +24,7 @@ import InventorySelectComponent from './inventory-select.vue';
|
|||||||
import ManualDetailComponent from './manual-detail.vue';
|
import ManualDetailComponent from './manual-detail.vue';
|
||||||
import {
|
import {
|
||||||
buildOutboundPayload,
|
buildOutboundPayload,
|
||||||
|
filterOutboundBillTypeOptions,
|
||||||
mergeOutboundInventory,
|
mergeOutboundInventory,
|
||||||
type OutboundFormDetail,
|
type OutboundFormDetail,
|
||||||
shouldClearDetailsForWarehouseChange,
|
shouldClearDetailsForWarehouseChange,
|
||||||
@@ -35,6 +35,7 @@ const formData = ref<WmsIostorInvApi.IostorInv>();
|
|||||||
const details = ref<OutboundFormDetail[]>([]);
|
const details = ref<OutboundFormDetail[]>([]);
|
||||||
const currentStorId = ref<string>();
|
const currentStorId = ref<string>();
|
||||||
let manualRowSequence = 0;
|
let manualRowSequence = 0;
|
||||||
|
let billTypeRequest: null | ReturnType<typeof getSimpleDictDataList> = null;
|
||||||
|
|
||||||
const isEdit = computed(() => Boolean(formData.value?.iostorinvId));
|
const isEdit = computed(() => Boolean(formData.value?.iostorinvId));
|
||||||
const getTitle = computed(() =>
|
const getTitle = computed(() =>
|
||||||
@@ -103,7 +104,7 @@ const [OutboundForm, outboundFormApi] = useVbenForm({
|
|||||||
component: 'Select',
|
component: 'Select',
|
||||||
componentProps: {
|
componentProps: {
|
||||||
allowClear: true,
|
allowClear: true,
|
||||||
options: getDictOptions(DICT_TYPE.WMS_SHIPMENT_ORDER_TYPE, 'string'),
|
options: [],
|
||||||
placeholder: '请选择业务类型',
|
placeholder: '请选择业务类型',
|
||||||
},
|
},
|
||||||
fieldName: 'billType',
|
fieldName: 'billType',
|
||||||
@@ -159,6 +160,28 @@ const [ManualDetail, manualDetailApi] = useVbenModal({
|
|||||||
destroyOnClose: true,
|
destroyOnClose: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
async function loadBillTypeOptions() {
|
||||||
|
billTypeRequest ??= getSimpleDictDataList();
|
||||||
|
const request = billTypeRequest;
|
||||||
|
try {
|
||||||
|
const dictItems = await request;
|
||||||
|
outboundFormApi.updateSchema([
|
||||||
|
{
|
||||||
|
componentProps: {
|
||||||
|
allowClear: true,
|
||||||
|
options: filterOutboundBillTypeOptions(dictItems),
|
||||||
|
placeholder: '请选择业务类型',
|
||||||
|
},
|
||||||
|
fieldName: 'billType',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
} catch {
|
||||||
|
message.error('出库业务类型加载失败,请稍后重试');
|
||||||
|
} finally {
|
||||||
|
if (billTypeRequest === request) billTypeRequest = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{ key: 'index', title: '序号', width: 60 },
|
{ key: 'index', title: '序号', width: 60 },
|
||||||
{ dataIndex: 'materialCode', key: 'materialCode', title: '物料编码', width: 130 },
|
{ dataIndex: 'materialCode', key: 'materialCode', title: '物料编码', width: 130 },
|
||||||
@@ -293,12 +316,13 @@ const [Modal, modalApi] = useVbenModal({
|
|||||||
detailCount: 0,
|
detailCount: 0,
|
||||||
totalWeight: '0.000',
|
totalWeight: '0.000',
|
||||||
});
|
});
|
||||||
|
await loadBillTypeOptions();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
modalApi.lock();
|
modalApi.lock();
|
||||||
try {
|
try {
|
||||||
formData.value = data;
|
formData.value = data;
|
||||||
formData.value = await getIostorInv(Number(data.iostorinvId));
|
formData.value = await getIostorInv(data.iostorinvId);
|
||||||
await legacyFormApi.setValues(formData.value);
|
await legacyFormApi.setValues(formData.value);
|
||||||
} finally {
|
} finally {
|
||||||
modalApi.unlock();
|
modalApi.unlock();
|
||||||
|
|||||||
@@ -2,10 +2,23 @@ import { describe, expect, it } from 'vitest';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
buildOutboundPayload,
|
buildOutboundPayload,
|
||||||
|
filterOutboundBillTypeOptions,
|
||||||
mergeOutboundInventory,
|
mergeOutboundInventory,
|
||||||
shouldClearDetailsForWarehouseChange,
|
shouldClearDetailsForWarehouseChange,
|
||||||
} from './outbound-form';
|
} from './outbound-form';
|
||||||
|
|
||||||
|
describe('filterOutboundBillTypeOptions', () => {
|
||||||
|
it('从冷缓存接口结果中只提取启用的出库业务类型', () => {
|
||||||
|
expect(
|
||||||
|
filterOutboundBillTypeOptions([
|
||||||
|
{ dictType: 'in_bill_type', label: '采购入库', status: 0, value: '100' },
|
||||||
|
{ dictType: 'out_bill_type', label: '销售出库', status: 0, value: '201' },
|
||||||
|
{ dictType: 'out_bill_type', label: '停用出库', status: 1, value: '299' },
|
||||||
|
]),
|
||||||
|
).toEqual([{ label: '销售出库', value: '201' }]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('buildOutboundPayload', () => {
|
describe('buildOutboundPayload', () => {
|
||||||
it('将业务日期转换成毫秒,并剥离所有仅展示字段和汇总字段', () => {
|
it('将业务日期转换成毫秒,并剥离所有仅展示字段和汇总字段', () => {
|
||||||
const bizDate = new Date('2026-07-22T08:30:00+08:00');
|
const bizDate = new Date('2026-07-22T08:30:00+08:00');
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
import type { WmsIostorInvApi } from '#/api/wms/iostorinv';
|
import type { WmsIostorInvApi } from '#/api/wms/iostorinv';
|
||||||
|
|
||||||
|
export interface OutboundDictItem {
|
||||||
|
dictType: string;
|
||||||
|
label: string;
|
||||||
|
status?: number;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface OutboundFormValues {
|
export interface OutboundFormValues {
|
||||||
billType?: string;
|
billType?: string;
|
||||||
bizDate?: number | string | { valueOf: () => number };
|
bizDate?: number | string | { valueOf: () => number };
|
||||||
@@ -14,6 +21,12 @@ export interface OutboundFormDetail
|
|||||||
rowKey?: string;
|
rowKey?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function filterOutboundBillTypeOptions(items: OutboundDictItem[]) {
|
||||||
|
return items
|
||||||
|
.filter((item) => item.dictType === 'out_bill_type' && item.status !== 1)
|
||||||
|
.map(({ label, value }) => ({ label, value }));
|
||||||
|
}
|
||||||
|
|
||||||
export function buildOutboundPayload(
|
export function buildOutboundPayload(
|
||||||
values: OutboundFormValues,
|
values: OutboundFormValues,
|
||||||
details: OutboundFormDetail[],
|
details: OutboundFormDetail[],
|
||||||
|
|||||||
Reference in New Issue
Block a user