Commit 8857fdea by Sweet Zhang

新单跟进对接

parent 6b4dbc30
...@@ -251,7 +251,7 @@ export function batchSaveBrokers(data) { ...@@ -251,7 +251,7 @@ export function batchSaveBrokers(data) {
// 通过保险公司、险种查询产品列表及参数 // 通过保险公司、险种查询产品列表及参数
export function getProductList(data) { export function getProductList(data) {
return request({ return request({
url: '/prodcut/api/relProjectProductLaunch/parameter/page', url: '/product/api/relProjectProductLaunch/parameter/page',
method: 'post', method: 'post',
data: data data: data
}) })
......
<template> <template>
<el-form <el-form ref="formRef" :model="localModel" :rules="formRules" label-width="auto" v-bind="$attrs"
ref="formRef" :validate-on-rule-change="false">
:model="localModel"
:rules="formRules"
label-width="auto"
v-bind="$attrs"
:validate-on-rule-change="false"
>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col v-for="item in visibleConfig" :key="item.prop" :span="item.span || 6"> <el-col v-for="item in visibleConfig" :key="item.prop" :span="item.span || 6">
<el-form-item <el-form-item :label="item.label" :prop="item.prop" :class="{ 'search-form-item': isSearch }"
:label="item.label" :label-position="item.labelPosition || 'top'">
:prop="item.prop"
:class="{ 'search-form-item': isSearch }"
:label-position="item.labelPosition || 'top'"
>
<!-- Input --> <!-- Input -->
<el-input <el-input v-if="item.type === 'input'" v-model="localModel[item.prop]"
v-if="item.type === 'input'" :placeholder="item.placeholder || `请输入${item.label}`" :clearable="true" :disabled="item.disabled"
v-model="localModel[item.prop]" @input="val => handleNumberInput(val, item)" @change="val => handleModelChange(val, item)" />
:placeholder="item.placeholder || `请输入${item.label}`"
:clearable="true"
:disabled="item.disabled"
@input="val => handleNumberInput(val, item)"
@change="val => handleModelChange(val, item)"
/>
<!-- Select (支持 dictType / api / options) --> <!-- Select (支持 dictType / api / options) -->
<el-select <el-select v-else-if="item.type === 'select'" v-model="localModel[item.prop]" :multiple="!!item.multiple"
v-else-if="item.type === 'select'" :placeholder="item.placeholder || `请选择${item.label}`" :clearable="true" filterable :disabled="item.disabled"
v-model="localModel[item.prop]" :loading="remoteLoading[item.prop] || false" @change="val => handleModelChange(val, item)"
:multiple="!!item.multiple" @focus="() => loadRemoteOptions(item)" @filter-change="keyword => handleFilterChange(keyword, item)">
:placeholder="item.placeholder || `请选择${item.label}`" <el-option v-for="opt in getSelectOptions(item)" :key="opt.value" :label="opt.label" :value="opt.value" />
:clearable="true"
filterable
:disabled="item.disabled"
:loading="remoteLoading[item.prop] || false"
@change="val => handleModelChange(val, item)"
@focus="() => loadRemoteOptions(item)"
@filter-change="keyword => handleFilterChange(keyword, item)"
>
<el-option
v-for="opt in getSelectOptions(item)"
:key="opt.value"
:label="opt.label"
:value="opt.value"
/>
</el-select> </el-select>
<!-- Date --> <!-- Date -->
<el-date-picker <el-date-picker v-else-if="item.type === 'date'" v-model="localModel[item.prop]" type="date"
v-else-if="item.type === 'date'" :placeholder="`选择${item.label}`" :disabled="item.disabled" :value-format="item.valueFormat || 'YYYY-MM-DD'"
v-model="localModel[item.prop]" style="width: 100%" :disabled-date="getDisabledDateFn(item)"
type="date" @change="val => handleModelChange(val, item)" />
:placeholder="`选择${item.label}`"
:disabled="item.disabled"
:value-format="item.valueFormat || 'YYYY-MM-DD'"
style="width: 100%"
:disabled-date="getDisabledDateFn(item)"
@change="val => handleModelChange(val, item)"
/>
<!-- Month --> <!-- Month -->
<el-date-picker <el-date-picker v-else-if="item.type === 'month'" v-model="localModel[item.prop]" type="month"
v-else-if="item.type === 'month'" :placeholder="`选择${item.label}`" :value-format="item.valueFormat || 'YYYY-MM'" style="width: 100%"
v-model="localModel[item.prop]" :disabled="item.disabled" :disabled-date="getDisabledDateFn(item)"
type="month" @change="val => handleModelChange(val, item)" />
:placeholder="`选择${item.label}`"
:value-format="item.valueFormat || 'YYYY-MM'"
style="width: 100%"
:disabled="item.disabled"
:disabled-date="getDisabledDateFn(item)"
@change="val => handleModelChange(val, item)"
/>
<!-- Daterange --> <!-- Daterange -->
<el-date-picker <el-date-picker v-else-if="item.type === 'daterange'" v-model="localModel[item.prop]" type="daterange"
v-else-if="item.type === 'daterange'" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
v-model="localModel[item.prop]" :value-format="item.valueFormat || 'YYYY-MM-DD'" :disabled="item.disabled"
type="daterange" :disabled-date="getDisabledDateFn(item)" style="width: 100%"
range-separator="至" @change="val => handleModelChange(val, item)" />
start-placeholder="开始日期"
end-placeholder="结束日期"
:value-format="item.valueFormat || 'YYYY-MM-DD'"
:disabled="item.disabled"
:disabled-date="getDisabledDateFn(item)"
style="width: 100%"
@change="val => handleModelChange(val, item)"
/>
<!-- Checkbox Group --> <!-- Checkbox Group -->
<el-checkbox-group <el-checkbox-group v-else-if="item.type === 'checkbox-group'" v-model="localModel[item.prop]"
v-else-if="item.type === 'checkbox-group'" :disabled="item.disabled" @change="val => handleModelChange(val, item)">
v-model="localModel[item.prop]"
:disabled="item.disabled"
@change="val => handleModelChange(val, item)"
>
<el-checkbox v-for="opt in getSelectOptions(item)" :key="opt.value" :label="opt.value"> <el-checkbox v-for="opt in getSelectOptions(item)" :key="opt.value" :label="opt.value">
{{ opt.label }} {{ opt.label }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!-- textarea --> <!-- textarea -->
<el-input <el-input v-else-if="item.type === 'textarea'" v-model="localModel[item.prop]" style="width: 240px" autosize
v-else-if="item.type === 'textarea'" :disabled="item.disabled" type="textarea" placeholder="请输入" :clearable="true"
v-model="localModel[item.prop]" @change="val => handleModelChange(val, item)" />
style="width: 240px"
autosize
:disabled="item.disabled"
type="textarea"
placeholder="请输入"
:clearable="true"
@change="val => handleModelChange(val, item)"
/>
<!-- Upload 回显值得时候数据格式至少是[{url: '必须要传', name: 'name不是必须的根据需要传值'}]--> <!-- Upload 回显值得时候数据格式至少是[{url: '必须要传', name: 'name不是必须的根据需要传值'}]-->
<el-upload <el-upload v-else-if="item.type === 'upload'" v-model:file-list="localModel[item.prop]" :action="item.action"
v-else-if="item.type === 'upload'" :headers="item.headers" :multiple="!!item.multiple" :limit="item.limit || (item.multiple ? 999 : 1)"
v-model:file-list="localModel[item.prop]" :accept="item.accept" :list-type="item.listType || 'text'" :disabled="item.disabled" :auto-upload="true"
:action="item.action" :show-file-list="item.showFileList" :on-exceed="handleExceed"
:headers="item.headers"
:multiple="!!item.multiple"
:limit="item.limit || (item.multiple ? 999 : 1)"
:accept="item.accept"
:list-type="item.listType || 'text'"
:disabled="item.disabled"
:auto-upload="true"
:show-file-list="item.showFileList"
:on-exceed="handleExceed"
:before-upload="file => beforeUpload(file, item)" :before-upload="file => beforeUpload(file, item)"
:on-success="(res, file, fileList) => handleUploadSuccess(res, file, fileList, item)" :on-success="(res, file, fileList) => handleUploadSuccess(res, file, fileList, item)"
:on-error="(err, file, fileList) => handleUploadError(err, file, fileList, item)" :on-error="(err, file, fileList) => handleUploadError(err, file, fileList, item)"
:on-remove="(file, fileList) => handleUploadRemove(file, fileList, item)" :on-remove="(file, fileList) => handleUploadRemove(file, fileList, item)">
> <el-icon class="iconStyle" :size="20" v-if="item.uploadType === 'image'">
<el-icon class="iconStyle" :size="20" v-if="item.uploadType === 'image'" <Upload />
><Upload </el-icon>
/></el-icon> <el-button v-else size="small" type="primary" :link="item.link" :disabled="item.disabled">
<el-button
v-else
size="small"
type="primary"
:link="item.link"
:disabled="item.disabled"
>
{{ '点击上传文件' }} {{ '点击上传文件' }}
</el-button> </el-button>
<template #tip v-if="item.maxSize || item.accept"> <template #tip v-if="item.maxSize || item.accept">
...@@ -364,6 +284,7 @@ watch( ...@@ -364,6 +284,7 @@ watch(
// ✅ 在这里同步 modelValue(包括 extra 字段) // ✅ 在这里同步 modelValue(包括 extra 字段)
localModel.value = syncModelFromProps(props.modelValue, internalConfig.value) localModel.value = syncModelFromProps(props.modelValue, internalConfig.value)
console.log('子组件监测config变化', localModel.value)
}, },
{ immediate: true } { immediate: true }
) )
...@@ -376,6 +297,7 @@ watch( ...@@ -376,6 +297,7 @@ watch(
if (!newVal || !internalConfig.value) return if (!newVal || !internalConfig.value) return
// ✅ 同样使用 sync 函数 // ✅ 同样使用 sync 函数
localModel.value = syncModelFromProps(newVal, internalConfig.value) localModel.value = syncModelFromProps(newVal, internalConfig.value)
console.log('子组件监测 modelValue 变化:', localModel.value)
}, },
{ deep: true } { deep: true }
) )
...@@ -464,7 +386,7 @@ function syncModelFromProps(newModelValue, newConfig) { ...@@ -464,7 +386,7 @@ function syncModelFromProps(newModelValue, newConfig) {
synced[key] = newModelValue[key] synced[key] = newModelValue[key]
} }
} }
// console.log('🚀 子组件 props.modelValue 同步后:', synced) console.log('🚀 子组件 进行modelvalue处理:', synced)
return synced return synced
} }
function getNestedValue(obj, path) { function getNestedValue(obj, path) {
...@@ -481,10 +403,7 @@ function markDictLoaded(prop) { ...@@ -481,10 +403,7 @@ function markDictLoaded(prop) {
// 2. 用户操作导致 localModel 变化时,emit(防抖可选) // 2. 用户操作导致 localModel 变化时,emit(防抖可选)
function handleModelChange(value, item) { function handleModelChange(value, item) {
console.group('🔄 handleModelChange') console.group('用户操作导致 localModel 变化时,emit(防抖可选)')
// console.log('输入 value:', value)
// console.log('item:', item)
// console.log('当前 localModel:', localModel.value)
const newModel = { ...localModel.value, [item.prop]: value } const newModel = { ...localModel.value, [item.prop]: value }
...@@ -501,22 +420,18 @@ function handleModelChange(value, item) { ...@@ -501,22 +420,18 @@ function handleModelChange(value, item) {
} }
} }
} }
// console.log('🆕 newModel:', newModel)
// console.log('📦 props.modelValue:', props.modelValue)
// console.log('isEqualShallow?', isEqualShallow(props.modelValue, newModel))
localModel.value = newModel localModel.value = newModel
console.log('子组件用户操作后,modelvalue值==', newModel)
nextTick(() => { nextTick(() => {
if (!isEqualShallow(props.modelValue, newModel)) { if (!isEqualShallow(props.modelValue, newModel)) {
// console.log('📤 emit update:modelValue:', newModel) console.log('如果新旧值不一样,反馈给父组件', newModel)
emit('update:modelValue', newModel) emit('update:modelValue', newModel)
} else { } else {
console.log('🚫 跳过 emit:认为相等') console.log('🚫 跳过 emit:认为相等')
} }
}) })
if (item.type === 'select') { if (item.type === 'select') {
console.log('如果是select类型,反馈给父组件', item.prop, value, item)
emit('selectChange', item.prop, value, item) emit('selectChange', item.prop, value, item)
} else if (item.type == 'upload') { } else if (item.type == 'upload') {
// 传给父组件最新的上传值newModel // 传给父组件最新的上传值newModel
...@@ -821,9 +736,11 @@ defineExpose({ ...@@ -821,9 +736,11 @@ defineExpose({
.formBox { .formBox {
box-sizing: border-box; box-sizing: border-box;
} }
.search-form-item { .search-form-item {
margin-bottom: 20px; margin-bottom: 20px;
} }
.iconStyle { .iconStyle {
color: #409eff; color: #409eff;
} }
......
...@@ -24,7 +24,11 @@ const appointmentInfo = [ ...@@ -24,7 +24,11 @@ const appointmentInfo = [
{ {
label: '签单日', label: '签单日',
key: 'signDate', key: 'signDate',
domType: 'DatePicker', domType: 'datetimePicker',
dateValue: '', //YYYY-MM-DD
timeValue: '', //HH:mm
compositionTime: true, //是否组合时间
finishTime: '',
required: true, required: true,
disabled: false, disabled: false,
placeholder: '请选择', placeholder: '请选择',
......
...@@ -32,6 +32,7 @@ export function useDict(...args) { ...@@ -32,6 +32,7 @@ export function useDict(...args) {
*/ */
export function useDictLists(typeLists) { export function useDictLists(typeLists) {
let params = { typeList: typeLists } let params = { typeList: typeLists }
console.log(params)
let dictArray = [] let dictArray = []
return (() => { return (() => {
getMoreDicts(params).then(resp => { getMoreDicts(params).then(resp => {
......
...@@ -914,9 +914,6 @@ const handleSubmit = async type => { ...@@ -914,9 +914,6 @@ const handleSubmit = async type => {
if (appointmentInfoRef.value) { if (appointmentInfoRef.value) {
const result = await appointmentInfoRef.value[0].handleFormValues() const result = await appointmentInfoRef.value[0].handleFormValues()
submitAppointmentObj.value.apiAppointmentInfoDto = result submitAppointmentObj.value.apiAppointmentInfoDto = result
console.log('====================================')
console.log('预约', result)
console.log('====================================')
if (!submitAppointmentObj.value.apiAppointmentInfoDto) return if (!submitAppointmentObj.value.apiAppointmentInfoDto) return
} }
if (productPlanRef.value) { if (productPlanRef.value) {
......
...@@ -5,15 +5,8 @@ ...@@ -5,15 +5,8 @@
<div style="position: relative; top: -100%; left: -1100%"> <div style="position: relative; top: -100%; left: -1100%">
{{ appointmentRef }} {{ appointmentRef }}
</div> </div>
<CommonForm <CommonForm :anchorList="anchorList" :affixOffset="affixOffset" :anchorOffset="10"
:anchorList="anchorList" :scrollContainerSelector="anchorContainer" :domIndex="tabIndex" :activeName="activeName" v-if="appointmentRef">
:affixOffset="affixOffset"
:anchorOffset="10"
:scrollContainerSelector="anchorContainer"
:domIndex="tabIndex"
:activeName="activeName"
v-if="appointmentRef"
>
<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 in processedAppointmentData">
...@@ -22,156 +15,71 @@ ...@@ -22,156 +15,71 @@
<CardOne :title="father.fatherTitle"> <CardOne :title="father.fatherTitle">
<template #mainTitCustom v-if="props.idsObj.appointmentBizId"> <template #mainTitCustom v-if="props.idsObj.appointmentBizId">
<div style="margin-left: 10px"> <div style="margin-left: 10px">
<el-button <el-button @click="viewHistory" type="primary" link
@click="viewHistory" v-if="father.key == 'administration'">历史记录</el-button>
type="primary"
link
v-if="father.key == 'administration'"
>历史记录</el-button
>
</div> </div>
</template> </template>
<template #headerRight v-if="father.key == 'administration'"> <template #headerRight v-if="father.key == 'administration'">
<div> <div>
<el-button <el-button v-if="idsObj.appointmentBizId" @click="handleExprot" type="primary"
v-if="idsObj.appointmentBizId" link>导出预约表</el-button>
@click="handleExprot" <el-button v-if="appointmentStatus >= 2" @click="getItineraryInfo" type="primary"
type="primary" link>行程单预览</el-button>
link
>导出预约表</el-button
>
<el-button
v-if="appointmentStatus >= 2"
@click="getItineraryInfo"
type="primary"
link
>行程单预览</el-button
>
</div> </div>
</template> </template>
<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 in father.data" :key="child.key">
<el-col <el-col :sm="child.sm" :lg="child.lg" class="formItemBox" v-if="child.show">
:sm="child.sm"
:lg="child.lg"
class="formItemBox"
v-if="child.show"
>
<div> <div>
<el-form-item <el-form-item :label-width="child.labelWidth" :label="child.label" :prop="child.key"
:label-width="child.labelWidth" :key="child.key" :label-position="child.labelPosition" class="button-form-item">
:label="child.label" <el-input v-if="child.domType === 'Input'" :type="child.inputType"
:prop="child.key" v-model="form[child.key]" :placeholder="child.placeholder" maxlength="30"
:key="child.key" :rows="child.rows" :disabled="editStatus" />
:label-position="child.labelPosition" <el-select v-if="child.domType === 'Select'" v-model="form[child.key]"
class="button-form-item" :placeholder="child.placeholder" @change="handleSelectChange(father, child)"
> :disabled="editStatus">
<el-input <el-option v-for="item in child.options" :key="item.value" :label="item.label"
v-if="child.domType === 'Input'" :value="item.value" />
:type="child.inputType"
v-model="form[child.key]"
:placeholder="child.placeholder"
maxlength="30"
:rows="child.rows"
:disabled="editStatus"
/>
<el-select
v-if="child.domType === 'Select'"
v-model="form[child.key]"
:placeholder="child.placeholder"
@change="handleSelectChange(father, child)"
:disabled="editStatus"
>
<el-option
v-for="item in child.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
<!-- 带时分的时间框 --> <!-- 带时分的时间框 -->
<div <div v-if="child.domType === 'datetimePicker'" class="compositionDateTime">
v-if="child.domType === 'datetimePicker'" <el-date-picker type="date" placeholder="选择日期" style="width: 100%"
class="compositionDateTime" v-model="form[child.key]" :disabled="editStatus" @change="handleDateChange(child)"
> :disabled-date="time => disabledDate(time, child)" format="YYYY-MM-DD"
<el-date-picker value-format="YYYY-MM-DD" @clear="handleDateClear(child)" />
type="date"
placeholder="选择日期"
style="width: 100%"
v-model="form[child.key]"
:disabled="editStatus"
@change="handleDateChange(child)"
:disabled-date="time => disabledDate(time, child)"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@clear="handleDateClear(child)"
/>
<span class="text-gray-500">-</span> <span class="text-gray-500">-</span>
<el-time-picker <el-time-picker placeholder="选择时分" style="width: 100%" v-model="child.timeValue"
placeholder="选择时分" :disabled="editStatus" format="HH:mm" value-format="HH:mm"
style="width: 100%" @change="timeValueChange(child)" />
v-model="child.timeValue"
:disabled="editStatus"
format="HH:mm"
value-format="HH:mm"
@change="timeValueChange(child)"
/>
</div> </div>
<!-- 不带时分 --> <!-- 不带时分 -->
<el-date-picker <el-date-picker style="width: 100%" v-if="child.domType === 'DatePicker'"
style="width: 100%" v-model="form[child.key]" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
v-if="child.domType === 'DatePicker'" :placeholder="child.placeholder" :disabled="editStatus"
v-model="form[child.key]" :disabled-date="time => disabledDate(time, child)" @change="handleDateChange(child)"
type="date" @clear="handleDateClear(child)" />
format="YYYY-MM-DD" <el-input v-if="child.domType === 'arrowRight'" v-model="form[child.key]"
value-format="YYYY-MM-DD" :placeholder="child.placeholder" :suffix-icon="ArrowRight" readonly
:placeholder="child.placeholder" :disabled="editStatus" @focus="handleFoucs(child)">
:disabled="editStatus"
:disabled-date="time => disabledDate(time, child)"
@change="handleDateChange(child)"
@clear="handleDateClear(child)"
/>
<el-input
v-if="child.domType === 'arrowRight'"
v-model="form[child.key]"
:placeholder="child.placeholder"
:suffix-icon="ArrowRight"
readonly
:disabled="editStatus"
@focus="handleFoucs(child)"
>
</el-input> </el-input>
<el-select <el-select v-model="form[child.key]" v-if="child.domType === 'SearchSelect'" filterable
v-model="form[child.key]" :allow-create="child.allowCreate" reserve-keyword
v-if="child.domType === 'SearchSelect'"
filterable
:allow-create="child.allowCreate"
reserve-keyword
@change="handleSelectChange(father, child)" @change="handleSelectChange(father, child)"
:remote-method="query => searchSelectList(query, child.key)" :remote-method="query => searchSelectList(query, child.key)" placeholder="请输入关键词搜索"
placeholder="请输入关键词搜索" :loading="searchLoadingStates[child.key]" :disabled="editStatus">
:loading="searchLoadingStates[child.key]" <el-option v-for="item in searchOptions[child.key] || []" :key="item.id"
:disabled="editStatus" :label="item.label" :value="item.value" />
>
<el-option
v-for="item in searchOptions[child.key] || []"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<div v-if="child.domType === 'Div'" class="divClass"> <div v-if="child.domType === 'Div'" class="divClass">
<div v-if="child.key == 'information'" class="desBox"> <div v-if="child.key == 'information'" class="desBox">
<div class="title">{{ child.title }}</div> <div class="title">{{ child.title }}</div>
<div class="informationBox"> <div class="informationBox">
<div <div v-for="(item, index) in child.informationList" :key="index">
v-for="(item, index) in child.informationList"
:key="index"
>
{{ item.name }} {{ item.name }}
</div> </div>
</div> </div>
...@@ -184,15 +92,9 @@ ...@@ -184,15 +92,9 @@
<!-- 是表格数据 --> <!-- 是表格数据 -->
<el-row v-if="father.showTable"> <el-row v-if="father.showTable">
<el-col :span="24" v-if="father.addChildren"> <el-col :span="24" v-if="father.addChildren">
<el-button <el-button :disabled="editStatus" type="primary" icon="Plus" size="small"
:disabled="editStatus" style="margin-bottom: 10px" @click="addChildren(father)">{{ father.addChildrenTxt
type="primary" }}</el-button>
icon="Plus"
size="small"
style="margin-bottom: 10px"
@click="addChildren(father)"
>{{ father.addChildrenTxt }}</el-button
>
</el-col> </el-col>
<el-table :data="father.data" border v-if="father.data.length > 0"> <el-table :data="father.data" border v-if="father.data.length > 0">
<template v-if="father.key == 'referrerDtoList'"> <template v-if="father.key == 'referrerDtoList'">
...@@ -201,23 +103,12 @@ ...@@ -201,23 +103,12 @@
<span class="required-label">姓名</span> <span class="required-label">姓名</span>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-select <el-select v-model="scope.row.realName" filterable remote reserve-keyword
v-model="scope.row.realName" placeholder="请输入关键词搜索" :remote-method="query => searchSelectList(query, 'realName')"
filterable :loading="searchLoadingStates['realName']" :disabled="editStatus"
remote @change="handleTableSelectChange(father, scope.row, 'realName')">
reserve-keyword <el-option v-for="item in searchOptions['realName'] || []" :key="item.id"
placeholder="请输入关键词搜索" :label="item.label" :value="item.value" />
:remote-method="query => searchSelectList(query, 'realName')"
:loading="searchLoadingStates['realName']"
:disabled="editStatus"
@change="handleTableSelectChange(father, scope.row, 'realName')"
>
<el-option
v-for="item in searchOptions['realName'] || []"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
...@@ -226,12 +117,8 @@ ...@@ -226,12 +117,8 @@
<span class="required-label">手机号</span> <span class="required-label">手机号</span>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.phone" size="default" placeholder="请输入"
v-model="scope.row.phone" :disabled="editStatus" />
size="default"
placeholder="请输入"
:disabled="editStatus"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="邮箱" prop="email" align="center"> <el-table-column label="邮箱" prop="email" align="center">
...@@ -239,21 +126,15 @@ ...@@ -239,21 +126,15 @@
<span class="required-label">邮箱</span> <span class="required-label">邮箱</span>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.email" size="default" placeholder="请输入"
v-model="scope.row.email" :disabled="editStatus" />
size="default"
placeholder="请输入"
:disabled="editStatus"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="60px" align="center" label="操作"> <el-table-column width="60px" align="center" label="操作">
<template #default="scope"> <template #default="scope">
<el-icon <el-icon class="deleteIcon" @click="deleteChildren(father, scope.$index)">
class="deleteIcon" <Delete />
@click="deleteChildren(father, scope.$index)" </el-icon>
><Delete
/></el-icon>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
...@@ -263,23 +144,12 @@ ...@@ -263,23 +144,12 @@
<span class="required-label">姓名</span> <span class="required-label">姓名</span>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-select <el-select v-model="scope.row.name" filterable remote reserve-keyword placeholder="请选择"
v-model="scope.row.name"
filterable
remote
reserve-keyword
placeholder="请选择"
:remote-method="query => searchSelectList(query, 'name')" :remote-method="query => searchSelectList(query, 'name')"
:loading="searchLoadingStates['name']" :loading="searchLoadingStates['name']" :disabled="editStatus"
:disabled="editStatus" @change="handleTableSelectChange(father, scope.row, 'name')">
@change="handleTableSelectChange(father, scope.row, 'name')" <el-option v-for="item in searchOptions['name'] || []" :key="item.id"
> :label="item.label" :value="item.value" />
<el-option
v-for="item in searchOptions['name'] || []"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
...@@ -288,12 +158,8 @@ ...@@ -288,12 +158,8 @@
<span class="required-label">手机号</span> <span class="required-label">手机号</span>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.phone" size="default" placeholder="请输入"
v-model="scope.row.phone" :disabled="editStatus" />
size="default"
placeholder="请输入"
:disabled="editStatus"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="执业编码" prop="practiceCode" align="center"> <el-table-column label="执业编码" prop="practiceCode" align="center">
...@@ -301,59 +167,37 @@ ...@@ -301,59 +167,37 @@
<span class="required-label">执业编码</span> <span class="required-label">执业编码</span>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.practiceCode" size="default" placeholder="请输入"
v-model="scope.row.practiceCode" :disabled="editStatus" />
size="default"
placeholder="请输入"
:disabled="editStatus"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="邮箱" prop="email" align="center"> <el-table-column label="邮箱" prop="email" align="center">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.email" size="default" placeholder="请输入"
v-model="scope.row.email" :disabled="editStatus" />
size="default"
placeholder="请输入"
:disabled="editStatus"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="证件类型" prop="cardType" align="center"> <el-table-column label="证件类型" prop="cardType" align="center">
<template #default="scope"> <template #default="scope">
<el-select <el-select v-model="scope.row.cardType" placeholder="请选择" :disabled="editStatus"
v-model="scope.row.cardType" clearable>
placeholder="请选择" <el-option v-for="item in fetchDictData('csf_id_type')" :key="item.value"
:disabled="editStatus" :label="item.label" :value="item.value" />
clearable
>
<el-option
v-for="item in fetchDictData('csf_id_type')"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="证件号" prop="cardNo" align="center"> <el-table-column label="证件号" prop="cardNo" align="center">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.cardNo" size="default" placeholder="请输入"
v-model="scope.row.cardNo" :disabled="editStatus" />
size="default"
placeholder="请输入"
:disabled="editStatus"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="60px" align="center" label="操作"> <el-table-column width="60px" align="center" label="操作">
<template #default="scope"> <template #default="scope">
<el-icon <el-icon @click="deleteChildren(father, scope.$index)" class="deleteIcon">
@click="deleteChildren(father, scope.$index)" <Delete />
class="deleteIcon" </el-icon>
><Delete
/></el-icon>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
...@@ -369,26 +213,12 @@ ...@@ -369,26 +213,12 @@
</CommonForm> </CommonForm>
</div> </div>
<!-- 历史签约记录 --> <!-- 历史签约记录 -->
<CommonDialog <CommonDialog dialogTitle="历史记录" :showConfirm="false" cancleText="关闭" dialogWidth="70%" :openDialog="openList"
dialogTitle="历史记录" :showClose="true" @close="openList = false">
:showConfirm="false"
cancleText="关闭"
dialogWidth="70%"
:openDialog="openList"
:showClose="true"
@close="openList = false"
>
<div class="dialogBox"> <div class="dialogBox">
<CommonPage <CommonPage :showSearchForm="false" :show-pagination="true" :currentPage="queryParams.pageNo" :total="total"
:showSearchForm="false" :pageSize="queryParams.pageSize" @current-change="changePageNo" @size-change="changePageSize"
:show-pagination="true" :showOperationBtn="false">
:currentPage="queryParams.pageNo"
:total="total"
:pageSize="queryParams.pageSize"
@current-change="changePageNo"
@size-change="changePageSize"
:showOperationBtn="false"
>
<template #table> <template #table>
<el-table v-loading="tableLoading" :data="tableData" border height="350px"> <el-table v-loading="tableLoading" :data="tableData" border height="350px">
<el-table-column label="创建人" align="center" prop="creatorName" /> <el-table-column label="创建人" align="center" prop="creatorName" />
...@@ -400,13 +230,8 @@ ...@@ -400,13 +230,8 @@
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width"
label="操作" fixed="right">
align="center"
width="100"
class-name="small-padding fixed-width"
fixed="right"
>
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="viewDetail(scope.row)">查看</el-button> <el-button link type="primary" @click="viewDetail(scope.row)">查看</el-button>
</template> </template>
...@@ -417,15 +242,8 @@ ...@@ -417,15 +242,8 @@
</div> </div>
</CommonDialog> </CommonDialog>
<!-- 签约详情 --> <!-- 签约详情 -->
<CommonDialog <CommonDialog :dialogTitle="detailTitle" :showConfirm="false" cancleText="关闭" dialogWidth="70%"
:dialogTitle="detailTitle" :openDialog="showDetail" :showClose="true" @close="showDetail = false">
:showConfirm="false"
cancleText="关闭"
dialogWidth="70%"
:openDialog="showDetail"
:showClose="true"
@close="showDetail = false"
>
<el-scrollbar max-height="600px"> <el-scrollbar max-height="600px">
<div class="dialogBox"> <div class="dialogBox">
<AppointmentDetail :detailInfo="detailInfo" :editSatus="true"></AppointmentDetail> <AppointmentDetail :detailInfo="detailInfo" :editSatus="true"></AppointmentDetail>
...@@ -433,52 +251,22 @@ ...@@ -433,52 +251,22 @@
</el-scrollbar> </el-scrollbar>
</CommonDialog> </CommonDialog>
<!-- 行程单详情 --> <!-- 行程单详情 -->
<CommonDialog <CommonDialog dialogTitle="香港行程安排" confirmText="下载行程单" dialogWidth="70%" :openDialog="showItinerary"
dialogTitle="香港行程安排" @confirm="handleExprotPdf" @close="showItinerary = false" :showClose="true" :showCancle="false"
confirmText="下载行程单" :confirmLoading="exportLoading">
dialogWidth="70%"
:openDialog="showItinerary"
@confirm="handleExprotPdf"
@close="showItinerary = false"
:showClose="true"
:showCancle="false"
:confirmLoading="exportLoading"
>
<div class="itineraryDialogBox"> <div class="itineraryDialogBox">
<div class="dialogItem" v-for="item in itineraryData"> <div class="dialogItem" v-for="item in itineraryData">
<div class="dialogItemTitle">{{ item.title }}</div> <div class="dialogItemTitle">{{ item.title }}</div>
<DetailPanel <DetailPanel :data="item.data" :row-span="24" col-gap="10px" label-width="120px" row-height="45px"
:data="item.data" :show-col-border="true" />
:row-span="24"
col-gap="10px"
label-width="120px"
row-height="45px"
:show-col-border="true"
/>
</div> </div>
</div> </div>
</CommonDialog> </CommonDialog>
<Phone <Phone @close="handleCloseDrawer" :showDrawer="showPhoneDrawer" :drawerInfo="drawerInfo"
@close="handleCloseDrawer" :phoneMenuList="phoneMenuList" :phoneQuickList="phoneQuickList" @confirmDrawer="confirmDrawer" />
:showDrawer="showPhoneDrawer" <Address @close="handleCloseDrawer" :showAddressDrawer="showAddressDrawer" :drawerInfo="drawerInfo"
:drawerInfo="drawerInfo" :addressMenuList="addressMenuList" :addressQuickList="addressQuickList" @confirmDrawer="confirmDrawer" />
:phoneMenuList="phoneMenuList" <Country :showCountryDrawer="showCountryDrawer" @close="handleCloseDrawer" @confirmCountry="confirmDrawer" />
:phoneQuickList="phoneQuickList"
@confirmDrawer="confirmDrawer"
/>
<Address
@close="handleCloseDrawer"
:showAddressDrawer="showAddressDrawer"
:drawerInfo="drawerInfo"
:addressMenuList="addressMenuList"
:addressQuickList="addressQuickList"
@confirmDrawer="confirmDrawer"
/>
<Country
:showCountryDrawer="showCountryDrawer"
@close="handleCloseDrawer"
@confirmCountry="confirmDrawer"
/>
</div> </div>
</template> </template>
<script setup name="appointmentInfo"> <script setup name="appointmentInfo">
...@@ -793,6 +581,7 @@ const timeValueChange = child => { ...@@ -793,6 +581,7 @@ const timeValueChange = child => {
proxy.$message.warning(`请先选择${child.label}日期`) proxy.$message.warning(`请先选择${child.label}日期`)
child.timeValue = '' child.timeValue = ''
} }
console.log('signDate',child.finishTime)
} }
// 签约详情 // 签约详情
const viewDetail = row => { const viewDetail = row => {
...@@ -1010,6 +799,7 @@ const handleDateClear = child => { ...@@ -1010,6 +799,7 @@ 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' })
...@@ -1017,12 +807,11 @@ const handleDateChange = child => { ...@@ -1017,12 +807,11 @@ const handleDateChange = child => {
// 拼接日期与时分 // 拼接日期与时分
if (child.key == 'arrivalTime' && child.finishTime && child.finishTime.split(' ').length == 2) { if (child.key == 'arrivalTime' && child.finishTime && child.finishTime.split(' ').length == 2) {
child.finishTime = `${form.value[child.key]} ${child.timeValue}:00` child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
} else if ( } else if (child.key == 'departureTime' && child.finishTime && child.finishTime.split(' ').length == 2 ) {
child.key == 'departureTime' && child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
child.finishTime && } else if (child.key == 'signDate' && child.finishTime && child.finishTime.split(' ').length == 2) {
child.finishTime.split(' ').length == 2
) {
child.finishTime = `${form.value[child.key]} ${child.timeValue}:00` child.finishTime = `${form.value[child.key]} ${child.timeValue}:00`
console.log('signDate',child.finishTime)
} }
// 离港时间在到港时间之前 // 离港时间在到港时间之前
if ( if (
...@@ -1204,8 +993,7 @@ const confirmDrawer = info => { ...@@ -1204,8 +993,7 @@ const confirmDrawer = info => {
newObj.objType = drawerInfo.value.drawerType newObj.objType = drawerInfo.value.drawerType
// 因为电话有多个,根据点击的电话类型在抽屉里回显,所以要用drawerInfo.value.code来控制 // 因为电话有多个,根据点击的电话类型在抽屉里回显,所以要用drawerInfo.value.code来控制
newObj.key = drawerInfo.value.key newObj.key = drawerInfo.value.key
form.value[info.key] = newObj.phoneString = `${newObj[drawerInfo.value.code]} ${ form.value[info.key] = newObj.phoneString = `${newObj[drawerInfo.value.code]} ${newObj[drawerInfo.value.key]
newObj[drawerInfo.value.key]
}` }`
saveKey.value[drawerInfo.value.key] = newObj saveKey.value[drawerInfo.value.key] = newObj
// 检查数组中是否已存在key的电话 // 检查数组中是否已存在key的电话
...@@ -1377,7 +1165,11 @@ const setFormValue = (obj, formData) => { ...@@ -1377,7 +1165,11 @@ const setFormValue = (obj, formData) => {
if (field.key == 'confirmAppointmentTime' && props.appointmentStatus !== 0) { if (field.key == 'confirmAppointmentTime' && props.appointmentStatus !== 0) {
field.show = true field.show = true
} }
if(field.compositionTime){
field.finishTime = obj[field.key]
form.value[field.key] = proxy.formatToDate(obj[field.key])
field.timeValue = obj[field.key].split(' ')[1]
}
// 处理时间 // 处理时间
if (field.key == 'openAccountEndTime' && obj[field.key]) { if (field.key == 'openAccountEndTime' && obj[field.key]) {
// 开始时间是否在结束时间之前 // 开始时间是否在结束时间之前
...@@ -1428,8 +1220,7 @@ const setFormValue = (obj, formData) => { ...@@ -1428,8 +1220,7 @@ const setFormValue = (obj, formData) => {
} }
if (phoneObj[field.key]) { if (phoneObj[field.key]) {
phoneObj.phoneString = form.value[field.key] = `${phoneObj[field.code]} ${ phoneObj.phoneString = form.value[field.key] = `${phoneObj[field.code]} ${phoneObj[field.key]
phoneObj[field.key]
}` }`
tempPhoneList.push(phoneObj) tempPhoneList.push(phoneObj)
} }
...@@ -1505,7 +1296,7 @@ const setFormValue = (obj, formData) => { ...@@ -1505,7 +1296,7 @@ const setFormValue = (obj, formData) => {
addressQuickList.value = removeDuplicates(tempAddressList, 'addressString') addressQuickList.value = removeDuplicates(tempAddressList, 'addressString')
processedAppointmentData.value = oldAppointmentData.value = processedData processedAppointmentData.value = oldAppointmentData.value = processedData
oldObjInfo.value = JSON.parse(JSON.stringify(form.value)) oldObjInfo.value = JSON.parse(JSON.stringify(form.value))
console.log('form.value', form.value) console.log('辉县', form.value)
} }
// 数组去重 // 数组去重
function removeDuplicates(arr, key) { function removeDuplicates(arr, key) {
...@@ -1594,6 +1385,19 @@ const handleFormValues = () => { ...@@ -1594,6 +1385,19 @@ const handleFormValues = () => {
practiceCode: '签单员执业编码' practiceCode: '签单员执业编码'
} }
processedAppointmentData.value.forEach(item => { processedAppointmentData.value.forEach(item => {
if(item.data){
item.data.forEach(item1=>{
if(item1.key=='signDate'&&!item1.timeValue){
errorFields.value.push({
message: '请选择签单日的时分'
})
}
if (item1.compositionTime) {
submitObj[item1.key] = item1.finishTime
}
})
}
if (item.key == 'referrerDtoList') { if (item.key == 'referrerDtoList') {
if (form.value['isReferrerAccompany'] == 1 && item.data.length > 0) { if (form.value['isReferrerAccompany'] == 1 && item.data.length > 0) {
item.data.forEach((item1, index) => { item.data.forEach((item1, index) => {
...@@ -1612,13 +1416,7 @@ const handleFormValues = () => { ...@@ -1612,13 +1416,7 @@ const handleFormValues = () => {
}) })
} }
} }
if (item.key == 'position') {
item.data.forEach((item1, index) => {
if (item1.compositionTime) {
submitObj[item1.key] = item1.finishTime
}
})
}
if (item.key == 'userSignDtoList' && item.data.length > 0) { if (item.key == 'userSignDtoList' && item.data.length > 0) {
item.data.forEach((item1, index) => { item.data.forEach((item1, index) => {
for (const key in obj1) { for (const key in obj1) {
...@@ -1632,9 +1430,7 @@ const handleFormValues = () => { ...@@ -1632,9 +1430,7 @@ const handleFormValues = () => {
submitObj['userSignDtoList'] = item.data submitObj['userSignDtoList'] = item.data
} }
}) })
if (submitObj['signDate']) {
submitObj['signDate'] = proxy.formatToDateTime(submitObj['signDate'])
}
console.log('submitObj', submitObj) console.log('submitObj', submitObj)
if (submitObj['departureTime']) { if (submitObj['departureTime']) {
// 开始时间是否在结束时间之前 // 开始时间是否在结束时间之前
...@@ -1733,6 +1529,7 @@ defineExpose({ ...@@ -1733,6 +1529,7 @@ defineExpose({
color: #f56c6c; color: #f56c6c;
margin-right: 4px; margin-right: 4px;
} }
.domEmpty { .domEmpty {
width: 100%; width: 100%;
height: 100%; height: 100%;
...@@ -1744,25 +1541,30 @@ defineExpose({ ...@@ -1744,25 +1541,30 @@ defineExpose({
color: #a8abb2; color: #a8abb2;
margin-top: 100px; margin-top: 100px;
} }
.topBtn { .topBtn {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
} }
.formBox { .formBox {
width: 100%; width: 100%;
.fatherLable { .fatherLable {
font-size: 18px; font-size: 18px;
border-left: 4px solid #165dff; border-left: 4px solid #165dff;
padding-left: 5px; padding-left: 5px;
} }
.fatherDes { .fatherDes {
font-size: 14px; font-size: 14px;
color: #a8abb2; color: #a8abb2;
margin-top: 5px; margin-top: 5px;
margin-bottom: 20px; margin-bottom: 20px;
} }
.inputBox { .inputBox {
width: 100%; width: 100%;
border: 1px solid #dcdfe6; border: 1px solid #dcdfe6;
...@@ -1772,11 +1574,13 @@ defineExpose({ ...@@ -1772,11 +1574,13 @@ defineExpose({
justify-content: space-between; justify-content: space-between;
min-height: 32px; min-height: 32px;
padding: 0px 11px; padding: 0px 11px;
.rightArrow { .rightArrow {
font-size: 14px; font-size: 14px;
color: #a8abb2; color: #a8abb2;
} }
} }
.desBox { .desBox {
.title { .title {
width: 120px; width: 120px;
...@@ -1786,6 +1590,7 @@ defineExpose({ ...@@ -1786,6 +1590,7 @@ defineExpose({
color: #606266; color: #606266;
font-weight: 700; font-weight: 700;
} }
.informationBox { .informationBox {
font-size: 14px; font-size: 14px;
border: 1px solid #dcdfe6; border: 1px solid #dcdfe6;
...@@ -1796,6 +1601,7 @@ defineExpose({ ...@@ -1796,6 +1601,7 @@ defineExpose({
} }
} }
} }
.tabButton { .tabButton {
box-shadow: 0 -1px 14px #00000014; box-shadow: 0 -1px 14px #00000014;
width: 100%; width: 100%;
...@@ -1804,6 +1610,7 @@ defineExpose({ ...@@ -1804,6 +1610,7 @@ defineExpose({
justify-content: center; justify-content: center;
/* padding-right: 20px; */ /* padding-right: 20px; */
padding-top: 20px; padding-top: 20px;
.sumbitBtn { .sumbitBtn {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -1813,34 +1620,40 @@ defineExpose({ ...@@ -1813,34 +1620,40 @@ defineExpose({
background-color: #165dff; background-color: #165dff;
color: #fff; color: #fff;
padding: 0 30px; padding: 0 30px;
.buttonIcon { .buttonIcon {
font-size: 16px; font-size: 16px;
color: #fff; color: #fff;
} }
} }
} }
.customerBox { .customerBox {
.customerItem { .customerItem {
padding: 10px; padding: 10px;
border-radius: 5px; border-radius: 5px;
margin-bottom: 20px; margin-bottom: 20px;
box-shadow: 0 -1px 14px #00000014; box-shadow: 0 -1px 14px #00000014;
.top { .top {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
width: 100%; width: 100%;
.left { .left {
width: 40%; width: 40%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
.gender { .gender {
display: flex; display: flex;
align-items: center; align-items: center;
} }
} }
} }
.bottom { .bottom {
.infoItem { .infoItem {
display: flex; display: flex;
...@@ -1849,20 +1662,24 @@ defineExpose({ ...@@ -1849,20 +1662,24 @@ defineExpose({
} }
} }
} }
.customerItem:last-child { .customerItem:last-child {
margin-bottom: 0px; margin-bottom: 0px;
} }
} }
.deleteIcon { .deleteIcon {
color: red; color: red;
font-size: 18px; font-size: 18px;
padding-top: 10px; padding-top: 10px;
} }
.compositionDateTime { .compositionDateTime {
display: flex; display: flex;
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
} }
.itineraryDialogBox { .itineraryDialogBox {
.dialogItem { .dialogItem {
.dialogItemTitle { .dialogItemTitle {
...@@ -1873,6 +1690,7 @@ defineExpose({ ...@@ -1873,6 +1690,7 @@ defineExpose({
} }
} }
} }
@media only screen and (min-width: 768px) { @media only screen and (min-width: 768px) {
.formBtn { .formBtn {
margin-top: 0 !important; margin-top: 0 !important;
......
...@@ -302,6 +302,7 @@ import { getBankList } from '@/api/common' ...@@ -302,6 +302,7 @@ import { getBankList } from '@/api/common'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import { loadDicts, getDictLabel } from '@/utils/useDict' import { loadDicts, getDictLabel } from '@/utils/useDict'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { getNowTime, formatToDate, formatToDateTime } from '@/utils/date'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const userStore = useUserStore() const userStore = useUserStore()
// 分页相关 // 分页相关
...@@ -493,7 +494,7 @@ const affirmConfig = [ ...@@ -493,7 +494,7 @@ const affirmConfig = [
placeholder: '请选择', placeholder: '请选择',
maxDate: 'today', maxDate: 'today',
visible: formData => visible: formData =>
formData.remainingUnpaidAmount && 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' }]
}, },
{ {
...@@ -504,7 +505,7 @@ const affirmConfig = [ ...@@ -504,7 +505,7 @@ 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 formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0 || Number(formData.remainingUnpaidAmount) == 0,
}, },
{ {
type: 'select', type: 'select',
...@@ -512,7 +513,7 @@ const affirmConfig = [ ...@@ -512,7 +513,7 @@ const affirmConfig = [
label: '保单状态', label: '保单状态',
dictType: 'csf_policy_status_new', dictType: 'csf_policy_status_new',
visible: formData => visible: formData =>
formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) <= 0 formData.remainingUnpaidAmount && Number(formData.remainingUnpaidAmount) < 0 || Number(formData.remainingUnpaidAmount) == 0,
} }
] ]
//计算待付金额 //计算待付金额
...@@ -534,6 +535,7 @@ const calculateAmount = async () => { ...@@ -534,6 +535,7 @@ const calculateAmount = async () => {
const confirmAffirm = async () => { const confirmAffirm = async () => {
try { try {
const formData = await affirmFormRef.value.validate() const formData = await affirmFormRef.value.validate()
console.log(formData.value)
let newObj = JSON.parse(JSON.stringify(formData)) let newObj = JSON.parse(JSON.stringify(formData))
for (const key in newObj) { for (const key in newObj) {
if (/Date/.test(key)) { if (/Date/.test(key)) {
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<el-table-column prop="insured" label="受保人" width="150" sortable /> <el-table-column prop="insured" label="受保人" width="150" sortable />
<el-table-column prop="insuranceCompany" label="保险公司" width="200" sortable /> <el-table-column prop="insuranceCompany" label="保险公司" width="200" sortable />
<el-table-column prop="productName" label="产品计划" width="200" sortable /> <el-table-column prop="productName" label="产品计划" width="200" sortable />
<el-table-column prop="paymentTerm" label="缴费年期" width="120" sortable /> <el-table-column prop="issueNumber" label="缴费年期" width="120" sortable />
<el-table-column fixed="right" label="操作" min-width="80"> <el-table-column fixed="right" label="操作" min-width="80">
<template #default="{ row }"> <template #default="{ row }">
<el-popover placement="right" :width="200" trigger="click"> <el-popover placement="right" :width="200" trigger="click">
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div class="form-page"> <div class="form-page">
<el-form ref="formRef" :model="localData" label-width="120px" size="default"> <el-form ref="formRef" :model="localData" label-width="120px" size="default">
<!-- Tabs --> <!-- Tabs -->
<el-tabs v-model="activeTab" @tab-click="handleTabClick"> <el-tabs v-model="activeTab" @tab-click="handleTabClick" @before-leave="() => handleBeforeLeave()">
<el-tab-pane label="基础信息" name="basic"></el-tab-pane> <el-tab-pane label="基础信息" name="basic"></el-tab-pane>
<el-tab-pane label="产品计划" name="productPlan"></el-tab-pane> <el-tab-pane label="产品计划" name="productPlan"></el-tab-pane>
<el-tab-pane label="首期缴费" name="firstPayment"></el-tab-pane> <el-tab-pane label="首期缴费" name="firstPayment"></el-tab-pane>
...@@ -54,7 +54,8 @@ ...@@ -54,7 +54,8 @@
v-model="firstPremiumFormData" /> v-model="firstPremiumFormData" />
<h3 class="sectionTitle">首期对账信息</h3> <h3 class="sectionTitle">首期对账信息</h3>
<el-table :data="firstPremiumTableData" border style="width: 100%"> <el-table :data="firstPremiumTableData" border style="width: 100%">
<el-table-column prop="createTime" label="申请对账日期" width="180" /> <el-table-column prop="createTime" label="申请对账日期" width="180"
:formatter="(row, col, val) => formatToDateTime(val, 'YYYY-MM-DD HH:mm:ss')" />
<el-table-column prop="reconciliationStatus" label="对账状态" width="180" /> <el-table-column prop="reconciliationStatus" label="对账状态" width="180" />
<el-table-column prop="paymentMethod" label="缴费方式" width="180" /> <el-table-column prop="paymentMethod" label="缴费方式" width="180" />
<el-table-column prop="paymentAmount" label="汇款金额" width="180" /> <el-table-column prop="paymentAmount" label="汇款金额" width="180" />
...@@ -155,20 +156,33 @@ ...@@ -155,20 +156,33 @@
import { ref, reactive, watch, nextTick, onMounted, computed } from 'vue' import { ref, reactive, watch, nextTick, onMounted, computed } from 'vue'
import SearchForm from '@/components/SearchForm/SearchForm.vue' import SearchForm from '@/components/SearchForm/SearchForm.vue'
import CommonDialog from '@/components/commonDialog' import CommonDialog from '@/components/commonDialog'
import { ElMessage } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { Delete, Edit, Search, Share, Upload } from '@element-plus/icons-vue' import { Delete, Edit, Search, Share, Upload } from '@element-plus/icons-vue'
import { getPolicyfollow, getProductList } from '@/api/sign/underwritingMain' import { getPolicyfollow, getProductList } from '@/api/sign/underwritingMain'
import { uploadOssFileList } from '@/api/common' import { uploadOssFileList } from '@/api/common'
import { getProcessDetail } from '@/api/sign/fna' import { getProcessDetail } from '@/api/sign/fna'
import { premiumReconciliationList } from '@/api/sign/policy' import { premiumReconciliationList } from '@/api/sign/policy'
import { loadDicts, getDictLabel } from '@/utils/useDict' import { loadDicts, getDictLabel } from '@/utils/useDict'
import { formatToDate } from '@/utils/date' import { getNowTime, formatToDate, formatToDateTime } from '@/utils/date'
import EditableTable from '@/components/csf-common/EditableTable.vue' import EditableTable from '@/components/csf-common/EditableTable.vue'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
const { proxy } = getCurrentInstance()
proxy.useDictLists(['sys_no_yes', 'csf_ap_frequency', 'bx_currency_type', 'csf_ap_first_issue', 'csf_ap_dividend', 'csf_fortune_status', 'csf_ap_mailing_method', 'receipt_status'])
const router = useRouter() const router = useRouter()
const userStore = useUserStore() const userStore = useUserStore()
const files = ref('') const files = ref('')
const fileUploadDialogFlag = ref(false) const fileUploadDialogFlag = ref(false)
// 记录每个 tab 是否有未保存的修改(dirty 状态)
const tabDirty = ref({
basic: false,
productPlan: false,
firstPayment: false,
introducer: false,
postal: false,
related: false,
attachment: false
})
// ===== Props & Emits ===== // ===== Props & Emits =====
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
...@@ -461,7 +475,6 @@ const basicPlanFormConfig = ref([ ...@@ -461,7 +475,6 @@ const basicPlanFormConfig = ref([
valueKey: 'insuranceCompanyBizId', valueKey: 'insuranceCompanyBizId',
labelKey: 'fullName', labelKey: 'fullName',
transform: (res) => { transform: (res) => {
console.log(res)
return res?.data.records || [] return res?.data.records || []
}, },
onChangeExtraFields: { onChangeExtraFields: {
...@@ -497,8 +510,9 @@ const basicPlanFormConfig = ref([ ...@@ -497,8 +510,9 @@ const basicPlanFormConfig = ref([
projectBizId: userStore.projectInfo.projectBizId, projectBizId: userStore.projectInfo.projectBizId,
fieldBizId: 'field_olk1qZe81qHHKXbw', fieldBizId: 'field_olk1qZe81qHHKXbw',
fieldValueBizId: 'field_value_uOfJH5ucA2YwJpbn', fieldValueBizId: 'field_value_uOfJH5ucA2YwJpbn',
categoryCodeList: [basicPlanFormData.value.insuranceCategoryBizId], // ✅ 确认这里用的是正确的字段(code 或 bizId)
insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId], categoryCodeList: [basicPlanFormData.value.insuranceCategoryCode || ''],
insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId || ''],
pageNo: 1, pageNo: 1,
pageSize: 20 pageSize: 20
}), }),
...@@ -506,12 +520,15 @@ const basicPlanFormConfig = ref([ ...@@ -506,12 +520,15 @@ const basicPlanFormConfig = ref([
debounceWait: 500, debounceWait: 500,
valueKey: 'productName', valueKey: 'productName',
labelKey: 'productName', labelKey: 'productName',
transform: (res) => res?.data.records || [], transform: (res) => {
// ✅ 关键:当选择产品时,自动回填其他字段 console.log('======子组件选择选项后,父组件接收的值 :', res?.data.records || [])
return res?.data.records || []
},
onChangeExtraFields: { onChangeExtraFields: {
// 格式:targetProp: sourcePathInRawObject
apiAttributeSettingDtoList: 'apiAttributeSettingDtoList', apiAttributeSettingDtoList: 'apiAttributeSettingDtoList',
productLaunchBizId: 'productLaunchBizId', productLaunchBizId: 'productLaunchBizId',
insuranceCategoryCode: 'code',
// 如果需要,也可以回填其他字段
}, },
}, },
{ {
...@@ -729,11 +746,12 @@ const localData = ref(defaultFormData()) ...@@ -729,11 +746,12 @@ const localData = ref(defaultFormData())
// ✅ 只在挂载时初始化一次(避免 watch 形成闭环) // ✅ 只在挂载时初始化一次(避免 watch 形成闭环)
onMounted(async () => { onMounted(async () => {
if (props.modelValue) { if (props.modelValue) {
console.log('🚀 父组件 props.modelValue 挂载时:', props.modelValue)
// 深拷贝 + 合并默认值,防止缺失字段 // 深拷贝 + 合并默认值,防止缺失字段
localData.value = { ...defaultFormData(), ...props.modelValue } localData.value = { ...defaultFormData(), ...props.modelValue }
} }
try { try {
await loadDicts(['sys_no_yes', 'csf_ap_frequency', 'bx_currency_type', 'csf_ap_first_issue', 'csf_ap_dividend', 'csf_fortune_status', 'csf_ap_mailing_method', 'receipt_status'])
getPolicyfollowDetail() getPolicyfollowDetail()
} catch (error) { } catch (error) {
console.error('字典加载失败', error) console.error('字典加载失败', error)
...@@ -745,11 +763,25 @@ onMounted(async () => { ...@@ -745,11 +763,25 @@ onMounted(async () => {
policyInfoFormConfig.value = policyInfoFormConfig ? applyViewMode(policyInfoFormConfig.value, props.mode) : [] policyInfoFormConfig.value = policyInfoFormConfig ? applyViewMode(policyInfoFormConfig.value, props.mode) : []
}) })
watch(
() => ({
...basicInfoFormData.value,
...policyInfoFormData.value,
...firstPremiumFormData.value,
...postalFormData.value,
...basicPlanFormData.value
}),
() => {
console.log('========父组件监听basicPlanFormData的变化', basicPlanFormData.value)
tabDirty.value.basic = true
},
{ deep: true }
)
// ✅ 监听 localData 变化,emit 出去(用于 v-model) // ✅ 监听 localData 变化,emit 出去(用于 v-model)
watch( watch(
() => localData.value, () => localData.value,
(newVal) => { (newVal) => {
console.log('========父组件监测的localData:', newVal)
emit('update:modelValue', newVal) emit('update:modelValue', newVal)
}, },
{ deep: true } { deep: true }
...@@ -757,12 +789,46 @@ watch( ...@@ -757,12 +789,46 @@ watch(
// ===== 表单引用 & 验证规则 ===== // ===== 表单引用 & 验证规则 =====
const formRef = ref() const formRef = ref()
const activeTab = ref('basic') const activeTab = ref('basic')
// ========================
// ✅ 新增:切换前确认
// ========================
const handleBeforeLeave = async (newTabName, oldTabName) => {
console.log('切换前确认', newTabName, oldTabName)
if (tabDirty.value[oldTabName]) {
try {
await ElMessageBox.confirm(
`“${getTabLabel(oldTabName)}” 有未保存的内容,确定要切换吗?`,
'提示',
{
confirmButtonText: '继续切换',
cancelButtonText: '取消',
type: 'warning'
}
)
return true // 允许切换
} catch {
return false // 阻止切换
}
}
return true // 无未保存内容,允许切换
}
const getTabLabel = (name) => {
const labels = {
basic: '基础信息',
productPlan: '产品计划',
firstPayment: '首期缴费',
introducer: '介绍人',
postal: '邮寄信息',
related: '关联记录',
attachment: '附件'
}
return labels[name] || name
}
const handleTabClick = (tab) => { const handleTabClick = (tab) => {
if (tab.props.name === 'firstPayment') { if (tab.props.name === 'firstPayment') {
firstPremiumFormConfig.value = firstPremiumFormConfig ? applyViewMode(firstPremiumFormConfig.value, props.mode) : [] firstPremiumFormConfig.value = firstPremiumFormConfig ? applyViewMode(firstPremiumFormConfig.value, props.mode) : []
if (!basicInfoFormData.value.policyNo) return if (!policyInfoFormData.value.policyNo) return
getPremiumReconciliationList(basicInfoFormData.value.policyNo) getPremiumReconciliationList(policyInfoFormData.value.policyNo)
} else if (tab.props.name === 'postal') { } else if (tab.props.name === 'postal') {
postalFormConfig.value = postalFormConfig ? applyViewMode(postalFormConfig.value, props.mode) : [] postalFormConfig.value = postalFormConfig ? applyViewMode(postalFormConfig.value, props.mode) : []
} else if (tab.props.name === 'related') { } else if (tab.props.name === 'related') {
...@@ -782,6 +848,7 @@ const handleSubmit = () => { ...@@ -782,6 +848,7 @@ const handleSubmit = () => {
formRef.value?.validate((valid) => { formRef.value?.validate((valid) => {
if (valid) { if (valid) {
console.log('提交数据', introducerTableData.value) console.log('提交数据', introducerTableData.value)
savTabList.value.push(activeTab.value)
if (activeTab.value === 'postal') { if (activeTab.value === 'postal') {
emit('submit', { ...postalFormData.value, activeTab: activeTab.value }) emit('submit', { ...postalFormData.value, activeTab: activeTab.value })
} else if (activeTab.value === 'firstPayment') { } else if (activeTab.value === 'firstPayment') {
...@@ -826,12 +893,14 @@ const getPolicyfollowDetail = () => { ...@@ -826,12 +893,14 @@ const getPolicyfollowDetail = () => {
} }
getPolicyfollow(props.policyBizId).then(res => { getPolicyfollow(props.policyBizId).then(res => {
if (res.code === 200) { if (res.code === 200) {
console.log('====父组件在赋值basicPlanFormData前', basicPlanFormData.value)
newOrderData.value = res.data newOrderData.value = res.data
policyInfoFormData.value = transformToFormData(res.data, policyInfoFormConfig.value); policyInfoFormData.value = { ...transformToFormData(res.data, policyInfoFormConfig.value) };
basicPlanFormData.value = transformToFormData(res.data, basicPlanFormConfig.value); basicPlanFormData.value = { ...transformToFormData(res.data, basicPlanFormConfig.value) };
basicInfoFormData.value = transformToFormData(res.data, basicInfoFormConfig.value); basicInfoFormData.value = { ...transformToFormData(res.data, basicInfoFormConfig.value) };
firstPremiumFormData.value = transformToFormData(res.data, firstPremiumFormConfig.value); firstPremiumFormData.value = { ...transformToFormData(res.data, firstPremiumFormConfig.value) };
introducerTableData.value = res.data.brokerList || [] introducerTableData.value = res.data.brokerList || []
console.log('====父组件在赋值basicPlanFormData后', basicPlanFormData.value)
} }
}) })
...@@ -931,17 +1000,23 @@ const viewRecordDetail = (e) => { ...@@ -931,17 +1000,23 @@ const viewRecordDetail = (e) => {
} }
}) })
} }
const handleSelectChange = (prop, value, item, type) => { const handleSelectChange = async (prop, value, item, type) => {
console.log(basicPlanFormData.value) await nextTick()
// console.log('======子组件选择选项后,父组件接收的值 :', basicPlanFormData.value)
if (type === 'basicPlan') { if (type === 'basicPlan') {
const params = { const params = {
tenantBizId: userStore.projectInfo.tenantBizId, tenantBizId: userStore.projectInfo.tenantBizId,
projectBizId: userStore.projectInfo.projectBizId, projectBizId: userStore.projectInfo.projectBizId,
fieldBizId: 'field_olk1qZe81qHHKXbw',
fieldValueBizId: 'field_value_uOfJH5ucA2YwJpbn',
insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId], insuranceCompanyBizIdList: [basicPlanFormData.value.insuranceCompanyBizId],
categoryCodeList: [basicPlanFormData.value.insuranceCategoryCode],
pageNo: 1, pageNo: 1,
pageSize: 100, pageSize: 100,
} }
console.log('====父组件拿到值,去调用产品列表查询接口', params)
getProductLists(params) getProductLists(params)
} }
} }
......
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