Files
cz-web/src/api/contract.ts
2026-09-24 09:09:47 +08:00

111 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { FileInfo, PageResult } from '@/types/api'
import type { Contract, ContractQuery } from '@/types/business/contract'
// TODO(api): 待接口文档到位后,将以下 mock 替换为 request<T> 调用
/** 构造 mock 文件信息 */
function mockFile(name: string, size: number, uploadTime: string): FileInfo {
return { name, size, uploadTime, url: '' }
}
/** 详情 mock 所属合同 id */
const DETAIL_ID = 'contract-001'
/** 合同列表 mock(3 条,覆盖全部签署状态) */
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')],
},
]
/** 合同详情 mock */
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')],
}
/** 合同列表(keyword 筛选 + 分页) */
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,
})
}
/** 合同详情(不存在返回 null) */
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 })
}