Commit feda043c by yuzhenWang

Merge branch 'test' into 'wyz'

Test

See merge request !139
parents dbfb2eaa 5fb8d958
......@@ -498,12 +498,20 @@ export function billCalculateToAmount(data) {
data: data
})
}
// 应收款管理--明细列表
export function newQueryCommissionExpectedByPage(data) {
return request({
url: 'csf/api/CommissionExpected/queryCommissionExpectedByPage/new',
method: 'post',
data: data
})
}
// 应收款管理修改应收记录状态
export function CommissionExpectedChangeStatus(data) {
return request({
url: 'csf/api/CommissionExpected/change_status',
method: 'post',
url: 'csf/api/CommissionExpected/edit/status',
method: 'put',
data: data
})
}
......
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';
textarea.style.left = '-9999px';
document.body.appendChild(textarea);
try {
textarea.select();
textarea.setSelectionRange(0, 99999); // 对于移动设备
document.execCommand('copy');
console.log('传统方法复制成功');
ElMessage.success(`${typeName}已复制`)
textarea.setSelectionRange(0, 99999); // 兼容移动端
const successful = document.execCommand('copy');
if (successful) {
ElMessage.success(`${typeName}已复制`);
} else {
throw new Error('execCommand 返回失败');
}
} catch (err) {
console.error('传统方法复制失败:', err)
ElMessage.error('复制失败');
console.error('传统方法复制失败:', err);
ElMessage.error('复制失败,请手动复制');
} finally {
document.body.removeChild(textarea);
}
}
export default {
copyToClipboard
}
// 主导出函数,接收 text 和 typeName 两个参数
export default function copyToClipboard(text, typeName = '内容') {
// 1. 判断是否在安全上下文(HTTPS/localhost) 且 浏览器支持 Clipboard API
if (window.isSecureContext && navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(() => {
ElMessage.success(`${typeName}已复制`);
}).catch((err) => {
console.error('Clipboard API 写入失败,降级处理:', err);
// API 调用失败(如权限被拒),自动降级到传统方案
fallbackCopyText(text, typeName);
});
} else {
// 2. 非安全环境(如 HTTP)或不支持新 API,直接使用传统降级方案
fallbackCopyText(text, typeName);
}
}
\ No newline at end of file
......@@ -815,7 +815,8 @@ const getList = async (searchParams = {}) => {
accountDateEnd: searchParams.payoutDate?.[1] || undefined,
payoutDate: undefined,
pageNo: currentPage.value,
pageSize: pageSize.value
pageSize: pageSize.value,
statusList:searchParams.statusList || ['6']
}
const response = await getReferrerFortuneList(params)
......
......@@ -726,7 +726,7 @@ const searchConfig = ref([
const payRecordDialogTableVisible = ref(false)
// 新增出账记录
const addPayRecordFormModel = ref({
fortuneBizType: 'U'
fortuneBizType: 'R',
})
const addPayRecordDialogVisible = ref(false)
const addPayRecordFormRef = ref()
......@@ -779,15 +779,26 @@ const addPayRecordFormConfig = [
type: 'input',
prop: 'hkdAmount',
label: '出账金额',
rules: [{ pattern: /^-?\d+(\.\d{1,2})?$/, message: '小数(最多两位)', trigger: 'blur' }]
},
{
rules: [
{ required: true, message: '请输入', trigger: 'blur' },
{ pattern: /^-?\d+(\.\d{1,2})?$/, message: '小数(最多两位)', trigger: 'blur' }
]
}, {
type: 'select',
prop: 'currency',
label: '出账币种',
dictType: 'bx_currency_type'
dictType: 'bx_currency_type',
defaultValue:'HKD'
},
{
{
type: 'input',
prop: 'defaultExchangeRate',
label: '结算汇率(入账检核时的汇率)',
rules: [
{ required: true, message: '请输入', trigger: 'blur' },
{ pattern: /^-?\d+(\.\d{1,6})?$/, message: '小数(最多6位)', trigger: 'blur' }
]
},{
type: 'select',
prop: 'fortuneType',
label: '出账项目',
......
......@@ -111,7 +111,7 @@
:formatter="value => formatCurrency(value)"
>
<template #title>
<div style="display: inline-flex; align-items: center">应入账总金额</div>
<div style="display: inline-flex; align-items: center">HKD$应入账总金额</div>
</template>
</el-statistic>
</el-col>
......@@ -121,17 +121,17 @@
:formatter="value => formatCurrency(value)"
>
<template #title>
<div style="display: inline-flex; align-items: center">已入账金额</div>
<div style="display: inline-flex; align-items: center">HKD$已入账金额</div>
</template>
</el-statistic>
</el-col>
<el-col :xs="24" :sm="12" :md="4" class="text-center mb-4">
<el-statistic
:value="detailRecordStatistics.totalUnpaidAmount"
:value="detailRecordStatistics.pendingPaidAmount"
:formatter="value => formatCurrency(value)"
>
<template #title>
<div style="display: inline-flex; align-items: center">待入账金额</div>
<div style="display: inline-flex; align-items: center">HKD$待入账金额</div>
</template>
</el-statistic>
</el-col>
......@@ -145,20 +145,30 @@
</template>
</el-statistic>
</el-col>
<el-col :xs="24" :sm="12" :md="4" class="text-center mb-4">
<!-- <el-col :xs="24" :sm="12" :md="4" class="text-center mb-4">
<el-statistic :value="detailRecordStatistics.totalPolicyCount">
<template #title>
<div style="display: inline-flex; align-items: center">总保单数</div>
</template>
</el-statistic>
</el-col>
</el-col> -->
<el-col :xs="24" :sm="12" :md="4" class="text-center mb-4">
<el-statistic
:value="detailRecordStatistics.totalPremium"
:formatter="value => formatCurrency(value)"
>
<template #title>
<div style="display: inline-flex; align-items: center">总保费</div>
<div style="display: inline-flex; align-items: center">HKD$总保费</div>
</template>
</el-statistic>
</el-col>
<el-col :xs="24" :sm="12" :md="4" class="text-center mb-4">
<el-statistic
:value="detailRecordStatistics.fromTotalPremium"
:formatter="value => formatCurrency(value)"
>
<template #title>
<div style="display: inline-flex; align-items: center">原币种保费</div>
</template>
</el-statistic>
</el-col>
......@@ -168,6 +178,7 @@
:data="receivableReportTableData"
border
style="width: 100%; margin-bottom: 10px; min-height: 300px"
:row-class-name="getRowClassName"
>
<el-table-column
v-for="item in receivableReportItemTableColumns"
......@@ -177,18 +188,25 @@
:width="item.width"
:formatter="item.formatter"
/>
<el-table-column fixed="right" label="操作" min-width="120">
<template #default="{ row }">
<el-popover placement="right" :width="200" trigger="click">
<el-popover placement="right" :width="200" trigger="click" v-if="row.type == '1'">
<template #reference>
<el-icon>
<MoreFilled />
</el-icon>
</template>
<el-menu @select="handleSelect($event, row)" popper-class="custom-menu">
<el-menu-item :index="item.value" v-for="item in dropdownItems" :key="item.value">
<!-- <el-menu-item :index="item.value" v-for="item in dropdownItems" :key="item.value">
{{ item.label }}
</el-menu-item>
</el-menu-item> -->
<el-menu-item
:index="item.value"
v-for="item in getOperateItems(row)"
:key="item.value"
>{{ item.label }}</el-menu-item
>
</el-menu>
</el-popover>
</template>
......@@ -290,6 +308,7 @@ import { ref, reactive, onMounted, computed, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { MoreFilled } from '@element-plus/icons-vue'
import {
newQueryCommissionExpectedByPage,
receivedFortuneList,
updateCommissionExpected,
commissionEntryEditRecords,
......@@ -313,6 +332,12 @@ const commissionBizTypeOptions = [
{ value: 'R', label: '关联保单应收单' },
{ value: 'U', label: '非关联保单应收单' }
]
//是否实收
const typeOptions = [
{ value: 1, label: '预计' },
{ value: 2, label: '实收' }
]
const editStatus = ref('add')
// 新增应收款管理
......@@ -351,10 +376,11 @@ const addReceivablesFormConfig = [
visible: formData => formData.commissionBizType === 'R',
rules: [{ pattern: /^\d+$/, message: '只能输入正整数', trigger: 'blur' }]
},
// 等待key
{
type: 'date',
prop: 'commissionDate',
label: '入账(估)',
type: 'month',
prop: 'commissionDateMonth',
label: '入账(估)',
placeholder: '请选择'
},
// {
......@@ -403,7 +429,7 @@ const addReceivablesFormConfig = [
},
{
type: 'select',
prop: 'reconciliationCompanyBizId',
prop: 'reconciliationCompany',
label: '对账公司',
api: '/insurance/base/api/insuranceReconciliationCompany/page',
keywordField: 'name',
......@@ -423,15 +449,7 @@ const addReceivablesFormConfig = [
},
{
type: 'input',
prop: 'exchangeRate',
label: '结算汇率',
inputType: 'decimal',
rules: [{ required: true, message: '只能输入正整数和小数', trigger: 'blur' }]
// defaultValue: 1
},
{
type: 'input',
prop: 'remark',
prop: 'manualRemark',
label: '备注'
}
]
......@@ -444,7 +462,6 @@ const resetAddReceivablesForm = () => {
const handleConfirmAddReceivables = async () => {
if (editStatus.value === 'add') {
const p = addRecordRef.value.getFormData()
try {
await addReceivedFortune({
commissionExpectedAddDtoList: [p]
......@@ -466,6 +483,7 @@ const handleConfirmAddReceivables = async () => {
ElMessage.success('应收款修改成功')
addReceivablesDialogVisible.value = false
resetAddReceivablesForm()
receivedFortuneListData()
loadTableData() // 重新加载表格
} else {
ElMessage.error(res.msg || '应收款修改失败')
......@@ -621,13 +639,33 @@ const getCommissionBizTypeLabel = value => {
const item = commissionBizTypeOptions.find(item => item.value === value)
return item?.label || ''
}
// 是否实收通过value转成label
const getTypeLabel = value => {
const item = typeOptions.find(item => item.value === value)
return item?.label || ''
}
// 表格操作菜单
const dropdownItems = [
{ label: '入账记录', value: 'entryRecord' },
// { label: '入账记录', value: 'entryRecord' },
{ label: '设置状态', value: 'setStatus' },
{ label: '更新数据', value: 'updateData' }
]
// 动态生成操作菜单项(根据行数据)
const getOperateItems = row => {
const items = []
// 条件:isPart == 1 时不显示分期出账(使用宽松相等,兼容字符串 '1')
if (row.type == 1) {
items.push({ label: '设置状态', value: 'setStatus' })
items.push({ label: '更新数据', value: 'updateData' })
}
// 始终显示的菜单项(保持原始顺序)
// items.push({ label: '设置出账年月(实)', value: 'settingBillYearMonth' })
return items
}
// 弹窗状态
const entryRecordDialogTableVisible = ref(false)
......@@ -733,11 +771,6 @@ const handleCurrentChange = val => {
// 加载表格数据
const loadTableData = async () => {
const searchParams = searchFormRef.value.getFormData() || {}
// let msg = validateEnglish2(searchParams.eng)
// if (searchParams.eng && msg) {
// ElMessage.error(`投保人(英文):${msg}`)
// return
// }
loading.value = true
try {
console.log('searchParams.entryDate', searchParams.entryDate)
......@@ -917,6 +950,7 @@ const handleConfirmSetStatus = () => {
if (res.code === 200) {
ElMessage.success('状态修改成功')
setStatusDialogTableVisible.value = false
receivedFortuneListData()
loadTableData() // 重新加载表格
} else {
ElMessage.error(res.msg || '状态修改失败')
......@@ -956,7 +990,6 @@ const receivableReportTableColumns = ref([
fixed: 'left',
formatter: row => row.policyNo || '-'
},
{
prop: 'reconciliationCompany',
label: '对账公司',
......@@ -1088,6 +1121,13 @@ const receivableReportTableColumns = ref([
// 应收明细
const receivableReportItemTableColumns = ref([
{
prop: 'type',
label: '是否实收',
sortable: true,
width: '80',
formatter: row => getTypeLabel(row.type) || '-'
},
{
prop: 'commissionBizType',
label: '应收单类型',
sortable: true,
......@@ -1095,12 +1135,19 @@ const receivableReportItemTableColumns = ref([
formatter: row => getCommissionBizTypeLabel(row.commissionBizType) || '-'
},
{
prop: 'receivableNo',
label: '应收编号',
prop: 'no',
label: '应收编号',
sortable: true,
width: '150',
formatter: row => row.receivableNo || '-'
formatter: row => row.no || '-'
},
// {
// prop: 'receivableNo',
// label: '应收款编号',
// sortable: true,
// width: '150',
// formatter: row => row.receivableNo || '-'
// },
{
prop: 'policyNo',
label: '保单号',
......@@ -1126,14 +1173,14 @@ const receivableReportItemTableColumns = ref([
prop: 'commissionPeriod',
label: '入账期数',
sortable: true,
width: '120',
width: '80',
formatter: row => row.commissionPeriod || '-'
},
{
prop: 'totalPeriod',
label: '入账总期数',
sortable: true,
width: '120',
width: '100',
formatter: row => row.totalPeriod || '-'
},
{
......@@ -1144,13 +1191,28 @@ const receivableReportItemTableColumns = ref([
formatter: row => row.commissionName || '-'
},
{
prop: 'commissionDateMonth',
label: '入账年月(估)',
sortable: true,
width: '120',
formatter: row => row.commissionDateMonth || '-'
},
{
prop: 'commissionDate',
label: '入账日(估)',
label: '入账年月(实)',
sortable: true,
width: '130',
width: '120',
formatter: row => row.commissionDate || '-'
},
{
prop: 'totalRevenueRatio',
label: '累积达成率(%)',
sortable: true,
width: '130',
formatter: row => (row.totalRevenueRatio || 0) + '%' || '-'
},
{
prop: 'commissionRatio',
label: '产品对应来佣率',
sortable: true,
......@@ -1158,32 +1220,46 @@ const receivableReportItemTableColumns = ref([
formatter: row => (row.commissionRatio || 0) + '%' || '-'
},
{
prop: 'expectedAmount',
label: '预估入账金额',
prop: 'realRate',
label: '实佣率',
sortable: true,
width: '120',
formatter: row => formatCurrency(row.expectedAmount || 0)
formatter: row => (row.realRate || 0) + '%' || '-'
},
{
prop: 'paidRatio',
label: '实佣率',
prop: 'gapRate',
label: '达成率缺口',
sortable: true,
width: '120',
formatter: row => (row.paidRatio || 0) + '%' || '-'
formatter: row => (row.gapRate || 0) + '%' || '-'
},
{
prop: 'paidAmount',
prop: 'realExchangeRate',
label: '结算汇率实',
sortable: true,
width: '120',
formatter: row => row.realExchangeRate || '-'
},
{
prop: 'realAmount',
label: '已入账金额',
sortable: true,
width: '120',
formatter: row => formatCurrency(row.paidAmount || 0)
formatter: row => row.realAmount || '-'
},
{
prop: 'pendingRatio',
label: '实佣率缺口',
prop: 'realReconciliationYearMonth',
label: '检核年月',
sortable: true,
width: '120',
formatter: row => (row.pendingRatio || 0) + '%' || '-'
formatter: row => row.realReconciliationYearMonth || '-'
},
{
prop: 'revenueRatio',
label: '本次入账比例',
sortable: true,
width: '120',
formatter: row => (row.revenueRatio || 0) + '%' || '-'
},
{
prop: 'pendingAmount',
......@@ -1192,7 +1268,20 @@ const receivableReportItemTableColumns = ref([
width: '120',
formatter: row => formatCurrency(row.pendingAmount || 0)
},
{ prop: 'defaultExchangeRate', label: '结算汇率(估)', sortable: true, width: '120' },
{
prop: 'expectedAmount',
label: '预计入账金额',
sortable: true,
width: '120',
formatter: row => formatCurrency(row.expectedAmount || 0)
},
{
prop: 'defaultExchangeRate',
label: '结算汇率估',
sortable: true,
width: '120',
formatter: row => row.defaultExchangeRate || '-'
},
{
prop: 'insuranceCompany',
label: '保险公司',
......@@ -1208,11 +1297,11 @@ const receivableReportItemTableColumns = ref([
formatter: row => row.productName || '-'
},
{
prop: 'premium',
label: '期交保费',
prop: 'issueNumber',
label: '年期',
sortable: true,
width: '120',
formatter: row => formatCurrency(row.premium || 0)
width: '80',
formatter: row => row.issueNumber || '-'
},
{
prop: 'policyCurrency',
......@@ -1222,18 +1311,18 @@ const receivableReportItemTableColumns = ref([
formatter: row => row.policyCurrency || '-'
},
{
prop: 'currency',
label: '入账币种',
prop: 'premium',
label: '期交保费',
sortable: true,
width: '120',
formatter: row => row.currency || '-'
formatter: row => formatCurrency(row.premium || 0)
},
{
prop: 'statusDesc',
label: '入账状态修改理由',
prop: 'manualRemark',
label: '人工备注',
sortable: true,
width: '120',
formatter: row => row.statusDesc || '-'
formatter: row => row.manualRemark || '-'
},
{
prop: 'remark',
......@@ -1241,7 +1330,45 @@ const receivableReportItemTableColumns = ref([
sortable: true,
width: '120',
formatter: row => row.remark || '-'
},
{
prop: 'realUpdaterName',
label: '操作人',
sortable: true,
width: '120',
formatter: row => row.realUpdaterName || '-'
},
{
prop: 'realUpdateTime',
label: '操作时间',
sortable: true,
width: '120',
formatter: row => row.realUpdateTime || '-'
}
// {
// prop: 'pendingRatio',
// label: '实佣率缺口',
// sortable: true,
// width: '120',
// formatter: row => (row.pendingRatio || 0) + '%' || '-'
// },
// { prop: 'defaultExchangeRate', label: '结算汇率(估)', sortable: true, width: '120' },
// {
// prop: 'currency',
// label: '入账币种',
// sortable: true,
// width: '120',
// formatter: row => row.currency || '-'
// },
// {
// prop: 'statusDesc',
// label: '入账状态修改理由',
// sortable: true,
// width: '120',
// formatter: row => row.statusDesc || '-'
// },
])
const detailRecordStatistics = ref({})
......@@ -1252,7 +1379,7 @@ const detailPageInfo = ref({
total: 0
})
// 获取入账报告
// 获取应收明细
const receivedFortuneListData = async () => {
loading.value = true
try {
......@@ -1263,18 +1390,21 @@ const receivedFortuneListData = async () => {
pageNo: detailPageInfo.value.currentPage,
pageSize: detailPageInfo.value.pageSize
}
const response = await receivedFortuneList(params)
const response = await newQueryCommissionExpectedByPage(params)
receivableReportTableData.value = response.data.page.records || []
detailPageInfo.value.total = response.data.page.total || 0
detailPageInfo.value.pageSize = response.data.page.size || 50
// 统计信息
detailRecordStatistics.value = {
totalAmount: response.data.expectedStatisticsVO.totalAmount,
totalPaidAmount: response.data.expectedStatisticsVO.totalPaidAmount,
pendingPaidAmount: response.data.expectedStatisticsVO.pendingPaidAmount,
paidAmountRatio: response.data.expectedStatisticsVO.paidAmountRatio,
totalPolicyCount: response.data.expectedStatisticsVO.totalPolicyCount,
totalPremium: response.data.expectedStatisticsVO.totalPremium
// detailRecordStatistics.value = {
// totalAmount: response.data.expectedStatisticsVO.totalAmount,
// totalPaidAmount: response.data.expectedStatisticsVO.totalPaidAmount,
// pendingPaidAmount: response.data.expectedStatisticsVO.pendingPaidAmount,
// paidAmountRatio: response.data.expectedStatisticsVO.paidAmountRatio,
// totalPolicyCount: response.data.expectedStatisticsVO.totalPolicyCount,
// totalPremium: response.data.expectedStatisticsVO.totalPremium
// }
if (response.data.expectedStatisticsVO) {
detailRecordStatistics.value = response.data.expectedStatisticsVO
}
} catch (error) {
console.error('加载数据失败:', error)
......@@ -1299,6 +1429,16 @@ const handleCurrentChangeDetailRecord = val => {
detailPageInfo.value.currentPage = val
receivedFortuneListData()
}
// 定义行类名方法
const getRowClassName = ({ row }) => {
// type == 1 表示“预计”,添加高亮类名
return row.type === 1 ? 'estimated-row' : ''
}
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
/* 使用 :deep 穿透 scoped 样式,保证对 el-table__row 生效 */
:deep(.estimated-row) {
background-color: #f0f9ff; /* 浅蓝色,可根据需要修改 */
}
</style>
......@@ -232,7 +232,7 @@ import {
getItineraryExprot
} from '@/api/sign/appointment'
import useUserStore from '@/store/modules/user'
import { copyToClipboard } from '@/utils/copyToClipboard'
import copyToClipboard from '@/utils/copyToClipboard'
const dictStore = useDictStore()
const userStore = useUserStore()
const router = useRouter()
......
......@@ -151,7 +151,7 @@ import {
saveInitialPayment,
updatePolicyProduct
} from '@/api/sign/underwritingMain'
import { copyToClipboard } from '@/utils/copyToClipboard'
import copyToClipboard from '@/utils/copyToClipboard';
import PolicyDetail from './policyDetail.vue'
const policyDetailFormRef = ref(null)
const policyDetailFormData = ref({})
......
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