diff --git a/src/api/wms/home/index.ts b/src/api/wms/home/index.ts new file mode 100644 index 000000000..3c747bd87 --- /dev/null +++ b/src/api/wms/home/index.ts @@ -0,0 +1,77 @@ +import request from '@/config/axios' + +// WMS 首页统计查询参数 +export interface WmsHomeStatisticsReqVO { + warehouseId?: number + goodsLimit?: number + warehouseLimit?: number +} + +// WMS 首页单据状态统计 VO +export interface WmsHomeOrderStatusVO { + status: number + count: number +} + +// WMS 首页单据汇总统计 VO +export interface WmsHomeOrderSummaryVO { + type: number + total: number + statuses: WmsHomeOrderStatusVO[] +} + +// WMS 首页单据趋势 VO +export interface WmsHomeOrderTrendVO { + time: string | number + receiptCount: number + shipmentCount: number + movementCount: number + checkCount: number +} + +// WMS 首页商品库存排行 VO +export interface WmsHomeInventoryItemRankVO { + id: number + name: string + quantity: number +} + +// WMS 首页仓库库存排行 VO +export interface WmsHomeInventoryWarehouseRankVO { + id: number + name: string + quantity: number +} + +// WMS 首页库存汇总统计 VO +export interface WmsHomeInventorySummaryVO { + totalQuantity: number + goodsShareList: WmsHomeInventoryItemRankVO[] + warehouseDistributionList: WmsHomeInventoryWarehouseRankVO[] +} + +// WMS 首页统计 API +export const WmsHomeStatisticsApi = { + // 获得首页单据汇总统计 + getOrderSummary: async (params?: WmsHomeStatisticsReqVO): Promise => { + return await request.get({ url: `/wms/home-statistics/order-summary`, params }) + }, + + // 获得首页单据趋势 + getOrderTrend: async ( + days?: number, + params?: WmsHomeStatisticsReqVO + ): Promise => { + return await request.get({ + url: `/wms/home-statistics/order-trend`, + params: { ...params, days } + }) + }, + + // 获得首页库存汇总统计 + getInventorySummary: async ( + params?: WmsHomeStatisticsReqVO + ): Promise => { + return await request.get({ url: `/wms/home-statistics/inventory-summary`, params }) + } +} diff --git a/src/api/wms/inventory/history/index.ts b/src/api/wms/inventory/history/index.ts new file mode 100644 index 000000000..a0ce1d1da --- /dev/null +++ b/src/api/wms/inventory/history/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +// WMS 库存记录 VO +export interface InventoryHistoryVO { + id?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + quantity?: number + beforeQuantity?: number + afterQuantity?: number + price?: number + totalPrice?: number + remark?: string + orderId?: number + orderNo?: string + orderType?: number + createTime?: Date +} + +// WMS 库存记录 API +export const InventoryHistoryApi = { + // 查询库存记录分页 + getInventoryHistoryPage: async (params: any) => { + return await request.get({ url: '/wms/inventory-history/page', params }) + } +} diff --git a/src/api/wms/inventory/index.ts b/src/api/wms/inventory/index.ts new file mode 100644 index 000000000..6cddf4617 --- /dev/null +++ b/src/api/wms/inventory/index.ts @@ -0,0 +1,36 @@ +import request from '@/config/axios' + +// WMS 库存统计 VO +export interface InventoryVO { + id?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + quantity?: number + remark?: string + createTime?: Date +} + +// WMS 库存统计列表 Request VO +export interface InventoryListReqVO { + warehouseId: number +} + +// WMS 库存统计 API +export const InventoryApi = { + // 查询库存统计分页 + getInventoryPage: async (params: any) => { + return await request.get({ url: '/wms/inventory/page', params }) + }, + + // 查询库存统计列表 + getInventoryList: async (params: InventoryListReqVO) => { + return await request.get({ url: '/wms/inventory/list', params }) + } +} diff --git a/src/api/wms/md/item/brand/index.ts b/src/api/wms/md/item/brand/index.ts new file mode 100644 index 000000000..01e2b4c1c --- /dev/null +++ b/src/api/wms/md/item/brand/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +// WMS 商品品牌 VO +export interface ItemBrandVO { + id?: number + code?: string + name?: string + createTime?: Date +} + +// WMS 商品品牌 API +export const ItemBrandApi = { + // 查询商品品牌分页 + getItemBrandPage: async (params: any) => { + return await request.get({ url: '/wms/item-brand/page', params }) + }, + + // 查询商品品牌精简列表 + getItemBrandSimpleList: async () => { + return await request.get({ url: '/wms/item-brand/simple-list' }) + }, + + // 查询商品品牌详情 + getItemBrand: async (id: number) => { + return await request.get({ url: '/wms/item-brand/get?id=' + id }) + }, + + // 新增商品品牌 + createItemBrand: async (data: ItemBrandVO) => { + return await request.post({ url: '/wms/item-brand/create', data }) + }, + + // 修改商品品牌 + updateItemBrand: async (data: ItemBrandVO) => { + return await request.put({ url: '/wms/item-brand/update', data }) + }, + + // 删除商品品牌 + deleteItemBrand: async (id: number) => { + return await request.delete({ url: '/wms/item-brand/delete?id=' + id }) + }, + + // 导出商品品牌 + exportItemBrand: async (params) => { + return await request.download({ url: '/wms/item-brand/export-excel', params }) + } +} diff --git a/src/api/wms/md/item/category/index.ts b/src/api/wms/md/item/category/index.ts new file mode 100644 index 000000000..bc654a252 --- /dev/null +++ b/src/api/wms/md/item/category/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +// WMS 商品分类 VO +export interface ItemCategoryVO { + id?: number + parentId?: number + code?: string + name?: string + sort?: number + status?: number + createTime?: Date + children?: ItemCategoryVO[] +} + +// WMS 商品分类 API +export const ItemCategoryApi = { + // 查询商品分类列表 + getItemCategoryList: async (params?: any) => { + return await request.get({ url: '/wms/item-category/list', params }) + }, + + // 查询商品分类精简列表 + getItemCategorySimpleList: async () => { + return await request.get({ url: '/wms/item-category/simple-list' }) + }, + + // 查询商品分类详情 + getItemCategory: async (id: number) => { + return await request.get({ url: '/wms/item-category/get?id=' + id }) + }, + + // 新增商品分类 + createItemCategory: async (data: ItemCategoryVO) => { + return await request.post({ url: '/wms/item-category/create', data }) + }, + + // 修改商品分类 + updateItemCategory: async (data: ItemCategoryVO) => { + return await request.put({ url: '/wms/item-category/update', data }) + }, + + // 删除商品分类 + deleteItemCategory: async (id: number) => { + return await request.delete({ url: '/wms/item-category/delete?id=' + id }) + } +} diff --git a/src/api/wms/md/item/index.ts b/src/api/wms/md/item/index.ts new file mode 100644 index 000000000..77ad3f12d --- /dev/null +++ b/src/api/wms/md/item/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' +import { ItemSkuVO } from './sku' + +// WMS 商品 VO +export interface ItemVO { + id?: number + code?: string + name?: string + categoryId?: number + categoryName?: string + unit?: string + brandId?: number + brandName?: string + remark?: string + skus?: ItemSkuVO[] + createTime?: Date +} + +// WMS 商品 API +export const ItemApi = { + // 查询商品分页 + getItemPage: async (params: any) => { + return await request.get({ url: '/wms/item/page', params }) + }, + + // 查询商品精简列表 + getItemSimpleList: async (params?: any) => { + return await request.get({ url: '/wms/item/simple-list', params }) + }, + + // 查询商品详情 + getItem: async (id: number) => { + return await request.get({ url: '/wms/item/get?id=' + id }) + }, + + // 新增商品 + createItem: async (data: ItemVO) => { + return await request.post({ url: '/wms/item/create', data }) + }, + + // 修改商品 + updateItem: async (data: ItemVO) => { + return await request.put({ url: '/wms/item/update', data }) + }, + + // 删除商品 + deleteItem: async (id: number) => { + return await request.delete({ url: '/wms/item/delete?id=' + id }) + }, + + // 导出商品 + exportItem: async (params: any) => { + return await request.download({ url: '/wms/item/export-excel', params }) + } +} diff --git a/src/api/wms/md/item/sku/index.ts b/src/api/wms/md/item/sku/index.ts new file mode 100644 index 000000000..886d91b36 --- /dev/null +++ b/src/api/wms/md/item/sku/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +// WMS 商品 SKU VO +export interface ItemSkuVO { + id?: number + name?: string + itemId?: number + itemCode?: string + itemName?: string + categoryId?: number + categoryName?: string + unit?: string + brandId?: number + brandName?: string + barCode?: string + code?: string + length?: number + width?: number + height?: number + grossWeight?: number + netWeight?: number + costPrice?: number + sellingPrice?: number + createTime?: Date +} + +// WMS 商品 SKU API +export const ItemSkuApi = { + // 按 SKU 维度分页(支持商品 / 品牌 / 分类多表联查筛选) + getItemSkuPage: async (params: any) => { + return await request.get({ url: '/wms/item-sku/page', params }) + } +} diff --git a/src/api/wms/md/merchant/index.ts b/src/api/wms/md/merchant/index.ts new file mode 100644 index 000000000..94527ce18 --- /dev/null +++ b/src/api/wms/md/merchant/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +// WMS 往来企业 VO +export interface MerchantVO { + id?: number + code?: string + name?: string + type?: number + level?: string + bankName?: string + bankAccount?: string + address?: string + mobile?: string + telephone?: string + contact?: string + email?: string + remark?: string + createTime?: Date +} + +export interface MerchantSimpleListReqVO { + types?: number[] +} + +// WMS 往来企业 API +export const MerchantApi = { + // 查询往来企业分页 + getMerchantPage: async (params: any) => { + return await request.get({ url: '/wms/merchant/page', params }) + }, + + // 查询往来企业精简列表 + getMerchantSimpleList: async (params?: MerchantSimpleListReqVO) => { + return await request.get({ url: '/wms/merchant/simple-list', params }) + }, + + // 查询往来企业详情 + getMerchant: async (id: number) => { + return await request.get({ url: '/wms/merchant/get?id=' + id }) + }, + + // 新增往来企业 + createMerchant: async (data: MerchantVO) => { + return await request.post({ url: '/wms/merchant/create', data }) + }, + + // 修改往来企业 + updateMerchant: async (data: MerchantVO) => { + return await request.put({ url: '/wms/merchant/update', data }) + }, + + // 删除往来企业 + deleteMerchant: async (id: number) => { + return await request.delete({ url: '/wms/merchant/delete?id=' + id }) + }, + + // 导出往来企业 + exportMerchant: async (params: any) => { + return await request.download({ url: '/wms/merchant/export-excel', params }) + } +} diff --git a/src/api/wms/md/warehouse/index.ts b/src/api/wms/md/warehouse/index.ts new file mode 100644 index 000000000..b08bd965f --- /dev/null +++ b/src/api/wms/md/warehouse/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +// WMS 仓库 VO +export interface WarehouseVO { + id?: number + code?: string + name?: string + remark?: string + sort?: number + createTime?: Date +} + +// WMS 仓库 API +export const WarehouseApi = { + // 查询仓库分页 + getWarehousePage: async (params: any) => { + return await request.get({ url: '/wms/warehouse/page', params }) + }, + + // 查询仓库精简列表 + getWarehouseSimpleList: async () => { + return await request.get({ url: '/wms/warehouse/simple-list' }) + }, + + // 查询仓库详情 + getWarehouse: async (id: number) => { + return await request.get({ url: '/wms/warehouse/get?id=' + id }) + }, + + // 新增仓库 + createWarehouse: async (data: WarehouseVO) => { + return await request.post({ url: '/wms/warehouse/create', data }) + }, + + // 修改仓库 + updateWarehouse: async (data: WarehouseVO) => { + return await request.put({ url: '/wms/warehouse/update', data }) + }, + + // 删除仓库 + deleteWarehouse: async (id: number) => { + return await request.delete({ url: '/wms/warehouse/delete?id=' + id }) + }, + + // 导出仓库 + exportWarehouse: async (params) => { + return await request.download({ url: '/wms/warehouse/export-excel', params }) + } +} diff --git a/src/api/wms/order/check/detail/index.ts b/src/api/wms/order/check/detail/index.ts new file mode 100644 index 000000000..9424a3064 --- /dev/null +++ b/src/api/wms/order/check/detail/index.ts @@ -0,0 +1,21 @@ +// WMS 盘库单明细 VO +export interface CheckOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + inventoryId?: number + warehouseId?: number + warehouseName?: string + receiptTime?: Date + quantity?: number + checkQuantity?: number + availableQuantity?: number + price?: number + createTime?: Date +} diff --git a/src/api/wms/order/check/index.ts b/src/api/wms/order/check/index.ts new file mode 100644 index 000000000..a28b298ef --- /dev/null +++ b/src/api/wms/order/check/index.ts @@ -0,0 +1,73 @@ +import request from '@/config/axios' +import { CheckOrderDetailVO } from './detail' + +// WMS 盘库单 VO +export interface CheckOrderVO { + id?: number + no?: string + orderTime?: string + status?: number + remark?: string + warehouseId?: number + warehouseName?: string + totalQuantity?: number + totalPrice?: number + actualPrice?: number + details?: CheckOrderDetailVO[] + createTime?: Date + creator?: string + creatorName?: string + updateTime?: Date + updater?: string + updaterName?: string +} + +// WMS 盘库单 API +export const CheckOrderApi = { + // 查询盘库单分页 + getCheckOrderPage: async (params: any) => { + return await request.get({ url: '/wms/check-order/page', params }) + }, + + // 查询盘库单详情 + getCheckOrder: async (id: number) => { + return await request.get({ url: '/wms/check-order/get?id=' + id }) + }, + + // 查询盘库单明细 + getCheckOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/check-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增盘库单 + createCheckOrder: async (data: CheckOrderVO) => { + return await request.post({ url: '/wms/check-order/create', data }) + }, + + // 修改盘库单 + updateCheckOrder: async (data: CheckOrderVO) => { + return await request.put({ url: '/wms/check-order/update', data }) + }, + + // 完成盘库 + completeCheckOrder: async (id: number) => { + return await request.put({ url: '/wms/check-order/complete?id=' + id }) + }, + + // 作废盘库单 + cancelCheckOrder: async (id: number) => { + return await request.put({ url: '/wms/check-order/cancel?id=' + id }) + }, + + // 删除盘库单 + deleteCheckOrder: async (id: number) => { + return await request.delete({ url: '/wms/check-order/delete?id=' + id }) + }, + + // 导出盘库单 + exportCheckOrder: async (params: any) => { + return await request.download({ url: '/wms/check-order/export-excel', params }) + } +} diff --git a/src/api/wms/order/movement/detail/index.ts b/src/api/wms/order/movement/detail/index.ts new file mode 100644 index 000000000..accd5fe93 --- /dev/null +++ b/src/api/wms/order/movement/detail/index.ts @@ -0,0 +1,21 @@ +// WMS 移库单明细 VO +export interface MovementOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + sourceWarehouseId?: number + sourceWarehouseName?: string + targetWarehouseId?: number + targetWarehouseName?: string + quantity?: number + availableQuantity?: number + price?: number + totalPrice?: number + createTime?: Date +} diff --git a/src/api/wms/order/movement/index.ts b/src/api/wms/order/movement/index.ts new file mode 100644 index 000000000..20204fbc4 --- /dev/null +++ b/src/api/wms/order/movement/index.ts @@ -0,0 +1,74 @@ +import request from '@/config/axios' +import { MovementOrderDetailVO } from './detail' + +// WMS 移库单 VO +export interface MovementOrderVO { + id?: number + no?: string + orderTime?: string + status?: number + remark?: string + sourceWarehouseId?: number + sourceWarehouseName?: string + targetWarehouseId?: number + targetWarehouseName?: string + totalQuantity?: number + totalPrice?: number + details?: MovementOrderDetailVO[] + createTime?: Date + creator?: string + creatorName?: string + updateTime?: Date + updater?: string + updaterName?: string +} + +// WMS 移库单 API +export const MovementOrderApi = { + // 查询移库单分页 + getMovementOrderPage: async (params: any) => { + return await request.get({ url: '/wms/movement-order/page', params }) + }, + + // 查询移库单详情 + getMovementOrder: async (id: number) => { + return await request.get({ url: '/wms/movement-order/get?id=' + id }) + }, + + // 查询移库单明细 + getMovementOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/movement-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增移库单 + createMovementOrder: async (data: MovementOrderVO) => { + return await request.post({ url: '/wms/movement-order/create', data }) + }, + + // 修改移库单 + updateMovementOrder: async (data: MovementOrderVO) => { + return await request.put({ url: '/wms/movement-order/update', data }) + }, + + // 完成移库 + completeMovementOrder: async (id: number) => { + return await request.put({ url: '/wms/movement-order/complete?id=' + id }) + }, + + // 作废移库单 + cancelMovementOrder: async (id: number) => { + return await request.put({ url: '/wms/movement-order/cancel?id=' + id }) + }, + + // 删除移库单 + deleteMovementOrder: async (id: number) => { + return await request.delete({ url: '/wms/movement-order/delete?id=' + id }) + }, + + // 导出移库单 + exportMovementOrder: async (params: any) => { + return await request.download({ url: '/wms/movement-order/export-excel', params }) + } +} diff --git a/src/api/wms/order/receipt/detail/index.ts b/src/api/wms/order/receipt/detail/index.ts new file mode 100644 index 000000000..582bc7977 --- /dev/null +++ b/src/api/wms/order/receipt/detail/index.ts @@ -0,0 +1,18 @@ +// WMS 入库单明细 VO +export interface ReceiptOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + quantity?: number + price?: number + totalPrice?: number + createTime?: Date +} diff --git a/src/api/wms/order/receipt/index.ts b/src/api/wms/order/receipt/index.ts new file mode 100644 index 000000000..4965112ec --- /dev/null +++ b/src/api/wms/order/receipt/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' +import { ReceiptOrderDetailVO } from './detail' + +// WMS 入库单 VO +export interface ReceiptOrderVO { + id?: number + no?: string + type?: number + orderTime?: string + status?: number + bizOrderNo?: string + merchantId?: number + merchantName?: string + remark?: string + warehouseId?: number + warehouseName?: string + totalQuantity?: number + totalPrice?: number + details?: ReceiptOrderDetailVO[] + createTime?: Date + creator?: string + creatorName?: string + updateTime?: Date + updater?: string + updaterName?: string +} + +// WMS 入库单 API +export const ReceiptOrderApi = { + // 查询入库单分页 + getReceiptOrderPage: async (params: any) => { + return await request.get({ url: '/wms/receipt-order/page', params }) + }, + + // 查询入库单详情 + getReceiptOrder: async (id: number) => { + return await request.get({ url: '/wms/receipt-order/get?id=' + id }) + }, + + // 查询入库单明细 + getReceiptOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/receipt-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增入库单 + createReceiptOrder: async (data: ReceiptOrderVO) => { + return await request.post({ url: '/wms/receipt-order/create', data }) + }, + + // 修改入库单 + updateReceiptOrder: async (data: ReceiptOrderVO) => { + return await request.put({ url: '/wms/receipt-order/update', data }) + }, + + // 完成入库 + completeReceiptOrder: async (id: number) => { + return await request.put({ url: '/wms/receipt-order/complete?id=' + id }) + }, + + // 作废入库单 + cancelReceiptOrder: async (id: number) => { + return await request.put({ url: '/wms/receipt-order/cancel?id=' + id }) + }, + + // 删除入库单 + deleteReceiptOrder: async (id: number) => { + return await request.delete({ url: '/wms/receipt-order/delete?id=' + id }) + }, + + // 导出入库单 + exportReceiptOrder: async (params: any) => { + return await request.download({ url: '/wms/receipt-order/export-excel', params }) + } +} diff --git a/src/api/wms/order/shipment/detail/index.ts b/src/api/wms/order/shipment/detail/index.ts new file mode 100644 index 000000000..4f2d5c0e9 --- /dev/null +++ b/src/api/wms/order/shipment/detail/index.ts @@ -0,0 +1,19 @@ +// WMS 出库单明细 VO +export interface ShipmentOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + quantity?: number + availableQuantity?: number + price?: number + totalPrice?: number + createTime?: Date +} diff --git a/src/api/wms/order/shipment/index.ts b/src/api/wms/order/shipment/index.ts new file mode 100644 index 000000000..2f1b0ea49 --- /dev/null +++ b/src/api/wms/order/shipment/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' +import { ShipmentOrderDetailVO } from './detail' + +// WMS 出库单 VO +export interface ShipmentOrderVO { + id?: number + no?: string + type?: number + orderTime?: string + status?: number + bizOrderNo?: string + merchantId?: number + merchantName?: string + remark?: string + warehouseId?: number + warehouseName?: string + totalQuantity?: number + totalPrice?: number + details?: ShipmentOrderDetailVO[] + createTime?: Date + creator?: string + creatorName?: string + updateTime?: Date + updater?: string + updaterName?: string +} + +// WMS 出库单 API +export const ShipmentOrderApi = { + // 查询出库单分页 + getShipmentOrderPage: async (params: any) => { + return await request.get({ url: '/wms/shipment-order/page', params }) + }, + + // 查询出库单详情 + getShipmentOrder: async (id: number) => { + return await request.get({ url: '/wms/shipment-order/get?id=' + id }) + }, + + // 查询出库单明细 + getShipmentOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/shipment-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增出库单 + createShipmentOrder: async (data: ShipmentOrderVO) => { + return await request.post({ url: '/wms/shipment-order/create', data }) + }, + + // 修改出库单 + updateShipmentOrder: async (data: ShipmentOrderVO) => { + return await request.put({ url: '/wms/shipment-order/update', data }) + }, + + // 完成出库 + completeShipmentOrder: async (id: number) => { + return await request.put({ url: '/wms/shipment-order/complete?id=' + id }) + }, + + // 作废出库单 + cancelShipmentOrder: async (id: number) => { + return await request.put({ url: '/wms/shipment-order/cancel?id=' + id }) + }, + + // 删除出库单 + deleteShipmentOrder: async (id: number) => { + return await request.delete({ url: '/wms/shipment-order/delete?id=' + id }) + }, + + // 导出出库单 + exportShipmentOrder: async (params: any) => { + return await request.download({ url: '/wms/shipment-order/export-excel', params }) + } +} diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 91909f538..35774ab65 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -216,6 +216,13 @@ export enum DICT_TYPE { ERP_AUDIT_STATUS = 'erp_audit_status', // ERP 审批状态 ERP_STOCK_RECORD_BIZ_TYPE = 'erp_stock_record_biz_type', // 库存明细的业务类型 + // ========== WMS - 仓库管理模块 ========== + WMS_MERCHANT_TYPE = 'merchant_type', // WMS 往来企业类型 + WMS_ORDER_TYPE = 'wms_order_type', // WMS 单据类型 + WMS_ORDER_STATUS = 'wms_order_status', // WMS 单据状态 + WMS_RECEIPT_ORDER_TYPE = 'wms_receipt_order_type', // WMS 入库单类型 + WMS_SHIPMENT_ORDER_TYPE = 'wms_shipment_order_type', // WMS 出库单类型 + // ========== AI - 人工智能模块 ========== AI_PLATFORM = 'ai_platform', // AI 平台 AI_MODEL_TYPE = 'ai_model_type', // AI 模型类型 diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts index 99eb428c3..570464823 100644 --- a/src/utils/formatTime.ts +++ b/src/utils/formatTime.ts @@ -63,7 +63,7 @@ export const defaultShortcuts = [ * @description format 季度 + 星期 + 几周:"YYYY-MM-DD HH:mm:ss WWW QQQQ ZZZ" * @returns 返回拼接后的时间字符串 */ -export function formatDate(date: Date, format?: string): string { +export function formatDate(date: Date | string, format?: string): string { // 日期不存在,则返回空 if (!date) { return '' @@ -72,6 +72,25 @@ export function formatDate(date: Date, format?: string): string { return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : '' } +/** + * 格式化可为空的时间日期 + * + * @param date 当前时间,new Date() 格式或者字符串时间格式 + * @param format 需要转换的时间格式字符串 + * @param emptyText 空值展示文案 + * @returns 返回格式化后的时间字符串 + */ +export function formatNullableDate( + date?: Date | string | null, + format = 'YYYY-MM-DD HH:mm:ss', + emptyText = '-' +): string { + if (!date) { + return emptyText + } + return formatDate(date, format) || emptyText +} + /** * 获取当前的日期+时间 */ diff --git a/src/views/wms/home/components/WmsHomeInventoryCharts.vue b/src/views/wms/home/components/WmsHomeInventoryCharts.vue new file mode 100644 index 000000000..a0ca3f6fc --- /dev/null +++ b/src/views/wms/home/components/WmsHomeInventoryCharts.vue @@ -0,0 +1,211 @@ + + + diff --git a/src/views/wms/home/components/WmsHomeOrderSummaryCards.vue b/src/views/wms/home/components/WmsHomeOrderSummaryCards.vue new file mode 100644 index 000000000..32b3ef580 --- /dev/null +++ b/src/views/wms/home/components/WmsHomeOrderSummaryCards.vue @@ -0,0 +1,221 @@ + + + diff --git a/src/views/wms/home/components/WmsHomeOrderTrendChart.vue b/src/views/wms/home/components/WmsHomeOrderTrendChart.vue new file mode 100644 index 000000000..06c152850 --- /dev/null +++ b/src/views/wms/home/components/WmsHomeOrderTrendChart.vue @@ -0,0 +1,174 @@ + + + diff --git a/src/views/wms/home/index.vue b/src/views/wms/home/index.vue new file mode 100644 index 000000000..08b38e592 --- /dev/null +++ b/src/views/wms/home/index.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/wms/inventory/components/InventorySelect.vue b/src/views/wms/inventory/components/InventorySelect.vue new file mode 100644 index 000000000..125355875 --- /dev/null +++ b/src/views/wms/inventory/components/InventorySelect.vue @@ -0,0 +1,261 @@ + + + + diff --git a/src/views/wms/inventory/history/index.vue b/src/views/wms/inventory/history/index.vue new file mode 100644 index 000000000..b85e12e7d --- /dev/null +++ b/src/views/wms/inventory/history/index.vue @@ -0,0 +1,237 @@ + + + + diff --git a/src/views/wms/inventory/index/index.vue b/src/views/wms/inventory/index/index.vue new file mode 100644 index 000000000..31374477b --- /dev/null +++ b/src/views/wms/inventory/index/index.vue @@ -0,0 +1,281 @@ + + + + diff --git a/src/views/wms/md/item/ItemForm.vue b/src/views/wms/md/item/ItemForm.vue new file mode 100644 index 000000000..a8a3ebcda --- /dev/null +++ b/src/views/wms/md/item/ItemForm.vue @@ -0,0 +1,307 @@ + + + + diff --git a/src/views/wms/md/item/brand/ItemBrandForm.vue b/src/views/wms/md/item/brand/ItemBrandForm.vue new file mode 100644 index 000000000..ef97abafc --- /dev/null +++ b/src/views/wms/md/item/brand/ItemBrandForm.vue @@ -0,0 +1,105 @@ + + + + diff --git a/src/views/wms/md/item/brand/components/ItemBrandSelect.vue b/src/views/wms/md/item/brand/components/ItemBrandSelect.vue new file mode 100644 index 000000000..87ea86a71 --- /dev/null +++ b/src/views/wms/md/item/brand/components/ItemBrandSelect.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/views/wms/md/item/brand/index.vue b/src/views/wms/md/item/brand/index.vue new file mode 100644 index 000000000..3cf4f626b --- /dev/null +++ b/src/views/wms/md/item/brand/index.vue @@ -0,0 +1,194 @@ + + + + diff --git a/src/views/wms/md/item/category/ItemCategoryForm.vue b/src/views/wms/md/item/category/ItemCategoryForm.vue new file mode 100644 index 000000000..9b13664d0 --- /dev/null +++ b/src/views/wms/md/item/category/ItemCategoryForm.vue @@ -0,0 +1,163 @@ + + + diff --git a/src/views/wms/md/item/category/components/ItemCategorySelect.vue b/src/views/wms/md/item/category/components/ItemCategorySelect.vue new file mode 100644 index 000000000..5df2a5f1e --- /dev/null +++ b/src/views/wms/md/item/category/components/ItemCategorySelect.vue @@ -0,0 +1,57 @@ + + + + diff --git a/src/views/wms/md/item/category/components/ItemCategoryTree.vue b/src/views/wms/md/item/category/components/ItemCategoryTree.vue new file mode 100644 index 000000000..53a00182a --- /dev/null +++ b/src/views/wms/md/item/category/components/ItemCategoryTree.vue @@ -0,0 +1,100 @@ + + + + diff --git a/src/views/wms/md/item/category/index.vue b/src/views/wms/md/item/category/index.vue new file mode 100644 index 000000000..9bc9bd4ec --- /dev/null +++ b/src/views/wms/md/item/category/index.vue @@ -0,0 +1,213 @@ + + + + diff --git a/src/views/wms/md/item/index.vue b/src/views/wms/md/item/index.vue new file mode 100644 index 000000000..b7eb83756 --- /dev/null +++ b/src/views/wms/md/item/index.vue @@ -0,0 +1,311 @@ + + + + diff --git a/src/views/wms/md/item/sku/components/ItemSkuSelect.vue b/src/views/wms/md/item/sku/components/ItemSkuSelect.vue new file mode 100644 index 000000000..39c74d613 --- /dev/null +++ b/src/views/wms/md/item/sku/components/ItemSkuSelect.vue @@ -0,0 +1,327 @@ + + + + diff --git a/src/views/wms/md/merchant/MerchantForm.vue b/src/views/wms/md/merchant/MerchantForm.vue new file mode 100644 index 000000000..b111eb900 --- /dev/null +++ b/src/views/wms/md/merchant/MerchantForm.vue @@ -0,0 +1,190 @@ + + + + diff --git a/src/views/wms/md/merchant/components/MerchantSelect.vue b/src/views/wms/md/merchant/components/MerchantSelect.vue new file mode 100644 index 000000000..90bd59939 --- /dev/null +++ b/src/views/wms/md/merchant/components/MerchantSelect.vue @@ -0,0 +1,98 @@ + + + + diff --git a/src/views/wms/md/merchant/index.vue b/src/views/wms/md/merchant/index.vue new file mode 100644 index 000000000..5aa27392f --- /dev/null +++ b/src/views/wms/md/merchant/index.vue @@ -0,0 +1,211 @@ + + + + diff --git a/src/views/wms/md/warehouse/WarehouseForm.vue b/src/views/wms/md/warehouse/WarehouseForm.vue new file mode 100644 index 000000000..850d4229c --- /dev/null +++ b/src/views/wms/md/warehouse/WarehouseForm.vue @@ -0,0 +1,126 @@ + + + + diff --git a/src/views/wms/md/warehouse/components/WarehouseSelect.vue b/src/views/wms/md/warehouse/components/WarehouseSelect.vue new file mode 100644 index 000000000..b652ea596 --- /dev/null +++ b/src/views/wms/md/warehouse/components/WarehouseSelect.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/views/wms/md/warehouse/index.vue b/src/views/wms/md/warehouse/index.vue new file mode 100644 index 000000000..36cdca370 --- /dev/null +++ b/src/views/wms/md/warehouse/index.vue @@ -0,0 +1,201 @@ + + + + diff --git a/src/views/wms/order/check/CheckOrderDetail.vue b/src/views/wms/order/check/CheckOrderDetail.vue new file mode 100644 index 000000000..a44230454 --- /dev/null +++ b/src/views/wms/order/check/CheckOrderDetail.vue @@ -0,0 +1,202 @@ + + + + diff --git a/src/views/wms/order/check/CheckOrderForm.vue b/src/views/wms/order/check/CheckOrderForm.vue new file mode 100644 index 000000000..fbc184c48 --- /dev/null +++ b/src/views/wms/order/check/CheckOrderForm.vue @@ -0,0 +1,668 @@ + + + + diff --git a/src/views/wms/order/check/CheckOrderPrint.vue b/src/views/wms/order/check/CheckOrderPrint.vue new file mode 100644 index 000000000..de0effcf7 --- /dev/null +++ b/src/views/wms/order/check/CheckOrderPrint.vue @@ -0,0 +1,222 @@ + + + + diff --git a/src/views/wms/order/check/index.vue b/src/views/wms/order/check/index.vue new file mode 100644 index 000000000..7678a3bd9 --- /dev/null +++ b/src/views/wms/order/check/index.vue @@ -0,0 +1,618 @@ + + + + diff --git a/src/views/wms/order/movement/MovementOrderDetail.vue b/src/views/wms/order/movement/MovementOrderDetail.vue new file mode 100644 index 000000000..c8905eb5a --- /dev/null +++ b/src/views/wms/order/movement/MovementOrderDetail.vue @@ -0,0 +1,138 @@ + + + + diff --git a/src/views/wms/order/movement/MovementOrderForm.vue b/src/views/wms/order/movement/MovementOrderForm.vue new file mode 100644 index 000000000..3695f7a45 --- /dev/null +++ b/src/views/wms/order/movement/MovementOrderForm.vue @@ -0,0 +1,507 @@ + + + + diff --git a/src/views/wms/order/movement/MovementOrderPrint.vue b/src/views/wms/order/movement/MovementOrderPrint.vue new file mode 100644 index 000000000..8a4c50275 --- /dev/null +++ b/src/views/wms/order/movement/MovementOrderPrint.vue @@ -0,0 +1,140 @@ + + + + diff --git a/src/views/wms/order/movement/index.vue b/src/views/wms/order/movement/index.vue new file mode 100644 index 000000000..9aad7c83f --- /dev/null +++ b/src/views/wms/order/movement/index.vue @@ -0,0 +1,568 @@ + + + + diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue new file mode 100644 index 000000000..e668f32f7 --- /dev/null +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -0,0 +1,155 @@ + + + + diff --git a/src/views/wms/order/receipt/ReceiptOrderForm.vue b/src/views/wms/order/receipt/ReceiptOrderForm.vue new file mode 100644 index 000000000..27b205a7b --- /dev/null +++ b/src/views/wms/order/receipt/ReceiptOrderForm.vue @@ -0,0 +1,490 @@ + + + + diff --git a/src/views/wms/order/receipt/ReceiptOrderPrint.vue b/src/views/wms/order/receipt/ReceiptOrderPrint.vue new file mode 100644 index 000000000..d4c7d96f2 --- /dev/null +++ b/src/views/wms/order/receipt/ReceiptOrderPrint.vue @@ -0,0 +1,144 @@ + + + + diff --git a/src/views/wms/order/receipt/index.vue b/src/views/wms/order/receipt/index.vue new file mode 100644 index 000000000..657fe4dbd --- /dev/null +++ b/src/views/wms/order/receipt/index.vue @@ -0,0 +1,625 @@ + + + + diff --git a/src/views/wms/order/shipment/ShipmentOrderDetail.vue b/src/views/wms/order/shipment/ShipmentOrderDetail.vue new file mode 100644 index 000000000..dc490a355 --- /dev/null +++ b/src/views/wms/order/shipment/ShipmentOrderDetail.vue @@ -0,0 +1,155 @@ + + + + diff --git a/src/views/wms/order/shipment/ShipmentOrderForm.vue b/src/views/wms/order/shipment/ShipmentOrderForm.vue new file mode 100644 index 000000000..af60c618c --- /dev/null +++ b/src/views/wms/order/shipment/ShipmentOrderForm.vue @@ -0,0 +1,511 @@ + + + + diff --git a/src/views/wms/order/shipment/ShipmentOrderPrint.vue b/src/views/wms/order/shipment/ShipmentOrderPrint.vue new file mode 100644 index 000000000..dd9c06c03 --- /dev/null +++ b/src/views/wms/order/shipment/ShipmentOrderPrint.vue @@ -0,0 +1,144 @@ + + + + diff --git a/src/views/wms/order/shipment/index.vue b/src/views/wms/order/shipment/index.vue new file mode 100644 index 000000000..99be459bd --- /dev/null +++ b/src/views/wms/order/shipment/index.vue @@ -0,0 +1,625 @@ + + + + diff --git a/src/views/wms/utils/constants.ts b/src/views/wms/utils/constants.ts new file mode 100644 index 000000000..a1aa38110 --- /dev/null +++ b/src/views/wms/utils/constants.ts @@ -0,0 +1,52 @@ +/** 单据状态枚举 */ +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 可选前缀,按业务域区分编号种类: + * - `I` 商品编号 + * - `S` SKU 编号 + * - `W` 仓库编号 + * - `M` 往来企业编号 + * - 不传 / 空串 用于 SKU 条码(条码业务习惯纯数字) + * @returns 前缀 + 8 位随机数字串。 + * + * 由前端在表单【生成】按钮上调用,避免后端兜底生成造成编号不可控。 + */ +export function generateWmsCode(prefix: string = ''): string { + let result = '' + for (let i = 0; i < 8; i++) { + result += Math.floor(Math.random() * 10).toString() + } + return prefix + result +} diff --git a/src/views/wms/utils/format.ts b/src/views/wms/utils/format.ts new file mode 100644 index 000000000..a946d86fd --- /dev/null +++ b/src/views/wms/utils/format.ts @@ -0,0 +1,126 @@ +/** + * WMS 展示格式化和表单配置 + */ + +import { isNullOrUnDef } from '@/utils/is' + +type DecimalValue = number | string | null | undefined + +/** 数量小数位 */ +export const QUANTITY_PRECISION = 2 +/** 金额小数位 */ +export const PRICE_PRECISION = 2 +/** 重量小数位 */ +export const WEIGHT_PRECISION = 3 +/** 长宽高小数位 */ +export const DIMENSION_PRECISION = 1 + +function toFiniteDecimal(value: DecimalValue) { + if (isNullOrUnDef(value)) { + return undefined + } + if (typeof value === 'string' && value.trim() === '') { + return undefined + } + const decimalValue = typeof value === 'string' ? Number(value) : value + if (!Number.isFinite(decimalValue)) { + return undefined + } + return decimalValue +} + +function sumDecimal(list: T[], getter: (item: T) => DecimalValue) { + return list.reduce((sum, item) => { + const decimalValue = toFiniteDecimal(getter(item)) + return decimalValue === undefined ? sum : sum + decimalValue + }, 0) +} + +/** 格式化数量 */ +export function formatQuantity(value?: number | string | null) { + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(QUANTITY_PRECISION) +} + +/** 格式化金额 */ +export function formatPrice(value?: number | string | null) { + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(PRICE_PRECISION) +} + +/** 金额四舍五入 */ +export function roundPrice(value: number) { + return Number.isFinite(value) ? Number(value.toFixed(PRICE_PRECISION)) : undefined +} + +/** 亏损数字样式 */ +export function getLossClass(value?: number | string | null) { + const decimalValue = toFiniteDecimal(value) + return decimalValue !== undefined && decimalValue < 0 ? 'text-red-500' : '' +} + +/** 数量 * 单价,计算金额 */ +export function multiplyPrice(quantity?: number, price?: number) { + if (quantity === undefined || quantity === null || price === undefined || price === null) { + return undefined + } + return roundPrice(Number(quantity) * Number(price)) +} + +/** 金额 / 数量,反算单价 */ +export function dividePrice(totalPrice?: number, quantity?: number) { + if (totalPrice === undefined || totalPrice === null || !quantity) { + return undefined + } + return roundPrice(Number(totalPrice) / Number(quantity)) +} + +/** 汇总数量 */ +export function sumQuantity(list: T[], getter: (item: T) => DecimalValue) { + return sumDecimal(list, getter) +} + +/** 汇总金额 */ +export function sumPrice(list: T[], getter: (item: T) => DecimalValue) { + return sumDecimal(list, getter) +} + +/** 格式化汇总数量 */ +export function formatSumQuantity(list: T[], getter: (item: T) => DecimalValue) { + return formatQuantity(sumQuantity(list, getter)) +} + +/** 格式化汇总金额 */ +export function formatSumPrice(list: T[], getter: (item: T) => DecimalValue) { + return formatPrice(sumPrice(list, getter)) +} + +/** 格式化重量 */ +export function formatWeight(value?: number | string | null) { + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(WEIGHT_PRECISION) +} + +/** 格式化长宽高 */ +export function formatDimension(value?: number | string | null) { + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(DIMENSION_PRECISION) +} + +/** 格式化长宽高组合 */ +export function formatDimensionText( + length?: number | string | null, + width?: number | string | null, + height?: number | string | null +) { + if (!isNullOrUnDef(length) && !isNullOrUnDef(width) && !isNullOrUnDef(height)) { + return [formatDimension(length), formatDimension(width), formatDimension(height)].join(' * ') + } + return [ + !isNullOrUnDef(length) ? `长:${formatDimension(length)}` : undefined, + !isNullOrUnDef(width) ? `宽:${formatDimension(width)}` : undefined, + !isNullOrUnDef(height) ? `高:${formatDimension(height)}` : undefined + ] + .filter(Boolean) + .join(' ') +} diff --git a/src/views/wms/utils/order.ts b/src/views/wms/utils/order.ts new file mode 100644 index 000000000..356413609 --- /dev/null +++ b/src/views/wms/utils/order.ts @@ -0,0 +1,12 @@ +/** + * WMS 订单工具 + */ + +/** 生成业务单号:前缀 + 月日 + 4 位随机数 */ +export function generateOrderNo(prefix: string) { + const now = new Date() + const month = String(now.getMonth() + 1).padStart(2, '0') + const day = String(now.getDate()).padStart(2, '0') + const randomNo = String(Math.floor(Math.random() * 10000)).padStart(4, '0') + return `${prefix}${month}${day}${randomNo}` +}