This commit is contained in:
2026-02-12 19:48:28 +08:00
parent 2584e24fa1
commit 94c0af4039
62 changed files with 9597 additions and 127 deletions

View File

@@ -0,0 +1,291 @@
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 为 featureroute 参数 / 产品英文编码)
* value 为该产品需要的字段数组
*
* 先以你当前主要产品为例填入,后续有新产品直接在这里扩展即可。
*/
const productFieldConfig = {
// 婚恋风险(当前与默认字段一致,单独配置方便以后扩展)
marriage: ["name", "idCard", "mobile", "verificationCode"],
// 司法涉诉
toc_PersonalLawsuit: ["name", "idCard", "mobile", "verificationCode"],
// 人企关系加强版:仅身份证号
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"],
};
// 当前 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,
};
}