import type { PaginationRequest } from '@/types/product-master-data/api' import type { Product } from '@/types/product-master-data/product' // ===== Mock 数据(至少7条) ===== const mockProducts: Product[] = [ { productId: 1, productCode: 'PROD-001', productName: '5052铝板', category: '铝加工材', stage: '量产', grade: '一级品', standardized: '标品', minOrderQty: 5000.0000, isActive: 1, creationDate: '2026-01-15 08:30:00', createdBy: '张三', lastUpdateDate: '2026-06-20 14:00:00', lastUpdatedBy: '李四', versionNum: 1 }, { productId: 2, productCode: 'PROD-002', productName: '6061铝棒', category: '铝加工材', stage: '量产', grade: '一级品', standardized: '标品', minOrderQty: 3000.0000, isActive: 1, creationDate: '2026-02-10 09:00:00', createdBy: '王五', lastUpdateDate: '2026-06-19 10:30:00', lastUpdatedBy: '王五', versionNum: 2 }, { productId: 3, productCode: 'PROD-003', productName: '铝合金窗框', category: '铝加工制品', stage: '试产', grade: '二级品', standardized: '非标品', minOrderQty: 1000.0000, isActive: 1, creationDate: '2026-03-20 13:15:00', createdBy: '赵六', lastUpdateDate: '2026-06-18 16:45:00', lastUpdatedBy: '赵六', versionNum: 1 }, { productId: 4, productCode: 'PROD-004', productName: '7075铝型材', category: '铝加工材', stage: '样品', grade: '一级品', standardized: '非标品', minOrderQty: 500.0000, isActive: 0, creationDate: '2026-04-05 10:00:00', createdBy: '张三', lastUpdateDate: '2026-05-15 11:20:00', lastUpdatedBy: '李四', versionNum: 3 }, { productId: 5, productCode: 'PROD-005', productName: '废铝料A型', category: '废铝', stage: '量产', grade: '二级品', standardized: '标品', minOrderQty: 10000.0000, isActive: 1, creationDate: '2026-01-28 08:00:00', createdBy: '孙七', lastUpdateDate: '2026-06-21 09:30:00', lastUpdatedBy: '孙七', versionNum: 1 }, { productId: 6, productCode: 'PROD-006', productName: '铝门框架-X1', category: '铝加工制品', stage: '量产', grade: '一级品', standardized: '标品', minOrderQty: 2000.0000, isActive: 1, creationDate: '2026-02-18 14:30:00', createdBy: '周八', lastUpdateDate: '2026-06-22 08:00:00', lastUpdatedBy: '周八', versionNum: 2 }, { productId: 7, productCode: 'PROD-007', productName: '铝板边角料', category: '废铝', stage: '样品', grade: '二级品', standardized: '非标品', minOrderQty: 8000.0000, isActive: 0, creationDate: '2026-03-10 11:00:00', createdBy: '吴九', lastUpdateDate: '2026-04-20 15:00:00', lastUpdatedBy: '吴九', versionNum: 1 }, ] let nextId = 8 // 模拟 200ms 网络延迟 function delay(ms = 200): Promise { return new Promise(resolve => setTimeout(resolve, ms)) } // 深拷贝 function clone(obj: T): T { return JSON.parse(JSON.stringify(obj)) } // ===== API 函数 ===== // GET /crmProduct/get-id?id=xxx export function getById(id: number) { // Mock 实现 const product = mockProducts.find(p => p.productId === id) return delay().then(() => { if (!product) { return { code: '3100_crm_product_005', msg: '产品数据不存在', data: null } } return { code: '200', msg: '成功', data: clone(product) } }) } // POST /crmProduct/find-pagination export function findPagination(data: PaginationRequest) { const { pageIndex = 1, pageRows = 20, params = {} } = data return delay().then(() => { let filtered = [...mockProducts] const p = params as Record if (p.productCode) { const keyword = String(p.productCode).toLowerCase() filtered = filtered.filter(item => item.productCode.toLowerCase().includes(keyword)) } if (p.productName) { const keyword = String(p.productName).toLowerCase() filtered = filtered.filter(item => item.productName.toLowerCase().includes(keyword)) } if (p.category) { filtered = filtered.filter(item => item.category === p.category) } if (p.stage) { filtered = filtered.filter(item => item.stage === p.stage) } if (p.standardized) { filtered = filtered.filter(item => item.standardized === p.standardized) } if (p.isActive !== '' && p.isActive !== undefined && p.isActive !== null) { filtered = filtered.filter(item => item.isActive === Number(p.isActive)) } // 按 creationDate 降序排序 filtered.sort((a, b) => { const dateA = a.creationDate || '' const dateB = b.creationDate || '' return dateB.localeCompare(dateA) }) const total = filtered.length const start = (pageIndex - 1) * pageRows const records = filtered.slice(start, start + pageRows) return { code: '200', msg: '成功', data: { total, records, pageIndex, pageRows }, } }) } // POST /crmProduct/save // 注意: 项目使用 { params: formData } 包装保存请求 export function save(params: Product) { return delay().then(() => { // 编码唯一性校验 if (mockProducts.some(p => p.productCode === params.productCode)) { return { code: '3100_crm_product_007', msg: '产品编码已存在', data: null } } const newProduct: Product = { ...params, productId: nextId++, isActive: params.isActive ? 1 : 0, // 注意: 后端 isActive 是 number creationDate: new Date().toISOString().replace('T', ' ').substring(0, 19), createdBy: '当前用户', lastUpdateDate: new Date().toISOString().replace('T', ' ').substring(0, 19), lastUpdatedBy: '当前用户', versionNum: 1, } mockProducts.unshift(newProduct) return { code: '200', msg: '成功', data: clone(newProduct) } }) } // POST /crmProduct/update export function update(params: Product) { return delay().then(() => { const index = mockProducts.findIndex(p => p.productId === params.productId) if (index === -1) { return { code: '3100_crm_product_005', msg: '产品数据不存在', data: null } } // 乐观锁检查 if (params.versionNum !== undefined && mockProducts[index].versionNum !== params.versionNum) { return { code: 'UPDATE_DATA_VERSION_ERROR', msg: '数据已被他人修改,请刷新后重试', data: null } } const updated = { ...mockProducts[index], ...params, productCode: mockProducts[index].productCode, // 编码不可修改 isActive: params.isActive ? 1 : 0, lastUpdateDate: new Date().toISOString().replace('T', ' ').substring(0, 19), lastUpdatedBy: '当前用户', versionNum: (mockProducts[index].versionNum || 0) + 1, } mockProducts[index] = updated return { code: '200', msg: '成功', data: clone(updated) } }) } // GET /crmProduct/delete?id=xxx export function deleteProduct(id: number) { return delay().then(() => { const index = mockProducts.findIndex(p => p.productId === id) if (index === -1) { return { code: '3100_crm_product_005', msg: '产品数据不存在', data: null } } mockProducts[index].isActive = 0 mockProducts[index].lastUpdateDate = new Date().toISOString().replace('T', ' ').substring(0, 19) mockProducts[index].lastUpdatedBy = '当前用户' return { code: '200', msg: '成功', data: null } }) } // GET /crmProduct/get-by-code?productCode=xxx export function getByCode(productCode: string) { return delay().then(() => { const product = mockProducts.find(p => p.productCode === productCode) if (!product) { return { code: '200', msg: '成功', data: null } // 不存在返回 null data } if (product.isActive === 0) { return { code: '3100_crm_product_009', msg: '该产品已下架,不可使用', data: null } } return { code: '200', msg: '成功', data: clone(product) } }) }