diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts index 6afad210..5c9cc4ae 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts @@ -1,6 +1,7 @@ -import type { PageParam, PageResult } from '@vben/request'; import type { Dayjs } from 'dayjs'; +import type { PageParam, PageResult } from '@vben/request'; + import { requestClient } from '#/api/request'; export namespace WmsIostorInvApi { @@ -10,7 +11,7 @@ export namespace WmsIostorInvApi { billCode?: string; // 单据编号 ioType?: string; // 出入类型 billType?: string; // 单据类型 - bizDate?: string | Dayjs; // 业务日期 + bizDate?: Dayjs | string; // 业务日期 storId: string; // 仓库标识 storCode: string; // 仓库编码 storName: string; // 仓库名称 @@ -24,15 +25,70 @@ export namespace WmsIostorInvApi { remark: string; // 备注 createMode?: string; // 生成方式 disOptid: string; // 分配人 - disTime?: string | Dayjs; // 分配时间 + disTime?: Dayjs | string; // 分配时间 confirmOptid: string; // 确认人 - confirmTime?: string | Dayjs; // 确认时间 + confirmTime?: Dayjs | string; // 确认时间 sysdeptid: string; // 部门ID syscompanyid: string; // 公司ID isUpload?: string; // 是否已上传 uploadOptid: string; // 回传人 uploadTime: string; // 回传时间 } + + /** 出库单可持久化明细 */ + export interface OutboundDetail { + materialCode: string; // 物料编码 + materialId?: string; // 物料标识 + pcsn?: string; // 批次序列号 + planQty: number; // 出库重量 + qtyUnitId?: string; // 数量单位标识 + qtyUnitName?: string; // 数量单位名称 + sourceBillCode?: string; // 来源单据编号 + sourceBillType?: string; // 来源单据类型 + sourceBilldtlId?: string; // 来源单据明细标识 + remark?: string; // 备注 + } + + /** 出库单新增请求 */ + export interface OutboundCreateReq { + billType: string; // 单据类型 + storId: string; // 仓库标识 + bizDate: Dayjs | string; // 业务日期 + remark?: string; // 备注 + details: OutboundDetail[]; // 出库单明细 + } + + /** 可用库存 */ + export interface AvailableInventory { + vehicleCode: string; // 箱号 + pcsn: string; // 批次 + materialId: string; // 物料标识 + materialCode: string; // 物料编码 + materialName: string; // 物料名称 + availableQty: number; // 可用数量 + qtyUnitId: string; // 计量单位标识 + qtyUnitName: string; // 计量单位名称 + extCode: string; // 来源单据号 + extType: string; // 来源单据类型 + extDtlCode: string; // 来源单据明细号 + storId: string; // 仓库标识 + storCode: string; // 仓库编码 + storName: string; // 仓库名称 + } + + /** 可用库存分页请求 */ + export interface AvailableInventoryPageReq extends PageParam { + storId: string; // 仓库标识 + materialCode?: string; // 物料编码 + vehicleCode?: string; // 箱号 + pcsn?: string; // 批次 + } + + /** 按箱号展开可用库存请求 */ + export interface ExpandAvailableInventoryReq { + storId: string; // 仓库标识 + vehicleCodes: string[]; // 箱号列表 + } } /** 查询出入库单主表分页 */ @@ -77,4 +133,27 @@ export function exportIostorInv(params: any) { return requestClient.download('/wms/iostor-inv/export-excel', { params }); } +/** 查询可用库存分页 */ +export function getAvailableInventoryPage( + params: WmsIostorInvApi.AvailableInventoryPageReq, +) { + return requestClient.get< + PageResult + >('/wms/iostor-inv/availableInventoryPage', { params }); +} + +/** 按箱号展开可用库存 */ +export function expandAvailableInventory( + data: WmsIostorInvApi.ExpandAvailableInventoryReq, +) { + return requestClient.post( + '/wms/iostor-inv/expandAvailableInventory', + data, + ); +} + +/** 创建出库单 */ +export function createOutbound(data: WmsIostorInvApi.OutboundCreateReq) { + return requestClient.post('/wms/iostor-inv/createOutbound', data); +} diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/detail-summary.test.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/detail-summary.test.ts new file mode 100644 index 00000000..03242aa8 --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/detail-summary.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from 'vitest'; + +import { summarizeDetails } from './detail-summary'; + +describe('summarizeDetails', () => { + it('汇总明细数量和总重量', () => { + expect( + summarizeDetails([{ planQty: 12.5 }, { planQty: 7.25 }]), + ).toEqual({ detailCount: 2, totalWeight: 19.75 }); + }); + + it('空明细返回零值', () => { + expect(summarizeDetails([])).toEqual({ detailCount: 0, totalWeight: 0 }); + }); +}); diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/detail-summary.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/detail-summary.ts new file mode 100644 index 00000000..7901b3ec --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/modules/detail-summary.ts @@ -0,0 +1,14 @@ +export interface OutboundDetailLike { + planQty: number; +} + +/** 汇总出库明细数量和重量 */ +export function summarizeDetails(details: OutboundDetailLike[]) { + return { + detailCount: details.length, + totalWeight: details.reduce( + (total, detail) => total + Number(detail.planQty), + 0, + ), + }; +}