Commit 6b4dbc30 by Sweet Zhang

联调

parent d9ec28db
......@@ -251,7 +251,7 @@ export function batchSaveBrokers(data) {
// 通过保险公司、险种查询产品列表及参数
export function getProductList(data) {
return request({
url: '/csf/prodcut/api/relProjectProductLaunch/parameter/page',
url: '/prodcut/api/relProjectProductLaunch/parameter/page',
method: 'post',
data: data
})
......
......@@ -629,11 +629,11 @@ function getSelectOptions(item) {
return []
}
async function loadRemoteOptionsForInit(item) {
const { prop, api, requestParams = {} } = item
const { prop, api, requestParams } = item
try {
// 构造请求体:只传 requestParams,不传 keyword
const payload = {
...(requestParams || {})
...(typeof requestParams === 'function' ? requestParams() : requestParams || {})
}
const res = await request({
......@@ -663,7 +663,7 @@ async function loadRemoteOptionsForInit(item) {
}
// ==================== 加载远程 API 选项(首次 focus 时加载,无搜索词) ====================
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
try {
......@@ -671,7 +671,7 @@ async function loadRemoteOptions(item) {
// 构造请求体:合并 requestParams + 分页(默认第一页)
const payload = {
...(requestParams || {})
...(typeof requestParams === 'function' ? requestParams() : requestParams || {})
// 注意:此时无 keyword,所以不加 keywordField
}
......@@ -706,7 +706,7 @@ async function loadRemoteOptions(item) {
// ==================== 远程搜索(带关键词,防抖) ====================
let searchTimeout = null
function handleFilterChange(keyword, item) {
const { prop, api, requestParams = {}, keywordField = 'keyword', debounceWait = 300 } = item
const { prop, api, requestParams, keywordField = 'keyword', debounceWait = 300 } = item
if (!api) return
clearTimeout(searchTimeout)
......@@ -716,7 +716,7 @@ function handleFilterChange(keyword, item) {
// 构造请求体:requestParams + 分页 + 动态关键词字段
const payload = {
...(requestParams || {}),
...(typeof requestParams === 'function' ? requestParams() : requestParams || {}),
[keywordField]: keyword // ← 动态字段名,如 name / companyName
}
......
......@@ -9,14 +9,14 @@
</template>
<!-- 列表区域 -->
<template #table>
<!-- 统计信息卡片 -->
<div class="statistics-container" v-if="statisticsData.totalInAmount > 0">
<!-- 统计信息卡片 v-if="statisticsData.totalInAmount > 0"-->
<div class="statistics-container">
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="4" :lg="4">
<el-card shadow="hover" class="statistics-card">
<div class="card-content">
<div class="card-label">入账金额</div>
<div class="card-value">{{ statisticsData.totalInAmount }}</div>
<div class="card-value">{{ statisticsData.totalInAmount ? formatCurrency(statisticsData.totalInAmount) : 0 }}</div>
</div>
</el-card>
</el-col>
......@@ -24,7 +24,7 @@
<el-card shadow="hover" class="statistics-card">
<div class="card-content">
<div class="card-label">总保单数</div>
<div class="card-value">{{ statisticsData.totalPolicyCount }}</div>
<div class="card-value">{{ statisticsData.totalPolicyCount ? statisticsData.totalPolicyCount : 0 }}</div>
</div>
</el-card>
</el-col>
......@@ -32,7 +32,7 @@
<el-card shadow="hover" class="statistics-card">
<div class="card-content">
<div class="card-label">总保费(HKD)</div>
<div class="card-value">{{ statisticsData.totalPremium }}</div>
<div class="card-value">{{ statisticsData.totalPremium ? formatCurrency(statisticsData.totalPremium) : 0 }}</div>
</div>
</el-card>
</el-col>
......@@ -40,7 +40,7 @@
<el-card shadow="hover" class="statistics-card">
<div class="card-content">
<div class="card-label">待出账金额</div>
<div class="card-value">{{ statisticsData.pendingOutAmount }}</div>
<div class="card-value">{{ statisticsData.pendingOutAmount ? formatCurrency(statisticsData.pendingOutAmount) : 0 }}</div>
</div>
</el-card>
</el-col>
......@@ -48,7 +48,7 @@
<el-card shadow="hover" class="statistics-card">
<div class="card-content">
<div class="card-label">可出账金额</div>
<div class="card-value">{{ statisticsData.availableOutAmount }}</div>
<div class="card-value">{{ statisticsData.availableOutAmount ? formatCurrency(statisticsData.availableOutAmount) : 0 }}</div>
</div>
</el-card>
</el-col>
......@@ -56,7 +56,7 @@
<el-card shadow="hover" class="statistics-card">
<div class="card-content">
<div class="card-label">差额(估)</div>
<div class="card-value">{{ formatCurrency(statisticsData.differenceAmount) }}</div>
<div class="card-value">{{ statisticsData.differenceAmount ? formatCurrency(statisticsData.differenceAmount) : 0 }}</div>
</div>
</el-card>
</el-col>
......@@ -73,7 +73,7 @@
<el-table-column prop="policyNo" label="保单号" width="120" sortable />
<el-table-column prop="insuranceCompany" label="保险公司" width="120" sortable />
<el-table-column prop="commissionPaidAmount" label="累积已入账金额" width="120" sortable />
<el-table-column prop="commissionPaidRatio" label="累积已入账比例" width="120" sortable :formatter="(row) => `${row.commissionPaidRatio }%`" />
<el-table-column prop="commissionPaidRatio" label="累积已入账比例" width="120" sortable :formatter="(row) => `${row.commissionPaidRatio ? row.commissionPaidRatio : 0 }%`" />
<el-table-column prop="fortuneName" label="出账项目" width="130" sortable />
<el-table-column prop="fortunePeriod" label="出账期数" width="130" sortable />
<el-table-column prop="fortuneTotalPeriod" label="总期数" width="120" sortable />
......@@ -185,7 +185,7 @@ const searchConfig = ref([
debounceWait: 500, // 自定义防抖时间
multiple: true,
valueKey: 'insuranceCompanyBizId',
labelKey: 'abbreviation',
labelKey: 'fullName',
transform: (res) => {
console.log(res)
return res?.data.records || []
......
......@@ -387,7 +387,7 @@ const searchConfig = ref([
debounceWait: 500, // 自定义防抖时间
multiple: true,
valueKey: 'insuranceCompanyBizId',
labelKey: 'abbreviation',
labelKey: 'fullName',
transform: (res) => {
console.log(res)
return res?.data.records || []
......
......@@ -319,7 +319,7 @@ const searchConfig = ref([
placeholder: '输入保险公司名称搜索',
debounceWait: 500, // 自定义防抖时间
valueKey: 'insuranceCompanyBizId',
labelKey: 'abbreviation',
labelKey: 'fullName',
transform: (res) => {
console.log(res)
return res?.data.records || []
......@@ -725,6 +725,7 @@ const handleConfirmSetPayRecordStatus = async () => {
onMounted(async () => {
try {
await loadDicts(['csf_expected_fortune_status'])
loadTableData()
} catch (error) {
console.error('字典加载失败', error)
} finally {
......
......@@ -410,7 +410,7 @@ const searchConfig = ref([
debounceWait: 500, // 自定义防抖时间
multiple: true,
valueKey: 'insuranceCompanyBizId',
labelKey: 'abbreviation',
labelKey: 'fullName',
transform: (res) => {
return res?.data.records || []
}
......@@ -736,6 +736,7 @@ const handleConfirmSetStatus = () => {
onMounted(async () => {
try {
await loadDicts(['csf_expected_commission_status'])
loadTableData()
} catch (error) {
console.error('字典加载失败', error)
} finally {
......
......@@ -824,17 +824,25 @@ const viewHistory = () => {
}
}
const handleTableSelectChange = (father, row, key) => {
console.log('选择了', row, key)
searchOptions.value[key].forEach(item => {
console.log('item', item)
if (row[key] == item.value) {
row[key] = item.label
row.userBizId = item.userBizId
if (key == 'name') {
row.userSignBizId = item.value
row.practiceCode = item.practiceCode
row.phone = item.phone
row.cardNo = item.cardNo
row.email = item.email
row.cardType = item.cardType
} else if (key == 'realName') {
row.userSaleBizId = item.value
}
}
})
}
// 添加表单子级dom
const addChildren = father => {
......
......@@ -667,10 +667,10 @@ const remittanceConfig = [
type: 'select',
prop: 'policyNo',
label: '保单号码',
api: '/csf/api/policy/list/page/vo',
api: '/csf/api/policy_follow/policyNos',
keywordField: 'policyNo',
requestParams: { pageNo: 1, pageSize: 20 },
placeholder: '输入转介人名称搜索',
requestParams: { pageNo: 1, pageSize: 100 },
placeholder: '输入保单号码搜索',
debounceWait: 500, // 自定义防抖时间
valueKey: 'policyNo',
labelKey: 'policyNo',
......@@ -1046,10 +1046,10 @@ const addCheckRecordConfig = [
type: 'select',
prop: 'policyNo',
label: '保单号码',
api: '/csf/api/policy/list/page/vo',
api: '/csf/api/policy_follow/policyNos',
keywordField: 'policyNo',
requestParams: { pageNo: 1, pageSize: 20 },
placeholder: '输入转介人名称搜索',
requestParams: { pageNo: 1, pageSize: 100 },
placeholder: '输入保单号码搜索',
debounceWait: 500, // 自定义防抖时间
valueKey: 'policyNo',
labelKey: 'policyNo',
......
......@@ -120,13 +120,14 @@ const editStatusFormConfig = ref([
prop: 'status',
label: '新单状态',
dictType: 'csf_policy_follow_status_new'
}, {
},
{
type: 'date',
prop: 'policyEffectiveDate',
prop: 'effectiveDate',
label: '保单生效日',
}, {
type: 'date',
prop: 'policyInsureDate',
prop: 'underwritingDate',
label: '保单核保日',
},
])
......@@ -243,6 +244,7 @@ const normalizeIntroducerData = (data) => {
onMounted(async () => {
try {
await loadDicts(['csf_policy_follow_status_new'])
loadTableData()
} catch (error) {
console.error('字典加载失败', error)
} finally {
......@@ -338,7 +340,7 @@ const searchConfig = ref([
placeholder: '输入保险公司名称搜索',
debounceWait: 500, // 自定义防抖时间
valueKey: 'insuranceCompanyBizId',
labelKey: 'abbreviation',
labelKey: 'fullName',
multiple: true,
transform: (res) => {
return res?.data.records || []
......@@ -425,6 +427,10 @@ const handleSelect = async (e, row) => {
viewDetailDialogFlag.value = true
break
case 'setNewSingleStatus':
if (selectedRow.value.status === '生效') {
ElMessage.warning('保单已生效,不能更新新单状态')
return
}
editStatusDialogFlag.value = true
editStatusFormData.value = {
status: row.status
......
......@@ -34,7 +34,8 @@
<!-- 基本计划 -->
<div class="section">
<h3 class="sectionTitle">基本计划</h3>
<SearchForm ref="basicPlanFormRef" :config="basicPlanFormConfig" v-model="basicPlanFormData" />
<SearchForm ref="basicPlanFormRef" :config="basicPlanFormConfig" v-model="basicPlanFormData"
@selectChange="(prop, value, item) => handleSelectChange(prop, value, item, 'basicPlan')" />
</div>
<!-- 附加计划(可编辑表格) -->
......@@ -104,7 +105,8 @@
<div v-else-if="activeTab === 'attachment'" class="tab-content">
<div class="section">
<h3 class="sectionTitle">附件</h3>
<el-button type="primary" @click="fileUploadDialogFlag = true" :disabled="props.mode === 'viewDetail'">
<el-button type="primary" @click="fileUploadDialogFlag = true"
:disabled="props.mode === 'viewDetail'">
<el-icon class="el-icon--right">
<Upload />
</el-icon>上传附件
......@@ -141,8 +143,9 @@
<CommonDialog dialogTitle='文件导入' dialogWidth='80%' :openDialog=fileUploadDialogFlag :showAction='true'
:showClose='true' @close='fileUploadDialogFlag = false; files = ""'
@confirm='fileUploadDialogFlag = false; files = ""'>
<FileUpload v-model="files" :data="{ obiectTableName: 'policy_follow',objectBizId: props.policyBizId }"
:file-type="['xlsx', 'xls', 'doc', 'docx', 'pdf', 'txt', 'jpg', 'jpeg', 'png', 'gif']" :action="'/oss/api/oss/batch/upload'" :limit="10" :fileSize="15" :name="'files'"
<FileUpload v-model="files" :data="{ obiectTableName: 'policy_follow', objectBizId: props.policyBizId }"
:file-type="['xlsx', 'xls', 'doc', 'docx', 'pdf', 'txt', 'jpg', 'jpeg', 'png', 'gif']"
:action="'/oss/api/oss/batch/upload'" :limit="10" :fileSize="15" :name="'files'"
@uploadEnd="handleUploadEnd" />
</CommonDialog>
</div>
......@@ -197,19 +200,16 @@ const introducerConfig = [
debounceWait: 500, // 自定义防抖时间
onChangeExtraFields: {
broker: 'realName',// 选中后自动填 broker = raw.realName
brokerName: 'realName',
internalCode: 'code',
team: 'teamName',
phone: 'phone'
phone: 'phone',
},
transform: (res) => {
return (res?.data.records || []).map(item => ({
value: item.clientUserBizId,
label: item.realName,
// 👇 把 extra 字段挂到 option 上
realName: item.realName,
code: item.code,
teamName: item.teamName,
phone: item.phone
...item
}))
},
},
......@@ -356,13 +356,12 @@ const basicInfoFormConfig = ref([
placeholder: '输入签单员姓名搜索',
debounceWait: 500, // 自定义防抖时间
onChangeExtraFields: {
signerBizId: 'signerBizId',
signerBizId: 'userSignBizId',
practiceCode: 'practiceCode',
},
valueKey: 'userSignBizId',
valueKey: 'realName',
labelKey: 'realName',
transform: (res) => {
console.log(res)
return res?.data.records || []
},
rules: [
......@@ -449,8 +448,7 @@ const policyInfoFormConfig = ref([
// 基本计划
const basicPlanFormRef = ref()
const basicPlanFormData = ref({})
const basicPlanFormConfig = computed(() => {
return [
const basicPlanFormConfig = ref([
{
type: 'select',
prop: 'insuranceCompanyBizId',
......@@ -483,34 +481,38 @@ const basicPlanFormConfig = computed(() => {
transform: (res) => {
return res?.data.records || []
},
onChangeExtraFields: {
insuranceCategoryCode: 'code',
},
},
{
type: 'select',
prop: 'productLaunchBizId',
prop: 'productName',
label: '产品名称',
api: '/product/api/relProjectProductLaunch/parameter/page',
keywordField: 'productName',
// ✅ 关键:requestParams 必须是函数,才能响应式获取最新值!
requestParams: {
tenantBizId: userStore.projectInfo.tenantBizId || '',
projectBizId: userStore.projectInfo.projectBizId || '',
requestParams: () => ({
tenantBizId: userStore.projectInfo.tenantBizId,
projectBizId: userStore.projectInfo.projectBizId,
fieldBizId: 'field_olk1qZe81qHHKXbw',
fieldValueBizId: 'field_value_uOfJH5ucA2YwJpbn',
categoryCodeList: [basicPlanFormData.value.insuranceCategoryBizId || ''],
insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId || ''],
categoryCodeList: [basicPlanFormData.value.insuranceCategoryBizId],
insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId],
pageNo: 1,
pageSize: 20
},
}),
placeholder: '请选择产品名称',
debounceWait: 500,
valueKey: 'productLaunchBizId',
valueKey: 'productName',
labelKey: 'productName',
transform: (res) => res?.data.records || [],
// ✅ 关键:当选择产品时,自动回填其他字段
onChangeExtraFields: {
// 格式:targetProp: sourcePathInRawObject
apiAttributeSettingDtoList: 'apiAttributeSettingDtoList',
}
productLaunchBizId: 'productLaunchBizId',
},
},
{
type: 'select',
......@@ -582,12 +584,11 @@ const basicPlanFormConfig = computed(() => {
dictType: 'csf_ap_first_issue'
}, {
type: 'select',
prop: 'dividendPaymentMethod',
prop: 'dividendDistributionMethod',
label: '红利付款方式',
dictType: 'csf_ap_dividend'
},
]
})
])
// 首期保费
......@@ -780,12 +781,13 @@ const handleTabClick = (tab) => {
const handleSubmit = () => {
formRef.value?.validate((valid) => {
if (valid) {
console.log('提交数据', introducerTableData.value)
if (activeTab.value === 'postal') {
emit('submit', { ...postalFormData.value, activeTab: activeTab.value })
} else if (activeTab.value === 'firstPayment') {
emit('submit', { ...firstPremiumFormData.value, activeTab: activeTab.value })
} else if (activeTab.value === 'attachment') {
emit('submit', { ...attachmentFormData.value, activeTab: activeTab.value })
emit('submit', { activeTab: activeTab.value })
} else if (activeTab.value === 'introducer') {
emit('submit', { ...introducerTableData.value, activeTab: activeTab.value })
} else if (activeTab.value === 'basic') {
......@@ -829,6 +831,7 @@ const getPolicyfollowDetail = () => {
basicPlanFormData.value = transformToFormData(res.data, basicPlanFormConfig.value);
basicInfoFormData.value = transformToFormData(res.data, basicInfoFormConfig.value);
firstPremiumFormData.value = transformToFormData(res.data, firstPremiumFormConfig.value);
introducerTableData.value = res.data.brokerList || []
}
})
......@@ -928,6 +931,19 @@ const viewRecordDetail = (e) => {
}
})
}
const handleSelectChange = (prop, value, item, type) => {
console.log(basicPlanFormData.value)
if (type === 'basicPlan') {
const params = {
tenantBizId: userStore.projectInfo.tenantBizId,
projectBizId: userStore.projectInfo.projectBizId,
insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId],
pageNo: 1,
pageSize: 100,
}
getProductLists(params)
}
}
// 获取产品列表
const getProductLists = (params) => {
......
......@@ -62,6 +62,16 @@ export default defineConfig(({ mode, command }) => {
// proxyReq.setHeader('host', '139.224.145.34:9002')
// })
// }
},'/product': {
target: 'http://139.224.145.34:9002',
changeOrigin: true,
secure: false,
// 如果后端需要 host 头
// configure: (proxy, options) => {
// proxy.on('proxyReq', (proxyReq, req, res) => {
// proxyReq.setHeader('host', '139.224.145.34:9002')
// })
// }
},
// springdoc proxy
'^/v3/api-docs/(.*)': {
......
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