This commit is contained in:
Leo_Ding 2025-10-20 13:40:16 +08:00
parent c17f6794a4
commit fffa4c28d7
4 changed files with 599 additions and 592 deletions

View File

@ -1,23 +1,12 @@
<!-- AreaCascader.vue -->
<template>
<a-cascader
v-model:value="modelValue"
:options="options"
:load-data="loadData"
:placeholder="placeholder"
:style="style"
:disabled="disabled"
:show-search="showSearch"
:allow-clear="allowClear"
:change-on-select="changeOnSelect"
:field-names="fieldNames"
@change="handleChange"
ref="cascaderRef"
/>
<a-cascader v-model:value="modelValue" :options="options" :load-data="loadData" :placeholder="placeholder"
:style="style" :disabled="disabled" :show-search="showSearch" :allow-clear="allowClear"
:change-on-select="changeOnSelect" :field-names="fieldNames" @change="handleChange" ref="cascaderRef" />
</template>
<script setup>
import { ref, watch, nextTick, defineModel, onMounted } from 'vue';
import { ref, watch, nextTick, defineModel, onMounted,defineExpose } from 'vue';
import apis from '@/apis';
import { useDicsStore } from '@/store';
@ -54,20 +43,23 @@ watch(
{ immediate: true }
);
// 🔁 modelValue
watch(
() => modelValue?.value,
async (val) => {
if (!val || !Array.isArray(val) || val.length <= 1) return;
//
await nextTick();
//
for (let i = 1; i < val.length; i++) {
const parentCode = val[i - 1];
const currentCode = val[i];
// 🔍
function findNodeInOptions(options, code) {
for (const opt of options) {
if (opt.code === code) return opt;
if (opt.children) {
const found = findNodeInOptions(opt.children, code);
if (found) return found;
}
}
return null;
}
async function initData(codes){
//
for (let i = 1; i < codes.length; i++) {
const parentCode = codes[i - 1];
// const currentCode = val[i];
//
let targetNode;
if (i === 1) {
@ -86,22 +78,7 @@ watch(
//
await nextTick();
}
},
{ immediate: true } // 🔥
);
// 🔍
function findNodeInOptions(options, code) {
for (const opt of options) {
if (opt.code === code) return opt;
if (opt.children) {
const found = findNodeInOptions(opt.children, code);
if (found) return found;
}
}
return null;
}
// 🌐
const loadData = async (selectedOptions) => {
const targetOption = selectedOptions[selectedOptions.length - 1];
@ -143,4 +120,5 @@ const loadData = async (selectedOptions) => {
const handleChange = (value, selectedOptions) => {
emit('change', value, selectedOptions?.map(opt => opt.label) || []);
};
defineExpose({initData})
</script>

View File

@ -33,7 +33,7 @@
</span>
</div>
<div class="paltform_list">
<div value="CALL_CENTER" class="paltform_icon">
<div value="CALL_CENTER" class="paltform_icon" @click="handleSelect('hujiao')">
<div class="paltform_icon_1">
<img :src="tel" alt="" srcset="" width="76" height="76" class="img">
</div>
@ -45,7 +45,7 @@
</div>
<p>监管平台</p>
</div>
<div value="HOME_BED" class="paltform_icon">
<div value="HOME_BED" class="paltform_icon" @click="handleSelect('yunying')">
<div class="paltform_icon_1">
<img :src="yunying" alt="" srcset="" width="76" height="76">
</div>

View File

@ -1,458 +1,470 @@
<template>
<a-modal :open="modal.open" :title="modal.title" :width="800" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" @ok="handleOk" @cancel="handleCancel">
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-tabs v-model:activeKey="activeKey">
<!-- 基本信息 -->
<a-tab-pane key="1" tab="基本信息">
<a-row :gutter="24">
<!-- 姓名 -->
<a-col :span="12">
<a-form-item label="姓名" name="name">
<a-input v-model:value="formData.name" placeholder="请输入姓名" />
</a-form-item>
</a-col>
<a-spin tip="Loading..." :spinning="spining">
<a-card>
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-tabs v-model:activeKey="activeKey">
<!-- 基本信息 -->
<a-tab-pane key="1" tab="基本信息">
<a-row :gutter="24">
<!-- 姓名 -->
<a-col :span="12">
<a-form-item label="姓名" name="name">
<a-input v-model:value="formData.name" placeholder="请输入姓名" />
</a-form-item>
</a-col>
<!-- 性别 -->
<a-col :span="12">
<a-form-item label="性别" name="gender">
<a-radio-group v-model:value="formData.gender">
<a-radio value="1"></a-radio>
<a-radio value="2"></a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<!-- 性别 -->
<a-col :span="12">
<a-form-item label="性别" name="gender">
<a-radio-group v-model:value="formData.gender">
<a-radio value="1"></a-radio>
<a-radio value="2"></a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<!-- 证件号码 -->
<a-col :span="12">
<a-form-item label="证件号码" name="identityNo">
<span style="display: inline-flex; width: 100%;">
<a-select v-model:value="formData.identityType"
style="width: 100px; margin-right: 8px;">
<a-select-option v-for="item in dicsStore.dictOptions.CARD_TYPE"
<!-- 证件号码 -->
<a-col :span="12">
<a-form-item label="证件号码" name="identityNo">
<span style="display: inline-flex; width: 100%;">
<a-select v-model:value="formData.identityType"
style="width: 100px; margin-right: 8px;">
<a-select-option v-for="item in dicsStore.dictOptions.CARD_TYPE"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
<a-input v-model:value="formData.identityNo" placeholder="请输入证件号码"
style="flex: 1;" @change="extractBirthDateFromIdCard" />
</span>
</a-form-item>
</a-col>
<!-- 出生日期 -->
<a-col :span="12">
<a-form-item label="出生日期" name="birthDate">
<a-date-picker v-model:value="formData.birthDate" placeholder="请选择出生日期"
style="width: 100%;" />
</a-form-item>
</a-col>
<!-- 关爱巡访电话 -->
<a-col :span="12">
<a-form-item label="关爱巡访电话" name="careVisitPhone">
<a-input v-model:value="formData.careVisitPhone" placeholder="请输入关爱巡访电话" />
</a-form-item>
</a-col>
<!-- 联系方式 -->
<a-col :span="12">
<a-form-item label="联系方式" name="contact1">
<a-input v-model:value="formData.contact1" placeholder="请输入联系方式" />
</a-form-item>
</a-col>
<!-- 社保卡号 -->
<a-col :span="12">
<a-form-item label="社保卡号" name="socialSecurityCardNumber">
<a-input v-model:value="formData.socialSecurityCardNumber" placeholder="请输入社保卡号" />
</a-form-item>
</a-col>
<!-- 其他电话1 -->
<a-col :span="12">
<a-form-item label="其他电话1" name="otherPhone1">
<a-input v-model:value="formData.otherPhone1" placeholder="请输入其他电话1" />
</a-form-item>
</a-col>
<!-- 其他电话2 -->
<a-col :span="12">
<a-form-item label="其他电话2" name="otherPhone2">
<a-input v-model:value="formData.otherPhone2" placeholder="请输入其他电话2" />
</a-form-item>
</a-col>
<!-- 政府购买服务开始时间 -->
<a-col :span="12">
<a-form-item label="政府购买服务时间" name="governmentPurchasedServiceStartDate">
<a-range-picker v-model:value="formData.governmentPurchasedServiceStartDate"
placeholder="请选择政府购买服务时间" style="width: 100%;" />
</a-form-item>
</a-col>
<!-- 健康状况 -->
<a-col :span="12">
<a-form-item label="健康状况" :name="['archive', 'healthStatus']">
<a-select v-model:value="formData.archive.healthStatus" placeholder="请选择健康状况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Health_Condition"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
<a-input v-model:value="formData.identityNo" placeholder="请输入证件号码" style="flex: 1;"
@change="extractBirthDateFromIdCard" />
</span>
</a-form-item>
</a-col>
</a-form-item>
</a-col>
<!-- 出生日期 -->
<a-col :span="12">
<a-form-item label="出生日期" name="birthDate">
<a-date-picker v-model:value="formData.birthDate" placeholder="请选择出生日期"
style="width: 100%;" />
</a-form-item>
</a-col>
<!-- 服务状态 -->
<a-col :span="12">
<a-form-item label="服务状态" :name="['archive', 'serviceStatus']">
<a-select v-model:value="formData.archive.serviceStatus" placeholder="请选择服务状态">
<a-select-option v-for="item in dicsStore.dictOptions.SERVICE_STATUS"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 关爱巡访电话 -->
<a-col :span="12">
<a-form-item label="关爱巡访电话" name="careVisitPhone">
<a-input v-model:value="formData.careVisitPhone" placeholder="请输入关爱巡访电话" />
</a-form-item>
</a-col>
<!-- 生存状态 -->
<a-col :span="12">
<a-form-item label="生存状态" :name="['archive', 'survivalStatus']">
<a-select v-model:value="formData.archive.survivalStatus" placeholder="请选择生存状态">
<a-select-option v-for="item in dicsStore.dictOptions.LIVING_STATUS"
:key="item.dval" :value="item.dval">{{
item.introduction }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 联系方式 -->
<a-col :span="12">
<a-form-item label="联系方式" name="contact1">
<a-input v-model:value="formData.contact1" placeholder="请输入联系方式" />
</a-form-item>
</a-col>
<!-- 服务形式 -->
<a-col :span="12">
<a-form-item label="服务形式" name="archive.serviceForm">
<a-select v-model:value="formData.archive.serviceForm" placeholder="请选择服务形式"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Service_Format"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 社保卡号 -->
<a-col :span="12">
<a-form-item label="社保卡号" name="socialSecurityCardNumber">
<a-input v-model:value="formData.socialSecurityCardNumber" placeholder="请输入社保卡号" />
</a-form-item>
</a-col>
<!-- 护理等级 -->
<a-col :span="12">
<a-form-item label="护理等级" name="archive.nursingLevel">
<a-select v-model:value="formData.archive.nursingLevel" placeholder="请选择护理等级"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Care_Level"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 家庭地址 -->
<a-col :span="12">
<a-form-item label="家庭地址" :name="['archive', 'homeAreaCodes']">
<AreaCascader v-model:value="formData.archive.homeAreaCodes" @change="onAreaChange"
ref="areaCascaderRef" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="详细地址" :name="['archive', 'homeDetailAddress']">
<a-input v-model:value="formData.archive.homeDetailAddress" placeholder="请输入详细地址" />
</a-form-item>
</a-col>
</a-row>
<!-- 其他电话1 -->
<a-col :span="12">
<a-form-item label="其他电话1" name="otherPhone1">
<a-input v-model:value="formData.otherPhone1" placeholder="请输入其他电话1" />
</a-form-item>
</a-col>
<!-- 其他电话2 -->
<a-col :span="12">
<a-form-item label="其他电话2" name="otherPhone2">
<a-input v-model:value="formData.otherPhone2" placeholder="请输入其他电话2" />
</a-form-item>
</a-col>
</a-tab-pane>
<!-- 政府购买服务开始时间 -->
<a-col :span="12">
<a-form-item label="政府购买服务时间" name="governmentPurchasedServiceStartDate">
<a-range-picker v-model:value="formData.governmentPurchasedServiceStartDate"
placeholder="请选择政府购买服务时间" style="width: 100%;" />
</a-form-item>
</a-col>
<!-- 家庭信息 -->
<a-tab-pane key="2" tab="地图定位">
<a-row :gutter="24">
<!-- 经度 -->
<a-col :span="12">
<a-form-item label="经度" name="lat">
<a-input-number v-model:value="formData.archive.lat" placeholder="请输入经度"
style="width: 100%;" />
</a-form-item>
</a-col>
<!-- 健康状况 -->
<a-col :span="12">
<a-form-item label="健康状况" :name="['archive', 'healthStatus']">
<a-select v-model:value="formData.archive.healthStatus" placeholder="请选择健康状况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Health_Condition"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 纬度 -->
<a-col :span="12">
<a-form-item label="纬度" name="lag">
<a-input-number v-model:value="formData.archive.lag" placeholder="请输入纬度"
style="width: 100%;" />
</a-form-item>
</a-col>
<gx-map @handleGetLng="handleGetLng" />
</a-row>
<!-- 服务状态 -->
<a-col :span="12">
<a-form-item label="服务状态" :name="['archive', 'serviceStatus']">
<a-select v-model:value="formData.archive.serviceStatus" placeholder="请选择服务状态">
<a-select-option v-for="item in dicsStore.dictOptions.SERVICE_STATUS"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-tab-pane>
<!-- 生存状态 -->
<a-col :span="12">
<a-form-item label="生存状态" :name="['archive', 'survivalStatus']">
<a-select v-model:value="formData.archive.survivalStatus" placeholder="请选择生存状态">
<a-select-option v-for="item in dicsStore.dictOptions.LIVING_STATUS"
:key="item.dval" :value="item.dval">{{
item.introduction }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 更多 -->
<a-tab-pane key="3" tab="更多">
<a-row :gutter="24">
<!-- 居住情况 -->
<a-col :span="8">
<a-form-item label="居住情况" name="livingSituation">
<a-select v-model:value="formData.archive.livingSituation" placeholder="请选择居住情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Living_Situation"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 服务形式 -->
<a-col :span="12">
<a-form-item label="服务形式" name="archive.serviceForm">
<a-select v-model:value="formData.archive.serviceForm" placeholder="请选择服务形式"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Service_Format"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 子女情况 -->
<a-col :span="8">
<a-form-item label="子女情况" name="childrenSituation">
<a-select v-model:value="formData.archive.childrenSituation" placeholder="请选择子女情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.CHILDREN_STATE"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 护理等级 -->
<a-col :span="12">
<a-form-item label="护理等级" name="archive.nursingLevel">
<a-select v-model:value="formData.archive.nursingLevel" placeholder="请选择护理等级"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Care_Level" :key="item.dval"
:value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 家庭地址 -->
<a-col :span="12">
<a-form-item label="家庭地址" :name="['archive', 'homeAreaCodes']">
<AreaCascader v-model:value="formData.archive.homeAreaCodes" @change="onAreaChange" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="详细地址" :name="['archive', 'homeDetailAddress']">
<a-input v-model:value="formData.archive.homeDetailAddress" placeholder="请输入详细地址" />
</a-form-item>
</a-col>
</a-row>
<!-- 统计分类 -->
<a-col :span="8">
<a-form-item label="统计分类" name="statisticsCategory">
<a-select v-model:value="formData.archive.statisticsCategory" placeholder="请选择统计分类"
allow-clear>
<a-select-option
v-for="item in dicsStore.dictOptions.Statistical_Classification"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-tab-pane>
<!-- 智力情况 -->
<a-col :span="8">
<a-form-item label="智力情况" name="intellectualSituation">
<a-select v-model:value="formData.archive.intellectualSituation"
placeholder="请选择智力情况" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Intellectual_Condition"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 家庭信息 -->
<a-tab-pane key="2" tab="地图定位">
<a-row :gutter="24">
<!-- 经度 -->
<a-col :span="12">
<a-form-item label="经度" name="lat">
<a-input-number v-model:value="formData.archive.lat" placeholder="请输入经度" style="width: 100%;"/>
</a-form-item>
</a-col>
<!-- 是否长期照料失能子女 -->
<a-col :span="8">
<a-form-item label="是否长期照料失能子女" name="longTermCareForDisabledChildren">
<a-select v-model:value="formData.archive.longTermCareForDisabledChildren"
placeholder="请选择是否长期照料失能子女" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Disabled_Child"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 纬度 -->
<a-col :span="12">
<a-form-item label="纬度" name="lag">
<a-input-number v-model:value="formData.archive.lag" placeholder="请输入纬度" style="width: 100%;"/>
</a-form-item>
</a-col>
<gx-map @handleGetLng="handleGetLng" />
</a-row>
<!-- 老人子女探望情况 -->
<a-col :span="8">
<a-form-item label="老人子女探望情况" name="childrenVisitStatus">
<a-select v-model:value="formData.archive.childrenVisitStatus"
placeholder="请选择老人子女探望情况" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Frequency_Visits"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-tab-pane>
<!-- 是否人户分离 -->
<a-col :span="8">
<a-form-item label="是否人户分离" name="householdResidenceSeparation">
<a-select v-model:value="formData.archive.householdResidenceSeparation"
placeholder="请选择是否人户分离" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Separation"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 更多 -->
<a-tab-pane key="3" tab="更多">
<a-row :gutter="24">
<!-- 居住情况 -->
<a-col :span="8">
<a-form-item label="居住情况" name="livingSituation">
<a-select v-model:value="formData.archive.livingSituation" placeholder="请选择居住情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Living_Situation"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 民族 -->
<a-col :span="8">
<a-form-item label="民族" name="ethnicity">
<a-select v-model:value="formData.archive.ethnicity" placeholder="请选择民族"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Ethnicity"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 子女情况 -->
<a-col :span="8">
<a-form-item label="子女情况" name="childrenSituation">
<a-select v-model:value="formData.archive.childrenSituation" placeholder="请选择子女情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.CHILDREN_STATE"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 是否完成能力评估 -->
<a-col :span="8">
<a-form-item label="是否完成能力评估" name="completedCapacityAssessment">
<a-select v-model:value="formData.archive.completedCapacityAssessment"
placeholder="请选择是否完成能力评估" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Capability_Assessment"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 统计分类 -->
<a-col :span="8">
<a-form-item label="统计分类" name="statisticsCategory">
<a-select v-model:value="formData.archive.statisticsCategory" placeholder="请选择统计分类"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Statistical_Classification"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 是否住出租屋/地下室 -->
<a-col :span="8">
<a-form-item label="是否住出租屋/地下室" name="livesInRentedRoomOrBasement">
<a-select v-model:value="formData.archive.livesInRentedRoomOrBasement"
placeholder="请选择是否住出租屋/地下室" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Property_Basement"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 智力情况 -->
<a-col :span="8">
<a-form-item label="智力情况" name="intellectualSituation">
<a-select v-model:value="formData.archive.intellectualSituation" placeholder="请选择智力情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Intellectual_Condition"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 经济来源 -->
<a-col :span="8">
<a-form-item label="经济来源" name="economicSource">
<a-select v-model:value="formData.archive.economicSource" placeholder="请选择经济来源"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Source_Income"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 是否长期照料失能子女 -->
<a-col :span="8">
<a-form-item label="是否长期照料失能子女" name="longTermCareForDisabledChildren">
<a-select v-model:value="formData.archive.longTermCareForDisabledChildren"
placeholder="请选择是否长期照料失能子女" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Disabled_Child"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 文化程度 -->
<a-col :span="8">
<a-form-item label="文化程度" name="educationLevel">
<a-select v-model:value="formData.archive.educationLevel" placeholder="请选择文化程度"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Level_Education"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 老人子女探望情况 -->
<a-col :span="8">
<a-form-item label="老人子女探望情况" name="childrenVisitStatus">
<a-select v-model:value="formData.archive.childrenVisitStatus" placeholder="请选择老人子女探望情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Frequency_Visits"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 宗教信仰 -->
<a-col :span="8">
<a-form-item label="宗教信仰" name="religion">
<a-select v-model:value="formData.archive.religion" placeholder="请选择宗教信仰"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Religious_belief"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 是否人户分离 -->
<a-col :span="8">
<a-form-item label="是否人户分离" name="householdResidenceSeparation">
<a-select v-model:value="formData.archive.householdResidenceSeparation"
placeholder="请选择是否人户分离" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Separation" :key="item.dval"
:value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 职业情况 -->
<a-col :span="8">
<a-form-item label="职业情况" name="occupation">
<a-select v-model:value="formData.archive.occupation" placeholder="请选择职业情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Employment_Status"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 民族 -->
<a-col :span="8">
<a-form-item label="民族" name="ethnicity">
<a-select v-model:value="formData.archive.ethnicity" placeholder="请选择民族" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Ethnicity" :key="item.dval"
:value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 政治面貌 -->
<a-col :span="8">
<a-form-item label="政治面貌" name="politicalAffiliation">
<a-select v-model:value="formData.archive.politicalAffiliation"
placeholder="请选择政治面貌" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Political_affiliation"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 是否完成能力评估 -->
<a-col :span="8">
<a-form-item label="是否完成能力评估" name="completedCapacityAssessment">
<a-select v-model:value="formData.archive.completedCapacityAssessment"
placeholder="请选择是否完成能力评估" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Capability_Assessment"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 婚姻情况 -->
<a-col :span="8">
<a-form-item label="婚姻情况" name="maritalStatus">
<a-select v-model:value="formData.archive.maritalStatus" placeholder="请选择婚姻情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Marital_Status"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span='8'>
<a-form-item label="分类标签" name="labelsCode">
<a-select v-model:value="formData.labelsCode" allowClear mode="multiple">
<a-select-option
v-for="item in dicsStore.dictOptions.Service_Recipient_Category2"
:key="item.dval" :value="item.dval">{{
item.introduction }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 户口所在地 -->
<a-col :span="8">
<a-form-item label="户口所在地" name="householdArea">
<AreaCascader v-model:value="formData.archive.householdArea"
@change="onAreaHoldChange" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="详细地址" name="householdDetailAddress">
<a-input v-model:value="formData.archive.householdDetailAddress"
placeholder="请输入详细地址" />
</a-form-item>
</a-col>
<!-- 是否住出租屋/地下室 -->
<a-col :span="8">
<a-form-item label="是否住出租屋/地下室" name="livesInRentedRoomOrBasement">
<a-select v-model:value="formData.archive.livesInRentedRoomOrBasement"
placeholder="请选择是否住出租屋/地下室" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Property_Basement"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 其他 -->
<a-col :span="24">
<a-form-item label="其他" name="otherNotes">
<a-textarea v-model:value="formData.archive.otherNotes" placeholder="请输入" :rows="1"
:auto-size="{ minRows: 1, maxRows: 2 }" />
</a-form-item>
</a-col>
<!-- 经济来源 -->
<a-col :span="8">
<a-form-item label="经济来源" name="economicSource">
<a-select v-model:value="formData.archive.economicSource" placeholder="请选择经济来源"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Source_Income"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 身份证照片 -->
<a-col :span="12">
<a-form-item label="身份证照片" name="idCardPhotos">
<gx-upload v-model="formData.archive.idCardPhotos" accept-types=".jpg,.png,.webp"
:fileNumber="1" />
</a-form-item>
</a-col>
<!-- 文化程度 -->
<a-col :span="8">
<a-form-item label="文化程度" name="educationLevel">
<a-select v-model:value="formData.archive.educationLevel" placeholder="请选择文化程度"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Level_Education"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 宗教信仰 -->
<a-col :span="8">
<a-form-item label="宗教信仰" name="religion">
<a-select v-model:value="formData.archive.religion" placeholder="请选择宗教信仰" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Religious_belief"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 职业情况 -->
<a-col :span="8">
<a-form-item label="职业情况" name="occupation">
<a-select v-model:value="formData.archive.occupation" placeholder="请选择职业情况" allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Employment_Status"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 政治面貌 -->
<a-col :span="8">
<a-form-item label="政治面貌" name="politicalAffiliation">
<a-select v-model:value="formData.archive.politicalAffiliation" placeholder="请选择政治面貌"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Political_affiliation"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 婚姻情况 -->
<a-col :span="8">
<a-form-item label="婚姻情况" name="maritalStatus">
<a-select v-model:value="formData.archive.maritalStatus" placeholder="请选择婚姻情况"
allow-clear>
<a-select-option v-for="item in dicsStore.dictOptions.Marital_Status"
:key="item.dval" :value="item.dval">
{{ item.introduction }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span='8'>
<a-form-item label="分类标签" name="labelsCode">
<a-select v-model:value="formData.labelsCode" allowClear mode="multiple">
<a-select-option v-for="item in dicsStore.dictOptions.Service_Recipient_Category2"
:key="item.dval" :value="item.dval">{{
item.introduction }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 户口所在地 -->
<a-col :span="8">
<a-form-item label="户口所在地" name="householdArea">
<AreaCascader v-model:value="formData.archive.householdArea"
@change="onAreaHoldChange" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="详细地址" name="householdDetailAddress">
<a-input v-model:value="formData.archive.householdDetailAddress"
placeholder="请输入详细地址" />
</a-form-item>
</a-col>
<!-- 其他 -->
<a-col :span="24">
<a-form-item label="其他" name="otherNotes">
<a-textarea v-model:value="formData.archive.otherNotes" placeholder="请输入" :rows="1"
:auto-size="{ minRows: 1, maxRows: 2 }" />
</a-form-item>
</a-col>
<!-- 身份证照片 -->
<a-col :span="12">
<a-form-item label="身份证照片" name="idCardPhotos">
<gx-upload v-model="formData.archive.idCardPhotos" accept-types=".jpg,.png,.webp"
:fileNumber="1" />
</a-form-item>
</a-col>
<!-- 上传资料 -->
<a-col :span="12">
<a-form-item label="上传资料" name="uploadedDocuments">
<gx-upload v-model="formData.archive.idCardPhotos" accept-types=".jpg,.png,.webp,.xlsx,.docx,.doc"
:fileNumber="10" />
</a-form-item>
</a-col>
</a-row>
</a-tab-pane>
</a-tabs>
</a-form>
<!-- 上传资料 -->
<a-col :span="12">
<a-form-item label="上传资料" name="uploadedDocuments">
<gx-upload v-model="formData.archive.idCardPhotos"
accept-types=".jpg,.png,.webp,.xlsx,.docx,.doc" :fileNumber="10" />
</a-form-item>
</a-col>
</a-row>
</a-tab-pane>
</a-tabs>
</a-form>
</a-card>
</a-spin>
</a-modal>
</template>
<script setup>
import { cloneDeep } from 'lodash-es'
import { ref, defineProps } from 'vue'
import { ref, defineProps, nextTick } from 'vue'
import { config } from '@/config'
import apis from '@/apis'
import { useForm, useModal } from '@/hooks'
import { useForm, useModal,useSpining } from '@/hooks'
import { useDicsStore } from '@/store'
import AreaCascader from '@/components/AreaCascader/index.vue'
import { validatePhone, validateEmail, validateIdCard } from '@/utils/validate'
@ -460,11 +472,14 @@ import { getBirthDate, spliceUrl } from '@/utils/util'
import dayjs from 'dayjs'
import { message } from 'ant-design-vue'
import { FastBackwardFilled } from '@ant-design/icons-vue'
const emit = defineEmits(['ok'])
const activeKey = ref('1')
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRecord, formData, formRef, formRules, resetForm } = useForm()
const areaCascaderRef = ref()
const cancelText = ref('取消')
const spining=ref(false)
formRules.value = {
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
identityType: [{ required: true, message: '请选择证件类型', trigger: 'change' }],
@ -504,16 +519,28 @@ async function handleEdit(record = {}) {
type: 'edit',
title: '编辑对象'
})
const { data, success } = await apis.serverObj.getItem(record.id).catch()
if (!success) {
hideModal()
return
try {
spining.value=true
const { data, success } = await apis.serverObj.getItem(record.id).catch()
if (!success) {
spining.value=false
hideModal()
return
}
formData.value = { ...data }
formData.value.birthDate = dayjs(data.birthDate)
formData.value.archive.idCardPhotos = data.archive.idCardPhotos ? data.archive.idCardPhotos.map(item => config('http.apiBasic') + item) : []
formData.value.archive.uploadedDocuments = data.archive.uploadedDocuments ? data.archive.uploadedDocuments.map(item => config('http.apiBasic') + item) : []
formData.value.governmentPurchasedServiceStartDate = [dayjs(formData.value.starGovernmentService), dayjs(formData.value.endGovernmentService)]
nextTick(() => {
areaCascaderRef.value.initData(data.archive.homeAreaCodes)
})
spining.value=false
} catch (error) {
console.log(error.message)
spining.value=false
}
formData.value = { ...data }
formData.value.birthDate=dayjs(data.birthDate)
formData.value.archive.idCardPhotos = data.archive.idCardPhotos ? data.archive.idCardPhotos.map(item => config('http.apiBasic') + item) : []
formData.value.archive.uploadedDocuments = data.archive.uploadedDocuments ? data.archive.uploadedDocuments.map(item => config('http.apiBasic') + item) : []
formData.value.governmentPurchasedServiceStartDate=[dayjs(formData.value.starGovernmentService),dayjs(formData.value.endGovernmentService)]
}
// utils/idCard.js
function isValidIdCard(value) {
@ -580,11 +607,11 @@ function handleOk() {
labels: formData.value.labelsCode ? formData.value.labelsCode.map(item => dicsStore.getDictLabel('Service_Recipient_Category2', item)) : [],
}
params.archive.idCardPhotos = formData.value.archive.idCardPhotos&&formData.value.archive.idCardPhotos.length>0 ? formData.value.archive.idCardPhotos.map(item => spliceUrl(item)) : ['']
params.archive.uploadedDocuments = formData.value.archive.uploadedDocuments&&formData.value.archive.uploadedDocuments.length>0 ? formData.value.archive.uploadedDocuments.map(item => spliceUrl(item)) : ['']
if(formData.value.governmentPurchasedServiceStartDate&&formData.value.governmentPurchasedServiceStartDate.length>0){
params.archive.starGovernmentService=formData.value.governmentPurchasedServiceStartDate[0]
params.archive.endGovernmentService=formData.value.governmentPurchasedServiceStartDate[1]
params.archive.idCardPhotos = formData.value.archive.idCardPhotos && formData.value.archive.idCardPhotos.length > 0 ? formData.value.archive.idCardPhotos.map(item => spliceUrl(item)) : ['']
params.archive.uploadedDocuments = formData.value.archive.uploadedDocuments && formData.value.archive.uploadedDocuments.length > 0 ? formData.value.archive.uploadedDocuments.map(item => spliceUrl(item)) : ['']
if (formData.value.governmentPurchasedServiceStartDate && formData.value.governmentPurchasedServiceStartDate.length > 0) {
params.archive.starGovernmentService = formData.value.governmentPurchasedServiceStartDate[0]
params.archive.endGovernmentService = formData.value.governmentPurchasedServiceStartDate[1]
}
//
if (params.identityType === '1' && !isValidIdCard(params.identityNo)) {
@ -600,7 +627,7 @@ function handleOk() {
break
case 'edit':
console.log(params)
result = await apis.serverObj.updateItem(params.id,params).catch(() => {
result = await apis.serverObj.updateItem(params.id, params).catch(() => {
throw new Error()
})
break
@ -640,23 +667,9 @@ function onAreaHoldChange(value, labels) {
formData.value.archive.houseAreaLabels = [...labels]
}
function handleGetLng(obj) {
formData.value.lat = obj.lat
formData.value.lag = obj.lng
formData.value.archive.lat = obj.lat
formData.value.archive.lag = obj.lng
}
//
const handleCustomRequest = async (options) => {
const { file, onProgress, onSuccess, onError } = options;
try {
const formData = new FormData();
formData.append('file', file);
const { data } = await apis.common.uploadFile(formData);
const fullUrl = config('http.apiBasic') + data;
console.log(fullUrl)
} catch (err) {
message.error('上传失败');
}
};
/**
* 取消
*/

View File

@ -2,99 +2,104 @@
<a-modal :open="modal.open" :title="modal.title" :width="800" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" @ok="handleOk" @cancel="handleCancel">
<a-card>
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-row :gutter="24">
<!-- 姓名 -->
<a-col :span="12">
<a-form-item label="服务对象" name="name">
<a-input v-model:value="formData.name" placeholder="请输入姓名" disabled />
</a-form-item>
</a-col>
<!-- 性别 -->
<a-col :span="12">
<a-form-item label="服务站点" name="stationId">
<a-select v-model:value="formData.stationId">
<a-select-option v-for="item in stationList" :key="item.id" :value="item.id">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 出生日期 -->
<a-col :span="24">
<div style="margin-bottom: 20px;">
<span style="margin-right: 10px;"><span style="color: red;">*</span> 服务项目:</span>
<!-- 显示已选项目 -->
<a-tag v-for="item in selectedServices" :key="item.id" closable @close="handleRemove(item)">
{{ item.name }}
</a-tag>
<a-tag @click="showModal2" color="#108ee9" style="cursor: pointer;">
添加服务
</a-tag>
</div>
</a-col>
<a-col :span="12">
<a-form-item label="服务费用" name="price">
<a-input-number v-model:value="formData.price" style="width: 100%;"></a-input-number>
</a-form-item>
</a-col>
<template v-if="formData.orderType == '2'">
<a-col :span="12">
<a-form-item label="服务人员" name="servicePersonId">
<a-select v-model:value="formData.servicePersonId">
<a-select-option v-for="item in servicePersonList" :key="item.id" :value="item.id">
<a-spin tip="Loading..." :spinning="spining">
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-row :gutter="24">
<!-- 姓名 -->
<a-col :span="12">
<a-form-item label="服务对象" name="name">
<a-input v-model:value="formData.name" placeholder="请输入姓名" disabled />
</a-form-item>
</a-col>
<!-- 性别 -->
<a-col :span="12">
<a-form-item label="服务站点" name="stationId">
<a-select v-model:value="formData.stationId">
<a-select-option v-for="item in stationList" :key="item.id" :value="item.id">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- 出生日期 -->
<a-col :span="24">
<div style="margin-bottom: 20px;">
<span style="margin-right: 10px;"><span style="color: red;">*</span> 服务项目:</span>
<!-- 显示已选项目 -->
<a-tag v-for="item in selectedServices" :key="item.id" closable
@close="handleRemove(item)">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="计划日期" name="planeDate">
<a-range-picker v-model:value="formData.planeDate" placeholder="请选择计划日期" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="计划开始时间" name="plannedStartDate">
<a-time-picker v-model:value="formData.plannedStartDate" format="HH:mm"
style="width: 100%;" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="要求工单时长" name="workDuration">
<a-input-number v-model:value="formData.workDuration">
<template #addonAfter>分钟</template>
</a-input-number>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="服务地址(如修改服务地址,请务必更新地图定位地址)" name="areaCodes">
<AreaCascader v-model:value="formData.areaCodes" @change="onAreaChange" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="详细地址" name="detailAddress">
<a-input v-model:value="formData.detailAddress"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="地理地图定位" name="gps">
<div @click="mapVisible = true">
<span>{{ gps }}</span>
<AimOutlined style="color: #40a9ff;" />
</a-tag>
<a-tag @click="showModal2" color="#108ee9" style="cursor: pointer;">
添加服务
</a-tag>
</div>
</a-form-item>
</a-col>
</template>
<a-col :span="24">
<a-form-item label="服务内容" name="content">
<a-input v-model:value="formData.content"></a-input>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-col>
<a-col :span="12">
<a-form-item label="服务费用" name="price">
<a-input-number v-model:value="formData.price" style="width: 100%;"></a-input-number>
</a-form-item>
</a-col>
<template v-if="formData.orderType == '2'">
<a-col :span="12">
<a-form-item label="服务人员" name="servicePersonId">
<a-select v-model:value="formData.servicePersonId">
<a-select-option v-for="item in servicePersonList" :key="item.id"
:value="item.id">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="计划日期" name="planeDate">
<a-range-picker v-model:value="formData.planeDate" placeholder="请选择计划日期" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="计划开始时间" name="plannedStartDate">
<a-time-picker v-model:value="formData.plannedStartDate" format="HH:mm"
style="width: 100%;" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="要求工单时长" name="workDuration">
<a-input-number v-model:value="formData.workDuration">
<template #addonAfter>分钟</template>
</a-input-number>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="服务地址(如修改服务地址,请务必更新地图定位地址)" name="areaCodes">
<AreaCascader v-model:value="formData.areaCodes" @change="onAreaChange" ref="areaCascaderRef"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="详细地址" name="detailAddress">
<a-input v-model:value="formData.detailAddress"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="地理地图定位" name="gps">
<div @click="mapVisible = true">
<span>{{ gps }}</span>
<AimOutlined style="color: #40a9ff;" />
</div>
</a-form-item>
</a-col>
</template>
<a-col :span="24">
<a-form-item label="服务内容" name="content">
<a-input v-model:value="formData.content"></a-input>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</a-card>
</a-modal>
<a-modal v-model:open="modalVisible" title="选择服务项目" @ok="handleConfirm" @cancel="handleCancel2" okText="确认"
@ -139,6 +144,8 @@ const servicePersonList = ref([])
const gps = ref('')
const mapVisible = ref(false)
const stationList = ref([])
const spining = ref(false)
const areaCascaderRef=ref()
formRules.value = {
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
identityType: [{ required: true, message: '请选择证件类型', trigger: 'change' }],
@ -282,20 +289,29 @@ async function handleEdit(record = {}, type) {
type: 'edit',
title: '编辑对象'
})
formData.value.orderType = type, //线2 线1]
formData.value.customerId = record.id
formData.value.name = record.name
formData.value.areaCodes = record.archive.homeAreaCodes
try {
spining.value = true
formData.value.orderType = type, //线2 线1]
formData.value.customerId = record.id
formData.value.name = record.name
formData.value.areaCodes = [...record.archive.homeAreaCodes]
formData.value.areaLabels = record.archive.homeAreaLabels
if (type == '2') {
nextTick(() => {
areaCascaderRef.value.initData(record.archive.homeAreaCodes)
})
if (type == '2') {
formData.value.detailAddress = record.archive.homeDetailAddress
gps.value = record.region.join('') + record.archive.homeDetailAddress
formData.value.lat = record.archive.lag
formData.value.lng = record.archive.lat
}
formData.value.detailAddress = record.archive.homeDetailAddress
gps.value = record.region.join('') + record.archive.homeDetailAddress
formData.value.lat = record.archive.lag
formData.value.lng = record.archive.lat
getServiceStation()
spining.value = false
} catch (error) {
spining.value = false
}
getServiceStation()
}
async function getServiceStation() {
try {