2026-02-12 19:48:28 +08:00
|
|
|
|
import { reactive, computed } from "vue";
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 通用查询表单字段与规则(可按 feature 扩展)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 目标:
|
|
|
|
|
|
* - 统一管理「这个产品需要哪些输入控件」
|
|
|
|
|
|
* - 暴露统一的 formData / 校验规则 / 字段可见性 / 组装请求体
|
|
|
|
|
|
*
|
|
|
|
|
|
* 使用方式(示例,见 InquireForm.vue):
|
|
|
|
|
|
* const { formData, isPhoneNumberValid, isIdCardValid, isHasInput, buildRequestPayload } =
|
|
|
|
|
|
* useInquireForm(feature);
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function useInquireForm(featureRef) {
|
|
|
|
|
|
// 1. 表单字段全集(后续有新字段,只在这里统一扩展)
|
|
|
|
|
|
const formData = reactive({
|
|
|
|
|
|
name: "",
|
|
|
|
|
|
idCard: "",
|
|
|
|
|
|
mobile: "",
|
|
|
|
|
|
verificationCode: "",
|
|
|
|
|
|
// 预留扩展字段位(婚姻、车辆、企业等)
|
|
|
|
|
|
nameMan: "",
|
|
|
|
|
|
idCardMan: "",
|
|
|
|
|
|
nameWoman: "",
|
|
|
|
|
|
idCardWoman: "",
|
|
|
|
|
|
entName: "",
|
|
|
|
|
|
entCode: "",
|
|
|
|
|
|
carLicense: "",
|
|
|
|
|
|
carType: "",
|
|
|
|
|
|
vinCode: "",
|
|
|
|
|
|
certificateNumber: "",
|
|
|
|
|
|
// 车辆类扩展(仅必填项)
|
|
|
|
|
|
userType: "1",
|
|
|
|
|
|
returnUrl: "",
|
|
|
|
|
|
imageUrl: "",
|
|
|
|
|
|
vehicleLocation: "",
|
|
|
|
|
|
firstRegistrationDate: "",
|
|
|
|
|
|
vlphotoData: "",
|
|
|
|
|
|
authorized: "1",
|
|
|
|
|
|
// 核验工具
|
|
|
|
|
|
bankCard: "",
|
|
|
|
|
|
photoData: "",
|
|
|
|
|
|
// 协议
|
|
|
|
|
|
agreeToTerms: false,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 默认输入字段(大部分个人产品共用)
|
|
|
|
|
|
const defaultInput = ["name", "idCard", "mobile", "verificationCode"];
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 3. 不同产品的专用字段配置
|
|
|
|
|
|
* key 为 feature(route 参数 / 产品英文编码)
|
|
|
|
|
|
* value 为该产品需要的字段数组
|
|
|
|
|
|
*
|
|
|
|
|
|
* 先以你当前主要产品为例填入,后续有新产品直接在这里扩展即可。
|
|
|
|
|
|
*/
|
|
|
|
|
|
const productFieldConfig = {
|
|
|
|
|
|
// 婚恋风险(当前与默认字段一致,单独配置方便以后扩展)
|
|
|
|
|
|
marriage: ["name", "idCard", "mobile", "verificationCode"],
|
|
|
|
|
|
|
|
|
|
|
|
// 司法涉诉
|
|
|
|
|
|
toc_PersonalLawsuit: ["name", "idCard", "mobile", "verificationCode"],
|
2026-03-02 16:50:34 +08:00
|
|
|
|
// 本人不良:姓名 + 身份证(授权由后端默认传 1)
|
|
|
|
|
|
toc_PersonalBadRecord: ["name", "idCard"],
|
2026-02-12 19:48:28 +08:00
|
|
|
|
// 人企关系加强版:仅身份证号
|
|
|
|
|
|
toc_PersonEnterprisePro: ["idCard"],
|
|
|
|
|
|
// 新企业司法涉诉(QYGL66SL):仅企业名称,其他字段后端自动补齐
|
|
|
|
|
|
toc_EnterpriseLawsuitQYGL66SL: ["entName"],
|
|
|
|
|
|
|
|
|
|
|
|
// 被执行人 / 限高
|
|
|
|
|
|
// 限高被执行人 FLXG3A9B:姓名 + 身份证 + 手机号(授权由后端默认传 1,前端不展示)
|
|
|
|
|
|
toc_LimitHighExecuted: ["name", "idCard", "mobile"],
|
|
|
|
|
|
// 失信被执行人 QYGL2S0W:姓名 + 身份证;type 后端默认 per
|
|
|
|
|
|
toc_DishonestExecutedPerson: ["name", "idCard"],
|
|
|
|
|
|
|
|
|
|
|
|
// 婚姻状况系列(占位,后续可根据实际字段调整)
|
|
|
|
|
|
toc_PersonalMarriageStatus: [
|
|
|
|
|
|
"name",
|
|
|
|
|
|
"idCard",
|
|
|
|
|
|
"mobile",
|
|
|
|
|
|
"verificationCode",
|
|
|
|
|
|
],
|
|
|
|
|
|
toc_MarriageStatusRegisterTime: [
|
|
|
|
|
|
"name",
|
|
|
|
|
|
"idCard",
|
|
|
|
|
|
"mobile",
|
|
|
|
|
|
"verificationCode",
|
|
|
|
|
|
],
|
|
|
|
|
|
toc_MarriageStatusSupplement: [
|
|
|
|
|
|
"name",
|
|
|
|
|
|
"idCard",
|
|
|
|
|
|
"mobile",
|
|
|
|
|
|
"verificationCode",
|
|
|
|
|
|
],
|
|
|
|
|
|
toc_MarriageStatusVerify: [
|
|
|
|
|
|
"name",
|
|
|
|
|
|
"idCard",
|
|
|
|
|
|
"mobile",
|
|
|
|
|
|
"verificationCode",
|
|
|
|
|
|
],
|
|
|
|
|
|
toc_DualMarriageStatusRegisterTime: [
|
|
|
|
|
|
"nameMan",
|
|
|
|
|
|
"idCardMan",
|
|
|
|
|
|
"nameWoman",
|
|
|
|
|
|
"idCardWoman",
|
|
|
|
|
|
"mobile",
|
|
|
|
|
|
"verificationCode",
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
// 车辆相关(占位,后续可细化)
|
|
|
|
|
|
toc_VehiclesUnderName: ["name", "idCard", "mobile", "verificationCode"],
|
|
|
|
|
|
// 名下车辆(车牌):姓名 + 身份证 + 手机 + 验证码
|
|
|
|
|
|
toc_VehiclesUnderNamePlate: [
|
|
|
|
|
|
"name",
|
|
|
|
|
|
"idCard",
|
|
|
|
|
|
"mobile",
|
|
|
|
|
|
"verificationCode",
|
|
|
|
|
|
],
|
|
|
|
|
|
// 人车核验简版:姓名 + 号牌类型 + 车牌号
|
|
|
|
|
|
toc_PersonVehicleVerification: ["name", "carType", "carLicense"],
|
|
|
|
|
|
// 人车核验详版:姓名 + 号牌类型 + 车牌号(同简版)
|
|
|
|
|
|
toc_PersonVehicleVerificationDetail: ["name", "carType", "carLicense"],
|
|
|
|
|
|
// 名下车辆(数量) QCXG4D2E:仅 user_type + id_card
|
|
|
|
|
|
toc_VehiclesUnderNameCount: ["userType", "idCard"],
|
|
|
|
|
|
// 车辆静态信息 QCXG5U0Z:仅 vin_code(车辆类不要求手机号与验证码)
|
|
|
|
|
|
toc_VehicleStaticInfo: ["vinCode"],
|
|
|
|
|
|
// 车辆里程混合 QCXG1U4U(仅必填:vin_code, image_url;回调地址由后端自动生成)
|
|
|
|
|
|
toc_VehicleMileageMixed: ["vinCode", "imageUrl"],
|
|
|
|
|
|
// 二手车VIN估值 QCXGY7F2(仅必填:vin_code, vehicle_location, first_registrationdate)
|
|
|
|
|
|
toc_VehicleVinValuation: [
|
|
|
|
|
|
"vinCode",
|
|
|
|
|
|
"vehicleLocation",
|
|
|
|
|
|
"firstRegistrationDate",
|
|
|
|
|
|
],
|
|
|
|
|
|
// 车辆过户简版 QCXG1H7Y(必填:vin_code + 车牌号)
|
|
|
|
|
|
toc_VehicleTransferSimple: ["vinCode", "carLicense"],
|
|
|
|
|
|
// 车辆过户详版 QCXG4I1Z
|
|
|
|
|
|
toc_VehicleTransferDetail: ["vinCode"],
|
|
|
|
|
|
// 车辆维保简版 QCXG3Y6B(仅必填:vin_code;回调地址由后端自动生成)
|
|
|
|
|
|
toc_VehicleMaintenanceSimple: ["vinCode"],
|
|
|
|
|
|
// 车辆维保详细版 QCXG3Z3L(仅必填:vin_code;回调地址由后端自动生成)
|
|
|
|
|
|
toc_VehicleMaintenanceDetail: ["vinCode"],
|
|
|
|
|
|
// 车辆出险详版 QCXGP00W(仅必填:vin_code, vlphoto_data;回调地址由后端自动生成)
|
|
|
|
|
|
toc_VehicleClaimDetail: ["vinCode", "vlphotoData"],
|
|
|
|
|
|
// 车辆出险记录核验 QCXG6B4E(授权由后端默认传 1,前端不展示)
|
|
|
|
|
|
toc_VehicleClaimVerify: ["vinCode"],
|
|
|
|
|
|
|
|
|
|
|
|
// 核验工具(verify feature.md)
|
|
|
|
|
|
toc_PoliceTwoFactors: ["mobile", "idCard", "name"],
|
|
|
|
|
|
toc_PoliceThreeFactors: ["photoData", "idCard", "name"],
|
|
|
|
|
|
toc_ProfessionalCertificate: ["idCard", "name"],
|
|
|
|
|
|
toc_PersonalConsumptionCapacityLevel: ["mobile", "idCard", "name"], // 个人消费能力(沿用现有 product_en)
|
|
|
|
|
|
toc_OperatorTwoFactors: ["mobile", "name"],
|
|
|
|
|
|
toc_MobileThreeFactors: ["mobile", "idCard", "name"],
|
|
|
|
|
|
toc_NumberRecycle: ["mobile"],
|
|
|
|
|
|
toc_MobileEmptyCheck: ["mobile"],
|
|
|
|
|
|
toc_MobilePortability: ["mobile"],
|
|
|
|
|
|
toc_MobileOnlineStatus: ["mobile"],
|
|
|
|
|
|
toc_MobileOnlineDuration: ["mobile"],
|
|
|
|
|
|
toc_MobileAttribution: ["mobile"],
|
|
|
|
|
|
toc_MobileConsumptionRange: ["mobile", "authorized"],
|
|
|
|
|
|
toc_EnterpriseRelation: ["idCard"],
|
|
|
|
|
|
toc_BankcardFourFactors: ["mobile", "idCard", "bankCard", "name"],
|
|
|
|
|
|
toc_BankcardBlacklist: ["mobile", "idCard", "name", "bankCard"],
|
2026-04-24 11:48:27 +08:00
|
|
|
|
|
|
|
|
|
|
backgroundcheck: ["name", "idCard", "mobile"],
|
2026-02-12 19:48:28 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 当前 feature 名称
|
|
|
|
|
|
const currentFeature = computed(() => featureRef?.value || featureRef);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 4. 判断某个字段在当前产品下是否需要显示 / 校验 / 组包
|
|
|
|
|
|
*/
|
|
|
|
|
|
const isHasInput = (field) => {
|
|
|
|
|
|
const key = currentFeature.value;
|
|
|
|
|
|
if (key && productFieldConfig[key]) {
|
|
|
|
|
|
return productFieldConfig[key].includes(field);
|
|
|
|
|
|
}
|
|
|
|
|
|
return defaultInput.includes(field);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 5. 通用校验规则(不直接弹 Toast,只返回布尔值,UI 再决定提示)
|
|
|
|
|
|
const isPhoneNumberValid = computed(() => {
|
|
|
|
|
|
if (!formData.mobile) return false;
|
|
|
|
|
|
return /^1[3-9]\d{9}$/.test(formData.mobile);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const isIdCardValid = computed(() => {
|
|
|
|
|
|
if (!formData.idCard) return false;
|
|
|
|
|
|
return /^\d{17}[\dX]$/i.test(formData.idCard);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 预留:其他字段校验(如车牌、车架号等)后续可加在这里
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 6. 根据当前产品配置组装请求体
|
|
|
|
|
|
* 仅包含当前产品需要的字段;字段名与后端约定对齐。
|
|
|
|
|
|
*/
|
|
|
|
|
|
const buildRequestPayload = () => {
|
|
|
|
|
|
const req = {};
|
|
|
|
|
|
|
|
|
|
|
|
if (isHasInput("name") && formData.name) {
|
|
|
|
|
|
req.name = formData.name;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("idCard") && formData.idCard) {
|
|
|
|
|
|
req.id_card = formData.idCard;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("mobile") && formData.mobile) {
|
|
|
|
|
|
req.mobile = formData.mobile;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("verificationCode") && formData.verificationCode) {
|
|
|
|
|
|
req.code = formData.verificationCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 预留字段映射(以后启用时直接在这里补充)
|
|
|
|
|
|
if (isHasInput("nameMan") && formData.nameMan) {
|
|
|
|
|
|
req.name_man = formData.nameMan;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("idCardMan") && formData.idCardMan) {
|
|
|
|
|
|
req.id_card_man = formData.idCardMan;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("nameWoman") && formData.nameWoman) {
|
|
|
|
|
|
req.name_woman = formData.nameWoman;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("idCardWoman") && formData.idCardWoman) {
|
|
|
|
|
|
req.id_card_woman = formData.idCardWoman;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("entName") && formData.entName) {
|
|
|
|
|
|
req.ent_name = formData.entName;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("entCode") && formData.entCode) {
|
|
|
|
|
|
req.ent_code = formData.entCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("carLicense") && formData.carLicense) {
|
|
|
|
|
|
req.car_license = formData.carLicense.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("carType") && formData.carType) {
|
|
|
|
|
|
req.car_type = formData.carType;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("vinCode") && formData.vinCode) {
|
|
|
|
|
|
req.vin_code = formData.vinCode.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("certificateNumber") && formData.certificateNumber) {
|
|
|
|
|
|
req.certificate_number = formData.certificateNumber;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 车辆类扩展字段(与后端 types/query.go 对齐)
|
|
|
|
|
|
if (isHasInput("userType") && formData.userType) {
|
|
|
|
|
|
req.user_type = formData.userType;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("returnUrl") && formData.returnUrl) {
|
|
|
|
|
|
req.return_url = formData.returnUrl.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("imageUrl") && formData.imageUrl) {
|
|
|
|
|
|
req.image_url = formData.imageUrl.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("vehicleLocation") && formData.vehicleLocation) {
|
|
|
|
|
|
req.vehicle_location = formData.vehicleLocation.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
|
|
|
isHasInput("firstRegistrationDate") &&
|
|
|
|
|
|
formData.firstRegistrationDate
|
|
|
|
|
|
) {
|
|
|
|
|
|
req.first_registrationdate = formData.firstRegistrationDate.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("vlphotoData") && formData.vlphotoData) {
|
|
|
|
|
|
req.vlphoto_data = formData.vlphotoData;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
|
|
|
isHasInput("authorized") &&
|
|
|
|
|
|
formData.authorized !== undefined &&
|
|
|
|
|
|
formData.authorized !== ""
|
|
|
|
|
|
) {
|
|
|
|
|
|
req.authorized = String(formData.authorized);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("bankCard") && formData.bankCard) {
|
|
|
|
|
|
req.bank_card = formData.bankCard.trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isHasInput("photoData") && formData.photoData) {
|
|
|
|
|
|
req.photo_data = formData.photoData;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return req;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
formData,
|
|
|
|
|
|
isPhoneNumberValid,
|
|
|
|
|
|
isIdCardValid,
|
|
|
|
|
|
isHasInput,
|
|
|
|
|
|
buildRequestPayload,
|
|
|
|
|
|
defaultInput,
|
|
|
|
|
|
productFieldConfig,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|