233 lines
6.5 KiB
TypeScript
233 lines
6.5 KiB
TypeScript
// import { request } from '@/utils/http'
|
|
import type { LoanApplication, RelatedMerchant, AssistMaterial } from '@/typings/loan'
|
|
import { LoanStatus } from '@/typings/loan'
|
|
|
|
/**
|
|
* [用户端] 获取用户交易过的商家列表
|
|
*/
|
|
export function getUserMerchants() {
|
|
// Mock数据
|
|
return new Promise<{ list: RelatedMerchant[] }>((resolve) => {
|
|
setTimeout(() => {
|
|
resolve({
|
|
list: [
|
|
{
|
|
merchantId: 'M001',
|
|
merchantName: '乐高玩具旗舰店',
|
|
lastTradeTime: '2025-12-01',
|
|
selected: false,
|
|
assistStatus: 'pending'
|
|
},
|
|
{
|
|
merchantId: 'M002',
|
|
merchantName: '迪士尼官方店',
|
|
lastTradeTime: '2025-11-20',
|
|
selected: false,
|
|
assistStatus: 'pending'
|
|
},
|
|
{
|
|
merchantId: 'M003',
|
|
merchantName: '泡泡玛特',
|
|
lastTradeTime: '2025-11-15',
|
|
selected: false,
|
|
assistStatus: 'pending'
|
|
},
|
|
{
|
|
merchantId: 'M004',
|
|
merchantName: '奥特曼官方玩具店',
|
|
lastTradeTime: '2025-11-10',
|
|
selected: false,
|
|
assistStatus: 'pending'
|
|
},
|
|
{
|
|
merchantId: 'M005',
|
|
merchantName: '玩具反斗城',
|
|
lastTradeTime: '2025-11-05',
|
|
selected: false,
|
|
assistStatus: 'pending'
|
|
},
|
|
{
|
|
merchantId: 'M006',
|
|
merchantName: 'KidsLand',
|
|
lastTradeTime: '2025-10-20',
|
|
selected: false,
|
|
assistStatus: 'pending'
|
|
}
|
|
]
|
|
})
|
|
}, 500)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* [用户端] 提交贷款申请
|
|
*/
|
|
export function submitLoanApplication(data: any) {
|
|
return new Promise<{ id: string }>((resolve) => {
|
|
setTimeout(() => {
|
|
resolve({ id: `LA${Date.now()}` })
|
|
}, 1000)
|
|
})
|
|
}
|
|
|
|
// 模拟数据库
|
|
let mockDatabase: LoanApplication[] = []
|
|
|
|
/**
|
|
* [银行端] 获取贷款申请列表
|
|
*/
|
|
export function getLoanApplicationList(params: any) {
|
|
return new Promise<{ list: LoanApplication[], total: number }>((resolve) => {
|
|
setTimeout(() => {
|
|
// 如果没有数据,初始化一些 Mock 数据
|
|
if (mockDatabase.length === 0) {
|
|
mockDatabase = [
|
|
{
|
|
id: 'LA20251219001',
|
|
userId: 'U001',
|
|
userName: '张三',
|
|
userPhone: '13800138000',
|
|
amount: 50,
|
|
term: 1,
|
|
status: LoanStatus.SUBMITTED,
|
|
createTime: '2025-12-19 10:00:00',
|
|
updateTime: '2025-12-19 10:00:00',
|
|
relatedMerchants: [
|
|
{
|
|
merchantId: 'M001',
|
|
merchantName: '乐高玩具旗舰店',
|
|
lastTradeTime: '2025-12-01',
|
|
selected: true,
|
|
assistStatus: 'pending'
|
|
}
|
|
],
|
|
personalInfo: {
|
|
name: '张三',
|
|
phone: '13800138000',
|
|
idCard: '440106199001011234',
|
|
region: ['广东省', '广州市', '天河区'],
|
|
detailAddress: '天河路1号'
|
|
},
|
|
businessInfo: {
|
|
businessProject: '玩具零售',
|
|
businessTime: '3年',
|
|
annualIncome: 100,
|
|
hasDebt: 'no',
|
|
loanDemand: 50,
|
|
assets: ['house', 'car']
|
|
},
|
|
documentInfo: {
|
|
businessLicense: 'https://via.placeholder.com/150',
|
|
otherMaterials: []
|
|
},
|
|
processRecords: []
|
|
}
|
|
]
|
|
}
|
|
|
|
resolve({
|
|
list: mockDatabase,
|
|
total: mockDatabase.length
|
|
})
|
|
}, 500)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* [银行端] 获取贷款申请详情
|
|
*/
|
|
export function getLoanApplicationDetail(id: string) {
|
|
return new Promise<LoanApplication>((resolve, reject) => {
|
|
setTimeout(() => {
|
|
const item = mockDatabase.find(i => i.id === id)
|
|
if (item) {
|
|
resolve(item)
|
|
} else {
|
|
// Fallback for demo
|
|
if (mockDatabase.length > 0) resolve(mockDatabase[0])
|
|
else reject('Not found')
|
|
}
|
|
}, 500)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* [银行端] 流程操作
|
|
*/
|
|
export function operateLoanApplication(id: string, action: string, data?: any) {
|
|
return new Promise<void>((resolve) => {
|
|
setTimeout(() => {
|
|
const item = mockDatabase.find(i => i.id === id)
|
|
if (item) {
|
|
// 更新状态逻辑
|
|
switch (action) {
|
|
case 'accept': item.status = LoanStatus.ACCEPTED; break;
|
|
case 'investigate': item.status = LoanStatus.INVESTIGATING; break;
|
|
case 'report': item.status = LoanStatus.REPORTED; break;
|
|
case 'approve': item.status = LoanStatus.APPROVED; break;
|
|
case 'sign': item.status = LoanStatus.SIGNED; break;
|
|
case 'disburse': item.status = LoanStatus.DISBURSED; break;
|
|
case 'reject': item.status = LoanStatus.REJECTED; break;
|
|
case 'request_supplement': item.status = LoanStatus.PENDING_SUPPLEMENT; break;
|
|
}
|
|
|
|
// 添加记录
|
|
item.processRecords.push({
|
|
step: action as any,
|
|
operator: '银行管理员',
|
|
operateTime: new Date().toLocaleString(),
|
|
...data
|
|
})
|
|
}
|
|
resolve()
|
|
}, 500)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* [商家端] 获取待办列表
|
|
*/
|
|
export function getMerchantPendingAssistList() {
|
|
return new Promise<{ list: any[] }>((resolve) => {
|
|
setTimeout(() => {
|
|
// 找到所有关联了当前商家的未处理申请
|
|
// 这里简化逻辑,直接返回 Mock
|
|
resolve({
|
|
list: [
|
|
{
|
|
loanId: 'LA20251219001',
|
|
userName: '张三',
|
|
applyTime: '2025-12-19 10:00:00',
|
|
amount: 50,
|
|
status: 'pending'
|
|
}
|
|
]
|
|
})
|
|
}, 500)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* [商家端] 提交辅助材料
|
|
*/
|
|
export function submitAssistMaterial(loanId: string, materials: any[]) {
|
|
return new Promise<void>((resolve) => {
|
|
setTimeout(() => {
|
|
const item = mockDatabase.find(i => i.id === loanId)
|
|
// 简化:更新第一个匹配的商家状态
|
|
if (item && item.relatedMerchants.length > 0) {
|
|
item.relatedMerchants[0].assistStatus = 'submitted'
|
|
item.relatedMerchants[0].materials = {
|
|
merchantId: item.relatedMerchants[0].merchantId,
|
|
merchantName: item.relatedMerchants[0].merchantName,
|
|
loanApplicationId: loanId,
|
|
materials: materials,
|
|
submitTime: new Date().toLocaleString(),
|
|
status: 'submitted'
|
|
}
|
|
}
|
|
resolve()
|
|
}, 800)
|
|
})
|
|
}
|