Commit 7f73a77f by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

parents b59dc9b9 daf22e2d
...@@ -579,7 +579,7 @@ async function loadRemoteOptionsForInit(item) { ...@@ -579,7 +579,7 @@ async function loadRemoteOptionsForInit(item) {
// ==================== 加载远程 API 选项(首次 focus 时加载,无搜索词) ==================== // ==================== 加载远程 API 选项(首次 focus 时加载,无搜索词) ====================
async function loadRemoteOptions(item) { async function loadRemoteOptions(item) {
const { prop, api, requestParams, keywordField, debounceWait, ...rest } = item const { prop, api, requestParams, keywordField, debounceWait, ...rest } = item
if (!api || remoteOptions.value[prop]?.length > 0) return if (!api ) return
try { try {
remoteLoading.value[prop] = true remoteLoading.value[prop] = true
...@@ -728,6 +728,43 @@ defineExpose({ ...@@ -728,6 +728,43 @@ defineExpose({
}) })
localModel.value = { ...resetData } localModel.value = { ...resetData }
nextTick(() => formRef.value?.clearValidate()) nextTick(() => formRef.value?.clearValidate())
},
// ✅ 新增:强制刷新某个字段的远程选项
async refreshRemoteOptions(targetProp) {
console.log(`[SearchForm] 收到刷新请求: ${targetProp}`)
// 1. 查找配置项
const item = internalConfig.value.find(i => i.prop === targetProp)
if (!item) {
console.warn(`[SearchForm] 未找到 prop 为 ${targetProp} 的配置项`)
return
}
if (item.type !== 'select' || !item.api) {
console.warn(`[SearchForm] 字段 ${targetProp} 不是远程 Select 或没有 API`)
return
}
console.log(`[SearchForm] 开始强制加载 ${targetProp} 的数据,API: ${item.api}`)
// 2. 关键:在调用前,先清空旧数据,防止子组件内部的 "已加载则跳过" 逻辑生效
// 如果你的 loadRemoteOptions 里有 "if (remoteOptions.value[prop]?.length > 0) return"
// 这里必须先清空
remoteOptions.value[targetProp] = []
remoteLoading.value[targetProp] = true // 手动开启 loading
try {
// 3. 调用内部加载函数
// 注意:直接调用 loadRemoteOptions,它会读取最新的 requestParams
await loadRemoteOptions(item)
console.log(`[SearchForm] ${targetProp} 加载完成`)
} catch (error) {
console.error(`[SearchForm] ${targetProp} 加载失败`, error)
throw error
} finally {
remoteLoading.value[targetProp] = false
}
} }
}) })
</script> </script>
......
...@@ -82,7 +82,7 @@ const props = defineProps({ ...@@ -82,7 +82,7 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: true default: true
}, },
// 打开弹窗 // 确定按钮loading效果
confirmLoading: { confirmLoading: {
type: Boolean, type: Boolean,
default: false default: false
......
...@@ -13,6 +13,7 @@ const beneficiary = [ ...@@ -13,6 +13,7 @@ const beneficiary = [
label: '是否法定受益人', label: '是否法定受益人',
key: 'isLegalBeneficiary', key: 'isLegalBeneficiary',
domType: 'Select', domType: 'Select',
defaultValue: '1',
required: true, required: true,
disabled: false, disabled: false,
placeholder: '请选择', placeholder: '请选择',
......
...@@ -69,8 +69,8 @@ const customer = [ ...@@ -69,8 +69,8 @@ const customer = [
timeType: 'daterange', timeType: 'daterange',
custom: true, custom: true,
placeholder: '请选择证件有效期', placeholder: '请选择证件有效期',
required: true, // required: true,
width:300 width: 300
} }
], ],
data: [] data: []
......
const fnaForm = [ const fnaForm = [
// 介绍人信息 // 介绍人信息
{ // {
fatherTitle: '转介人信息', // fatherTitle: '转介人信息',
keyType: 'Array', // keyType: 'Array',
key: 'brokerList', // key: 'brokerList',
anchorKey: 'brokerList', // anchorKey: 'brokerList',
moudleType: 'brokerList', // moudleType: 'brokerList',
dataLength: 1, // dataLength: 1,
showMoudle: true, // showMoudle: true,
showTable: true, // showTable: true,
addChildren: true, // addChildren: true,
addChildrenTxt: '转介人', // addChildrenTxt: '转介人',
fatherRequired: false, // fatherRequired: false,
isOpen: false, // isOpen: false,
// 新增表格列配置 // // 新增表格列配置
columns: [ // columns: [
{ // {
label: '姓名', // label: '姓名',
prop: 'brokerName', // prop: 'brokerName',
type: 'remoteSelect', // type: 'remoteSelect',
searchType: 'brokerName', // searchType: 'brokerName',
placeholder: '请输入关键词搜索', // placeholder: '请输入关键词搜索',
required: false // required: false
}, // },
{ // {
label: '性别', // label: '性别',
prop: 'brokerGender', // prop: 'brokerGender',
type: 'select', // type: 'select',
dictType: 'sys_gender', // dictType: 'sys_gender',
placeholder: '请选择', // placeholder: '请选择',
required: false // required: false
}, // },
{ // {
label: '内部编号', // label: '内部编号',
prop: 'brokerNumber', // prop: 'brokerNumber',
type: 'input', // type: 'input',
placeholder: '请输入', // placeholder: '请输入',
required: false // required: false
}, // },
{ // {
label: '所属团队', // label: '所属团队',
prop: 'brokerTeam', // prop: 'brokerTeam',
type: 'remoteSelect', // type: 'remoteSelect',
searchType: 'brokerTeam', // searchType: 'brokerTeam',
placeholder: '请输入关键词搜索', // placeholder: '请输入关键词搜索',
required: false // required: false
}, // },
{ // {
label: '分配比例', // label: '分配比例',
prop: 'brokerRatio', // prop: 'brokerRatio',
type: 'inputNumber', // type: 'inputNumber',
placeholder: '请输入', // placeholder: '请输入',
required: true // required: true
}, // },
{ // {
label: '备注', // label: '备注',
prop: 'remark', // prop: 'remark',
type: 'input', // type: 'input',
placeholder: '请输入', // placeholder: '请输入',
required: false // required: false
} // }
], // ],
data: [ // data: [
// { // // {
// brokerName: '', // // brokerName: '',
// brokerGender: '', // // brokerGender: '',
// brokerNumber: '', // // brokerNumber: '',
// brokerTeam: '', // // brokerTeam: '',
// brokerRatio: '', // // brokerRatio: '',
// remark: '' // // remark: ''
// } // // }
] // ]
}, // },
// 受供养人信息 // 受供养人信息
{ {
fatherTitle: '受供养人信息', fatherTitle: '受供养人信息',
...@@ -245,6 +245,7 @@ const fnaForm = [ ...@@ -245,6 +245,7 @@ const fnaForm = [
{ {
label: '在过去12个月里你的平均每月收入', label: '在过去12个月里你的平均每月收入',
key: 'monthlyIncome', key: 'monthlyIncome',
customerKey: 'monthIncome',
value: '', value: '',
domType: 'Input', domType: 'Input',
unit: 'HKD', unit: 'HKD',
...@@ -264,6 +265,7 @@ const fnaForm = [ ...@@ -264,6 +265,7 @@ const fnaForm = [
{ {
label: '在过去12个月里你的平均每月开支', label: '在过去12个月里你的平均每月开支',
key: 'monthlyExpense', key: 'monthlyExpense',
customerKey: 'monthExpenditure',
value: '', value: '',
domType: 'Input', domType: 'Input',
unit: 'HKD', unit: 'HKD',
...@@ -282,6 +284,7 @@ const fnaForm = [ ...@@ -282,6 +284,7 @@ const fnaForm = [
{ {
label: '您现时的累积流动资产约有多少?', label: '您现时的累积流动资产约有多少?',
key: 'liquidAssets', key: 'liquidAssets',
customerKey: 'totalCurrentAssets',
value: '', value: '',
domType: 'Input', domType: 'Input',
unit: 'HKD', unit: 'HKD',
......
...@@ -9,6 +9,20 @@ const productPlan = [ ...@@ -9,6 +9,20 @@ const productPlan = [
fatherRequired: true, //父级必填,代表个人资料这个模块有必填项 fatherRequired: true, //父级必填,代表个人资料这个模块有必填项
data: [ data: [
{ {
label: '出单经纪公司',
key: 'reconciliationCompanyName',
domType: 'SearchSelect',
required: false,
maxLength: 30,
disabled: false,
placeholder: '请输入',
show: true,
labelWidth: '120px', //标签宽度
sm: 12, //栅格布局份数
labelPosition: 'top', //标签的位置
lg: 8 //栅格布局份数
},
{
label: '保险公司', label: '保险公司',
key: 'companyName', key: 'companyName',
domType: 'SearchSelect', domType: 'SearchSelect',
...@@ -253,20 +267,6 @@ const productPlan = [ ...@@ -253,20 +267,6 @@ const productPlan = [
lg: 8 //栅格布局份数 lg: 8 //栅格布局份数
}, },
{ {
label: '出单经纪公司',
key: 'reconciliationCompanyName',
domType: 'SearchSelect',
required: false,
maxLength: 30,
disabled: false,
placeholder: '请输入',
show: true,
labelWidth: '120px', //标签宽度
sm: 12, //栅格布局份数
labelPosition: 'top', //标签的位置
lg: 8 //栅格布局份数
},
{
label: '保单额度(重疾)', label: '保单额度(重疾)',
key: 'sumInsured', key: 'sumInsured',
domType: 'Input', domType: 'Input',
......
...@@ -12,6 +12,7 @@ const secondHolder = [ ...@@ -12,6 +12,7 @@ const secondHolder = [
{ {
label: '是否有第二持有人', label: '是否有第二持有人',
key: 'isSecond', key: 'isSecond',
defaultValue: '0',
domType: 'Select', domType: 'Select',
required: true, required: true,
disabled: false, disabled: false,
......
import { ElMessage } from 'element-plus'
export function copyToClipboard(text) {
// 方案1:使用现代 Clipboard API
if (navigator.clipboard && navigator.clipboard.writeText) {
return navigator.clipboard.writeText(text).catch((err) => {
console.error('Clipboard API 写入失败:', err);
ElMessage.error('复制失败')
// 降级到传统方案
fallbackCopyText(text);
});
}
// 方案2:降级使用传统方法
else {
fallbackCopyText(text);
}
}
// 传统复制方法
function fallbackCopyText(text, typeName = '内容') {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
try {
textarea.select();
textarea.setSelectionRange(0, 99999); // 对于移动设备
document.execCommand('copy');
console.log('传统方法复制成功');
ElMessage.success(`${typeName}已复制`)
} catch (err) {
console.error('传统方法复制失败:', err)
ElMessage.error('复制失败');
} finally {
document.body.removeChild(textarea);
}
}
export default {
copyToClipboard
}
...@@ -52,14 +52,14 @@ ...@@ -52,14 +52,14 @@
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="4" :lg="4"> <!-- <el-col :xs="24" :sm="12" :md="4" :lg="4">
<el-card shadow="hover" class="statistics-card"> <el-card shadow="hover" class="statistics-card">
<div class="card-content"> <div class="card-content">
<div class="card-label">差额(估)</div> <div class="card-label">差额(估)</div>
<div class="card-value">{{ statisticsData.differenceAmount ? formatCurrency(statisticsData.differenceAmount) : 0 }}</div> <div class="card-value">{{ statisticsData.differenceAmount ? formatCurrency(statisticsData.differenceAmount) : 0 }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col> -->
</el-row> </el-row>
</div> </div>
<el-table :data="tableData" @selection-change="handleSelectionChange" height="400" border highlight-current-row <el-table :data="tableData" @selection-change="handleSelectionChange" height="400" border highlight-current-row
...@@ -79,20 +79,23 @@ ...@@ -79,20 +79,23 @@
<el-table-column prop="fortuneTotalPeriod" label="总期数" width="120" sortable /> <el-table-column prop="fortuneTotalPeriod" label="总期数" width="120" sortable />
<el-table-column prop="broker" label="转介人" width="130" sortable /> <el-table-column prop="broker" label="转介人" width="130" sortable />
<el-table-column prop="team" label="所属团队" width="120" sortable /> <el-table-column prop="team" label="所属团队" width="120" sortable />
<el-table-column prop="amount" label="应出账金额" width="140" sortable /> <el-table-column prop="exchangeRate" label="结算汇率(估)" width="140" sortable />
<el-table-column prop="hkdAmount" label="应出账金额(HKD)" width="160" sortable/>
<el-table-column prop="currency" label="出账币种" width="130" sortable /> <el-table-column prop="currency" label="出账币种" width="130" sortable />
<el-table-column prop="fortunePaidAmount" label="已出账金额" width="120" sortable /> <el-table-column prop="fortunePaidAmount" label="已出账金额" width="160" sortable />
<el-table-column prop="fortuneUnpaidAmount" label="剩余出账金额" width="120" sortable /> <el-table-column prop="fortuneUnpaidAmount" label="剩余出账金额" width="160" sortable />
<el-table-column prop="currentPaymentAmount" label="本期出账金额" width="120" sortable/> <!-- <el-table-column prop="currentPaymentAmount" label="本期出账金额" width="120" sortable/> -->
<el-table-column prop="currentPaymentHkdAmount" label="本期出账金额(HKD)" width="160" sortable/>
<el-table-column prop="fortuneUnpaidRatio" label="剩余出账比例" width="120" sortable :formatter="(row) => `${row.fortuneUnpaidRatio }%`" /> <el-table-column prop="fortuneUnpaidRatio" label="剩余出账比例" width="120" sortable :formatter="(row) => `${row.fortuneUnpaidRatio }%`" />
<el-table-column prop="status" label="出账状态" width="120" sortable> <el-table-column prop="status" label="出账状态" width="160" sortable>
<template #default="{ row }"> <template #default="{ row }">
{{ selectDictLabel(csf_fortune_status, row.status) }} {{ selectDictLabel(csf_fortune_status, row.status) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="premium" label="期交保费" width="120" sortable /> <el-table-column prop="premium" label="期交保费" width="120" sortable />
<el-table-column prop="policyCurrency" label="保单币种" width="120" sortable /> <el-table-column prop="policyCurrency" label="保单币种" width="120" sortable />
<el-table-column prop="payoutDate" label="出账日(实)" width="120" sortable /> <el-table-column prop="payoutDate" label="出账日(估)" width="120" sortable />
<el-table-column prop="actualPayoutDate" label="出账日(实)" width="120" sortable />
<el-table-column prop="remark" label="备注" width="120" sortable /> <el-table-column prop="remark" label="备注" width="120" sortable />
<el-table-column fixed="right" label="操作" min-width="120"> <el-table-column fixed="right" label="操作" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
...@@ -330,18 +333,20 @@ const setPayoutAmountDialogFlag = ref(false) ...@@ -330,18 +333,20 @@ const setPayoutAmountDialogFlag = ref(false)
const setPayoutAmountConfig = [ const setPayoutAmountConfig = [
{ {
type: 'input', type: 'input',
prop: 'currentPaymentAmount', prop: 'currentPaymentHkdAmount',
label: '出账金额', label: '本期出账金额(HKD)',
inputType: 'decimal', inputType: 'decimal',
rules: [ rules: [
{ pattern: /^\d+$/, message: '只能输入正整数', trigger: 'blur' } { pattern: /^\d+$/, message: '只能输入正整数', trigger: 'blur' }
] ]
}, { },
type: 'select', // {
prop: 'currency', // type: 'select',
label: '出账币种', // prop: 'currency',
dictType: 'bx_currency_type' // label: '出账币种',
}, { // dictType: 'bx_currency_type'
// },
{
type: 'select', type: 'select',
prop: 'status', prop: 'status',
label: '出账状态', label: '出账状态',
......
...@@ -564,10 +564,10 @@ const addCheckRecordConfig = ref([ ...@@ -564,10 +564,10 @@ const addCheckRecordConfig = ref([
prop: 'amount', prop: 'amount',
label: '入账金额', label: '入账金额',
inputType: 'decimal', inputType: 'decimal',
decimalDigits: 2, decimalDigits: 4,
rules: [ rules: [
{ required: true, message: '请输入金额', trigger: 'blur' }, { required: true, message: '请输入金额', trigger: 'blur' },
{ pattern: /^\d+(\.\d{1,2})?$/, message: '最多两位小数', trigger: 'blur' } { pattern: /^\d+(\.\d{1,4})?$/, message: '最多四位小数', trigger: 'blur' }
] ]
}, { }, {
type: 'select', type: 'select',
...@@ -615,10 +615,10 @@ const addCheckRecordConfig = ref([ ...@@ -615,10 +615,10 @@ const addCheckRecordConfig = ref([
prop: 'exchangeRate', prop: 'exchangeRate',
label: '结算汇率(实)', label: '结算汇率(实)',
inputType: 'decimal', inputType: 'decimal',
decimalDigits: 2, decimalDigits: 4,
rules: [ rules: [
{ required: true, message: '请输入金额', trigger: 'blur' }, { required: true, message: '请输入金额', trigger: 'blur' },
{ pattern: /^\d+(\.\d{1,2})?$/, message: '最多两位小数', trigger: 'blur' } { pattern: /^\d+(\.\d{1,4})?$/, message: '最多四位小数', trigger: 'blur' }
] ]
}, },
]) ])
......
...@@ -25,9 +25,9 @@ ...@@ -25,9 +25,9 @@
<el-table-column type="selection" width="55" :reserve-selection="true" /> <el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column prop="broker" label="转介人" min-width="120" sortable /> <el-table-column prop="broker" label="转介人" min-width="120" sortable />
<el-table-column prop="team" label="所属团队" min-width="120" sortable /> <el-table-column prop="team" label="所属团队" min-width="120" sortable />
<el-table-column prop="amount" label="出账金额" width="120" sortable> <el-table-column prop="hkdAmount" label="出账金额" width="120" sortable>
<template #default="scope"> <template #default="scope">
{{ formatCurrency(scope.row.amount) }} {{ formatCurrency(scope.row.hkdAmount) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="currency" label="出账币种" width="120" sortable> <el-table-column prop="currency" label="出账币种" width="120" sortable>
......
...@@ -204,7 +204,7 @@ const payableReportTableColumns = ref([ ...@@ -204,7 +204,7 @@ const payableReportTableColumns = ref([
{ prop: 'unpaidRatio', label: '待出账比例', sortable: true, width: '120', formatter: (row) => (row.unpaidRatio || 0) + '%' || '-' }, { prop: 'unpaidRatio', label: '待出账比例', sortable: true, width: '120', formatter: (row) => (row.unpaidRatio || 0) + '%' || '-' },
{ prop: 'paidAmount', label: '已出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) }, { prop: 'paidAmount', label: '已出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) },
{ prop: 'unpaidAmount', label: '待出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.unpaidAmount || 0) }, { prop: 'unpaidAmount', label: '待出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.unpaidAmount || 0) },
{ prop: 'amount', label: '应出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.amount || 0) }, { prop: 'hkdAmount', label: '应出账金额(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.hkdAmount || 0) },
{ prop: 'currency', label: '出账币种', sortable: true, width: '120', formatter: (row) => row.currency || '-' }, { prop: 'currency', label: '出账币种', sortable: true, width: '120', formatter: (row) => row.currency || '-' },
{ prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => formatCurrency(row.premium || 0) }, { prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => formatCurrency(row.premium || 0) },
{ prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' }, { prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' },
...@@ -215,23 +215,24 @@ const detailDialogVisible = ref(false) ...@@ -215,23 +215,24 @@ const detailDialogVisible = ref(false)
// 应付明细列表 // 应付明细列表
const payableReportListTableColumns = ref([ const payableReportListTableColumns = ref([
{ prop: 'fortuneBizType', label: '应付款类型', sortable: true, width: '120', formatter: (row) => getFortuneBizTypeLabel(row.fortuneBizType) || '-' }, // { prop: 'fortuneBizType', label: '应付款类型', sortable: true, width: '120', formatter: (row) => getFortuneBizTypeLabel(row.fortuneBizType) || '-' },
{ prop: 'payableNo', label: '应付账款编号', sortable: true, width: '120', formatter: (row) => row.payableNo || '-' }, // { prop: 'payableNo', label: '应付账款编号', sortable: true, width: '120', formatter: (row) => row.payableNo || '-' },
{ prop: 'policyNo', label: '保单号', sortable: true, width: '120', formatter: (row) => row.policyNo || '-' }, { prop: 'policyNo', label: '保单号', sortable: true, width: '130', formatter: (row) => row.policyNo || '-' },
{ prop: 'broker', label: '转介人', sortable: true, width: '120', formatter: (row) => row.broker || '-' }, { prop: 'broker', label: '转介人', sortable: true, width: '120', formatter: (row) => row.broker || '-' },
{ prop: 'fortuneName', label: '出账项目', sortable: true, width: '120', formatter: (row) => row.fortuneName || '-' },
{ prop: 'status', label: '出账状态', sortable: true, width: '120', formatter: (row) => getDictLabel('csf_expected_fortune_status', row.status) || '-' }, { prop: 'status', label: '出账状态', sortable: true, width: '120', formatter: (row) => getDictLabel('csf_expected_fortune_status', row.status) || '-' },
{ prop: 'currency', label: '出账币种', sortable: true, width: '120', formatter: (row) => row.currency || '-' }, { prop: 'currency', label: '出账币种', sortable: true, width: '100', formatter: (row) => row.currency || '-' },
{ prop: 'fortunePeriod', label: '出账期数', sortable: true, width: '120', formatter: (row) => row.fortunePeriod || '-' }, { prop: 'fortunePeriod', label: '出账期数', sortable: true, width: '100', formatter: (row) => row.fortunePeriod || '-' },
{ prop: 'fortuneTotalPeriod', label: '出账总期数', sortable: true, width: '120', formatter: (row) => row.fortuneTotalPeriod || '-' }, { prop: 'fortuneTotalPeriod', label: '出账总期数', sortable: true, width: '100', formatter: (row) => row.fortuneTotalPeriod || '-' },
{ prop: 'payoutDate', label: '出账日(估)', sortable: true, width: '120', formatter: (row) => row.payoutDate || '-' }, { prop: 'payoutDate', label: '出账日(估)', sortable: true, width: '120', formatter: (row) => row.payoutDate || '-' },
{ prop: 'actualPayoutDate', label: '出账日(实)', sortable: true, width: '120', formatter: (row) => row.actualPayoutDate || '-' }, { prop: 'actualPayoutDate', label: '出账日(实)', sortable: true, width: '120', formatter: (row) => row.actualPayoutDate || '-' },
{ prop: 'commissionRatio', label: '出账比例', sortable: true, width: '120', formatter: (row) => (row.commissionRatio || 0) + '%' || '-' }, // { prop: 'commissionRatio', label: '职级对应积分比例', sortable: true, width: '120', formatter: (row) => (row.commissionRatio || 0) || '-' },
{ prop: 'amount', label: '应出账金额(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.amount || 0) }, { prop: 'hkdAmount', label: '应出账金额(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.hkdAmount || 0) },
{ prop: 'paidRatio', label: '已出账比例', sortable: true, width: '120', formatter: (row) => (row.paidRatio || 0) + '%' || '-' }, { prop: 'paidRatio', label: '已出账比例', sortable: true, width: '120', formatter: (row) => (row.paidRatio || 0) + '%' || '-' },
{ prop: 'paidAmount', label: '已出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) }, { prop: 'paidAmount', label: '已出账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) },
{ prop: 'unpaidRatio', label: '待出账比例', sortable: true, width: '120', formatter: (row) => (row.unpaidRatio || 0) + '%' || '-' }, { prop: 'unpaidRatio', label: '待出账比例', sortable: true, width: '120', formatter: (row) => (row.unpaidRatio || 0) + '%' || '-' },
{ prop: 'unpaidAmount', label: '待出账金额(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.unpaidAmount || 0) }, { prop: 'unpaidAmount', label: '待出账金额(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.unpaidAmount || 0) },
{ prop: 'brokerRatio', label: '持有比例', sortable: true, width: '120', formatter: (row) => (row.brokerRatio || 0) + '%' || '-' }, { prop: 'brokerRatio', label: '持有比例', sortable: true, width: '100', formatter: (row) => (row.brokerRatio || 0) + '%' || '-' },
{ prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => formatCurrency(row.premium || 0) }, { prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => formatCurrency(row.premium || 0) },
{ prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' }, { prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' },
{ prop: 'productName', label: '产品计划', sortable: true, width: '120', formatter: (row) => row.productName || '-' }, { prop: 'productName', label: '产品计划', sortable: true, width: '120', formatter: (row) => row.productName || '-' },
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<!-- 应收款管理列表 --> <!-- 应收款管理列表 -->
<el-table :data="tableData" height="400" border highlight-current-row style="width: 100%" <el-table :data="tableData" height="400" border highlight-current-row style="width: 100%"
v-loading="loading"> v-loading="loading">
<el-table-column v-for="(column, index) in receivableReportTableColumns" :key="index" <el-table-column v-for="(column, index) in receivableReportTableColumns" :key="index" :fixed="column.fixed"
:prop="column.prop" :label="column.label" :width="column.width" :sortable="column.sortable" :prop="column.prop" :label="column.label" :width="column.width" :sortable="column.sortable"
:formatter="column.formatter" /> :formatter="column.formatter" />
<el-table-column fixed="right" label="操作" min-width="120"> <el-table-column fixed="right" label="操作" min-width="120">
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
</div> </div>
<el-table :data="receivableReportTableData" border style="width: 100%;margin-bottom: 10px;min-height: 300px;"> <el-table :data="receivableReportTableData" border style="width: 100%;margin-bottom: 10px;min-height: 300px;">
<el-table-column v-for="item in receivableReportItemTableColumns" :key="item.property" :prop="item.prop" <el-table-column v-for="item in receivableReportItemTableColumns" :key="item.property" :prop="item.prop"
:label="item.label" :width="item.width" /> :label="item.label" :width="item.width" :formatter="item.formatter" />
<el-table-column fixed="right" label="操作" min-width="120"> <el-table-column fixed="right" label="操作" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
<el-popover placement="right" :width="200" trigger="click"> <el-popover placement="right" :width="200" trigger="click">
...@@ -248,22 +248,22 @@ const addReceivablesFormConfig = [ ...@@ -248,22 +248,22 @@ const addReceivablesFormConfig = [
prop: 'amount', prop: 'amount',
label: '入账金额', label: '入账金额',
inputType: 'decimal', inputType: 'decimal',
decimalDigits: 2, decimalDigits: 4,
visible: (formData) => formData.commissionBizType === 'U', visible: (formData) => formData.commissionBizType === 'U',
rules: [ rules: [
{ required: true, message: '请输入金额', trigger: 'blur' }, { required: true, message: '请输入金额', trigger: 'blur' },
{ pattern: /^\d+(\.\d{1,2})?$/, message: '最多两位小数', trigger: 'blur' } { pattern: /^\d+(\.\d{1,4})?$/, message: '最多四位小数', trigger: 'blur' }
] ]
}, { }, {
type: 'input', type: 'input',
prop: 'commissionRatio', prop: 'commissionRatio',
label: '入账比例(%)', label: '入账比例(%)',
inputType: 'decimal', inputType: 'decimal',
decimalDigits: 2, decimalDigits: 4,
visible: (formData) => formData.commissionBizType === 'R', visible: (formData) => formData.commissionBizType === 'R',
rules: [ rules: [
{ required: true, message: '请输入入账比例', trigger: 'blur' }, { required: true, message: '请输入入账比例', trigger: 'blur' },
{ pattern: /^\d+(\.\d{1,2})?$/, message: '最多两位小数', trigger: 'blur' } { pattern: /^\d+(\.\d{1,4})?$/, message: '最多四位小数', trigger: 'blur' }
] ]
}, { }, {
type: 'select', type: 'select',
...@@ -744,27 +744,27 @@ onMounted(async () => { ...@@ -744,27 +744,27 @@ onMounted(async () => {
} }
}) })
// 格式化函数(每次渲染都会调用,所以能拿到最新字典) // 格式化函数(每次渲染都会调用,所以能拿到最新字典)
const formatStatus = (row, column) => { const formatStatus = (row,column) => {
return getDictLabel('csf_expected_commission_status', row.status) // 实时查缓存 return getDictLabel('csf_expected_commission_status', row.status) // 实时查缓存
} }
const detailDialogVisible = ref(false) const detailDialogVisible = ref(false)
const receivableReportTableData = ref([]) const receivableReportTableData = ref([])
const receivableReportTableColumns = ref([ const receivableReportTableColumns = ref([
{ prop: 'policyNo', label: '保单号', sortable: true, width: '150', formatter: (row) => row.policyNo || '-' }, { prop: 'policyNo', label: '保单号', sortable: true, width: '150',fixed:'left', formatter: (row) => row.policyNo || '-' },
{ prop: 'reconciliationCompany', label: '对账公司', sortable: true, width: '150', formatter: (row) => row.reconciliationCompany || '-' }, { prop: 'reconciliationCompany', label: '对账公司', sortable: true, width: '150', formatter: (row) => row.reconciliationCompany || '-' },
{ prop: 'commissionPeriod', label: '入账期数', sortable: true, width: '120', formatter: (row) => row.commissionPeriod || '-' }, { prop: 'commissionPeriod', label: '入账期数', sortable: true, width: '120', formatter: (row) => row.commissionPeriod || '-' },
{ prop: 'totalPeriod', label: '入账总期数', sortable: true, width: '120', formatter: (row) => row.totalPeriod || '-' }, { prop: 'totalPeriod', label: '入账总期数', sortable: true, width: '120', formatter: (row) => row.totalPeriod || '-' },
{ prop: 'commissionDate', label: '入账日(估)', sortable: true, width: '130', }, { prop: 'commissionDate', label: '入账日(估)', sortable: true, width: '130', },
{ prop: 'commissionRatio', label: '预估入账比例', sortable: true, width: '120', formatter: (row) => (row.commissionRatio || 0) + '%' || '-' }, { prop: 'commissionRatio', label: '产品对应来佣率', sortable: true, width: '120', formatter: (row) => (row.commissionRatio || 0) + '%' || '-' },
{ prop: 'hkdAmount', label: '预估入账金额HKD', sortable: true, width: '120', formatter: (row) => formatCurrency(row.hkdAmount || 0) }, { prop: 'hkdAmount', label: '预估入账金额HKD', sortable: true, width: '120', formatter: (row) => formatCurrency(row.hkdAmount || 0) },
{ prop: 'paidRatio', label: '已入账比例', sortable: true, width: '120', formatter: (row) => (row.paidRatio || 0) + '%' || '-' }, { prop: 'paidRatio', label: '已入账比例', sortable: true, width: '120', formatter: (row) => (row.paidRatio || 0) + '%' || '-' },
{ prop: 'paidAmount', label: '已入账金额HKD', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) }, { prop: 'paidAmount', label: '已入账金额HKD', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) },
{ prop: 'unpaidRatio', label: '待入账比例', sortable: true, width: '120', formatter: (row) => (row.unpaidRatio || 0) + '%' || '-' }, { prop: 'unpaidRatio', label: '待入账比例', sortable: true, width: '120', formatter: (row) => (row.unpaidRatio || 0) + '%' || '-' },
{ prop: 'unpaidAmount', label: '待入账金额HKD', sortable: true, width: '120', formatter: (row) => formatCurrency(row.unpaidAmount || 0) }, { prop: 'unpaidAmount', label: '待入账金额HKD', sortable: true, width: '120', formatter: (row) => formatCurrency(row.unpaidAmount || 0) },
{ prop: 'exchangeRate', label: '结算汇率(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.exchangeRate || 0) }, { prop: 'exchangeRate', label: '结算汇率(估)', sortable: true, width: '120'},
{ prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' }, { prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' },
{ prop: 'productName', label: '产品计划', sortable: true, width: '120', formatter: (row) => row.productName || '-' }, { prop: 'productName', label: '产品计划', sortable: true, width: '120', formatter: (row) => row.productName || '-' },
{ prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => row.productName || '-' }, { prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => row.premium || '-' },
{ prop: 'policyCurrency', label: '保单币种', sortable: true, width: '120', formatter: (row) => row.policyCurrency || '-' }, { prop: 'policyCurrency', label: '保单币种', sortable: true, width: '120', formatter: (row) => row.policyCurrency || '-' },
]) ])
const receivableReportItemTableColumns = ref([ const receivableReportItemTableColumns = ref([
...@@ -772,18 +772,18 @@ const receivableReportItemTableColumns = ref([ ...@@ -772,18 +772,18 @@ const receivableReportItemTableColumns = ref([
{ prop: 'receivableNo', label: '应收款编号', sortable: true, width: '150', formatter: (row) => row.receivableNo || '-' }, { prop: 'receivableNo', label: '应收款编号', sortable: true, width: '150', formatter: (row) => row.receivableNo || '-' },
{ prop: 'policyNo', label: '保单号', sortable: true, width: '150', formatter: (row) => row.policyNo || '-' }, { prop: 'policyNo', label: '保单号', sortable: true, width: '150', formatter: (row) => row.policyNo || '-' },
{ prop: 'reconciliationCompany', label: '对账公司', sortable: true, width: '150', formatter: (row) => row.reconciliationCompany || '-' }, { prop: 'reconciliationCompany', label: '对账公司', sortable: true, width: '150', formatter: (row) => row.reconciliationCompany || '-' },
{ prop: 'status', label: '入账状态', sortable: true, width: '120', formatter: (row) => formatStatus(row.status) || '-' }, { prop: 'status', label: '入账状态', sortable: true, width: '120', formatter: (row) => formatStatus(row) || '-' },
{ prop: 'commissionPeriod', label: '入账期数', sortable: true, width: '120', formatter: (row) => row.commissionPeriod || '-' }, { prop: 'commissionPeriod', label: '入账期数', sortable: true, width: '120', formatter: (row) => row.commissionPeriod || '-' },
{ prop: 'totalPeriod', label: '入账总期数', sortable: true, width: '120', formatter: (row) => row.totalPeriod || '-' }, { prop: 'totalPeriod', label: '入账总期数', sortable: true, width: '120', formatter: (row) => row.totalPeriod || '-' },
{ prop: 'commissionName', label: '入账项目', sortable: true, width: '130', formatter: (row) => row.commissionName || '-' }, { prop: 'commissionName', label: '入账项目', sortable: true, width: '130', formatter: (row) => row.commissionName || '-' },
{ prop: 'commissionDate', label: '入账日(估)', sortable: true, width: '130', formatter: (row) => row.commissionDate || '-' }, { prop: 'commissionDate', label: '入账日(估)', sortable: true, width: '130', formatter: (row) => row.commissionDate || '-' },
{ prop: 'commissionRatio', label: '预估入账比例', sortable: true, width: '120', formatter: (row) => (row.commissionRatio || 0) + '%' || '-' }, { prop: 'commissionRatio', label: '产品对应来佣率', sortable: true, width: '120', formatter: (row) => (row.commissionRatio || 0) + '%' || '-' },
{ prop: 'expectedAmount', label: '预估入账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.expectedAmount || 0) }, { prop: 'expectedAmount', label: '预估入账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.expectedAmount || 0) },
{ prop: 'paidRatio', label: '已入账比例', sortable: true, width: '120', formatter: (row) => (row.paidRatio || 0) + '%' || '-' }, { prop: 'paidRatio', label: '已入账比例', sortable: true, width: '120', formatter: (row) => (row.paidRatio || 0) + '%' || '-' },
{ prop: 'paidAmount', label: '已入账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) }, { prop: 'paidAmount', label: '已入账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.paidAmount || 0) },
{ prop: 'pendingRatio', label: '待入账比例', sortable: true, width: '120', formatter: (row) => (row.pendingRatio || 0) + '%' || '-' }, { prop: 'pendingRatio', label: '待入账比例', sortable: true, width: '120', formatter: (row) => (row.pendingRatio || 0) + '%' || '-' },
{ prop: 'pendingAmount', label: '待入账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.pendingAmount || 0) }, { prop: 'pendingAmount', label: '待入账金额', sortable: true, width: '120', formatter: (row) => formatCurrency(row.pendingAmount || 0) },
{ prop: 'defaultExchangeRate', label: '结算汇率(估)', sortable: true, width: '120', formatter: (row) => formatCurrency(row.defaultExchangeRate || 0) }, { prop: 'defaultExchangeRate', label: '结算汇率(估)', sortable: true, width: '120'},
{ prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' }, { prop: 'insuranceCompany', label: '保险公司', sortable: true, width: '120', formatter: (row) => row.insuranceCompany || '-' },
{ prop: 'productName', label: '产品计划', sortable: true, width: '120', formatter: (row) => row.productName || '-' }, { prop: 'productName', label: '产品计划', sortable: true, width: '120', formatter: (row) => row.productName || '-' },
{ prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => formatCurrency(row.premium || 0) }, { prop: 'premium', label: '期交保费', sortable: true, width: '120', formatter: (row) => formatCurrency(row.premium || 0) },
......
...@@ -261,6 +261,7 @@ ...@@ -261,6 +261,7 @@
@change=" @change="
handleIsPermanentChange(father, scope.row, column.prop, $event) handleIsPermanentChange(father, scope.row, column.prop, $event)
" "
:disabled="editStatus"
> >
<el-radio value="1" size="large"></el-radio> <el-radio value="1" size="large"></el-radio>
<el-radio value="0" size="large"></el-radio> <el-radio value="0" size="large"></el-radio>
...@@ -1132,6 +1133,10 @@ const setFormValue = (obj, formData, exportValue) => { ...@@ -1132,6 +1133,10 @@ const setFormValue = (obj, formData, exportValue) => {
phoneQuickList.value = [] phoneQuickList.value = []
// 深拷贝原始数据 // 深拷贝原始数据
form.value = JSON.parse(JSON.stringify(obj)) form.value = JSON.parse(JSON.stringify(obj))
// 新增预约,是受保人,与投保人关系默认值是本人
if (props.activeName == 'insurantInfo' && !props.idsObj.appointmentBizId) {
form.value['policyholderRel'] = 'MYSELF'
}
// 深拷贝原始数据 // 深拷贝原始数据
const processedData = JSON.parse(JSON.stringify(formData)) const processedData = JSON.parse(JSON.stringify(formData))
...@@ -1158,8 +1163,7 @@ const setFormValue = (obj, formData, exportValue) => { ...@@ -1158,8 +1163,7 @@ const setFormValue = (obj, formData, exportValue) => {
// 编辑状态当tab为受保人时,与投保人关系为本人控制受保人信息模块隐藏 // 编辑状态当tab为受保人时,与投保人关系为本人控制受保人信息模块隐藏
if ( if (
props.activeName == 'insurantInfo' && props.activeName == 'insurantInfo' &&
props.idsObj.appointmentBizId && form.value['policyholderRel'] == 'MYSELF' &&
obj.policyholderRel == 'MYSELF' &&
section.key !== 'policyholderRel' section.key !== 'policyholderRel'
) { ) {
section.showMoudle = false section.showMoudle = false
...@@ -1446,16 +1450,16 @@ const handleFormValues = source => { ...@@ -1446,16 +1450,16 @@ const handleFormValues = source => {
processedData.forEach(item => { processedData.forEach(item => {
if (item.key == 'apiCertificateDtoList' && item.data.length > 0) { if (item.key == 'apiCertificateDtoList' && item.data.length > 0) {
item.data.forEach((item1, index) => { item.data.forEach((item1, index) => {
if (!item1.isPermanent || item1.isPermanent == '0') { // if (!item1.isPermanent || item1.isPermanent == '0') {
if (!item1.certificateStartDate) { // if (!item1.certificateStartDate) {
obj1.certificateStartDate = '证件开始时间' // obj1.certificateStartDate = '证件开始时间'
} // }
if (!item1.certificateEndDate) { // if (!item1.certificateEndDate) {
obj1.certificateEndDate = '证件结束时间' // obj1.certificateEndDate = '证件结束时间'
} // }
} else if (item1.isPermanent == '1' && !item1.certificateStartDate) { // } else if (item1.isPermanent == '1' && !item1.certificateStartDate) {
obj1.certificateStartDate = '证件有效时间' // obj1.certificateStartDate = '证件有效时间'
} // }
for (const key in obj1) { for (const key in obj1) {
if (!item1[key]) { if (!item1[key]) {
errorFields.value.push({ errorFields.value.push({
...@@ -1502,6 +1506,8 @@ const handleFormValues = source => { ...@@ -1502,6 +1506,8 @@ const handleFormValues = source => {
} }
if (props.customerBizId && props.activeName == 'customer') { if (props.customerBizId && props.activeName == 'customer') {
submitObj['fnaBizId'] = props.idsObj.fnaBizId
editCustomer(submitObj).then(res => { editCustomer(submitObj).then(res => {
if (res.code == 200) { if (res.code == 200) {
handleEditStatus() handleEditStatus()
...@@ -1516,6 +1522,7 @@ const handleFormValues = source => { ...@@ -1516,6 +1522,7 @@ const handleFormValues = source => {
} else if (!props.customerBizId && props.activeName == 'customer') { } else if (!props.customerBizId && props.activeName == 'customer') {
addFna({ remark: '' }).then(response => { addFna({ remark: '' }).then(response => {
if (response.code == 200) { if (response.code == 200) {
submitObj['fnaBizId'] = response.data.fnaBizId
addCustomer(submitObj).then(res => { addCustomer(submitObj).then(res => {
if (res.code == 200) { if (res.code == 200) {
proxy.$message.success('客户新增成功') proxy.$message.success('客户新增成功')
...@@ -1600,15 +1607,15 @@ watch( ...@@ -1600,15 +1607,15 @@ watch(
editStatus.value = false editStatus.value = false
customerRightRef.value = null customerRightRef.value = null
if (newVal === 'customer') { if (newVal === 'customer') {
if (JSON.stringify(customerForm.value) != '{}') { processFormData()
form.value = JSON.parse(JSON.stringify(customerForm.value)) // if (JSON.stringify(customerForm.value) != '{}') {
// form.value = JSON.parse(JSON.stringify(customerForm.value))
processedCustomerData.value = JSON.parse(JSON.stringify(tempCustomerDom.value)) // processedCustomerData.value = JSON.parse(JSON.stringify(tempCustomerDom.value))
return // return
} else { // } else {
processFormData() // processFormData()
} // }
// processFormData()
// 因为客户资料里的编辑状态是单独控制的 // 因为客户资料里的编辑状态是单独控制的
if (props.tabSource == 'customer' && props.customerBizId) { if (props.tabSource == 'customer' && props.customerBizId) {
editStatus.value = true editStatus.value = true
......
...@@ -423,6 +423,7 @@ const handleRemoteSelectChange = async (row, column, father) => { ...@@ -423,6 +423,7 @@ const handleRemoteSelectChange = async (row, column, father) => {
//如果险种选择了重疾险,则显示重疾险的输入框 //如果险种选择了重疾险,则显示重疾险的输入框
row.insuranceTypeOption.forEach(item => { row.insuranceTypeOption.forEach(item => {
if (item.value == row.insuranceType) { if (item.value == row.insuranceType) {
row.sumInsured = ''
if (item.code == 'CATEGORY5934890141') { if (item.code == 'CATEGORY5934890141') {
row.showSumInsured = true row.showSumInsured = true
} else { } else {
...@@ -445,7 +446,7 @@ const searchSelectList = async (query, fieldKey, row) => { ...@@ -445,7 +446,7 @@ const searchSelectList = async (query, fieldKey, row) => {
const params5 = { const params5 = {
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
queryContent: queryString realName: queryString
} }
const response5 = await getUserSaleExpandList(params5) const response5 = await getUserSaleExpandList(params5)
if (response5.code == 200) { if (response5.code == 200) {
...@@ -566,6 +567,13 @@ const processFormData = async () => { ...@@ -566,6 +567,13 @@ const processFormData = async () => {
} }
if (section.data) { if (section.data) {
for (const field of section.data) { for (const field of section.data) {
if (field.customerKey) {
for (const cKey in props.customerInfo) {
if (cKey == field.customerKey && !props.fnaFormBizId) {
form.value[section.key][field.key] = props.customerInfo[cKey]
}
}
}
if (field.dictType) { if (field.dictType) {
// 获取字典数据 // 获取字典数据
field.options = fetchDictData(field.dictType) field.options = fetchDictData(field.dictType)
...@@ -592,6 +600,9 @@ const processFormData = async () => { ...@@ -592,6 +600,9 @@ const processFormData = async () => {
loading.value = false loading.value = false
} }
processedFanFormData.value = oldFanFormData.value = processedData processedFanFormData.value = oldFanFormData.value = processedData
console.log('====================================')
console.log('新增', form.value)
console.log('====================================')
} }
// 添加表单子级dom // 添加表单子级dom
const addChildren = father => { const addChildren = father => {
......
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
</div> </div>
</div> </div>
</div> </div>
<Customer <Customer
v-if="tab.name === 'customer'" v-if="tab.name === 'customer'"
:activeName="activeName" :activeName="activeName"
...@@ -95,6 +96,7 @@ ...@@ -95,6 +96,7 @@
:tabIndex="tabsList.findIndex(t => t.name === 'customer')" :tabIndex="tabsList.findIndex(t => t.name === 'customer')"
anchorContainer=".tabPaneBox" anchorContainer=".tabPaneBox"
tabSource="customer" tabSource="customer"
:idsObj="processInfo"
/> />
<div v-if="tab.name === 'fnaform'"> <div v-if="tab.name === 'fnaform'">
<FanForm <FanForm
...@@ -153,7 +155,8 @@ const dictStore = useDictStore() ...@@ -153,7 +155,8 @@ const dictStore = useDictStore()
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const activeName = ref('overview') const activeName = ref()
const loading = ref(false)
const processInfo = ref({ const processInfo = ref({
fnaNo: '--', fnaNo: '--',
status: '未保存', status: '未保存',
...@@ -163,7 +166,6 @@ const processInfo = ref({ ...@@ -163,7 +166,6 @@ const processInfo = ref({
const updateStatus = ref(false) const updateStatus = ref(false)
const dictTypeLists = ref([]) const dictTypeLists = ref([])
const customerInfo = ref({}) const customerInfo = ref({})
const tabPaneRef = ref(null)
const tabsList = ref([ const tabsList = ref([
{ {
label: '总览', label: '总览',
...@@ -210,40 +212,40 @@ const tabsList = ref([ ...@@ -210,40 +212,40 @@ const tabsList = ref([
const { csf_fna_status } = proxy.useDict('csf_fna_status') const { csf_fna_status } = proxy.useDict('csf_fna_status')
// 获取各个流程所需要得字典数据 // 获取各个流程所需要得字典数据
const getDictsData = async () => { const getDictsData = async () => {
// 请求每个流程中所涉及到的字典值数据,如果缓存中有,则不再请求 loading.value = true
if (dictStore.dictTypeLists.length == 0) { await proxy.useDictLists1([
proxy.useDictLists([ 'csf_employment',
'csf_employment', 'sys_no_yes',
'sys_no_yes', 'bx_currency_type',
'bx_currency_type', 'csf_liquid_asset_type',
'csf_liquid_asset_type', 'csf_premium_funding_source',
'csf_premium_funding_source', 'csf_customer_type',
'csf_customer_type', 'csf_customer_title',
'csf_customer_title', 'sys_gender',
'sys_gender', 'csf_marriage',
'csf_marriage', 'csf_education',
'csf_education', 'csf_id_type',
'csf_id_type', 'csf_ap_apply_type',
'csf_ap_apply_type', 'csf_ap_meeting_point',
'csf_ap_meeting_point', 'csf_ap_first_issue',
'csf_ap_first_issue', 'csf_ap_dividend',
'csf_ap_dividend', 'csf_ap_frequency',
'csf_ap_frequency', 'csf_ap_rel',
'csf_ap_rel', 'csf_ap_registration',
'csf_ap_registration', 'csf_ap_exercise',
'csf_ap_exercise', 'csf_ap_risk',
'csf_ap_risk', 'csf_ap_movie',
'csf_ap_movie', 'csf_ap_game',
'csf_ap_game', 'wj_question_first_category',
'wj_question_first_category', 'wj_question_second_category',
'wj_question_second_category', 'csf_ap_policy_transfer',
'csf_ap_policy_transfer', 'md_bank',
'md_bank', 'csf_property_type',
'csf_property_type', 'oss_data_type',
'oss_data_type', 'oss_data_person'
'oss_data_person' ])
]) activeName.value = 'overview'
} loading.value = false
// 获取租户用户列表 // 获取租户用户列表
const params1 = { const params1 = {
tenantBizId: userStore.projectInfo.tenantBizId, tenantBizId: userStore.projectInfo.tenantBizId,
...@@ -394,7 +396,7 @@ const processUpdate = (data, status) => { ...@@ -394,7 +396,7 @@ const processUpdate = (data, status) => {
// 获取流程详情 // 获取流程详情
function getProcessInfo(fnaBizId, changeTab, currentTab) { function getProcessInfo(fnaBizId, changeTab, currentTab) {
getProcessDetail(fnaBizId).then(res => { getProcessDetail(fnaBizId).then(async res => {
if (res.code == 200) { if (res.code == 200) {
processInfo.value = res.data processInfo.value = res.data
tabsList.value.forEach(item => { tabsList.value.forEach(item => {
...@@ -404,13 +406,16 @@ function getProcessInfo(fnaBizId, changeTab, currentTab) { ...@@ -404,13 +406,16 @@ function getProcessInfo(fnaBizId, changeTab, currentTab) {
item.status = '0' item.status = '0'
} }
}) })
console.log('客户资料新增成功', tabsList.value)
csf_fna_status._object.csf_fna_status.forEach(item => { csf_fna_status._object.csf_fna_status.forEach(item => {
if (item.value == res.data.status) { if (item.value == res.data.status) {
processInfo.value.status = item.label processInfo.value.status = item.label
} }
}) })
if (res.data.customerBizId) {
await getCustomerInfo(res.data.customerBizId)
}
if (currentTab == 'appointment' && changeTab == 'appointment') { if (currentTab == 'appointment' && changeTab == 'appointment') {
router.push({ path: '/sign/appointment' }) router.push({ path: '/sign/appointment' })
} else if (changeTab) { } else if (changeTab) {
...@@ -421,9 +426,6 @@ function getProcessInfo(fnaBizId, changeTab, currentTab) { ...@@ -421,9 +426,6 @@ function getProcessInfo(fnaBizId, changeTab, currentTab) {
} }
// Tab切换前的验证 // Tab切换前的验证
const beforeTabLeave = (activeTabName, oldTabName) => { const beforeTabLeave = (activeTabName, oldTabName) => {
if (processInfo.value.customerBizId) {
// getCustomerInfo(processInfo.value.customerBizId)
}
// 如果切换到总览,始终允许 // 如果切换到总览,始终允许
if (activeTabName === 'overview' || activeTabName === 'customer') { if (activeTabName === 'overview' || activeTabName === 'customer') {
return true return true
...@@ -471,9 +473,6 @@ const handleStep = item => { ...@@ -471,9 +473,6 @@ const handleStep = item => {
// 允许切换 // 允许切换
activeName.value = item.name activeName.value = item.name
} }
const handleBack = () => {
router.go(-1)
}
if (route.query.type == 'add') { if (route.query.type == 'add') {
// getAddInfo() // getAddInfo()
...@@ -482,24 +481,30 @@ if (route.query.type == 'add') { ...@@ -482,24 +481,30 @@ if (route.query.type == 'add') {
getProcessInfo(route.query.fnaBizId) getProcessInfo(route.query.fnaBizId)
}, 100) }, 100)
} }
// 获取客户详情
// 获取客户详情(返回 Promise)
function getCustomerInfo(customerBizId) { function getCustomerInfo(customerBizId) {
getCustomerDetail(customerBizId).then(async res => { return getCustomerDetail(customerBizId).then(res => {
if (res.code == 200) { if (res.code === 200) {
customerInfo.value = res.data customerInfo.value = res.data
return res.data // 成功时返回数据
} else {
// 可选:抛出错误以便调用方捕获
throw new Error(res.msg || '获取客户详情失败')
} }
}) })
} }
const handleSuccess = info => { const handleSuccess = async info => {
switch (info.tab) { switch (info.tab) {
case 'customer': case 'customer':
// await getCustomerInfo(info.customerBizId)
if (info.type == 'add') { if (info.type == 'add') {
//客户提交成功,更新流程 //客户提交成功,更新流程
processUpdate({ fnaBizId: info.fnaBizId, customerBizId: info.customerBizId }, 'fnaform') processUpdate({ fnaBizId: info.fnaBizId, customerBizId: info.customerBizId }, 'fnaform')
} else { } else {
processUpdate({ fnaBizId: processInfo.value.fnaBizId, customerBizId: info.customerBizId }) processUpdate({ fnaBizId: processInfo.value.fnaBizId, customerBizId: info.customerBizId })
} }
getCustomerInfo(info.customerBizId)
break break
case 'fnaform': case 'fnaform':
if (info.type == 'add') { if (info.type == 'add') {
...@@ -552,7 +557,17 @@ getDictsData() ...@@ -552,7 +557,17 @@ getDictsData()
min-height: calc(100vh - 84.5px); min-height: calc(100vh - 84.5px);
padding: 20px; padding: 20px;
background-color: #f2f3f5; background-color: #f2f3f5;
.domEmpty {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
font-size: 16px;
color: #a8abb2;
margin-top: 100px;
}
.cardHeader { .cardHeader {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
......
...@@ -75,9 +75,21 @@ ...@@ -75,9 +75,21 @@
border border
max-height="380px" max-height="380px"
> >
<el-table-column type="index" width="60" label="序号" /> <el-table-column type="index" width="100" label="序号" />
<el-table-column label="客户姓名" align="center" prop="customerName" width="100" /> <el-table-column label="客户姓名" align="center" prop="customerName" width="180" >
<el-table-column label="中文姓名" align="center" prop="customerNameCn" width="100" /> <template #default="scope">
<el-button link size="default">
<span @click="copyToClipboard(scope.row.customerName,'客户姓名')">{{ scope.row.customerName }}</span>
</el-button>
</template>
</el-table-column>
<el-table-column label="中文姓名" align="center" prop="customerNameCn" width="180" >
<template #default="scope">
<el-button link size="default">
<span @click="copyToClipboard(scope.row.customerNameCn,'中文姓名')">{{ scope.row.customerNameCn }}</span>
</el-button>
</template>
</el-table-column>
<!-- <el-table-column label="状态" align="center" prop="status" width="100" :formatter="getDictLabel('csf_fna_status')"/> --> <!-- <el-table-column label="状态" align="center" prop="status" width="100" :formatter="getDictLabel('csf_fna_status')"/> -->
<el-table-column label="流程状态" sortable align="center" prop="status" width="200"> <el-table-column label="流程状态" sortable align="center" prop="status" width="200">
<template #default="scope"> <template #default="scope">
...@@ -88,18 +100,29 @@ ...@@ -88,18 +100,29 @@
label="流程编号" label="流程编号"
align="center" align="center"
prop="fnaNo" prop="fnaNo"
width="200" width="240"
show-overflow-tooltip show-overflow-tooltip>
/> <template #default="scope">
<el-button link size="default">
<span @click="copyToClipboard(scope.row.fnaNo,'流程编号')">{{ scope.row.fnaNo }}</span>
</el-button>
</template>
</el-table-column>
<el-table-column <el-table-column
label="预约编号" label="预约编号"
align="center" align="center"
prop="appointmentNo" prop="appointmentNo"
width="200" width="240"
show-overflow-tooltip show-overflow-tooltip
/> >
<el-table-column label="新单编号" align="center" prop="policyId" /> <template #default="scope">
<el-table-column label="保单号" align="center" prop="policyNo" width="150" /> <el-button link size="default">
<span @click="copyToClipboard(scope.row.appointmentNo,'预约编号')">{{ scope.row.appointmentNo }}</span>
</el-button>
</template>
</el-table-column>
<!-- <el-table-column label="新单编号" align="center" prop="policyId" /> -->
<el-table-column label="保单号" align="center" prop="policyNo" width="180" />
<el-table-column label="创建时间" sortable align="center" prop="createTime" width="200"> <el-table-column label="创建时间" sortable align="center" prop="createTime" width="200">
<template #default="scope"> <template #default="scope">
...@@ -107,7 +130,7 @@ ...@@ -107,7 +130,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" width="80" align="center"> <el-table-column fixed="right" label="操作" width="150" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-popover placement="left" :width="160" trigger="click"> <el-popover placement="left" :width="160" trigger="click">
<template #reference> <template #reference>
...@@ -158,6 +181,7 @@ import { getFnaList, deleteFna, subProcess } from '@/api/sign/fna' ...@@ -158,6 +181,7 @@ import { getFnaList, deleteFna, subProcess } from '@/api/sign/fna'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import { MoreFilled, InfoFilled } from '@element-plus/icons-vue' import { MoreFilled, InfoFilled } from '@element-plus/icons-vue'
import useDictStore from '@/store/modules/dict' import useDictStore from '@/store/modules/dict'
import copyToClipboard from '@/utils/copyToClipboard';
const dictStore = useDictStore() const dictStore = useDictStore()
const userStore = useUserStore() const userStore = useUserStore()
const router = useRouter() const router = useRouter()
......
...@@ -321,7 +321,7 @@ ...@@ -321,7 +321,7 @@
:policyMailing="policyDetailInfo.policyMailing" :policyMailing="policyDetailInfo.policyMailing"
/> />
</div> </div>
<div v-if="tab.name === 'newpolicyTodo'">新单事项</div>
<div v-if="tab.name === 'verifyPolicyInfo'"> <div v-if="tab.name === 'verifyPolicyInfo'">
<VerifyPolicyInfo <VerifyPolicyInfo
:activeName="activeName" :activeName="activeName"
...@@ -752,37 +752,6 @@ function getCustomerInfo(customerBizId) { ...@@ -752,37 +752,6 @@ function getCustomerInfo(customerBizId) {
} }
// 获取各个流程所需要得字典数据 // 获取各个流程所需要得字典数据
const getDictsData = async () => { const getDictsData = async () => {
// proxy.useDictLists([
// 'csf_employment',
// 'sys_no_yes',
// 'bx_currency_type',
// 'csf_liquid_asset_type',
// 'csf_premium_funding_source',
// 'csf_customer_type',
// 'csf_customer_title',
// 'sys_gender',
// 'csf_marriage',
// 'csf_education',
// 'csf_id_type',
// 'csf_ap_apply_type',
// 'csf_ap_meeting_point',
// 'csf_ap_first_issue',
// 'csf_ap_dividend',
// 'csf_ap_frequency',
// 'csf_ap_rel',
// 'csf_ap_registration',
// 'csf_ap_exercise',
// 'csf_ap_risk',
// 'csf_ap_movie',
// 'csf_ap_game',
// 'csf_ap_policy_transfer',
// 'wj_question_first_category',
// 'wj_question_second_category',
// 'csf_ap_status',
// 'md_bank',
// 'oss_data_type',
// 'oss_data_person'
// ])
if (route.query.source == 'policyList') { if (route.query.source == 'policyList') {
const params4 = { const params4 = {
pageNo: 1, pageNo: 1,
...@@ -977,6 +946,7 @@ const handleSubmit = async type => { ...@@ -977,6 +946,7 @@ const handleSubmit = async type => {
submitAppointmentObj.value.apiAppointmentInfoDto = result submitAppointmentObj.value.apiAppointmentInfoDto = result
if (!submitAppointmentObj.value.apiAppointmentInfoDto) return if (!submitAppointmentObj.value.apiAppointmentInfoDto) return
} }
if (productPlanRef.value) { if (productPlanRef.value) {
submitAppointmentObj.value.apiProductPlanInfoDto = submitAppointmentObj.value.apiProductPlanInfoDto =
await productPlanRef.value[0].handleSubmitForm() await productPlanRef.value[0].handleSubmitForm()
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
> >
<template #form-right> <template #form-right>
<el-form ref="appointmentInfoFormRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="appointmentInfoFormRef" :model="form" :rules="rules" label-width="120px">
<div v-for="father in processedAppointmentData"> <div v-for="(father, fIndex) in processedAppointmentData">
<el-row style="margin-bottom: 10px" v-if="father.showMoudle" :id="father.anchorKey"> <el-row style="margin-bottom: 10px" v-if="father.showMoudle" :id="father.anchorKey">
<div class="formBox"> <div class="formBox">
<CardOne :title="father.fatherTitle"> <CardOne :title="father.fatherTitle">
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
<template #content> <template #content>
<!-- 不是表格 --> <!-- 不是表格 -->
<el-row :gutter="20" v-if="!father.showTable"> <el-row :gutter="20" v-if="!father.showTable">
<template v-for="child in father.data" :key="child.key"> <template v-for="(child, cIndex) in father.data" :key="child.key">
<el-col <el-col
:sm="child.sm" :sm="child.sm"
:lg="child.lg" :lg="child.lg"
...@@ -829,10 +829,9 @@ const changePageSize = val => { ...@@ -829,10 +829,9 @@ const changePageSize = val => {
queryParams.value.pageSize = val queryParams.value.pageSize = val
viewHistory() viewHistory()
} }
const timeValueChange = child => { const timeValueChange = child => {
if (form.value[child.key]) { if (!form.value[child.key]) {
child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
} else if (!form.value[child.key]) {
proxy.$message.warning(`请先选择${child.label}日期`) proxy.$message.warning(`请先选择${child.label}日期`)
child.timeValue = '' child.timeValue = ''
} }
...@@ -1058,6 +1057,7 @@ const disabledDate = (time, child) => { ...@@ -1058,6 +1057,7 @@ const disabledDate = (time, child) => {
} }
} }
const handleDateClear = child => { const handleDateClear = child => {
form.value[child.key] = ''
if (child.key == 'openAccountStartTime' && !form.value['openAccountStartTime']) { if (child.key == 'openAccountStartTime' && !form.value['openAccountStartTime']) {
form.value['openAccountEndTime'] = '' form.value['openAccountEndTime'] = ''
resetShow({ type: 'child', key: 'openAccountEndTime', status: true, flag: 'disabled' }) resetShow({ type: 'child', key: 'openAccountEndTime', status: true, flag: 'disabled' })
...@@ -1070,28 +1070,11 @@ const handleDateClear = child => { ...@@ -1070,28 +1070,11 @@ const handleDateClear = child => {
} }
} }
const handleDateChange = child => { const handleDateChange = child => {
// debugger;
if (child.key == 'openAccountStartTime' && form.value['openAccountStartTime']) { if (child.key == 'openAccountStartTime' && form.value['openAccountStartTime']) {
resetShow({ type: 'child', key: 'openAccountEndTime', status: false, flag: 'disabled' }) resetShow({ type: 'child', key: 'openAccountEndTime', status: false, flag: 'disabled' })
disabledDate(form.value['openAccountStartTime'], { key: 'openAccountEndTime' }) disabledDate(form.value['openAccountStartTime'], { key: 'openAccountEndTime' })
} }
// 拼接日期与时分
if (child.key == 'arrivalTime' && child.finishTime && child.finishTime.split(' ').length == 2) {
child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
} else if (
child.key == 'departureTime' &&
child.finishTime &&
child.finishTime.split(' ').length == 2
) {
child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
} else if (
child.key == 'signDate' &&
child.finishTime &&
child.finishTime.split(' ').length == 2
) {
child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
console.log('signDate', child.finishTime)
}
// 离港时间在到港时间之前 // 离港时间在到港时间之前
if ( if (
child.key == 'arrivalTime' && child.key == 'arrivalTime' &&
...@@ -1203,8 +1186,6 @@ const processFormData = async () => { ...@@ -1203,8 +1186,6 @@ const processFormData = async () => {
processedAppointmentData.value = processedData processedAppointmentData.value = processedData
console.log('processedAppointmentData.value', processedAppointmentData.value) console.log('processedAppointmentData.value', processedAppointmentData.value)
} }
console.log('processedAppointmentData.value', processedAppointmentData.value)
console.log('form.value', form.value)
anchorListReady.value = true anchorListReady.value = true
} }
...@@ -1673,7 +1654,13 @@ const handleFormValues = () => { ...@@ -1673,7 +1654,13 @@ const handleFormValues = () => {
}) })
} }
if (item1.compositionTime) { if (item1.compositionTime) {
submitObj[item1.key] = item1.finishTime let dateTime = ''
if (item1.timeValue) {
dateTime = proxy.formatToDateTime(`${form.value[item1.key]} ${item1.timeValue}`)
} else if (form.value[item1.key]) {
dateTime = proxy.formatToDateTime(`${form.value[item1.key]}`)
}
submitObj[item1.key] = dateTime
} }
}) })
} }
...@@ -1710,7 +1697,7 @@ const handleFormValues = () => { ...@@ -1710,7 +1697,7 @@ const handleFormValues = () => {
} }
}) })
console.log('submitObj', submitObj) console.log('submitObj表单值', submitObj)
if (submitObj['departureTime']) { if (submitObj['departureTime']) {
// 开始时间是否在结束时间之前 // 开始时间是否在结束时间之前
if ( if (
......
...@@ -571,6 +571,13 @@ const processFormData = async obj => { ...@@ -571,6 +571,13 @@ const processFormData = async obj => {
for (const section of processedData) { for (const section of processedData) {
if (section.data) { if (section.data) {
for (const field of section.data) { for (const field of section.data) {
if (!props.idsObj.appointmentBizId && field.defaultValue) {
if (field.key == 'isLegalBeneficiary') {
form.value[field.key] = Number(field.defaultValue)
} else {
form.value[field.key] = field.defaultValue
}
}
rules.value[field.key] = [ rules.value[field.key] = [
{ required: true, message: `${field.label}不能为空`, trigger: 'blur' } { required: true, message: `${field.label}不能为空`, trigger: 'blur' }
] ]
...@@ -589,7 +596,7 @@ const processFormData = async obj => { ...@@ -589,7 +596,7 @@ const processFormData = async obj => {
} }
} }
} }
if (props.idsObj.appointmentBizId ) { if (props.idsObj.appointmentBizId) {
setFormValue(processedData) setFormValue(processedData)
} else { } else {
processedBeneficiaryData.value = oldAppointmentData.value = processedData processedBeneficiaryData.value = oldAppointmentData.value = processedData
......
...@@ -435,23 +435,6 @@ const handleSearchSelectChange = (father, key) => { ...@@ -435,23 +435,6 @@ const handleSearchSelectChange = (father, key) => {
form.value[father.key][key] = item1.label form.value[father.key][key] = item1.label
form.value[father.key]['productLaunchBizId'] = item1.value form.value[father.key]['productLaunchBizId'] = item1.value
console.log('item1.apiAttributeSettingDtoList', item1.apiAttributeSettingDtoList) console.log('item1.apiAttributeSettingDtoList', item1.apiAttributeSettingDtoList)
// item1.apiAttributeSettingDtoList.forEach(item2 => {
// if (item2.fieldBizId == 'field_eWCnuwS3WPKog5kZ' && item.key == 'issueNumber') {
// if (item2.value) {
// item.options = item2.value
// .split(/[,,;;\s]+/)
// .map(item => item.trim())
// .filter(item => item !== '')
// .map(item => {
// return { label: item, value: item }
// })
// if (item.options.length > 0)
// form.value[father.key]['issueNumber'] = item.options[0].value
// }
// console.log(item.options, item, '1111')
// }
// })
} }
}) })
}) })
...@@ -482,6 +465,7 @@ const handleSearchSelectChange = (father, key) => { ...@@ -482,6 +465,7 @@ const handleSearchSelectChange = (father, key) => {
if (form.value[father.key][key] == item.value) { if (form.value[father.key][key] == item.value) {
form.value[father.key][key] = item.label form.value[father.key][key] = item.label
form.value[father.key].reconciliationCompanyId = item.value form.value[father.key].reconciliationCompanyId = item.value
form.value[father.key].reconciliationCompanyCode = item.code
} }
}) })
} }
......
...@@ -436,6 +436,13 @@ const processFormData = async obj => { ...@@ -436,6 +436,13 @@ const processFormData = async obj => {
for (const section of processedData) { for (const section of processedData) {
if (section.data) { if (section.data) {
for (const field of section.data) { for (const field of section.data) {
if (!props.idsObj.appointmentBizId && field.defaultValue) {
if (field.key == 'isSecond') {
form.value[field.key] = Number(field.defaultValue)
} else {
form.value[field.key] = field.defaultValue
}
}
// 编辑状态下回显表单值 // 编辑状态下回显表单值
if (section.key == 'apiSecondHolderInfoDto' && props.idsObj.appointmentBizId) { if (section.key == 'apiSecondHolderInfoDto' && props.idsObj.appointmentBizId) {
if (obj['detailInfo'] && obj['detailInfo']['isSecond'] == '0') { if (obj['detailInfo'] && obj['detailInfo']['isSecond'] == '0') {
......
...@@ -70,7 +70,13 @@ ...@@ -70,7 +70,13 @@
prop="appointmentNo" prop="appointmentNo"
width="200" width="200"
fixed="left" fixed="left"
/> >
<template #default="scope">
<el-button link size="default">
<span @click="copyToClipboard(scope.row.appointmentNo,'预约编号')">{{ scope.row.appointmentNo }}</span>
</el-button>
</template>
</el-table-column>
<el-table-column label="预约状态" align="center" prop="status" fixed="left" width="100"> <el-table-column label="预约状态" align="center" prop="status" fixed="left" width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :options="csf_ap_status" :value="scope.row.status" /> <dict-tag :options="csf_ap_status" :value="scope.row.status" />
...@@ -94,16 +100,11 @@ ...@@ -94,16 +100,11 @@
<el-table-column label="投保人" align="center" prop="policyholder" width="150" /> <el-table-column label="投保人" align="center" prop="policyholder" width="150" />
<el-table-column label="受保人" align="center" prop="insurant" width="150" /> <el-table-column label="受保人" align="center" prop="insurant" width="150" />
<!-- <el-table-column label="供款频率" align="center" prop="paymentFrequency" width="100"> <!-- <el-table-column label="供款频率" align="center" width="150" prop="paymentFrequency">
<template #default="scope"> <template #default="scope">
<dict-tag :options="csf_ap_frequency" :value="scope.row.paymentFrequency" /> <dict-tag :options="csf_ap_frequency" :value="scope.row.paymentFrequency" />
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column label="供款频率" align="center" width="150" prop="paymentFrequency">
<template #default="scope">
<dict-tag :options="csf_ap_frequency" :value="scope.row.paymentFrequency" />
</template>
</el-table-column>
<el-table-column label="供款期数" align="center" prop="paymentTerm" width="100" /> <el-table-column label="供款期数" align="center" prop="paymentTerm" width="100" />
<el-table-column label="每期保费" align="center" prop="eachIssuePremium" width="100" /> <el-table-column label="每期保费" align="center" prop="eachIssuePremium" width="100" />
...@@ -212,6 +213,7 @@ import { ...@@ -212,6 +213,7 @@ import {
getItineraryExprot getItineraryExprot
} from '@/api/sign/appointment' } from '@/api/sign/appointment'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import {copyToClipboard} from '@/utils/copyToClipboard'
const dictStore = useDictStore() const dictStore = useDictStore()
const userStore = useUserStore() const userStore = useUserStore()
const router = useRouter() const router = useRouter()
...@@ -270,7 +272,7 @@ const { bx_currency_type, csf_ap_status, csf_ap_meeting_point, csf_ap_frequency ...@@ -270,7 +272,7 @@ const { bx_currency_type, csf_ap_status, csf_ap_meeting_point, csf_ap_frequency
const baseDropdownItems = [ const baseDropdownItems = [
{ label: '修改', value: 'edit', confirm: '' }, { label: '修改', value: 'edit', confirm: '' },
{ {
label: '生成行程单', label: '确认生成行程单',
value: 'viewItinerary', value: 'viewItinerary',
confirm: '', confirm: '',
// 只有当 row.status == 1 时才显示 // 只有当 row.status == 1 时才显示
......
...@@ -330,7 +330,8 @@ const setPayoutAmountConfig = [ ...@@ -330,7 +330,8 @@ const setPayoutAmountConfig = [
prop: 'currentPaymentAmount', prop: 'currentPaymentAmount',
label: '出账金额', label: '出账金额',
inputType: 'decimal', inputType: 'decimal',
rules: [{ pattern: /^\d+$/, message: '只能输入正整数', trigger: 'blur' }] decimalDigits: 4,
rules: [{ pattern: /^\d+(\.\d{1,4})?$/, message: '最多四位小数', trigger: 'blur' }]
}, },
{ {
type: 'select', type: 'select',
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
? '首期保费对账' ? '首期保费对账'
: '续期保费对账' : '续期保费对账'
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="insuranceCompany" label="保险公司" width="150" /> <el-table-column prop="insuranceCompany" label="保险公司" width="150" />
...@@ -218,6 +217,7 @@ ...@@ -218,6 +217,7 @@
:showClose="true" :showClose="true"
@close="showAffirm = false" @close="showAffirm = false"
@confirm="confirmAffirm" @confirm="confirmAffirm"
:confirmLoading="settingAffirmLoading"
> >
<SearchForm ref="affirmFormRef" :config="affirmConfig" v-model="affirmFormModel" /> <SearchForm ref="affirmFormRef" :config="affirmConfig" v-model="affirmFormModel" />
</CommonDialog> </CommonDialog>
...@@ -320,6 +320,7 @@ const showRemittance = ref(false) ...@@ -320,6 +320,7 @@ const showRemittance = ref(false)
const remittanceFormRef = ref(null) const remittanceFormRef = ref(null)
const bankOptions = ref([]) //银行options const bankOptions = ref([]) //银行options
const currentRow = ref({}) //银行options const currentRow = ref({}) //银行options
const settingAffirmLoading = ref(false)
const searchConfig = ref([ const searchConfig = ref([
{ {
type: 'select', type: 'select',
...@@ -460,9 +461,10 @@ const affirmConfig = [ ...@@ -460,9 +461,10 @@ const affirmConfig = [
prop: 'recognizedAmount', prop: 'recognizedAmount',
label: '保司认定金额', label: '保司认定金额',
inputType: 'decimal', inputType: 'decimal',
decimalDigits: 4,
rules: [ rules: [
{ required: true, message: '请输入', trigger: 'blur' }, { required: true, message: '请输入', trigger: 'blur' },
{ pattern: /^\d+$/, message: '只能输入正整数' } { pattern: /^\d+(\.\d{1,4})?$/, message: '最多四位小数', trigger: 'blur' }
] ]
}, },
{ {
...@@ -494,7 +496,8 @@ const affirmConfig = [ ...@@ -494,7 +496,8 @@ const affirmConfig = [
placeholder: '请选择', placeholder: '请选择',
maxDate: 'today', maxDate: 'today',
visible: formData => visible: formData =>
formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0 || Number(formData.remainingUnpaidAmount) == 0, (formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0) ||
Number(formData.remainingUnpaidAmount) == 0,
rules: [{ required: true, message: '请输入', trigger: 'blur' }] rules: [{ required: true, message: '请输入', trigger: 'blur' }]
}, },
{ {
...@@ -505,7 +508,8 @@ const affirmConfig = [ ...@@ -505,7 +508,8 @@ const affirmConfig = [
maxDate: 'today', maxDate: 'today',
rules: [{ required: true, message: '请输入', trigger: 'blur' }], rules: [{ required: true, message: '请输入', trigger: 'blur' }],
visible: formData => visible: formData =>
formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0 || Number(formData.remainingUnpaidAmount) == 0, (formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0) ||
Number(formData.remainingUnpaidAmount) == 0
}, },
{ {
type: 'select', type: 'select',
...@@ -513,7 +517,30 @@ const affirmConfig = [ ...@@ -513,7 +517,30 @@ const affirmConfig = [
label: '保单状态', label: '保单状态',
dictType: 'csf_policy_status_new', dictType: 'csf_policy_status_new',
visible: formData => visible: formData =>
formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0 || Number(formData.remainingUnpaidAmount) == 0, (formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0) ||
Number(formData.remainingUnpaidAmount) == 0
},
{
type: 'date',
prop: 'policyExpirationDate',
label: '保单截至日',
placeholder: '请选择',
// maxDate: 'today',
visible: formData =>
(formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0) ||
Number(formData.remainingUnpaidAmount) == 0
// rules: [{ required: true, message: '请输入', trigger: 'blur' }]
},
{
type: 'date',
prop: 'coolingOffEndDate',
label: '冷静期到期日',
placeholder: '请选择',
// maxDate: 'today',
visible: formData =>
(formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0) ||
Number(formData.remainingUnpaidAmount) == 0,
rules: [{ required: true, message: '请输入', trigger: 'blur' }]
} }
] ]
//计算待付金额 //计算待付金额
...@@ -533,6 +560,7 @@ const calculateAmount = async () => { ...@@ -533,6 +560,7 @@ const calculateAmount = async () => {
} }
} }
const confirmAffirm = async () => { const confirmAffirm = async () => {
settingAffirmLoading.value = true
try { try {
const formData = await affirmFormRef.value.validate() const formData = await affirmFormRef.value.validate()
console.log(formData.value) console.log(formData.value)
...@@ -545,6 +573,7 @@ const confirmAffirm = async () => { ...@@ -545,6 +573,7 @@ const confirmAffirm = async () => {
newObj.premiumReconciliationBizId = currentRow.value.premiumReconciliationBizId newObj.premiumReconciliationBizId = currentRow.value.premiumReconciliationBizId
let res = await submitResult(newObj) let res = await submitResult(newObj)
if (res.code == 200) { if (res.code == 200) {
settingAffirmLoading.value = false
ElMessage.success('认定成功') ElMessage.success('认定成功')
showAffirm.value = false showAffirm.value = false
affirmFormModel.value = {} affirmFormModel.value = {}
...@@ -587,14 +616,13 @@ const remittanceConfig = [ ...@@ -587,14 +616,13 @@ const remittanceConfig = [
prop: 'paymentAmount', prop: 'paymentAmount',
label: '付款金额', label: '付款金额',
inputType: 'decimal', inputType: 'decimal',
decimalDigits: 4,
rules: [ rules: [
{ required: true, message: '请输入', trigger: 'blur' }, { required: true, message: '请输入', trigger: 'blur' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (value === '' || value == null) { if (value === '' || value == null) {
callback(new Error('请输入付款金额')) callback(new Error('请输入付款金额'))
} else if (!/^\d+$/.test(String(value))) {
callback(new Error('只能输入正整数'))
} else { } else {
callback() callback()
} }
...@@ -636,7 +664,7 @@ const remittanceConfig = [ ...@@ -636,7 +664,7 @@ const remittanceConfig = [
label: '付款银行', label: '付款银行',
api: '/base/api/bank/page', api: '/base/api/bank/page',
keywordField: 'policyNo', keywordField: 'policyNo',
requestParams: { pageNo: 1, pageSize: 20 }, requestParams: { pageNo: 1, pageSize: 50 },
debounceWait: 500, // 自定义防抖时间 debounceWait: 500, // 自定义防抖时间
valueKey: 'bankBizId', valueKey: 'bankBizId',
...@@ -768,10 +796,10 @@ const handleUploadSuccess = (prop, Model) => { ...@@ -768,10 +796,10 @@ const handleUploadSuccess = (prop, Model) => {
// 代表是从新增保单对账开始 // 代表是从新增保单对账开始
if (item.response) { if (item.response) {
let newObj = JSON.parse(JSON.stringify(item.response.data)) let newObj = JSON.parse(JSON.stringify(item.response.data))
;(item.fileName = newObj.originalName), //文件名 ;((item.fileName = newObj.originalName), //文件名
(item.fileType = newObj.fileType), //文件类型 (item.fileType = newObj.fileType), //文件类型
(item.fileUrl = newObj.url), //文件URL, (item.fileUrl = newObj.url), //文件URL,
(item.url = newObj.url) (item.url = newObj.url))
} }
}) })
tempOtherFileList.value = list tempOtherFileList.value = list
...@@ -1188,6 +1216,7 @@ const handleSelect = (command, row) => { ...@@ -1188,6 +1216,7 @@ const handleSelect = (command, row) => {
getPremiumReconciliationDetail(row) getPremiumReconciliationDetail(row)
} else if (command === 'settingResult') { } else if (command === 'settingResult') {
affirmFormModel.value = {} affirmFormModel.value = {}
settingAffirmLoading.value = false
showAffirm.value = true showAffirm.value = true
currentRow.value = JSON.parse(JSON.stringify(row)) currentRow.value = JSON.parse(JSON.stringify(row))
} }
......
<template> <template>
<div> <div>
<CommonPage :operationBtnList='operationBtnList' :visibleDefaultButtons="visibleDefaultButtons" <CommonPage :operationBtnList='operationBtnList' :visibleDefaultButtons="visibleDefaultButtons" v-loading.fullscreen.lock="statusLoading"
:showSearchForm='true' :show-pagination='true' :total='pageTotal' :current-page='currentPage' :showSearchForm='true' :show-pagination='true' :total='pageTotal' :current-page='currentPage'
:page-size='pageSize' @size-change='handleSizeChange' @current-change='handleCurrentChange'> :page-size='pageSize' @size-change='handleSizeChange' @current-change='handleCurrentChange'>
<!-- 搜索区域 --> <!-- 搜索区域 -->
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
<!-- 查看详情、更新数据 --> <!-- 查看详情、更新数据 -->
<CommonDialog :dialogTitle='mode === "viewDetail" ? "查看详情" : "更新数据"' dialogWidth='80%' <CommonDialog :dialogTitle='mode === "viewDetail" ? "查看详情" : "更新数据"' dialogWidth='80%'
:openDialog=viewDetailDialogFlag :showAction='false' :showClose='true' @close='viewDetailDialogFlag = false' :openDialog=viewDetailDialogFlag :showAction='false' :showClose='true' @close='viewDetailDialogFlag=false'
@confirm='handleUpdateSubmit'> @confirm='handleUpdateSubmit'>
<PolicyDetail v-model="policyDetailFormData" :policyBizId="selectedRow.policyBizId" :mode="mode" <PolicyDetail v-model="policyDetailFormData" :policyBizId="selectedRow.policyBizId" :mode="mode"
ref="policyDetailFormRef" @submit="onSubmit" @cancel="viewDetailDialogFlag = false" ref="policyDetailFormRef" @submit="onSubmit" @cancel="viewDetailDialogFlag = false"
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
<script setup> <script setup>
import { ref, reactive, computed, watch, nextTick } from 'vue' import { ref, reactive, computed, watch, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import CommonPage from '@/components/commonPage' import CommonPage from '@/components/commonPage'
import SearchForm from '@/components/SearchForm/SearchForm.vue' import SearchForm from '@/components/SearchForm/SearchForm.vue'
import CommonDialog from '@/components/commonDialog' import CommonDialog from '@/components/commonDialog'
...@@ -94,9 +94,9 @@ import { ...@@ -94,9 +94,9 @@ import {
getExpectedCommissionList, getExpectedCommissionList,
changePolicyStatus, changePolicyStatus,
policyFollowReport, policyFollowReport,
saveMailingInfo, updatePolicyfollow, batchSaveBrokers, saveInitialPayment saveMailingInfo, updatePolicyfollow, batchSaveBrokers, saveInitialPayment,updatePolicyProduct
} from '@/api/sign/underwritingMain' } from '@/api/sign/underwritingMain'
import {copyToClipboard} from '@/utils/copyToClipboard'
import PolicyDetail from './policyDetail.vue' import PolicyDetail from './policyDetail.vue'
const policyDetailFormRef = ref(null) const policyDetailFormRef = ref(null)
const policyDetailFormData = ref({}) const policyDetailFormData = ref({})
...@@ -106,11 +106,13 @@ const currentPage = ref(1) ...@@ -106,11 +106,13 @@ const currentPage = ref(1)
const pageSize = ref(10) const pageSize = ref(10)
const pageTotal = ref(0) const pageTotal = ref(0)
const loading = ref(false) const loading = ref(false)
const statusLoading = ref(false)
// 搜索表单数据 // 搜索表单数据
const searchFormData = reactive({}) const searchFormData = reactive({})
const selectedRow = ref(null) const selectedRow = ref(null)
// 弹窗相关 // 弹窗相关
const editStatusDialogFlag = ref(false) const editStatusDialogFlag = ref(false)
// 修改状态 // 修改状态
const editStatusFormData = ref({}) const editStatusFormData = ref({})
const editStatusFormRef = ref(null) const editStatusFormRef = ref(null)
...@@ -139,6 +141,7 @@ const viewRelatedDetail = (row) => { ...@@ -139,6 +141,7 @@ const viewRelatedDetail = (row) => {
} }
// 提交修改状态 // 提交修改状态
const handleEditStatusSubmit = async () => { const handleEditStatusSubmit = async () => {
statusLoading.value = true;
try { try {
await editStatusFormRef.value.validate() await editStatusFormRef.value.validate()
const res = await changePolicyStatus({ const res = await changePolicyStatus({
...@@ -146,13 +149,16 @@ const handleEditStatusSubmit = async () => { ...@@ -146,13 +149,16 @@ const handleEditStatusSubmit = async () => {
...editStatusFormData.value ...editStatusFormData.value
}) })
if (res.code === 200) { if (res.code === 200) {
statusLoading.value = false;
ElMessage.success('修改状态成功') ElMessage.success('修改状态成功')
editStatusDialogFlag.value = false editStatusDialogFlag.value = false
loadTableData() loadTableData()
} else { } else {
statusLoading.value = false;
ElMessage.error(res.msg || '修改状态失败') ElMessage.error(res.msg || '修改状态失败')
} }
} catch (error) { } catch (error) {
statusLoading.value = false;
console.error('修改状态失败', error) console.error('修改状态失败', error)
} }
} }
...@@ -177,7 +183,7 @@ const onSubmit = async (data) => { ...@@ -177,7 +183,7 @@ const onSubmit = async (data) => {
} else { } else {
ElMessage.error(res.msg || '保存邮寄信息失败') ElMessage.error(res.msg || '保存邮寄信息失败')
} }
} else if (data.activeTab === 'basic' || data.activeTab === 'productPlan') { } else if (data.activeTab === 'basic') {
params = { params = {
policyBizId: selectedRow.value.policyBizId, policyBizId: selectedRow.value.policyBizId,
...data, ...data,
...@@ -186,10 +192,25 @@ const onSubmit = async (data) => { ...@@ -186,10 +192,25 @@ const onSubmit = async (data) => {
const res = await updatePolicyfollow(params) const res = await updatePolicyfollow(params)
if (res.code === 200) { if (res.code === 200) {
ElMessage.success(data.activeTab === 'basic' ? '保存基本信息成功' : '保存产品计划成功') ElMessage.success(data.activeTab === 'basic' ? '保存基本信息成功' : '保存产品计划成功')
loadTableData()
// viewDetailDialogFlag.value = false // viewDetailDialogFlag.value = false
} else { } else {
ElMessage.error(res.msg || (data.activeTab === 'basic' ? '保存基本信息失败' : '保存产品计划失败')) ElMessage.error(res.msg || (data.activeTab === 'basic' ? '保存基本信息失败' : '保存产品计划失败'))
} }
} else if (data.activeTab === 'productPlan') {
params = {
policyBizId: selectedRow.value.policyBizId,
apiProductPlanMainInfoDto:{...data},
activeTab: undefined
}
const res = await updatePolicyProduct(params)
if (res.code === 200) {
ElMessage.success('保存产品计划成功')
loadTableData()
// viewDetailDialogFlag.value = false
} else {
ElMessage.error(res.msg || ('保存产品计划失败'))
}
} else if (data.activeTab === 'introducer') { } else if (data.activeTab === 'introducer') {
params = { params = {
policyBizId: selectedRow.value.policyBizId, policyBizId: selectedRow.value.policyBizId,
...@@ -433,7 +454,9 @@ const handleSelect = async (e, row) => { ...@@ -433,7 +454,9 @@ const handleSelect = async (e, row) => {
} }
editStatusDialogFlag.value = true editStatusDialogFlag.value = true
editStatusFormData.value = { editStatusFormData.value = {
status: row.status status: row.status,
effectiveDate:row.effectiveDate,
underwritingDate:row.underwritingDate
} }
break break
case 'viewRelated': case 'viewRelated':
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<el-col :sm="12" :lg="12" :xs="24"> <el-col :sm="12" :lg="12" :xs="24">
<div class="headerLeft"> <div class="headerLeft">
<div class="top">欢迎!</div> <div class="top">欢迎!</div>
<div class="bottom">王力群</div> <div class="bottom">CSF-HK</div>
</div> </div>
</el-col> </el-col>
<el-col :sm="12" :lg="12" :xs="24" class="right"> <el-col :sm="12" :lg="12" :xs="24" class="right">
...@@ -180,14 +180,14 @@ const headerList = ref([ ...@@ -180,14 +180,14 @@ const headerList = ref([
id: '1', id: '1',
title: '总保费(HKD)', title: '总保费(HKD)',
icon: 'icon-zongbaofei', icon: 'icon-zongbaofei',
count: '392.52', count: '--',
url: '/todo' url: '/todo'
}, },
{ {
id: '2', id: '2',
title: '有效保单数', title: '有效保单数',
icon: 'icon-youxiaobaodan', icon: 'icon-youxiaobaodan',
count: '0.00', count: '--',
url: '/todo' url: '/todo'
}, },
...@@ -195,7 +195,7 @@ const headerList = ref([ ...@@ -195,7 +195,7 @@ const headerList = ref([
id: '3', id: '3',
title: '待来佣保单', title: '待来佣保单',
icon: 'icon-daijiesuan', icon: 'icon-daijiesuan',
count: '10', count: '--',
url: '/todo' url: '/todo'
} }
]) ])
...@@ -275,7 +275,7 @@ const staticList = ref([ ...@@ -275,7 +275,7 @@ const staticList = ref([
id: '1', id: '1',
title: '财务需求分析数', title: '财务需求分析数',
icon: 'icon-xiexian', icon: 'icon-xiexian',
count: '3735', count: '--',
unit: '条', unit: '条',
url: '/todo', url: '/todo',
color: '#F53F3F' color: '#F53F3F'
...@@ -284,7 +284,7 @@ const staticList = ref([ ...@@ -284,7 +284,7 @@ const staticList = ref([
id: '2', id: '2',
title: '预约单数', title: '预约单数',
icon: 'icon-xiexian', icon: 'icon-xiexian',
count: '12', count: '--',
unit: '单', unit: '单',
url: '/todo', url: '/todo',
color: '#0FC6C2' color: '#0FC6C2'
...@@ -293,7 +293,7 @@ const staticList = ref([ ...@@ -293,7 +293,7 @@ const staticList = ref([
id: '3', id: '3',
title: '新单数', title: '新单数',
icon: 'icon-xiexian', icon: 'icon-xiexian',
count: '12', count: '--',
unit: '单', unit: '单',
url: '/todo', url: '/todo',
color: '#165DFF' color: '#165DFF'
...@@ -302,7 +302,7 @@ const staticList = ref([ ...@@ -302,7 +302,7 @@ const staticList = ref([
id: '4', id: '4',
title: '续期保单数', title: '续期保单数',
icon: 'icon-xiexian', icon: 'icon-xiexian',
count: '13', count: '--',
unit: '份', unit: '份',
url: '/todo', url: '/todo',
color: '#0FC6C2' color: '#0FC6C2'
...@@ -312,22 +312,22 @@ const infoList = ref([ ...@@ -312,22 +312,22 @@ const infoList = ref([
{ {
id: '1', id: '1',
title: '产品优惠', title: '产品优惠',
subTitle: 'XXXXX第四季度优惠政策' subTitle: '暂未开放'
}, },
{ {
id: '2', id: '2',
title: '产品培训', title: '产品培训',
subTitle: 'XXXXX产品培训回放' subTitle: '暂未开放'
}, },
{ {
id: '3', id: '3',
title: '重要通知', title: '重要通知',
subTitle: 'XXXXX保单未续费' subTitle: '暂未开放'
}, },
{ {
id: '4', id: '4',
title: '系统消息', title: '系统消息',
subTitle: 'FNA导出成功!' subTitle: '暂未开放!'
} }
]) ])
const timeList = ref([ const timeList = ref([
...@@ -351,21 +351,21 @@ const workList = ref([ ...@@ -351,21 +351,21 @@ const workList = ref([
{ {
id: '1', id: '1',
title: '新单跟进', title: '新单跟进',
subTitle: '张三预约单待录入', subTitle: '暂未开放',
unit: 'Q', unit: 'Q',
color: '#7BC616' color: '#7BC616'
}, },
{ {
id: '2', id: '2',
title: '续费提醒', title: '续费提醒',
subTitle: 'bug fix', subTitle: '暂未开放',
unit: 'Y', unit: 'Y',
color: '#14C9C9' color: '#14C9C9'
}, },
{ {
id: '3', id: '3',
title: '预约单生成', title: '预约单生成',
subTitle: '车险预约单已生成', subTitle: '暂未开放',
unit: 'N', unit: 'N',
color: '#168CFF' color: '#168CFF'
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment