rhb-server/mes-ui/rhb-app/packageForm/pages/householdForm.vue
2025-10-20 11:14:41 +08:00

2424 lines
79 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<view class="container">
<u-form :model="form" ref="uForm" label-width="200rpx">
<!-- 基本信息 -->
<view class="card">
<view class="section-header">
<view class="section-title">基本信息</view>
<view v-if="showHelp && form.id" class="history-link" @click="viewHistory('help',form.id)">
查看历史帮扶信息</view>
</view>
<!-- 删除原有镇、村输入框,新增级联选择器 -->
<!-- <u-form-item label="镇(街)" prop="town" >
<u-input v-model="form.town" placeholder="请输入镇(街)" />
</u-form-item>
<u-form-item label="村(居)" prop="village" >
<u-input v-model="form.village" placeholder="请输入村(居)" />
</u-form-item> -->
<u-form-item label="所属区域" required prop="areaObj">
<hg-select :disabled="showArea" title="选择所属区域" v-model="form.areaObj" :range="townVillageGroup"
rangeKey="label" rangeKeyChildren="children" :isGanged="true"></hg-select>
</u-form-item>
<u-form-item label="门牌号" required prop="doorNumber">
<uni-easyinput :disabled="form.submitStatus == 1" v-model="form.doorNumber" type="textarea"
placeholder="请输入门牌号" />
</u-form-item>
<!-- 家庭属性(多选) -->
<u-form-item label="家庭属性" required prop="householdType">
<view class="custom-checkbox-group">
<view v-for="item in householdTypeOptions" :key="item.value" class="custom-checkbox-item">
<view class="checkbox-icon" @click="toggleHouseholdType(item)">
<view v-if="form.householdType && form.householdType.includes(item.value)"
class="checkbox-checked">✓</view>
</view>
<view class="checkbox-label" @click="toggleHouseholdType(item)">
{{ item.label }}
</view>
</view>
</view>
</u-form-item>
<!-- 帮扶信息(当家庭属性为监测户或脱贫户时显示) -->
<!-- 居住属性单选checkbox-group+单选逻辑) -->
<u-form-item label="居住属性" required prop="hukouType">
<u-radio-group v-model="form.hukouType">
<view class="option-list-col">
<u-radio labelSize="26" size="36" shape="square" v-for="item in hukouTypeOptions"
:key="item.value" :name="item.value" :label="item.label" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item v-if="showRiskMitigation" label="是否消除风险" required prop="riskMitigation">
<u-radio-group v-model="form.riskMitigation">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item v-if="showHelp" label="帮扶单位" prop="helpUnit">
<zxz-uni-data-select filterable v-model="form.helpUnit" :localdata="helpUnitOptions" clearable
@change="changeHelpUnit" placeholder="请选择帮扶单位"></zxz-uni-data-select>
</u-form-item>
<u-form-item v-if="showHelp" label="帮扶人" required prop="helperName">
<u-input v-model="form.helperName" placeholder="请输入帮扶人姓名" />
</u-form-item>
<u-form-item v-if="showHelp" label="联系方式" required prop="helperPhone">
<u-input v-model="form.helperPhone" placeholder="请输入帮扶人联系电话" />
</u-form-item>
<u-form-item v-if="showHelp" label="记录时间" required prop="helpRecordTime">
<uni-datetime-picker placeholder="请选择记录时间" type="datetime" v-model="form.helpRecordTime" />
</u-form-item>
<u-form-item v-if="showHelp" label="帮扶手册" required>
<cc-imgPreDelUpload :count="6" :imageList="helpFiles"></cc-imgPreDelUpload>
</u-form-item>
</view>
<!-- 户信息基本情况 -->
<view class="card">
<view class="section-title">户信息</view>
<u-form-item label="户主姓名" required prop="householderName">
<u-input v-model="form.householderName" placeholder="请输入户主姓名" />
</u-form-item>
<u-form-item label="身份证号" required prop="householderIdNumber">
<u-input v-model="form.householderIdNumber" placeholder="请输入身份证号"
@blur="validateId(form.householderIdNumber, -1)" />
</u-form-item>
<u-form-item label="户籍人数" required prop="householdNum">
<u-input v-model="form.householdNum" type="number" placeholder="请输入户籍人数若无填0" />
</u-form-item>
<u-form-item label="常住人数" required prop="residentNum">
<u-input v-model="form.residentNum" type="number" placeholder="请输入常住人数若无填0" />
</u-form-item>
<u-form-item label="联系电话" required prop="householderPhone">
<u-input v-model="form.householderPhone" placeholder="请输入联系电话"
@blur="validatePhone(form.householderPhone, -1)" />
</u-form-item>
<u-form-item label="劳动力人数" required prop="laborNum">
<u-input v-model="form.laborNum" type="number" placeholder="请输入劳动力人数若无填0" />
</u-form-item>
<u-form-item label="务工人数" required prop="workNum">
<u-input v-model="form.workNum" type="number" placeholder="请输入务工人数若无填0" />
</u-form-item>
<u-form-item label="丧失或无劳动力人数" required prop="noLaborNum">
<u-input v-model="form.noLaborNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
</view>
<!-- 家庭成员信息(动态添加) -->
<view class="card">
<view class="section-title">家庭成员</view>
<view>
<view v-for="(member, idx) in form.members" :key="idx" class="member-block">
<u-button v-if="member.id" type="success" size="mini"
@click="viewHistory('member',member.id)">查看该成员历史数据</u-button>
<u-form-item label="姓名" required :prop="'members.'+idx+'.name'">
<u-input v-model="member.name" placeholder="请输入姓名" />
</u-form-item>
<u-form-item label="与户主关系" required :prop="'members.'+idx+'.relation'">
<u-input v-model="member.relation" placeholder="请输入与户主关系" />
</u-form-item>
<u-form-item label="身份证号" required :prop="'members.'+idx+'.idNumber'">
<u-input v-model="member.idNumber" placeholder="请输入身份证号"
@blur="validateId(member.idNumber, idx)" />
</u-form-item>
<u-form-item label="联系电话" :prop="'members.'+idx+'.phone'">
<u-input v-model="member.phone" placeholder="请输入联系电话"
@blur="validatePhone(member.phone, idx)" />
</u-form-item>
<u-form-item label="健康状况" required :prop="'members.'+idx+'.health'">
<view class="custom-checkbox-group">
<view v-for="item in healthOptions" :key="item.value" class="custom-checkbox-item">
<view class="checkbox-icon" @click="toggleHealth(item.value,member)">
<view v-if="member.health && member.health.includes(item.value)"
class="checkbox-checked">✓</view>
</view>
<view class="checkbox-label" @click="toggleHealth(item.value,member)">
{{ item.label }}
</view>
</view>
</view>
</u-form-item>
<u-form-item v-if="member.showDisability" label="残疾等级" required
:prop="'members.'+idx+'.disability'">
<zxz-uni-data-select filterable v-model="member.disability" :localdata="handicapOptions"
placeholder="请选择残疾等级"></zxz-uni-data-select>
</u-form-item>
<u-form-item label="是否就学" required :prop="'members.'+idx+'.isStudy'">
<u-radio-group v-model="member.isStudy">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是"
label-size="36rpx" label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否"
label-size="36rpx" label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="是否就业" required :prop="'members.'+idx+'.isEmploy'">
<u-radio-group v-model="member.isEmploy">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是"
label-size="36rpx" label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否"
label-size="36rpx" label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="就学就业情况" required :prop="'members.'+idx+'.studyEmplouStatus'">
<uni-easyinput type="textarea" v-model="member.studyEmplouStatus"
placeholder="请输入就学就业情况,若无填无" />
</u-form-item>
<u-form-item label="是否党员" required :prop="'members.'+idx+'.isPartyMember'">
<u-radio-group v-model="member.isPartyMember">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是"
label-size="36rpx" label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否"
label-size="36rpx" label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="是否退役军人" required :prop="'members.'+idx+'isSoldier'">
<u-radio-group v-model="member.isSoldier">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是"
label-size="36rpx" label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否"
label-size="36rpx" label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="养老保险等级" :prop="'members.'+idx+'.pensionInsuranceLevel'">
<zxz-uni-data-select filterable v-model="member.pensionInsuranceLevel"
:localdata="insuranceOptions" placeholder="请选择养老保险类型"></zxz-uni-data-select>
</u-form-item>
<u-button type="error" size="mini" @click="removeMember(idx)">移除成员</u-button>
</view>
<u-button type="primary" size="mini" @click="addMember">添加成员</u-button>
</view>
</view>
<!-- 住房饮水安全保障 -->
<view class="card">
<view class="section-title">住房饮水安全保障</view>
<u-form-item label="住房结构" required prop="houseStructure">
<u-input :disabled="form.submitStatus == 1" v-model="form.houseStructure"
placeholder="请输入住房结构,若无填无" />
</u-form-item>
<u-form-item label="住房面积(㎡)" required prop="houseArea">
<u-input :disabled="form.submitStatus == 1" v-model="form.houseArea" type="number"
placeholder="请输入住房面积若无填0" />
</u-form-item>
<u-form-item label="是否危房" required prop="isDangerousHouse">
<u-radio-group v-model="form.isDangerousHouse">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="是否有其他安全住房" required prop="hasOtherSafeHouse">
<u-radio-group v-model="form.hasOtherSafeHouse">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="饮用水水源" required prop="waterSource">
<zxz-uni-data-select filterable v-model="form.waterSource" :localdata="waterOptions"
placeholder="请选择饮用水水源类型"></zxz-uni-data-select>
</u-form-item>
<u-form-item label="户厕改造情况" required prop="toiletStatus">
<zxz-uni-data-select filterable v-model="form.toiletStatus" :localdata="toiletOptions"
placeholder="请选择户厕改造类型"></zxz-uni-data-select>
</u-form-item>
</view>
<!-- 三保障情况 -->
<view class="card">
<view class="section-title">综合保障</view>
<u-form-item label="医疗保险参保人数" required prop="medicalInsuranceNum">
<u-input v-model="form.medicalInsuranceNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<u-form-item label="养老保险参保人数" required prop="pensionInsuranceNum">
<u-input v-model="form.pensionInsuranceNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<!-- <u-form-item label="缴费档次" required prop="insuranceLevel">
<u-input v-model="form.insuranceLevel" placeholder="请输入缴费档次,若无填无" />
</u-form-item> -->
<u-form-item label="享受低保人数" required prop="dibaoNum">
<u-input v-model="form.dibaoNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<u-form-item label="月保障金额" required prop="dibaoAmount">
<u-input v-model="form.dibaoAmount" type="number" placeholder="请输入金额若无填0" />
</u-form-item>
<u-form-item label="特困供养人数" required prop="tekunNum">
<u-input v-model="form.tekunNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<u-form-item label="月保障金额" required prop="tekunAmount">
<u-input v-model="form.tekunAmount" type="number" placeholder="请输入金额若无填0" />
</u-form-item>
<u-form-item label="残疾保障人数" required prop="disabledNum">
<u-input v-model="form.disabledNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<u-form-item label="残疾类型" required prop="disabledType">
<zxz-uni-data-select filterable v-model="form.disabledType" :localdata="handicapAndNoOptions"
placeholder="请选择残疾类型"></zxz-uni-data-select>
</u-form-item>
<u-form-item label="月保障总金额" required prop="disabledAmount">
<u-input v-model="form.disabledAmount" type="number" placeholder="请输入金额若无填0" />
</u-form-item>
<u-form-item label="领取养老金人数" required prop="pensionNum">
<u-input v-model="form.pensionNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<u-form-item label="月领取总金额" required prop="pensionAmount">
<u-input v-model="form.pensionAmount" type="number" placeholder="请输入金额若无填0" />
</u-form-item>
<u-form-item label="是否申请临时救助" required prop="hasAppliedForTemporaryAssistance">
<u-radio-group v-model="form.hasAppliedForTemporaryAssistance">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="家庭医生是否签约" required prop="hasFamilyDoctorContract">
<u-radio-group v-model="form.hasFamilyDoctorContract">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
</view>
<!-- 教育保障 -->
<view class="card">
<view class="section-title">教育保障</view>
<u-form-item label="义务教育学生人数" required prop="eduStudentNum">
<u-input v-model="form.eduStudentNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
<u-form-item label="是否需要送教上门" required prop="needsHomeTeaching">
<u-radio-group v-model="form.needsHomeTeaching">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="大中专学生人数" required prop="collegeStudentNum">
<u-input v-model="form.collegeStudentNum" type="number" placeholder="请输入人数若无填0" />
</u-form-item>
</view>
<!-- 生产生活情况 -->
<view class="card">
<view class="section-title">生产生活情况</view>
<!-- <u-form-item label="产业发展情况" prop="industryStatus">
<uni-easyinput type="textarea" v-model="form.industryStatus" placeholder="请输入产业发展情况" />
</u-form-item> -->
<u-form-item label="是否有耕地" required prop="hasFarmland">
<u-radio-group v-model="form.hasFarmland">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="确权面积(亩)" required prop="landArea">
<u-input v-model="form.landArea" type="number" placeholder="请输入面积若无填0" />
</u-form-item>
<u-form-item label="养殖情况" required prop="breedingStatus">
<uni-easyinput type="textarea" v-model="form.breedingStatus" placeholder="请输入养殖情况,若无填无" />
</u-form-item>
<u-form-item label="个体经营情况" required prop="businessStatus">
<uni-easyinput type="textarea" v-model="form.businessStatus" placeholder="请输入个体经营情况,若无填无" />
</u-form-item>
<u-form-item label="是否需要创业贷款" required prop="needsStartupLoan">
<u-radio-group v-model="form.needsStartupLoan">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="贷款用途" required prop="loanPurpose">
<uni-easyinput type="textarea" v-model="form.loanPurpose" placeholder="请输入贷款用途,若无填无" />
</u-form-item>
<u-form-item label="惠民政策享受情况" prop="beneficialPolicy">
<view class="custom-checkbox-group">
<view v-for="item in beneficialPolicyOptions" :key="item.value"
class="custom-checkbox-item">
<view class="checkbox-icon" @click="togglebeneficialPolicy(item.value)">
<view v-if="form.beneficialPolicy && form.beneficialPolicy.includes(item.value)"
class="checkbox-checked">✓</view>
</view>
<view class="checkbox-label" @click="togglebeneficialPolicy(item.value)">
{{ item.label }}
</view>
</view>
</view>
</u-form-item>
<u-form-item v-if="showOtherBene" label="其他享受政策说明" required prop="otherBene">
<uni-easyinput type="textarea" v-model="form.otherBene" placeholder="请输入其他享受政策,不得为空或无" />
</u-form-item>
</view>
<!-- 监测对象、综合研判、重点关注对象 -->
<view class="card">
<view class="section-title">监测对象、综合研判、重点关注对象</view>
<u-form-item label="是否知道如何申报监测对象" required prop="knowsHowToReportMonitoring">
<u-radio-group v-model="form.knowsHowToReportMonitoring">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="是否纳入监测对象人均纯收入低于9000元或家庭开支较大、突发重大疾病或事故等" required
prop="comprehensiveJudgment">
<u-radio-group v-model="form.comprehensiveJudgment">
<view class="option-list-row">
<u-radio labelSize="26" size="36" shape="square" name="是" label="是" label-size="36rpx"
label-color="#222" class="option-item" />
<u-radio labelSize="26" size="36" shape="square" name="否" label="否" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="是否八必访重点关注对象" prop="keyAttention">
<view class="custom-checkbox-group">
<view v-for="item in keyAttentionOptions" :key="item.value" class="custom-checkbox-item">
<view class="checkbox-icon" @click="toggleKeyAttention(item.value)">
<view v-if="form.keyAttention && form.keyAttention.includes(item.value)"
class="checkbox-checked">✓</view>
</view>
<view class="checkbox-label" @click="toggleKeyAttention(item.value)">
{{ item.label }}
</view>
</view>
</view>
</u-form-item>
<!-- <u-form-item label="综合研判" prop="comprehensiveJudgment">
<u-input v-model="form.comprehensiveJudgment" type="textarea" placeholder="请输入综合研判内容" />
</u-form-item> -->
<!-- <u-form-item label="是否八必访重点关注对象" prop="keyAttention">
</u-form-item> -->
</view>
<!-- 培训、就业、诉求、建议 -->
<view class="card">
<view class="section-header">
<view class="section-title">培训、就业、诉求、建议</view>
<view v-if="form.id" class="history-link" @click="viewHistory('need',form.id)">查看历史信息</view>
</view>
<u-form-item label="培训需求" required prop="trainingNeed">
<uni-easyinput v-model="form.trainingNeed" type="textarea" placeholder="请输入培训需求,若无填无" />
</u-form-item>
<u-form-item label="就业需求" required prop="jobNeed">
<uni-easyinput v-model="form.jobNeed" type="textarea" placeholder="请输入就业需求,若无填无" />
</u-form-item>
<u-form-item label="其他诉求" required prop="otherNeed">
<uni-easyinput v-model="form.otherNeed" type="textarea" placeholder="请输入其他诉求,若无填无" />
</u-form-item>
<u-form-item label="意见建议" required prop="suggestion">
<uni-easyinput v-model="form.suggestion" type="textarea" placeholder="请输入意见建议,若无填无" />
</u-form-item>
</view>
<!-- 满意度 -->
<view class="card">
<view class="section-header">
<view class="section-title">满意度</view>
<view v-if="form.id" class="history-link" @click="viewHistory('satisfaction',form.id)">查看历史信息
</view>
</view>
<u-form-item label="对村两委满意度" required prop="villageSatisfaction">
<u-radio-group v-model="form.villageSatisfaction">
<view class="option-list-col">
<u-radio labelSize="26" size="36" shape="square" v-for="item in satisfactionOptions"
:key="item.value" :name="item.value" :label="item.label" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
<u-form-item label="对驻村工作队满意度" required prop="workTeamSatisfaction">
<u-radio-group v-model="form.workTeamSatisfaction">
<view class="option-list-col">
<u-radio labelSize="26" size="36" shape="square" v-for="item in satisfactionOptions"
:key="item.value" :name="item.value" :label="item.label" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
</view>
<!-- 签字 -->
<view class="card">
<view class="section-header">
<view class="section-title">签字</view>
<view v-if="form.id" class="history-link" @click="viewHistory('sign',form.id)">查看历史信息</view>
</view>
<u-form-item label="入户员签字" required prop="signatureImg">
<view>
<image v-if="form.signatureImg" :src="form.signatureImg" @click="viewSignature('staff')"
style="width: 200rpx; height: 80rpx; border: 1px solid #ddd; border-radius: 4rpx;" />
<u-button v-if="!form.signatureImg" @click="sign('staff')">点击此处进行签字</u-button>
<u-button v-else @click="sign('staff')">重新签名</u-button>
</view>
</u-form-item>
<u-form-item label="户主签字" required prop="holderSignatureImg">
<view>
<image v-if="form.holderSignatureImg" :src="form.holderSignatureImg"
@click="viewSignature('holder')"
style="width: 200rpx; height: 80rpx; border: 1px solid #ddd; border-radius: 4rpx;" />
<u-button v-if="!form.holderSignatureImg" @click="sign('holder')">点击此处进行签字</u-button>
<u-button v-else @click="sign('holder')">重新签名</u-button>
</view>
</u-form-item>
<u-form-item label="入户方式" required prop="hukouType">
<u-radio-group v-model="form.recordMethod">
<view class="option-list-col">
<u-radio labelSize="26" size="36" shape="square" v-for="item in recordMethodOptions"
:key="item.value" :name="item.value" :label="item.label" label-size="36rpx"
label-color="#222" class="option-item" />
</view>
</u-radio-group>
</u-form-item>
</view>
<!-- 提交与导出 -->
<view class="btn-row">
<view class="button-row">
<u-button v-if="editId" type="error" class="btn-main btn-left"
@click="deleteMsg()">删除</u-button>
<u-button type="success" class="btn-main btn-left" @click="saveDraft">暂存</u-button>
<u-button type="primary" class="btn-main btn-right" @click="submitForm">提交</u-button>
</view>
<!-- <u-button type="success" class="btn-main" @click="exportExcel">导出Excel</u-button> -->
</view>
</u-form>
</view>
<FullScreenSignature v-if="showSign" :signatureImg="form.holderSignatureImg" @save="onSignatureSave" />
<!-- 帮扶信息日期选择器 -->
<u-calendar v-model="showHelpCalendar" :min-date="helpMinDate" :max-date="helpMaxDate"
@confirm="onHelpDateConfirm"></u-calendar>
</view>
</template>
<script>
// 建议后续引入 xlsx.js 实现前端导出
import FullScreenSignature from '../../components/FullScreenSignature.vue';
import {
householdApi,
areaApi,
systemApi,
memberApi
} from '../../utils/api';
import {
v4 as uuidv4
} from 'uuid';
import {
config
} from '../../utils/config.js';
import userUtil from '../../utils/UserUtil';
export default {
components: {
FullScreenSignature
},
data() {
return {
showRiskMitigation: false,
showArea: false,
showHelp: false,
id: '',
action: '',
inputType: 'textarea',
showSign: false,
holderShowSign: false,
showOtherBene: false,
userInfo: {},
penColor: 'red',
showSign: false,
penSize: 5,
openSmooth: true,
isEdit: false,
editId: null,
form: {
id: '',
householderName: '',
householderIdNumber: '',
householdNum: '',
residentNum: '',
riskMitigation: '',
householderPhone: '',
laborNum: '',
workNum: '',
noLaborNum: '',
town: '',
village: '',
groupName: '',
area: [],
doorNumber: '',
householdType: [], // 多选
hukouType: '', // 单选,实际只保留一个
// 8个单选字段直接使用字符串
isDangerousHouse: '',
hasOtherSafeHouse: '',
hasAppliedForTemporaryAssistance: '',
hasFamilyDoctorContract: '',
needsHomeTeaching: '',
hasFarmland: '',
waterSource: '',
toiletStatus: '',
needsStartupLoan: '',
knowsHowToReportMonitoring: '',
populationType: [], // 多选
members: [{
name: '',
idNumber: '',
phone: '',
relation: '',
health: '',
job: ''
}],
houseStructure: '',
houseArea: '',
signatureImg: '', // 签名图片
holderSignatureImg: '',
// 三保障情况
medicalInsuranceNum: '',
pensionInsuranceNum: '',
insuranceLevel: '',
dibaoNum: '',
dibaoAmount: '',
tekunNum: '',
tekunAmount: '',
disabledNum: '',
disabledType: '',
disabledAmount: '',
pensionNum: '',
pensionAmount: '',
isTempHelp: '',
hasFamilyDoctor: '',
// 教育保障
eduStudentNum: '',
collegeStudentNum: '',
// 生产生活情况
industryStatus: '',
landArea: '',
breedingStatus: '',
businessStatus: '',
loanPurpose: '',
beneficialPolicy: [],
otherBene: '',
// 监测对象、综合研判、重点关注对象
comprehensiveJudgment: '',
keyAttention: [],
// 培训、就业、诉求、建议
trainingNeed: '',
jobNeed: '',
otherNeed: '',
suggestion: '',
// 满意度
villageSatisfaction: '',
workTeamSatisfaction: '',
recordMethod: '',
// 签字
signer: '',
areaObj: [],
// 帮扶信息
helpUnit: '',
helperName: '',
helperPhone: '',
helpRecordTime: '',
},
helpFiles: [],
showCalendar: false,
minDate: '1950-01-01',
maxDate: '2100-12-31',
showHelpCalendar: false,
helpMinDate: '1950-01-01',
helpMaxDate: '2100-12-31',
householdTypeOptions: [],
townVillageGroup: [],
hukouTypeOptions: [],
keyAttentionOptions: [],
satisfactionOptions: [],
recordMethodOptions: [],
helpUnitOptions: [],
waterOptions: [],
insuranceOptions: [],
toiletOptions: [],
healthOptions: [],
handicapOptions: [],
handicapAndNoOptions: [],
beneficialPolicyOptions: [],
noMultiple: '',
queryDictTypeDO: {
dictTypeList: ['biz_household_type', 'biz_hukou_type', 'biz_key_attention', 'biz_record_type',
'biz_satisfaction', 'biz_help_unit', 'biz_water_type',
'biz_insurance_type',
'biz_toilet_type',
'biz_health_type',
'biz_handicap_type',
'beneficial_policy_type'
].join(','),
}
}
},
async onLoad(options) {
await this.initData()
this.loadUserInfo()
if (options.id) {
this.editId = options.id
this.isEdit = true
this.loadHouseholdData(options.id)
} else {
this.loadDraftData()
}
},
computed: {
// 控制帮扶信息显示
showHelpInfo() {
return this.form.householdType && this.form.householdType.some(type =>
type === '监测户' || type === '脱贫户'
);
}
},
methods: {
changeHelpUnit(e) {
console.log(e)
},
viewHistory(type, item) {
uni.navigateTo({
url: `/packageForm/pages/historyMessage?id=${item}&type=${type}`
})
},
async initData() {
await this.listAreaNode();
var dictType = await systemApi.getDictType(this.queryDictTypeDO);
this.handicapAndNoOptions.push({
text: '无',
value: '99'
})
dictType.forEach(item => {
if (item.dictType == 'biz_household_type') {
if (item.isMultiple && item.isMultiple == 1) {
this.noMultiple = this.noMultiple + item.value + ','
}
this.householdTypeOptions.push(item)
} else if (item.dictType == 'biz_hukou_type') {
this.hukouTypeOptions.push(item)
} else if (item.dictType == 'biz_key_attention') {
this.keyAttentionOptions.push(item)
} else if (item.dictType == 'biz_satisfaction') {
this.satisfactionOptions.push(item)
} else if (item.dictType == 'biz_record_type') {
this.recordMethodOptions.push(item)
} else if (item.dictType == 'biz_help_unit') {
this.helpUnitOptions.push({
text: item.label,
value: item.value
})
} else if (item.dictType == 'biz_water_type') {
this.waterOptions.push({
text: item.label,
value: item.value
})
} else if (item.dictType == 'biz_insurance_type') {
this.insuranceOptions.push({
text: item.label,
value: item.value
})
} else if (item.dictType == 'biz_toilet_type') {
this.toiletOptions.push({
text: item.label,
value: item.value
})
} else if (item.dictType == 'biz_health_type') {
this.healthOptions.push(item)
} else if (item.dictType == 'biz_handicap_type') {
this.handicapOptions.push({
text: item.label,
value: item.value
})
this.handicapAndNoOptions.push({
text: item.label,
value: item.value
})
} else if (item.dictType == 'beneficial_policy_type') {
this.beneficialPolicyOptions.push(item)
}
})
},
async listAreaNode() {
var areaDate = await areaApi.getAreaList();
this.townVillageGroup = this.transformTree(areaDate);
},
transformTree(nodes) {
return nodes.map(node => {
// 创建基础对象只包含label和value
const newNode = {
"label": node.name,
"value": node.name
};
// 如果存在非空children则递归处理
if (node.children && node.children.length > 0) {
newNode.children = this.transformTree(node.children);
}
return newNode;
});
},
sign(type) {
if (type == 'staff') {
uni.navigateTo({
url: '/packageForm/pages/FullScreenSignature?signatureType=' + type + '&signatureImg=' +
encodeURIComponent(this.form.signatureImg),
events: {
signatureSaved: (data) => {
if (data.img != 'return') {
this.form.signatureImg = data.img;
}
},
}
});
} else if (type == 'holder') {
uni.navigateTo({
url: '/packageForm/pages/FullScreenSignature?signatureType=' + type + '&signatureImg=' +
encodeURIComponent(this.form.holderSignatureImg),
events: {
signatureHoulderSaved: (data) => {
if (data.img != 'return') {
this.form.holderSignatureImg = data.img;
}
},
}
});
}
},
onSignatureSave(img) {
if (img == 'return') {
this.showSign = false;
} else {
this.form.signatureImg = img;
this.showSign = false;
}
},
loadUserInfo() {
const userInfo = uni.getStorageSync('userInfo')
if (userInfo) {
this.userInfo = userInfo
} else {
uni.reLaunch({
url: '/packageUser/pages/login'
})
}
},
async loadHouseholdData(id) {
try {
const token = uni.getStorageSync('token')
var response = await householdApi.getHouseholdDetail(id);
if (response) {
this.fillFormData(response)
}
} catch (error) {
uni.showToast({
title: '加载数据失败',
icon: 'none'
})
}
},
async loadDraftData() {
try {
var userInfo = userUtil.getLoginInfo();
const response = await householdApi.getDraft(userInfo.userId);
if (response) {
this.fillFormData(response)
uni.showToast({
title: '已加载暂存数据',
icon: 'success'
})
} else {
this.form.members = []
}
} catch (error) {
if (!error.data.data) {
this.form.members = []
}
}
},
fillFormData(data) {
this.form.id = data.id || ''
// 基本信息
this.form.householderName = data.householderName || ''
this.form.householderIdNumber = data.householderIdNumber || ''
this.form.householdNum = data.householdNum || ''
this.form.residentNum = data.residentNum || ''
this.form.householderPhone = data.householderPhone || ''
this.form.laborNum = data.laborNum || ''
this.form.doorNumber = data.doorNumber || ''
this.form.workNum = data.workNum || ''
this.form.noLaborNum = data.noLaborNum || ''
this.form.town = data.town || ''
this.form.waterSource = data.waterSource || ''
this.form.toiletStatus = data.toiletStatus || ''
this.form.village = data.village || ''
this.form.groupName = data.groupName || ''
if (data.town) {
this.showArea = true;
if (data.town) {
for (var i = 0; i < this.townVillageGroup.length; i++) {
var t = this.townVillageGroup[i];
if (t.value == data.town) {
this.form.areaObj.push(t);
for (var j = 0; j < t.children.length; j++) {
var v = t.children[j];
if (v.value == data.village) {
this.form.areaObj.push(v)
var msg = false;
for (var k = 0; k < v.children.length; k++) {
var g = v.children[k];
if (g.value == data.groupName) {
msg = true;
this.form.areaObj.push({
label: g.value,
value: g.value
})
break;
}
}
if (!msg) {
uni.showToast({
title: "区域缺失组/网格,请确认!",
icon: "exception"
})
}
}
}
}
}
}
}
// 户属性
if (data.householdType) {
try {
this.form.householdType = JSON.parse(data.householdType)
if(this.form.householdType && this.form.householdType.length > 0){
for(var i = 0 ; i < this.form.householdType.length ; i++){
var item = this.form.householdType[i];
console.log(item)
if (item == '监测户' || item == '脱贫户') {
this.showHelp = true;
}
if (item == '监测户') {
this.showRiskMitigation = true;
}
}
}
} catch (e) {
this.form.householdType = []
}
}
this.form.hukouType = data.hukouType || ''
this.form.riskMitigation = data.riskMitigation || ''
if (this.form.riskMitigation) {
this.showRiskMitigation = true;
}
// 8个单选字段
this.form.isDangerousHouse = data.isDangerousHouse || ''
this.form.hasOtherSafeHouse = data.hasOtherSafeHouse || ''
this.form.hasAppliedForTemporaryAssistance = data.hasAppliedForTemporaryAssistance || ''
this.form.hasFamilyDoctorContract = data.hasFamilyDoctorContract || ''
this.form.needsHomeTeaching = data.needsHomeTeaching || ''
this.form.hasFarmland = data.hasFarmland || ''
this.form.needsStartupLoan = data.needsStartupLoan || ''
this.form.knowsHowToReportMonitoring = data.knowsHowToReportMonitoring || ''
if (data.populationType) {
try {
this.form.populationType = JSON.parse(data.populationType)
} catch (e) {
this.form.populationType = []
}
}
// 住房情况
this.form.houseStructure = data.houseStructure || ''
this.form.houseArea = data.houseArea || ''
// 三保障情况
this.form.medicalInsuranceNum = data.medicalInsuranceNum || ''
this.form.pensionInsuranceNum = data.pensionInsuranceNum || ''
// this.form.insuranceLevel = data.insuranceLevel || ''
this.form.dibaoNum = data.dibaoNum || ''
this.form.dibaoAmount = data.dibaoAmount || ''
this.form.tekunNum = data.tekunNum || ''
this.form.tekunAmount = data.tekunAmount || ''
this.form.disabledNum = data.disabledNum || ''
this.form.disabledType = data.disabledType || ''
this.form.disabledAmount = data.disabledAmount || ''
this.form.pensionNum = data.pensionNum || ''
this.form.pensionAmount = data.pensionAmount || ''
// 教育保障
this.form.eduStudentNum = data.eduStudentNum || ''
this.form.collegeStudentNum = data.collegeStudentNum || ''
// 生产生活情况
this.form.industryStatus = data.industryStatus || ''
this.form.landArea = data.landArea || ''
this.form.breedingStatus = data.breedingStatus || ''
this.form.businessStatus = data.businessStatus || ''
this.form.loanPurpose = data.loanPurpose || ''
// 监测对象、综合研判、重点关注对象
this.form.comprehensiveJudgment = data.comprehensiveJudgment || ''
if (data.keyAttention) {
try {
this.form.keyAttention = JSON.parse(data.keyAttention)
} catch (e) {
this.form.keyAttention = []
}
} else {
this.form.keyAttention = []
}
if (data.beneficialPolicy) {
try {
this.form.beneficialPolicy = JSON.parse(data.beneficialPolicy)
if (this.form.beneficialPolicy.length > 0) {
for (var i = 0; i < this.form.beneficialPolicy.length; i++) {
var item = this.form.beneficialPolicy[i];
if (item.includes('13丨')) {
console.log('gg')
var iii = item.split('丨');
this.form.otherBene = iii[1];
this.form.beneficialPolicy[i] = iii[0];
this.showOtherBene = true;
break;
}
}
}
} catch (e) {
this.form.beneficialPolicy = []
}
} else {
this.form.beneficialPolicy = []
}
// 培训、就业、诉求、建议
this.form.trainingNeed = data.trainingNeed || ''
this.form.jobNeed = data.jobNeed || ''
this.form.otherNeed = data.otherNeed || ''
this.form.suggestion = data.suggestion || ''
this.form.recordMethod = data.recordMethod !== null && data.recordMethod !==
undefined ? data.recordMethod + '' : ''
// 满意度
this.form.villageSatisfaction = data.villageSatisfaction !== null && data.villageSatisfaction !==
undefined ? data.villageSatisfaction + '' : ''
this.form.workTeamSatisfaction = data.workTeamSatisfaction !== null && data.workTeamSatisfaction !==
undefined ? data.workTeamSatisfaction + '' : ''
// 签名
this.form.signatureImg = data.signatureImg || ''
this.form.holderSignatureImg = data.holderSignatureImg || ''
this.form.submitStatus = data.submitStatus || '0'
// 帮扶信息
this.form.helpUnit = data.helpUnit || ''
this.form.helperName = data.helperName || ''
this.form.helperPhone = data.helperPhone || ''
this.form.helpRecordTime = data.helpRecordTime || ''
// 家庭成员
if (data.members) {
this.form.members = data.members.map(member => ({
id: member.id || '',
name: member.name || '',
idNumber: member.idNumber || '',
phone: member.phone || '',
relation: member.relation || '',
health: member.health.split(',').map(item => item.trim()) || '',
studyEmplouStatus: member.studyEmplouStatus || '',
isStudy: member.isStudy || '',
isEmploy: member.isEmploy || '',
isPartyMember: member.isPartyMember || '',
isSoldier: member.isSoldier || '',
pensionInsuranceLevel: member.pensionInsuranceLevel || '',
remark: member.remark || '',
disability: member.disability || '',
showDisability: member.showDisability || false,
}))
//this.form.members = data.members
} else {
this.form.members = []
}
if (data.helpFiles) {
this.helpFiles = data.helpFiles.map(helpFiles => ({
id: helpFiles.id,
status: data.submitStatus + '' || '0',
base64: helpFiles.manualPhoto,
fileName: helpFiles.manualPhotoName,
deleteFlag: helpFiles.deleteFlag,
groupId: helpFiles.groupId,
}))
this.showHelp = true;
}
},
addMember() {
this.form.members.push({
name: '',
idNumber: '',
phone: '',
relation: '',
health: [],
studyEmplouStatus: '',
isStudy: '',
isEmploy: '',
isPartyMember: '',
isSoldier: '',
pensionInsuranceLevel: '',
disability: '',
showDisability: false,
})
},
async removeMember(idx) {
if (this.form.members[idx].id) {
await memberApi.deleteMember(this.form.members[idx].id);
}
this.form.members.splice(idx, 1)
},
validateId(id, idx) {
const reg = /^(\d{15}|\d{17}[\dXx])$/
if (id && !reg.test(id)) {
uni.showToast({
title: idx === -1 ? '户主身份证号格式有误' : `${idx+1}位成员身份证号格式有误`,
icon: 'none',
duration: 3000,
})
}
},
validatePhone(phone, idx) {
const reg = /^1[3-9]\d{9}$/
if (phone && !reg.test(phone)) {
uni.showToast({
title: idx === -1 ? '户主手机号格式有误' : `${idx+1}位成员手机号格式有误`,
icon: 'none',
duration: 3000,
})
}
},
// 限制checkbox-group为单选仅用于居住属性
onSingleCheckboxChange(field) {
// 确保单选:只保留当前选中的值
if (Array.isArray(this.form[field])) {
// 获取最后选择的那个选项
const lastSelected = this.form[field][this.form[field].length - 1];
// 立即清空数组,只保留当前选中的
this.form[field] = lastSelected ? [lastSelected] : [];
// 同步到对应的字符串字段用于提交(仅居住属性)
if (field === 'hukouType') {
this.form.hukouType = this.form[field][0] || '';
}
}
},
// 互斥单选:只保留最后一个选项
onSingleStringCheckboxChange(field) {
if (Array.isArray(this.form[field])) {
if (this.form[field].length > 1) {
this.form[field] = this.form[field][this.form[field].length - 1];
} else if (this.form[field].length === 1) {
this.form[field] = this.form[field][0];
} else {
this.form[field] = '';
}
}
},
clearSignature() {
this.$refs.limeSign.clear();
this.form.signatureImg = '';
},
// lime-signature官方推荐@confirm事件获取base64
onSignatureConfirm(e) {
this.form.signatureImg = e;
this.showSign = false;
uni.showToast({
title: '签名已保存',
icon: 'success'
});
},
openSignatureDialog(type) {
if (type === 'staff') {
this.showSign = true;
// 如果已有签名,提示用户
if (this.form.signatureImg) {
setTimeout(() => {
uni.showToast({
title: '已有签名,如需修改请重新签名',
icon: 'none',
duration: 2000
});
}, 500);
}
} else if (type === 'holder') {
this.holderShowSign = true;
// 如果已有签名,提示用户
if (this.form.holderSignatureImg) {
setTimeout(() => {
uni.showToast({
title: '已有签名,如需修改请重新签名',
icon: 'none',
duration: 2000
});
}, 500);
}
}
},
viewSignature(type) {
let signatureImg = '';
if (type == 'staff') {
signatureImg = this.form.signatureImg;
} else {
signatureImg = this.form.holderSignatureImg;
}
this.showSign = false;
if (signatureImg) {
// 预览签名图片
uni.previewImage({
urls: [signatureImg],
current: 0
});
}
},
toggleKeyAttention(value) {
const index = this.form.keyAttention.indexOf(value);
if (index > -1) {
this.form.keyAttention.splice(index, 1);
} else {
this.form.keyAttention.push(value);
}
},
toggleHealth(value, member) {
console.log(member)
const healthOptions = member.health;
const isHealth = value === '健康';
const hasHealth = healthOptions.includes('健康');
const hasOtherOptions = healthOptions.some(opt => opt !== '健康');
if (!healthOptions.includes(value)) {
if (isHealth && hasOtherOptions) {
uni.showToast({
title: '健康不允许与其他选项同时选择',
icon: "none",
})
return;
}
if (!isHealth && hasHealth) {
uni.showToast({
title: '健康不允许与其他选项同时选择',
icon: "none",
})
// alert('健康不允许与其他选项同时选择');
return;
}
}
const index = member.health.indexOf(value);
if (index > -1) {
if (value == '残疾') {
member.showDisability = false;
member.disability = '';
}
member.health.splice(index, 1);
} else {
if (value == '残疾') {
member.showDisability = true;
member.disability = ''
}
member.health.push(value);
}
},
togglebeneficialPolicy(value) {
const index = this.form.beneficialPolicy.indexOf(value);
if (index > -1) {
if (value == '13') {
this.showOtherBene = false;
this.otherBene = '';
}
this.form.beneficialPolicy.splice(index, 1);
} else {
if (value == '13') {
this.showOtherBene = true;
this.otherBene = '';
}
this.form.beneficialPolicy.push(value);
}
},
toggleHouseholdType(item) {
console.log(this.form.householdType)
if (!this.form.householdType) {
if (item.value == '监测户' || item.value == '脱贫户') {
this.showHelp = true;
}
if (item.value == '监测户') {
this.showRiskMitigation = true;
}
this.form.householdType.push(item.value);
} else {
const index = this.form.householdType.indexOf(item.value);
if (index > -1) {
if (item.value == '监测户' || item.value == '脱贫户') {
this.showHelp = false;
}
if (item.value == '监测户') {
this.showRiskMitigation = false;
}
this.form.householdType.splice(index, 1);
} else {
if (item.value == '监测户' || item.value == '脱贫户') {
this.showHelp = true;
}
if (item.value == '监测户') {
this.showRiskMitigation = true;
}
//看有没有不允许多选的,如果有就提示错误
if (item.isMultiple == 1) {
var isMultiple = false;
var isMultiple1 = false;
console.log(this.form.householdType)
if (this.noMultiple.includes(item.value)) {
isMultiple = true;
}
for (var i = 0; i < this.form.householdType.length; i++) {
var item1 = this.form.householdType[i];
if (item1 != item.value) {
if (this.noMultiple.includes(item1)) {
isMultiple1 = true;
break;
}
}
}
if (isMultiple && isMultiple1) {
uni.showToast({
title: this.noMultiple + "不允许多选!",
duration: 3000,
icon: "none",
})
return;
}
}
this.form.householdType.push(item.value);
}
}
},
onClick(type) {
if (type == 'openSmooth') {
this.openSmooth = !this.openSmooth
return
}
if (type == 'save') {
this.$refs.signatureRef.canvasToTempFilePath({
success: (res) => {
// 检查是否为空
if (res.isEmpty) {
uni.showToast({
title: "请先签字",
duration: 3000,
icon: "none",
});
return;
}
// 获取图片路径
const url = res.tempFilePath;
// 检查是否为base64格式
if (url && url.startsWith('data:image/')) {
// 直接使用base64数据
this.form.signatureImg = url;
} else {
// 如果是文件路径需要转换为base64
this.convertToBase64(0, url);
return;
}
// 关闭签名弹窗
this.showSign = false;
// 显示成功提示
uni.showToast({
title: '签名已保存',
duration: 3000,
icon: 'success'
});
},
fail: (err) => {
uni.showToast({
title: '生成签名图片失败',
duration: 3000,
icon: 'none'
});
}
})
return
}
if (this.$refs.signatureRef)
this.$refs.signatureRef[type]()
},
onHolderSignatureSave(img) {
this.form.holderSignatureImg = img;
this.holderShowSign = false;
uni.showToast({
title: '签名已保存',
duration: 3000,
icon: 'success'
});
},
convertToBase64(type, filePath) {
const fs = uni.getFileSystemManager();
fs.readFile({
filePath: filePath,
encoding: "base64", // 指定编码为base64
success: (res) => {
// 构造data URL
const base64String = `data:image/png;base64,${res.data}`;
if (type === 0) {
// 保存到表单
this.form.signatureImg = base64String;
// 关闭签名弹窗
this.showSign = false;
} else {
this.form.holderSignatureImg = base64String;
this.holderShowSign = false;
}
// 显示成功提示
uni.showToast({
title: '签名已保存',
icon: 'success',
duration: 3000,
});
},
fail: (err) => {
uni.showToast({
title: '转换签名图片失败',
duration: 3000,
icon: 'none'
});
},
});
},
onAreaChange(val) {
this.form.town = val.town || '';
this.form.village = val.village || '';
this.form.groupName = val.groupName || '';
},
async deleteMsg() {
try {
var userInfo = userUtil.getUserInfo();
const response = await householdApi.deleteHousehold(this.editId, userInfo.username);
if (response && response.data) {
var msg = '删除失败';
if (response.data.msg) {
msg = response.data.msg;
}
console.log(response.data)
uni.showToast({
title: msg,
icon: 'none',
duration: 2000
})
return
} else if (response == true) {
uni.showToast({
title: '删除成功',
duration: 3000,
icon: 'success'
})
// 返回主页并刷新数据
setTimeout(() => {
// 通过事件总线通知主页刷新数据
uni.$emit('refreshStats')
// 返回主页
uni.reLaunch({
url: '/pages/index/index'
})
}, 1500)
} else {
uni.showToast({
title: '删除失败',
duration: 3000,
icon: 'success'
})
}
} catch (error) {
uni.showToast({
title: error.data.msg,
duration: 3000,
icon: 'none'
})
}
},
async submitForm() {
// 保证keyAttention为数组
if (!Array.isArray(this.form.keyAttention)) {
this.form.keyAttention = [];
}
if (!this.showHelp) {
this.form.helpUnit = '';
this.form.helperPhone = '';
this.form.helpRecordTime = '';
this.form.helpFiles = []
}
// 完整的表单验证
const validationErrors = [];
// 基本信息验证
if (!this.form.areaObj || this.form.areaObj.length === 0) {
validationErrors.push('请选择所属区域');
} else {
if (!this.form.areaObj[2]) {
validationErrors.push('区域缺失组/网格,请确认!');
}
}
if (!this.form.doorNumber) {
validationErrors.push('请输入门牌号');
}
if (!this.form.householdType || this.form.householdType.length === 0) {
validationErrors.push('请选择家庭属性');
} else {
for (var i = 0; i < this.form.householdType.length; i++) {
if (this.form.householdType[i] == '监测户') {
if (this.form.riskMitigation == '') {
validationErrors.push('监测户需填写是否消除风险!');
}
}
}
}
if (!this.form.hukouType) {
validationErrors.push('请选择居住属性');
}
if (!this.form.householderName) {
validationErrors.push('请输入户主姓名');
}
if (!this.form.householderIdNumber) {
validationErrors.push('请输入身份证号');
} else {
// 验证户主身份证号格式
const idReg = /^(\d{15}|\d{17}[\dXx])$/;
if (!idReg.test(this.form.householderIdNumber)) {
validationErrors.push('户主身份证号格式不正确');
}
}
if (!this.form.householdNum) {
validationErrors.push('请输入户籍人数');
}
if (!this.form.residentNum) {
validationErrors.push('请输入常住人数');
}
if (!this.form.householderPhone) {
validationErrors.push('请输入联系电话');
} else {
if (this.form.householderPhone == '无') {
} else {
// 验证户主手机号格式
const phoneReg = /^1[3-9]\d{9}$/;
if (!phoneReg.test(this.form.householderPhone)) {
validationErrors.push('户主手机号格式不正确');
}
}
}
if (!this.form.laborNum) {
validationErrors.push('请输入劳动力人数');
}
if (!this.form.workNum) {
validationErrors.push('请输入务工人数');
}
if (!this.form.noLaborNum) {
validationErrors.push('请输入丧失或无劳动力人数');
}
// 家庭成员验证
if (this.form.members && this.form.members.length > 0) {
this.form.members.forEach((member, index) => {
if (!member.name) {
validationErrors.push(`${index + 1}位成员姓名不能为空,若无成员请删除移除第一条数据后重新条`);
}
if (!member.relation) {
validationErrors.push(`${index + 1}位成员与户主关系不能为空,若无成员请删除移除第一条数据后重新条`);
}
if (!member.idNumber) {
validationErrors.push(`${index + 1}位成员身份证号不能为空,若无成员请删除移除第一条数据后重新条`);
} else {
// 验证成员身份证号格式
const idReg = /^(\d{15}|\d{17}[\dXx])$/;
if (!idReg.test(member.idNumber)) {
validationErrors.push(`${index + 1}位成员身份证号格式不正确,若无成员请删除移除第一条数据后重新条`);
}
}
// if (!member.phone) {
// validationErrors.push(`第${index + 1}位成员联系电话不能为空`);
// } else {
// // 验证成员手机号格式
// const phoneReg = /^1[3-9]\d{9}$/;
// if (!phoneReg.test(member.phone)) {
// validationErrors.push(`第${index + 1}位成员手机号格式不正确`);
// }
// }
if (!member.health) {
validationErrors.push(`${index + 1}位成员健康状况不能为空,若无成员请删除移除第一条数据后重新条`);
} else {
if (member.health.includes('残疾')) {
if (member.disability == '') {
validationErrors.push(`${index + 1}位成员残疾等级未选择,若无成员请删除移除第一条数据后重新条`);
}
}
}
if (!member.isStudy) {
validationErrors.push(`${index + 1}位成员就学情况不能为空,若无成员请删除移除第一条数据后重新条`);
}
if (!member.isEmploy) {
validationErrors.push(`${index + 1}位成员就业情况不能为空,若无成员请删除移除第一条数据后重新条`);
}
if (!member.studyEmplouStatus) {
validationErrors.push(`${index + 1}位成员就学就业情况不能为空,若无成员请删除移除第一条数据后重新条`);
}
if (!member.isPartyMember) {
validationErrors.push(`${index + 1}位成员是否党员不能为空,若无成员请删除移除第一条数据后重新条`);
}
if (!member.isSoldier) {
validationErrors.push(`${index + 1}位成员是否退役军人不能为空,若无成员请删除移除第一条数据后重新条`);
}
});
}
// 住房饮水安全保障验证
if (!this.form.houseStructure) {
validationErrors.push('请输入住房结构');
}
if (!this.form.houseArea) {
validationErrors.push('请输入住房面积');
}
if (!this.form.isDangerousHouse) {
validationErrors.push('请选择是否危房');
}
if (!this.form.hasOtherSafeHouse) {
validationErrors.push('请选择是否有其他安全住房');
}
if (!this.form.waterSource) {
validationErrors.push('请输入饮用水水源');
}
if (!this.form.toiletStatus) {
validationErrors.push('请输入户厕改造情况');
}
// 综合保障验证
if (!this.form.medicalInsuranceNum) {
validationErrors.push('请输入医疗保险参保人数');
}
if (!this.form.pensionInsuranceNum) {
validationErrors.push('请输入养老保险参保人数');
}
// if (!this.form.insuranceLevel) {
// validationErrors.push('请输入缴费档次');
// }
if (!this.form.dibaoNum) {
validationErrors.push('请输入享受低保人数');
}
if (!this.form.dibaoAmount) {
validationErrors.push('请输入月保障金额');
}
if (!this.form.tekunNum) {
validationErrors.push('请输入特困供养人数');
}
if (!this.form.tekunAmount) {
validationErrors.push('请输入特困月保障金额');
}
if (!this.form.disabledNum) {
validationErrors.push('请输入残疾保障人数');
}
if (!this.form.disabledType) {
validationErrors.push('请输入残疾类型');
}
if (!this.form.disabledAmount) {
validationErrors.push('请输入残疾月保障金额');
}
if (!this.form.pensionNum) {
validationErrors.push('请输入领取养老金人数');
}
if (!this.form.pensionAmount) {
validationErrors.push('请输入月领取金额');
}
if (!this.form.hasAppliedForTemporaryAssistance) {
validationErrors.push('请选择是否申请临时救助');
}
if (!this.form.hasFamilyDoctorContract) {
validationErrors.push('请选择家庭医生是否签约');
}
// 教育保障验证
if (!this.form.eduStudentNum) {
validationErrors.push('请输入义务教育学生人数');
}
if (!this.form.needsHomeTeaching) {
validationErrors.push('请选择是否需要送教上门');
}
if (!this.form.collegeStudentNum) {
validationErrors.push('请输入大中专学生人数');
}
// 生产生活情况验证
if (!this.form.hasFarmland) {
validationErrors.push('请选择是否有耕地');
}
if (!this.form.landArea) {
validationErrors.push('请输入确权面积');
}
if (!this.form.breedingStatus) {
validationErrors.push('请输入养殖情况');
}
if (!this.form.businessStatus) {
validationErrors.push('请输入个体经营情况');
}
if (!this.form.needsStartupLoan) {
validationErrors.push('请选择是否需要创业贷款');
}
if (!this.form.loanPurpose) {
validationErrors.push('请输入贷款用途');
}
// 监测对象验证
if (!this.form.knowsHowToReportMonitoring) {
validationErrors.push('请选择是否知道如何申报监测对象');
}
if (!this.form.comprehensiveJudgment) {
validationErrors.push('请选择是否纳入监测对象');
}
// if (!this.form.keyAttention || this.form.keyAttention.length === 0) {
// validationErrors.push('请选择是否八必访重点关注对象');
// }
// 培训就业验证
if (!this.form.trainingNeed) {
validationErrors.push('请输入培训需求');
}
if (!this.form.jobNeed) {
validationErrors.push('请输入就业需求');
}
if (!this.form.otherNeed) {
validationErrors.push('请输入其他诉求');
}
if (!this.form.suggestion) {
validationErrors.push('请输入意见建议');
}
// 满意度验证
if (this.form.villageSatisfaction === '') {
validationErrors.push('请选择对村两委满意度');
}
if (this.form.workTeamSatisfaction === '') {
validationErrors.push('请选择对驻村工作队满意度');
}
// 签字验证
if (!this.form.signatureImg) {
validationErrors.push('请完成入户员签字');
}
// 签字验证
// if (!this.form.holderSignatureImg) {
// validationErrors.push('请完成户主签字');
// }
// 签字验证
if (!this.form.recordMethod) {
validationErrors.push('请选择入户方式');
}
// 帮扶信息验证(当家庭属性为监测户或脱贫户时)
if (this.showHelpInfo) {
// if (!this.form.helpUnit) {
// validationErrors.push('请输入帮扶单位');
// }
if (!this.form.helperName) {
validationErrors.push('请输入帮扶人姓名');
}
if (!this.form.helperPhone) {
validationErrors.push('请输入帮扶人联系方式');
} else {
if (this.form.helperPhone == '无') {
} else {
// 验证帮扶人手机号格式
const phoneReg = /^1[3-9]\d{9}$/;
if (!phoneReg.test(this.form.helperPhone)) {
validationErrors.push('帮扶人手机号格式不正确');
}
}
}
if (!this.form.helpRecordTime) {
validationErrors.push('请选择记录时间');
}
}
try {
if (this.form.areaObj && this.form.areaObj.length != 0) {
this.form.town = this.form.areaObj[0].value;
this.form.village = this.form.areaObj[1].value;
this.form.groupName = this.form.areaObj[2].value;
}
// 准备提交数据确保members格式正确
const formData = {
...this.form
}
var userInfo = userUtil.getUserInfo();
formData.submitterId = userInfo.userId;
formData.submitterName = userInfo.username;
if (formData.members && Array.isArray(formData.members)) {
formData.members = formData.members.map(member => ({
id: member.id || '',
name: member.name || '',
idNumber: member.idNumber || '',
phone: member.phone || '',
relation: member.relation || '',
health: member.health.join(',') || '',
studyEmplouStatus: member.studyEmplouStatus || '',
isStudy: member.isStudy || '',
isEmploy: member.isEmploy || '',
isPartyMember: member.isPartyMember || '',
isSoldier: member.isSoldier || '',
pensionInsuranceLevel: member.pensionInsuranceLevel || '',
remark: member.remark || '',
disability: member.disability || '',
showDisability: member.showDisability || false,
}))
var j = 0;
var k = 0;
for (var i = 0; i < formData.members.length; i++) {
var item = formData.members[i];
if (!item.health) {
validationErrors.push('第' + i + '位成员,健康状况不能为空!');
break;
}
if (item.pensionInsuranceLevel) {
k++;
}
if (item.health.includes('残疾')) {
if (!item.disability) {
validationErrors.push('第' + i + '位成员,残疾类型不能为空!')
break;
}
j++;
}
if (!item.isStudy) {
validationErrors.push('第' + i + '位成员,是否就学必须选择一项!');
break;
}
if (!item.isEmploy) {
validationErrors.push('第' + i + '位成员,是否就业必须选择一项!');
break;
}
if (!item.studyEmplouStatus) {
validationErrors.push('第' + i + '位成员,就学就业情况不能为空!');
break;
}
if (!item.isPartyMember) {
validationErrors.push('第' + i + '位成员,是否党员必须选择!');
break;
}
if (!item.isSoldier) {
validationErrors.push('第' + i + '位成员,是否退役军人必须选择!');
break;
}
}
if (this.form.disabledNum) {
if (this.form.disabledNum > j) {
uni.showToast({
title: '残疾保障人数不得大于家庭成员总残疾人数',
duration: 3000,
icon: 'none'
})
return
}
}
if (this.form.pensionInsuranceNum) {
if (this.form.pensionInsuranceNum > k) {
uni.showToast({
title: '养老保险人数不得大于家庭成员中已填保险信息的总人数',
duration: 3000,
icon: 'none'
})
return
}
}
}
if (this.helpFiles.length >= 1) {
formData.helpFiles = this.helpFiles.map(helpFiles => ({
id: helpFiles.id || '',
groupId: helpFiles.groupId || '',
manualPhoto: helpFiles.base64,
manualPhotoName: helpFiles.fileName,
}))
}
// 如果有验证错误,显示第一个错误并返回
if (validationErrors.length > 0) {
uni.showToast({
title: validationErrors[0],
duration: 3000,
icon: 'none'
});
return;
}
formData.submitStatus = 1;
const response = await householdApi.createHousehold(formData);
if (response) {
this.id = response.id;
uni.showToast({
title: '提交成功',
duration: 3000,
icon: 'success'
})
// 返回主页并刷新数据
setTimeout(() => {
// 通过事件总线通知主页刷新数据
uni.$emit('refreshStats')
// 返回主页
uni.reLaunch({
url: '/pages/index/index'
})
}, 1500)
} else {
uni.showToast({
title: response.data.message || '提交失败',
duration: 3000,
icon: 'none'
})
}
} catch (error) {
formData.members = formData.members.map(member => ({
id: member.id || '',
name: member.name || '',
idNumber: member.idNumber || '',
phone: member.phone || '',
relation: member.relation || '',
health: member.health.split(',').map(item => item.trim()) || '',
studyEmplouStatus: member.studyEmplouStatus || '',
isStudy: member.isStudy || '',
isEmploy: member.isEmploy || '',
isPartyMember: member.isPartyMember || '',
isSoldier: member.isSoldier || '',
pensionInsuranceLevel: member.pensionInsuranceLevel || '',
remark: member.remark || '',
disability: member.disability || '',
showDisability: member.showDisability || false,
}))
if (error.data && error.data.msg) {
uni.showToast({
title: error.data.msg,
duration: 3000,
icon: 'none'
})
} else {
uni.showToast({
title: '提交失败,请检查网络连接',
duration: 3000,
icon: 'none'
})
}
}
},
formatTimestamp(timestamp) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day}${hours}:${minutes}:${seconds}`;
},
async saveDraft() {
// 保证keyAttention为数组
if (!this.showHelp) {
this.form.helpUnit = '';
this.form.helperPhone = '';
this.form.helpRecordTime = '';
this.form.helpFiles = []
}
if (!Array.isArray(this.form.keyAttention)) {
this.form.keyAttention = [];
}
if (this.form.areaObj && this.form.areaObj.length != 0) {
this.form.town = this.form.areaObj[0].value;
this.form.village = this.form.areaObj[1].value;
this.form.groupName = this.form.areaObj[2].value;
}
// 暂存时只验证身份证号
if (!this.form.householderIdNumber) {
uni.showToast({
title: '身份证号不得为空',
duration: 3000,
icon: 'none'
})
return
}
try {
const token = uni.getStorageSync('token')
if (!token) {
uni.showToast({
title: '请先登录',
duration: 3000,
icon: 'none'
})
return
}
// 准备暂存数据确保members格式正确
const formData = {
...this.form
}
formData.submitStatus = 0 // 标记为暂存
// 确保members是Map格式
if (formData.members && Array.isArray(formData.members)) {
formData.members = formData.members.map(member => ({
id: member.id || '',
name: member.name || '',
idNumber: member.idNumber || '',
phone: member.phone || '',
relation: member.relation || '',
health: member.health.join(',') || '',
studyEmplouStatus: member.studyEmplouStatus || '',
isStudy: member.isStudy || '',
isEmploy: member.isEmploy || '',
isPartyMember: member.isPartyMember || '',
isSoldier: member.isSoldier || '',
pensionInsuranceLevel: member.pensionInsuranceLevel || '',
remark: member.remark || '',
disability: member.disability || '',
showDisability: member.showDisability || false,
}))
var i = 0;
for (var i = 0; i < formData.members.length; i++) {
var item = formData.members[i];
if (item.health.includes('残疾')) {
i++;
}
}
if (this.form.disabledNum) {
if (this.form.disabledNum > i) {
uni.showToast({
title: '残疾保障人数不得大于家庭成员总残疾人数',
duration: 3000,
icon: 'none'
})
return
}
}
}
if (this.helpFiles.length >= 1) {
formData.helpFiles = this.helpFiles.map(helpFiles => ({
id: helpFiles.id || '',
groupId: helpFiles.groupId || '',
manualPhoto: helpFiles.base64,
manualPhotoName: helpFiles.fileName,
}))
}
var userInfo = userUtil.getUserInfo();
formData.submitterId = userInfo.userId;
formData.submitterName = userInfo.username;
const response = await householdApi.createHousehold(formData)
if (response) {
uni.showToast({
title: '暂存成功',
duration: 3000,
icon: 'success'
})
// 返回主页并刷新数据
setTimeout(() => {
uni.navigateBack({
success: () => {
// 通过事件总线通知主页刷新数据
uni.$emit('refreshStats')
}
})
}, 1500)
} else {
uni.showToast({
title: response.data.message || '暂存失败',
duration: 3000,
icon: 'none'
})
}
} catch (error) {
formData.members = formData.members.map(member => ({
id: member.id || '',
name: member.name || '',
idNumber: member.idNumber || '',
phone: member.phone || '',
relation: member.relation || '',
health: member.health.split(',').map(item => item.trim()) || '',
studyEmplouStatus: member.studyEmplouStatus || '',
isStudy: member.isStudy || '',
isEmploy: member.isEmploy || '',
isPartyMember: member.isPartyMember || '',
isSoldier: member.isSoldier || '',
pensionInsuranceLevel: member.pensionInsuranceLevel || '',
remark: member.remark || '',
disability: member.disability || '',
showDisability: member.showDisability || false,
}))
uni.showToast({
title: error.data.message,
duration: 3000,
icon: 'none'
})
}
},
exportExcel() {
// TODO: 可用 xlsx.js 前端导出,或调用后端导出接口
uni.showToast({
title: '导出功能开发中',
duration: 3000,
icon: 'none'
})
},
onHelpDateConfirm(e) {
this.form.helpRecordTime = e.result;
this.showHelpCalendar = false;
}
},
mounted() {}
}
</script>
<style scoped>
.container {
padding: 20rpx;
background-color: #f5f5f5;
min-height: 100vh;
}
.card {
background-color: #fff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);
}
.section-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
margin-bottom: 30rpx;
border-left: 8rpx solid #007aff;
padding-left: 20rpx;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
}
.history-link {
font-size: 28rpx;
color: #007aff;
text-decoration: underline;
cursor: pointer;
padding: 6rpx 16rpx;
border-radius: 8rpx;
transition: background-color 0.3s;
}
.history-link:hover {
background-color: rgba(0, 122, 255, 0.1);
}
.history-link:active {
opacity: 0.7;
}
.option-list-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 20rpx;
}
.option-list-col {
display: flex;
flex-direction: column;
gap: 20rpx;
}
.option-list-col-compact {
display: flex;
flex-direction: column;
gap: 12rpx;
}
.option-item {
margin-right: 20rpx;
font-size: 26rpx;
color: #222;
}
/* 复选框包装器样式 */
.checkbox-item-wrapper {
display: flex;
align-items: flex-start;
margin-bottom: 12rpx;
padding: 8rpx 0;
}
/* 强制复选框文本换行 */
.checkbox-item-wrapper :deep(.u-checkbox) {
align-items: flex-start !important;
width: 100% !important;
display: flex !important;
}
.checkbox-item-wrapper :deep(.u-checkbox__label) {
white-space: normal !important;
word-wrap: break-word !important;
word-break: break-all !important;
line-height: 1.4 !important;
flex: 1 !important;
padding-top: 4rpx;
max-width: none !important;
overflow-wrap: break-word !important;
}
.checkbox-item-wrapper :deep(.u-checkbox__icon-wrap) {
flex-shrink: 0 !important;
margin-top: 4rpx;
margin-right: 12rpx;
}
/* 自定义复选框样式 */
.custom-checkbox-group {
display: flex;
flex-direction: column;
gap: 12rpx;
}
.custom-checkbox-item {
display: flex;
align-items: flex-start;
padding: 8rpx 0;
cursor: pointer;
}
.checkbox-icon {
width: 32rpx;
height: 32rpx;
border: 2rpx solid #ddd;
border-radius: 4rpx;
margin-right: 12rpx;
margin-top: 4rpx;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background-color: #fff;
}
.checkbox-checked {
color: #007aff;
font-size: 20rpx;
font-weight: bold;
}
.checkbox-label {
flex: 1;
font-size: 26rpx;
color: #222;
line-height: 1.4;
white-space: normal;
word-wrap: break-word;
word-break: break-all;
padding-top: 4rpx;
}
.btn-row {
display: flex;
flex-direction: column;
gap: 20rpx;
margin-top: 40rpx;
}
.button-row {
display: flex;
justify-content: space-between;
gap: 20rpx;
}
.btn-left {
flex: 1;
}
.btn-right {
flex: 1;
}
.btn-main {
height: 80rpx;
font-size: 32rpx;
}
.member-block {
border: 2rpx solid #eee;
border-radius: 12rpx;
padding: 20rpx;
margin-bottom: 20rpx;
background-color: #fafafa;
}
.member-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
}
.member-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.remove-btn {
background-color: #ff4757;
color: white;
padding: 10rpx 20rpx;
border-radius: 8rpx;
font-size: 24rpx;
}
.add-btn {
background-color: #007aff;
color: white;
padding: 15rpx 30rpx;
border-radius: 12rpx;
font-size: 28rpx;
margin-top: 20rpx;
text-align: center;
}
/* 帮扶信息样式 */
.help-info-card {
background-color: #f8f9fa;
border: 2rpx solid #e9ecef;
border-radius: 12rpx;
padding: 20rpx;
margin: 20rpx 0;
}
.help-info-card .section-title {
color: #495057;
font-size: 30rpx;
font-weight: 600;
margin-bottom: 20rpx;
border-bottom: 2rpx solid #dee2e6;
padding-bottom: 10rpx;
}
.preview-list {
display: flex;
flex-wrap: wrap;
margin-top: 20px;
}
.preview-image {
width: 30%;
margin: 5px;
border-radius: 4px;
}
</style>