Files
agent/mock/inventory.mock.ts
2026-02-16 12:46:37 +08:00

167 lines
5.8 KiB
TypeScript

import { Request, Response } from 'express';
// 初始数据
const genInventoryList = (current: number, pageSize: number) => {
const tableListDataSource: any[] = [];
const warehouses = ['上海一号仓', '北京东区仓', '深圳前海仓'];
const units = ['个', '箱', '台'];
const statusList = ['normal', 'low_stock', 'out_of_stock'];
for (let i = 0; i < pageSize; i += 1) {
const quantity = Math.floor(Math.random() * 200);
let status = 'normal';
if (quantity === 0) status = 'out_of_stock';
else if (quantity < 10) status = 'low_stock';
tableListDataSource.push({
key: i,
id: `inv-${i}`,
sku: `SKU-2024-${String(i).padStart(3, '0')}`,
name: `高性能组件-${i}`,
quantity,
unit: units[i % 3],
warehouse: warehouses[i % 3],
status,
minStock: 10,
maxStock: 500,
lastUpdated: new Date().toISOString(),
category: '电子元器件',
description: '关键零部件,需定期盘点',
});
}
return tableListDataSource;
};
let tableListDataSource = genInventoryList(1, 40);
const logs: Record<string, any[]> = {}; // Map<InventoryId, LogItem[]>
export default {
'GET /api/inventory': (req: Request, res: Response) => {
const { current = 1, pageSize = 20, name, sku, status, warehouse } = req.query as any;
let dataSource = [...tableListDataSource];
if (name) {
dataSource = dataSource.filter(item => item.name.includes(name));
}
if (sku) {
dataSource = dataSource.filter(item => item.sku.includes(sku));
}
if (status) {
dataSource = dataSource.filter(item => item.status === status);
}
if (warehouse) {
dataSource = dataSource.filter(item => item.warehouse === warehouse);
}
const total = dataSource.length;
const startIndex = ((current as number) - 1) * (pageSize as number);
const endIndex = (current as number) * (pageSize as number);
const list = dataSource.slice(startIndex, endIndex);
res.json({
data: list,
total,
success: true,
pageSize,
current: parseInt(`${current}`, 10) || 1,
});
},
'POST /api/inventory': (req: Request, res: Response) => {
const newData = {
...req.body,
id: `inv-${Date.now()}`,
lastUpdated: new Date().toISOString(),
createdAt: new Date().toISOString(),
status: req.body.quantity > 0 ? 'normal' : 'out_of_stock',
};
tableListDataSource.unshift(newData);
res.json(newData);
},
'PUT /api/inventory/:id': (req: Request, res: Response) => {
const { id } = req.params;
const index = tableListDataSource.findIndex(item => item.id === id);
if (index !== -1) {
tableListDataSource[index] = { ...tableListDataSource[index], ...req.body, lastUpdated: new Date().toISOString() };
res.json(tableListDataSource[index]);
} else {
res.status(404).json({ success: false });
}
},
'POST /api/inventory/:id/adjust': (req: Request, res: Response) => {
const { id } = req.params;
const { type, quantity, remark } = req.body; // type: 'in' | 'out' | 'adjust'
const index = tableListDataSource.findIndex(item => item.id === id);
if (index !== -1) {
const item = tableListDataSource[index];
let newQuantity = item.quantity;
let changeAmount = 0;
if (type === 'in') {
newQuantity += parseInt(quantity, 10);
changeAmount = parseInt(quantity, 10);
} else if (type === 'out') {
newQuantity -= parseInt(quantity, 10);
changeAmount = -parseInt(quantity, 10);
} else if (type === 'adjust') {
changeAmount = parseInt(quantity, 10) - item.quantity; // 盘点调整:直接设为新值
newQuantity = parseInt(quantity, 10);
}
if (newQuantity < 0) {
res.status(400).json({ success: false, message: '库存不足,无法扣减' });
return;
}
// Update Status
let status = 'normal';
if (newQuantity === 0) status = 'out_of_stock';
else if (newQuantity < (item.minStock || 10)) status = 'low_stock';
tableListDataSource[index] = { ...item, quantity: newQuantity, status, lastUpdated: new Date().toISOString() };
// Log
const logId = String(id);
if (!logs[logId]) logs[logId] = [];
logs[logId].unshift({
id: `log-${Date.now()}`,
inventoryId: logId,
type,
quantity: changeAmount,
beforeQuantity: item.quantity,
afterQuantity: newQuantity,
operator: 'Admin', // MOCKED
remark,
createdAt: new Date().toISOString(),
});
res.json({ success: true, data: tableListDataSource[index] });
} else {
res.status(404).json({ success: false, message: 'Item not found' });
}
},
'GET /api/inventory/:id/logs': (req: Request, res: Response) => {
const { id } = req.params;
const logId = String(id);
const list = logs[logId] || [];
res.json({
data: list,
total: list.length,
success: true,
});
},
'DELETE /api/inventory/:id': (req: Request, res: Response) => {
const { id } = req.params;
tableListDataSource = tableListDataSource.filter(item => item.id !== id);
delete logs[String(id)];
res.json({ success: true });
}
};