Files
cz-web/src/api/contract.ts
2026-10-01 17:24:57 +08:00

103 lines
3.5 KiB
TypeScript

import type { FileInfo, PageResult } from '@/types/api'
import type { Contract, ContractQuery } from '@/types/business/contract'
// TODO(api): 待接口文档到位后,将以下 mock 替换为 request<T> 调用
function mockFile(name: string, size: number, uploadTime: string): FileInfo {
return { name, size, uploadTime, url: '' }
}
const DETAIL_ID = 'contract-001'
const MOCK_CONTRACTS: Contract[] = [
{
id: 'contract-001',
contractNo: 'C8K2M202408001',
contractName: '智慧城市建设项目技术服务合同',
contractType: '互联网软件通用/app开发',
contractAmount: 201000,
relatedProjectName: '智慧城市大数据平台建设项目',
projectNo: 'P8K2M202408001',
signStatus: '履行中',
signDate: '2026-8-17 14:00',
effectiveDate: '2026-8-17 14:00',
expiryDate: '2026-8-17 14:00',
files: [mockFile('项目需求规格说明书.pdf', 2516582, '2026-8-17 14:00')],
},
{
id: 'contract-002',
contractNo: 'C8K2M202408002',
contractName: '智慧城市建设项目硬件电路设计合同',
contractType: '硬件电路通用/电路版设计',
contractAmount: 180000,
relatedProjectName: '三甲医院指挥医疗信息化系统',
projectNo: 'P8K2M202408001',
signStatus: '已过期',
signDate: '2026-8-17 14:00',
effectiveDate: '2026-8-17 14:00',
expiryDate: '2026-8-17 14:00',
files: [mockFile('硬件电路设计合同.pdf', 1468006, '2026-8-17 14:00')],
},
{
id: 'contract-003',
contractNo: 'C8K2M202408003',
contractName: '智慧城市建设项目物联网全案合同',
contractType: '物联网全案通用/一套门禁卡',
contractAmount: 96000,
relatedProjectName: '社区康养智能服务系统',
projectNo: 'P8K2M202408001',
signStatus: '待签署',
effectiveDate: '2026-8-17 14:00',
expiryDate: '2026-8-17 14:00',
files: [mockFile('物联网全案合同.pdf', 1258291, '2026-8-17 14:00')],
},
]
const CONTRACT_DETAIL: Contract = {
id: DETAIL_ID,
contractNo: 'C8K2M202408001',
contractName: '社区康养智能服务系统开发合同',
contractType: '互联网软件开发',
contractAmount: 201000,
relatedProjectName: '社区康养智能服务系统',
projectNo: '20260813ZZ251245',
signStatus: '履行中',
signDate: '2024-10-15',
effectiveDate: '2024-10-15',
expiryDate: '2024-10-15',
files: [mockFile('项目需求规格说明书.pdf', 2516582, '2024-10-15')],
}
export function getContractList(query: ContractQuery): Promise<PageResult<Contract>> {
const filtered = MOCK_CONTRACTS.filter((item) => {
if (
query.keyword
&& !item.contractName.includes(query.keyword)
&& !item.contractNo.includes(query.keyword)
) {
return false
}
return true
})
const pageSize = query.pageSize > 0 ? query.pageSize : 8
const start = (query.page - 1) * pageSize
return Promise.resolve({
list: filtered.slice(start, start + pageSize),
total: filtered.length,
})
}
export function getContractDetail(id: string): Promise<Contract | null> {
if (id === DETAIL_ID) return Promise.resolve({ ...CONTRACT_DETAIL, files: [...CONTRACT_DETAIL.files] })
const found = MOCK_CONTRACTS.find((item) => item.id === id) ?? null
return Promise.resolve(found ? { ...found, files: [...found.files] } : null)
}
export function getSignQr(_id: string): Promise<{ expiresInSeconds: number }> {
return Promise.resolve({ expiresInSeconds: 272 })
}
export function refreshSignQr(_id: string): Promise<{ expiresInSeconds: number }> {
return Promise.resolve({ expiresInSeconds: 272 })
}