| | |
| | | <script setup lang="uts"> |
| | | import { loadOnboardingStatus, SettlementOnboarding, submitOnboarding as submitOnboardingRemote } from '../../services/settlement.uts' |
| | | import { uploadMerchantProductImage } from '../../services/merchant-management.uts' |
| | | import { getMerchantOnboardingDraftStorageKey } from '../../services/onboarding-draft.uts' |
| | | import { getSession } from '../../services/session.uts' |
| | | import { areaProvinceNames, areaProvinceCodes, areaCityNames, areaCityCodes } from '../../config/area-codes.uts' |
| | | |
| | | const stepTitles = ['主体信息', '法人信息', '联系人', '结算账户'] |
| | |
| | | const businessValidityIndex = ref(0) |
| | | const subjectValidityOptions = ['10年', '20年', '长期有效'] |
| | | const subjectValidityIndex = ref(0) |
| | | const draftStorageKey = 'merchant-onboarding-draft' |
| | | // 草稿按当前登录的操作员分命名空间,换账号看不到上一个账号的草稿(见 services/onboarding-draft.uts)。 |
| | | // 必须在取用点现算:进入页面时机不确定,模块加载时算会把当时的会话固化住。 |
| | | const draftStorageKey = (): string => getMerchantOnboardingDraftStorageKey() |
| | | const currentOperatorId = (): string => { |
| | | const session = getSession() |
| | | if (session == null || session.operatorId == null) return '' |
| | | return (session.operatorId as string).trim() |
| | | } |
| | | let draftRestored = false |
| | | |
| | | /** 私营企业等类型汇付要求必须填注册资本,这里与服务端 normalizeRegisteredCapital 保持一致。 */ |
| | |
| | | } |
| | | const goPrevStep = () => { saveDraft(); if (currentStep.value > 1) currentStep.value = currentStep.value - 1; resetScroll() } |
| | | |
| | | const draftPayload = (): any => ({ merchantType: merchantType.value, merchantName: merchantName.value, merchantShortName: merchantShortName.value, companyType: companyType.value, companyTypeIndex: companyTypeIndex.value, industryType: industryType.value, industryTypeIndex: industryTypeIndex.value, businessLicenseUrl: businessLicenseUrl.value, creditCode: creditCode.value, businessValidity: businessValidity.value, businessStartDate: businessStartDate.value, businessEndDate: businessEndDate.value, establishedDate: establishedDate.value, registeredRegion: registeredRegion.value, registeredProvinceCode: registeredProvinceCode.value, registeredCityCode: registeredCityCode.value, registeredDistrictCode: registeredDistrictCode.value, registeredAddress: registeredAddress.value, registeredCapital: registeredCapital.value, subjectName: subjectName.value, legalIdFrontUrl: legalIdFrontUrl.value, legalIdBackUrl: legalIdBackUrl.value, subjectIdNumber: subjectIdNumber.value, subjectValidity: subjectValidity.value, subjectStartDate: subjectStartDate.value, subjectEndDate: subjectEndDate.value, legalCertificateAddress: legalCertificateAddress.value, contactName: contactName.value, contactMobile: contactMobile.value, administratorEmail: administratorEmail.value, bankCardNumber: bankCardNumber.value, bankProvince: bankProvince.value, bankProvinceCode: bankProvinceCode.value, bankProvinceIndex: bankProvinceIndex.value, bankCity: bankCity.value, bankCityCode: bankCityCode.value, bankCityIndex: bankCityIndex.value, bankBranch: bankBranch.value, bankBranchCode: bankBranchCode.value, bankName: bankName.value, settlementProofUrl: settlementProofUrl.value, currentStep: currentStep.value }) |
| | | const saveDraft = () => { uni.setStorageSync(draftStorageKey, JSON.stringify(draftPayload())) } |
| | | const clearDraft = () => { uni.removeStorageSync(draftStorageKey) } |
| | | const draftPayload = (): any => ({ ownerOperatorId: currentOperatorId(), merchantType: merchantType.value, merchantName: merchantName.value, merchantShortName: merchantShortName.value, companyType: companyType.value, companyTypeIndex: companyTypeIndex.value, industryType: industryType.value, industryTypeIndex: industryTypeIndex.value, businessLicenseUrl: businessLicenseUrl.value, creditCode: creditCode.value, businessValidity: businessValidity.value, businessStartDate: businessStartDate.value, businessEndDate: businessEndDate.value, establishedDate: establishedDate.value, registeredRegion: registeredRegion.value, registeredProvinceCode: registeredProvinceCode.value, registeredCityCode: registeredCityCode.value, registeredDistrictCode: registeredDistrictCode.value, registeredAddress: registeredAddress.value, registeredCapital: registeredCapital.value, subjectName: subjectName.value, legalIdFrontUrl: legalIdFrontUrl.value, legalIdBackUrl: legalIdBackUrl.value, subjectIdNumber: subjectIdNumber.value, subjectValidity: subjectValidity.value, subjectStartDate: subjectStartDate.value, subjectEndDate: subjectEndDate.value, legalCertificateAddress: legalCertificateAddress.value, contactName: contactName.value, contactMobile: contactMobile.value, administratorEmail: administratorEmail.value, bankCardNumber: bankCardNumber.value, bankProvince: bankProvince.value, bankProvinceCode: bankProvinceCode.value, bankProvinceIndex: bankProvinceIndex.value, bankCity: bankCity.value, bankCityCode: bankCityCode.value, bankCityIndex: bankCityIndex.value, bankBranch: bankBranch.value, bankBranchCode: bankBranchCode.value, bankName: bankName.value, settlementProofUrl: settlementProofUrl.value, currentStep: currentStep.value }) |
| | | const saveDraft = () => { uni.setStorageSync(draftStorageKey(), JSON.stringify(draftPayload())) } |
| | | const clearDraft = () => { uni.removeStorageSync(draftStorageKey()) } |
| | | const restoreDraft = () => { |
| | | const stored = uni.getStorageSync(draftStorageKey) |
| | | const stored = uni.getStorageSync(draftStorageKey()) |
| | | if (stored == null || stored == '') return |
| | | try { |
| | | const draft = JSON.parse(stored as string) as any |
| | | // 草稿必须属于当前登录的操作员。key 已经按操作员分命名空间,这里再校验一次归属: |
| | | // 更新前存在旧的全局 key 下的草稿,里面可能有别的账号的姓名、身份证号、银行卡号; |
| | | // 归属不符就直接丢弃,宁可让用户重填,也不能把别人的资料预填进来。 |
| | | const owner = draft.ownerOperatorId != null ? (draft.ownerOperatorId as string) : '' |
| | | if (owner != currentOperatorId()) { clearDraft(); return } |
| | | if (draft.merchantType != null) merchantType.value = draft.merchantType as string |
| | | if (draft.merchantName != null) merchantName.value = draft.merchantName as string |
| | | if (draft.merchantShortName != null) merchantShortName.value = draft.merchantShortName as string |
| | |
| | | const restoredBusinessValidity = validityOptions.indexOf(businessValidity.value); if (restoredBusinessValidity >= 0) businessValidityIndex.value = restoredBusinessValidity |
| | | const restoredSubjectValidity = subjectValidityOptions.indexOf(subjectValidity.value); if (restoredSubjectValidity >= 0) subjectValidityIndex.value = restoredSubjectValidity |
| | | if (draft.currentStep != null) { const restoredStep = Number(draft.currentStep); currentStep.value = (restoredStep >= 1 && restoredStep <= 4) ? restoredStep : 1 } |
| | | // 走到这里才说明草稿确实属于当前账号,这时才提示"已恢复草稿"。 |
| | | draftNotice.value = true |
| | | } catch (_error) { clearDraft() } |
| | | } |