diff --git a/apps/web-antd/src/api/wms/md/warehouse/index.ts b/apps/web-antd/src/api/wms/md/warehouse/index.ts new file mode 100644 index 000000000..2b99f3776 --- /dev/null +++ b/apps/web-antd/src/api/wms/md/warehouse/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsWarehouseApi { + /** WMS 仓库 */ + export interface Warehouse { + id?: number; + code?: string; + name?: string; + remark?: string; + sort?: number; + createTime?: Date; + } +} + +/** 查询仓库分页 */ +export function getWarehousePage(params: PageParam) { + return requestClient.get>( + '/wms/warehouse/page', + { params }, + ); +} + +/** 查询仓库精简列表 */ +export function getWarehouseSimpleList() { + return requestClient.get( + '/wms/warehouse/simple-list', + ); +} + +/** 查询仓库详情 */ +export function getWarehouse(id: number) { + return requestClient.get( + `/wms/warehouse/get?id=${id}`, + ); +} + +/** 新增仓库 */ +export function createWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.post('/wms/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.put('/wms/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/wms/warehouse/delete?id=${id}`); +} + +/** 导出仓库 */ +export function exportWarehouse(params: any) { + return requestClient.download('/wms/warehouse/export-excel', { params }); +} diff --git a/apps/web-antd/src/views/wms/md/warehouse/components/index.ts b/apps/web-antd/src/views/wms/md/warehouse/components/index.ts new file mode 100644 index 000000000..38d2851c3 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/components/index.ts @@ -0,0 +1 @@ +export { default as WmsWarehouseSelect } from './warehouse-select.vue'; diff --git a/apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue b/apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue new file mode 100644 index 000000000..19ef2e417 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue @@ -0,0 +1,85 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/warehouse/data.ts b/apps/web-antd/src/views/wms/md/warehouse/data.ts new file mode 100644 index 000000000..e64ccecd3 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/data.ts @@ -0,0 +1,138 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改仓库的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + maxLength: 50, + placeholder: '请输入仓库名称', + }, + rules: z.string().min(1, '仓库名称不能为空').max(50), + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入仓库编号', + }, + rules: z.string().min(1, '仓库编号不能为空').max(20), + suffix: () => { + return h( + Button, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('W')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'sort', + label: '排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxLength: 255, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入仓库名称', + }, + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入仓库编号', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '仓库名称', + minWidth: 160, + }, + { + field: 'code', + title: '仓库编号', + minWidth: 140, + }, + { + field: 'remark', + title: '备注', + minWidth: 220, + }, + { + field: 'sort', + title: '排序', + width: 100, + align: 'center', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/wms/md/warehouse/index.vue b/apps/web-antd/src/views/wms/md/warehouse/index.vue new file mode 100644 index 000000000..f4810f920 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue b/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue new file mode 100644 index 000000000..95d3e7eaa --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antd/src/views/wms/utils/constants.ts b/apps/web-antd/src/views/wms/utils/constants.ts new file mode 100644 index 000000000..a72929881 --- /dev/null +++ b/apps/web-antd/src/views/wms/utils/constants.ts @@ -0,0 +1,48 @@ +/** 单据状态枚举 */ +export const OrderStatusEnum = { + PREPARE: 0, // 草稿 + FINISHED: 4, // 已完成 + CANCELED: 5, // 已作废 +} as const; + +/** 可修改的单据状态 */ +export const OrderUpdateStatusList: number[] = [OrderStatusEnum.PREPARE]; + +/** 可删除的单据状态 */ +export const OrderDeleteStatusList: number[] = [ + OrderStatusEnum.PREPARE, + OrderStatusEnum.CANCELED, +]; + +/** 往来企业类型枚举 */ +export const MerchantTypeEnum = { + CUSTOMER: 1, // 客户 + SUPPLIER: 2, // 供应商 + CUSTOMER_SUPPLIER: 3, // 客户/供应商 +} as const; + +/** 供应商类型的往来企业 */ +export const SupplierMerchantTypeList = [ + MerchantTypeEnum.SUPPLIER, + MerchantTypeEnum.CUSTOMER_SUPPLIER, +]; + +/** 客户类型的往来企业 */ +export const CustomerMerchantTypeList = [ + MerchantTypeEnum.CUSTOMER, + MerchantTypeEnum.CUSTOMER_SUPPLIER, +]; + +/** + * 生成 WMS 编号 / 条码。 + * + * @param prefix 可选前缀,按业务域区分编号种类。 + * @returns 前缀 + 8 位随机数字串。 + */ +export function generateWmsCode(prefix = ''): string { + let result = ''; + for (let i = 0; i < 8; i++) { + result += Math.floor(Math.random() * 10).toString(); + } + return prefix + result; +} diff --git a/apps/web-ele/src/api/wms/md/warehouse/index.ts b/apps/web-ele/src/api/wms/md/warehouse/index.ts new file mode 100644 index 000000000..2b99f3776 --- /dev/null +++ b/apps/web-ele/src/api/wms/md/warehouse/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsWarehouseApi { + /** WMS 仓库 */ + export interface Warehouse { + id?: number; + code?: string; + name?: string; + remark?: string; + sort?: number; + createTime?: Date; + } +} + +/** 查询仓库分页 */ +export function getWarehousePage(params: PageParam) { + return requestClient.get>( + '/wms/warehouse/page', + { params }, + ); +} + +/** 查询仓库精简列表 */ +export function getWarehouseSimpleList() { + return requestClient.get( + '/wms/warehouse/simple-list', + ); +} + +/** 查询仓库详情 */ +export function getWarehouse(id: number) { + return requestClient.get( + `/wms/warehouse/get?id=${id}`, + ); +} + +/** 新增仓库 */ +export function createWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.post('/wms/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.put('/wms/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/wms/warehouse/delete?id=${id}`); +} + +/** 导出仓库 */ +export function exportWarehouse(params: any) { + return requestClient.download('/wms/warehouse/export-excel', { params }); +} diff --git a/apps/web-ele/src/views/wms/md/warehouse/components/index.ts b/apps/web-ele/src/views/wms/md/warehouse/components/index.ts new file mode 100644 index 000000000..38d2851c3 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/components/index.ts @@ -0,0 +1 @@ +export { default as WmsWarehouseSelect } from './warehouse-select.vue'; diff --git a/apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue b/apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue new file mode 100644 index 000000000..d40833ed3 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue @@ -0,0 +1,88 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/warehouse/data.ts b/apps/web-ele/src/views/wms/md/warehouse/data.ts new file mode 100644 index 000000000..42cca9655 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/data.ts @@ -0,0 +1,139 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改仓库的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + maxLength: 50, + placeholder: '请输入仓库名称', + }, + rules: z.string().min(1, '仓库名称不能为空').max(50), + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入仓库编号', + }, + rules: z.string().min(1, '仓库编号不能为空').max(20), + suffix: () => { + return h( + ElButton, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('W')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'sort', + label: '排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxLength: 255, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入仓库名称', + }, + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入仓库编号', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '仓库名称', + minWidth: 160, + }, + { + field: 'code', + title: '仓库编号', + minWidth: 140, + }, + { + field: 'remark', + title: '备注', + minWidth: 220, + }, + { + field: 'sort', + title: '排序', + width: 100, + align: 'center', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/wms/md/warehouse/index.vue b/apps/web-ele/src/views/wms/md/warehouse/index.vue new file mode 100644 index 000000000..753bae133 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue b/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue new file mode 100644 index 000000000..93709fe89 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-ele/src/views/wms/utils/constants.ts b/apps/web-ele/src/views/wms/utils/constants.ts new file mode 100644 index 000000000..b7d8166cc --- /dev/null +++ b/apps/web-ele/src/views/wms/utils/constants.ts @@ -0,0 +1,13 @@ +/** + * 生成 WMS 编号 / 条码。 + * + * @param prefix 可选前缀,按业务域区分编号种类。 + * @returns 前缀 + 8 位随机数字串。 + */ +export function generateWmsCode(prefix = ''): string { + let result = ''; + for (let i = 0; i < 8; i++) { + result += Math.floor(Math.random() * 10).toString(); + } + return prefix + result; +}