提交
This commit is contained in:
1 parent
cdaa0ac273
commit
b7cd657f32
32 files changed
+2885
-1936
No files matched your search
@@ -37,11 +37,11 @@
|
||||
<dd>{{ maskIdCard(String(detail?.newbornIdCard || '')) }}</dd>
|
||||
</div>
|
||||
</template>
|
||||
<div v-if="detail?.payMode === 'fq'" class="view-kv">
|
||||
<div v-if="isInstallmentPayMode(String(detail?.payMode || ''))" class="view-kv">
|
||||
<dt>分期期序号</dt>
|
||||
<dd>{{ dash(detail?.installmentNo) }}</dd>
|
||||
</div>
|
||||
<div v-if="detail?.payMode === 'fq'" class="view-kv">
|
||||
<div v-if="isInstallmentPayMode(String(detail?.payMode || ''))" class="view-kv">
|
||||
<dt>应缴费时间</dt>
|
||||
<dd>{{ formatPaymentDueDate(detail?.installmentDueDate) }}</dd>
|
||||
</div>
|
||||
@@ -116,6 +116,7 @@
|
||||
loadTransferTypeDict,
|
||||
transferTypeLabel
|
||||
} from '@/utils/protocol-payment-labels'
|
||||
import { isInstallmentPayMode } from '@/utils/protocol-payment-presets'
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_status_tag_registry_ts", "label": "status-tag-registry.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L1"}, {"id": "utils_status_tag_registry_createlabelgetter", "label": "createLabelGetter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L23"}, {"id": "utils_status_tag_registry_createtagtypegetter", "label": "createTagTypeGetter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L27"}, {"id": "utils_status_tag_registry_isinactiveprotocolstatus", "label": "isInactiveProtocolStatus()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L47"}, {"id": "utils_status_tag_registry_protocolstatusdisplaylabel", "label": "protocolStatusDisplayLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L55"}, {"id": "utils_status_tag_registry_donationstatusdisplaylabel", "label": "donationStatusDisplayLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L74"}, {"id": "utils_status_tag_registry_protocolstatusdisplaylabelbysource", "label": "protocolStatusDisplayLabelBySource()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L82"}, {"id": "utils_status_tag_registry_joinworkorderstatusfilter", "label": "joinWorkOrderStatusFilter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L203"}, {"id": "utils_status_tag_registry_matchesworkorderstatusfilter", "label": "matchesWorkOrderStatusFilter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L208"}, {"id": "utils_status_tag_registry_txntypelabel", "label": "txnTypeLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L482"}, {"id": "utils_status_tag_registry_txntypetagtype", "label": "txnTypeTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L493"}, {"id": "utils_status_tag_registry_txnstatuslabel", "label": "txnStatusLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L505"}, {"id": "utils_status_tag_registry_txnstatustagtype", "label": "txnStatusTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L515"}, {"id": "utils_status_tag_registry_applicationstatuslabel", "label": "applicationStatusLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L526"}, {"id": "utils_status_tag_registry_applicationstatustagtype", "label": "applicationStatusTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L530"}, {"id": "utils_status_tag_registry_checkupstatuslabel", "label": "checkupStatusLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L543"}, {"id": "utils_status_tag_registry_checkupstatustagtype", "label": "checkupStatusTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L551"}, {"id": "utils_status_tag_registry_feestatuslabel", "label": "feeStatusLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L559"}, {"id": "utils_status_tag_registry_feestatustagtype", "label": "feeStatusTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L567"}, {"id": "utils_status_tag_registry_schedulestatuslabel", "label": "scheduleStatusLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L576"}, {"id": "utils_status_tag_registry_schedulestatustagtype", "label": "scheduleStatusTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts", "source_location": "L585"}, {"id": "utils_sLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_installment_ts", "label": "protocol-payment-installment.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L1"}, {"id": "utils_protocol_payment_installment_defaultinstallmentratios", "label": "defaultInstallmentRatios()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L10"}, {"id": "utils_protocol_payment_installment_resizeinstallmentratios", "label": "resizeInstallmentRatios()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L19"}, {"id": "utils_protocol_payment_installment_finalizeinstallmentratios", "label": "finalizeInstallmentRatios()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L31"}, {"id": "utils_protocol_payment_installment_isinstallmentratiosvalid", "label": "isInstallmentRatiosValid()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L39"}, {"id": "utils_protocol_payment_installment_islegacyinstallmentratios", "label": "isLegacyInstallmentRatios()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L49"}, {"id": "utils_protocol_payment_installment_normalizeinstallmentamounts", "label": "normalizeInstallmentAmounts()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L64"}, {"id": "utils_protocol_payment_installment_defaultinstallmentamounts", "label": "defaultInstallmentAmounts()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L82"}, {"id": "utils_protocol_payment_installment_resizeinstallmentamounts", "label": "resizeInstallmentAmounts()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L89"}, {"id": "utils_protocol_payment_installment_isinstallmentamountsvalid", "label": "isInstallmentAmountsValid()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L115"}, {"id": "utils_protocol_payment_installment_suminstallmentamounts", "label": "sumInstallmentAmounts()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L125"}, {"id": "utils_protocol_payment_installment_scaleinstallmentamountstocontract", "label": "scaleInstallmentAmountsToContract()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L131"}, {"id": "utils_protocol_payment_installment_addmonthsymd", "label": "addMonthsYmd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L156"}, {"id": "utils_protocol_payment_installment_adddaysymd", "label": "addDaysYmd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L170"}, {"id": "utils_protocol_payment_installment_addintervalmonthsymd", "label": "addIntervalMonthsYmd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L185"}, {"id": "utils_protocol_payment_installment_calcfqinstallmentduedate", "label": "calcFqInstallmentDueDate()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L206"}, {"id": "utils_protocol_payment_installment_calcinstallmentdueamounts", "label": "calcInstallmentDueAmounts()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L219"}, {"id": "utils_protocol_payment_installment_calcinstallmentdueamountsbyratios", "label": "calcInstallmentDueAmountsByRatios()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L239"}, {"id": "utils_protocol_payment_installment_calcunpaidamountsbyratios", "label": "calcUnpaidAmountsByRatios()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts", "source_location": "L259"}, {"id": "utils_protocol_pLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "label": "ProtocolViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1"}, {"id": "protocol_protocolviewdialog_financeconfirmattachmentfiles", "label": "financeConfirmAttachmentFiles()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1659"}, {"id": "protocol_protocolviewdialog_refundattachmentfiles", "label": "refundAttachmentFiles()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1666"}, {"id": "protocol_protocolviewdialog_refundfinanceconfirmattachmentfiles", "label": "refundFinanceConfirmAttachmentFiles()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1673"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_financeconfirmattachmentfiles", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1659", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_refundattachmentfiles", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1666", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_refundfinanceconfirmattachmentfiles", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1673", "weight": 1.0}], "raw_calls": [{"caller_nid": "protocol_protocolviewdialog_financeconfirmattachmentfiles", "callee": "isArray", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1660"}, {"caller_nid": "protocol_protocolviewdialog_financeconfirmattachmentfiles", "callee": "urlsToAttachmentFiles", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1663"}, {"caller_nid": "protocol_protocolviewdialog_financeconfirmattachmentfiles", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1663"}, {"caller_nid": "protocol_protocolviewdialog_refundattachmentfiles", "callee": "isArray", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1667"}, {"caller_nid": "protocol_protocolviewdialog_refundattachmentfiles", "callee": "urlsToAttachmentFiles", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1670"}, {"caller_nid": "protocol_protocolviewdialog_refundattachmentfiles", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1670"}, {"caller_nid": "protocol_protocolviewdialog_refundfinanceconfirmattachmentfiles", "callee": "isArray", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1674"}, {"caller_nid": "protocol_protocolviewdialog_refundfinanceconfirmattachmentfiles", "callee": "urlsToAttachmentFiles", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1677"}, {"caller_nid": "protocol_protocolviewdialog_refundfinanceconfirmattachmentfiles", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1677"}]}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_protocol_payment_detail_readonly_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-payment-detail-readonly/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_productionworkordercardlist_vue", "label": "ProductionWorkOrderCardList.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets_ts", "label": "protocol-payment-presets.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L1"}, {"id": "utils_protocol_payment_presets_getactivesamplecount", "label": "getActiveSampleCount()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L35"}, {"id": "utils_protocol_payment_presets_resolvepaymentpreset", "label": "resolvePaymentPreset()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L40"}, {"id": "utils_protocol_payment_presets_isinstallmentpaymode", "label": "isInstallmentPayMode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L47"}, {"id": "utils_protocol_payment_presets_availablepaymodes", "label": "availablePayModes()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L51"}, {"id": "utils_protocol_payment_presets_ispaymodevalidforsamplecount", "label": "isPayModeValidForSampleCount()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L56"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets_ts", "target": "utils_protocol_payment_presets_getactivesamplecount", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L35", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets_ts", "target": "utils_protocol_payment_presets_resolvepaymentpreset", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L40", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets_ts", "target": "utils_protocol_payment_presets_isinstallmentpaymode", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L47", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets_ts", "target": "utils_protocol_payment_presets_availablepaymodes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L51", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets_ts", "target": "utils_protocol_payment_presets_ispaymodevalidforsamplecount", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L56", "weight": 1.0}, {"source": "utils_protocol_payment_presets_ispaymodevalidforsamplecount", "target": "utils_protocol_payment_presets_availablepaymodes", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L57", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_protocol_payment_presets_getactivesamplecount", "callee": "filter", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L36"}, {"caller_nid": "utils_protocol_payment_presets_ispaymodevalidforsamplecount", "callee": "includes", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-presets.ts", "source_location": "L57"}]}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "label": "QcWorkOrderProtocolPaymentPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L177", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L178", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_money_format", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L179", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_status_tag_registry", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L180", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_status_tag_registry", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L185", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_qcworkorderprotocolpaymentpanel_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue", "source_location": "L186", "weight": 1.0}], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "label": "ProtocolFormDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1"}, {"id": "protocol_protocolformdialog_ensuretransfertypeoptions", "label": "ensureTransferTypeOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1015"}, {"id": "protocol_protocolformdialog_fmtmoney", "label": "fmtMoney()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1021"}, {"id": "protocol_protocolformdialog_pad", "label": "pad()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1414"}, {"id": "protocol_protocolformdialog_applypaymentpresetformode", "label": "applyPaymentPresetForMode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1715"}, {"id": "protocol_protocolformdialog_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1964"}, {"id": "protocol_protocolformdialog_for", "label": "for()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L1986"}, {"id": "protocol_protocolformdialog_applyfqpaymentdefaults", "label": "applyFqPaymentDefaults()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L2690"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_sample_transport_form_section_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L911", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L912", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L913", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_collection_protocol", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L926", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L932", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_download_attachment", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L933", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_composables_useattachmentdropzone", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue", "source_location": "L934", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolformdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_chinesLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_standard_import_parse_ts", "label": "protocol-standard-import-parse.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L1"}, {"id": "utils_protocol_standard_import_parse_normalizeline", "label": "normalizeLine()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L85"}, {"id": "utils_protocol_standard_import_parse_splitkeyvalue", "label": "splitKeyValue()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L91"}, {"id": "utils_protocol_standard_import_parse_normalizechinesedatetimeliteral", "label": "normalizeChineseDatetimeLiteral()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L97"}, {"id": "utils_protocol_standard_import_parse_parsedatetime", "label": "parseDatetime()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L106"}, {"id": "utils_protocol_standard_import_parse_parsesex", "label": "parseSex()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L117"}, {"id": "utils_protocol_standard_import_parse_parsedeliverymode", "label": "parseDeliveryMode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L125"}, {"id": "utils_protocol_standard_import_parse_parsemoney", "label": "parseMoney()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L133"}, {"id": "utils_protocol_standard_import_parse_parsescore", "label": "parseScore()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L140"}, {"id": "utils_protocol_standard_import_parse_ismaternalbloodempty", "label": "isMaternalBloodEmpty()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L144"}, {"id": "utils_protocol_standard_import_parse_resolvesamplecollecthint", "label": "resolveSampleCollectHint()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L150"}, {"id": "utils_protocol_standard_import_parse_resolvesamplecodehint", "label": "resolveSampleCodeHint()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L161"}, {"id": "utils_protocol_standard_import_parse_upsertsamplehint", "label": "upsertSampleHint()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L177"}, {"id": "utils_protocol_standard_import_parse_earliestcollecttime", "label": "earliestCollectTime()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L190"}, {"id": "utils_protocol_standard_import_parse_parsepaymodefromtext", "label": "parsePayModeFromText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L197"}, {"id": "utils_protocol_standard_import_parse_parsepaymenttransfersegments", "label": "parsePaymentTransferSegments()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L211"}, {"id": "utils_protocol_standard_import_parse_resolvetransfertypecode", "label": "resolveTransferTypeCode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L260"}, {"id": "utils_protocol_standard_import_parse_extractcarriernamefromtransport", "label": "extractCarrierNameFromTransport()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L289"}, {"id": "utils_protocol_standard_import_parse_parseprotocolstandardimporttext", "label": "parseProtocolStandardImportText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-standard-import-parse.ts", "source_location": "L296"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_standard_imLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_pay_mode_switch_ts", "label": "protocol-pay-mode-switch.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L1"}, {"id": "utils_protocol_pay_mode_switch_ispaydetaillocked", "label": "isPayDetailLocked()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L34"}, {"id": "utils_protocol_pay_mode_switch_markpaydetaillocks", "label": "markPayDetailLocks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L39"}, {"id": "utils_protocol_pay_mode_switch_sumpaidamount", "label": "sumPaidAmount()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L45"}, {"id": "utils_protocol_pay_mode_switch_calcremainingamount", "label": "calcRemainingAmount()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L51"}, {"id": "utils_protocol_pay_mode_switch_formatmoneysummary", "label": "formatMoneySummary()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L57"}, {"id": "utils_protocol_pay_mode_switch_activedetails", "label": "activeDetails()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L61"}, {"id": "utils_protocol_pay_mode_switch_hasblockingstatus", "label": "hasBlockingStatus()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L65"}, {"id": "utils_protocol_pay_mode_switch_countbystatus", "label": "countByStatus()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L69"}, {"id": "utils_protocol_pay_mode_switch_buildinstallmentdetails", "label": "buildInstallmentDetails()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L73"}, {"id": "utils_protocol_pay_mode_switch_createpaymentdetailrow", "label": "createPaymentDetailRow()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L102"}, {"id": "utils_protocol_pay_mode_switch_evaluatepaymodeswitch", "label": "evaluatePayModeSwitch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L126"}, {"id": "utils_protocol_pay_mode_switch_applypaymodeswitch", "label": "applyPayModeSwitch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L208"}, {"id": "utils_protocol_pay_mode_switch_canaddpaymentdetail", "label": "canAddPaymentDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L244"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_pay_mode_switch_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_installment", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_pay_mode_switch_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_payment_presets", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_pay_mode_switch_ts", "target": "utils_protocol_pay_mode_switch_ispaydetaillocked", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L34", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_pay_mode_switch_ts", "target": "utils_protocol_pay_mode_switch_markpaydetaillocks", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts", "source_location": "L39", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_pay_mode_switch_ts", "target": "utils_protocol_payLine truncated
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 采集协议单 · 缴费模式切换(dj ↔ fq)
|
||||
* 采集协议单 · 缴费模式切换(dj / fq / djfq)
|
||||
* 规则见 docs/superpowers/specs/2026-06-04-protocol-pay-mode-switch-design.md
|
||||
*/
|
||||
|
||||
@@ -8,8 +8,9 @@ import {
|
||||
DEFAULT_INSTALLMENT_ADVANCE_DAYS,
|
||||
defaultInstallmentAmounts
|
||||
} from '@/utils/protocol-payment-installment'
|
||||
import { type PayMode, isInstallmentPayMode } from '@/utils/protocol-payment-presets'
|
||||
|
||||
export type PayMode = 'dj' | 'fq'
|
||||
export type { PayMode }
|
||||
export type DetailLike = Record<string, any>
|
||||
|
||||
const LOCKED_STATUSES = new Set(['jfqrz', 'yjf', 'tfqrz', 'ytf'])
|
||||
@@ -69,6 +70,35 @@ function countByStatus(details: DetailLike[], status: string): number {
|
||||
return details.filter((d) => String(d.payStatus || 'dfj') === status).length
|
||||
}
|
||||
|
||||
function buildInstallmentDetails(
|
||||
ctx: PayModeSwitchContext,
|
||||
rows: DetailLike[]
|
||||
): DetailLike[] {
|
||||
const count = Number(ctx.installmentCount) || 6
|
||||
const interval = Number(ctx.installmentIntervalMonths) || 6
|
||||
const startDate = ctx.installmentStartDate || ''
|
||||
const advanceDays = Number(ctx.installmentAdvanceDays ?? DEFAULT_INSTALLMENT_ADVANCE_DAYS)
|
||||
const amounts =
|
||||
ctx.installmentRatios?.length && sumPaidAmount(rows) === 0
|
||||
? ctx.installmentRatios.map((v) => Number(v || 0))
|
||||
: defaultInstallmentAmounts(ctx.contractAmount, count)
|
||||
const result: DetailLike[] = []
|
||||
for (let i = 0; i < count; i++) {
|
||||
result.push(
|
||||
createPaymentDetailRow({
|
||||
dueAmount: amounts[i] ?? null,
|
||||
installmentNo: i + 1,
|
||||
installmentDueDate:
|
||||
startDate && interval
|
||||
? calcFqInstallmentDueDate(startDate, i, interval, advanceDays)
|
||||
: '',
|
||||
expanded: i === 0
|
||||
})
|
||||
)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export function createPaymentDetailRow(options: {
|
||||
dueAmount: number | null
|
||||
installmentDueDate?: string
|
||||
@@ -110,7 +140,7 @@ export function evaluatePayModeSwitch(
|
||||
}
|
||||
}
|
||||
|
||||
if (fromMode === 'dj' && toMode === 'fq') {
|
||||
if (fromMode === 'dj' && isInstallmentPayMode(toMode)) {
|
||||
if (rows.some((d) => isPayDetailLocked(d))) {
|
||||
return {
|
||||
action: 'blocked',
|
||||
@@ -118,13 +148,14 @@ export function evaluatePayModeSwitch(
|
||||
}
|
||||
}
|
||||
const count = ctx.installmentCount || 6
|
||||
const label = toMode === 'djfq' ? '趸交+分期' : '分期'
|
||||
return {
|
||||
action: 'confirm',
|
||||
summary: `将清除当前趸交计划,按 ${count} 期分期重新生成缴费明细。是否继续?`
|
||||
summary: `将清除当前趸交计划,按 ${count} 期${label}重新生成缴费明细。是否继续?`
|
||||
}
|
||||
}
|
||||
|
||||
if (fromMode === 'fq' && toMode === 'dj') {
|
||||
if (isInstallmentPayMode(fromMode) && toMode === 'dj') {
|
||||
const dfjCount = countByStatus(rows, 'dfj')
|
||||
const yjfCount = countByStatus(rows, 'yjf')
|
||||
|
||||
@@ -156,6 +187,21 @@ export function evaluatePayModeSwitch(
|
||||
}
|
||||
}
|
||||
|
||||
if (isInstallmentPayMode(fromMode) && isInstallmentPayMode(toMode) && fromMode !== toMode) {
|
||||
if (rows.some((d) => isPayDetailLocked(d))) {
|
||||
return {
|
||||
action: 'blocked',
|
||||
reason: '分期已有缴费记录,无法切换分期类型。'
|
||||
}
|
||||
}
|
||||
const count = ctx.installmentCount || 6
|
||||
const label = toMode === 'djfq' ? '趸交+分期' : '分期'
|
||||
return {
|
||||
action: 'confirm',
|
||||
summary: `将按 ${count} 期${label}重新生成缴费明细。是否继续?`
|
||||
}
|
||||
}
|
||||
|
||||
return { action: 'noop' }
|
||||
}
|
||||
|
||||
@@ -167,33 +213,11 @@ export function applyPayModeSwitch(
|
||||
): DetailLike[] {
|
||||
const rows = activeDetails(details)
|
||||
|
||||
if (fromMode === 'dj' && toMode === 'fq') {
|
||||
const count = Number(ctx.installmentCount) || 6
|
||||
const interval = Number(ctx.installmentIntervalMonths) || 6
|
||||
const startDate = ctx.installmentStartDate || ''
|
||||
const advanceDays = Number(ctx.installmentAdvanceDays ?? DEFAULT_INSTALLMENT_ADVANCE_DAYS)
|
||||
const amounts =
|
||||
ctx.installmentRatios?.length && sumPaidAmount(rows) === 0
|
||||
? ctx.installmentRatios.map((v) => Number(v || 0))
|
||||
: defaultInstallmentAmounts(ctx.contractAmount, count)
|
||||
const result: DetailLike[] = []
|
||||
for (let i = 0; i < count; i++) {
|
||||
result.push(
|
||||
createPaymentDetailRow({
|
||||
dueAmount: amounts[i] ?? null,
|
||||
installmentNo: i + 1,
|
||||
installmentDueDate:
|
||||
startDate && interval
|
||||
? calcFqInstallmentDueDate(startDate, i, interval, advanceDays)
|
||||
: '',
|
||||
expanded: i === 0
|
||||
})
|
||||
)
|
||||
}
|
||||
return result
|
||||
if (fromMode === 'dj' && isInstallmentPayMode(toMode)) {
|
||||
return buildInstallmentDetails(ctx, rows)
|
||||
}
|
||||
|
||||
if (fromMode === 'fq' && toMode === 'dj') {
|
||||
if (isInstallmentPayMode(fromMode) && toMode === 'dj') {
|
||||
const yjfRows = rows
|
||||
.filter((d) => String(d.payStatus) === 'yjf')
|
||||
.map((d) => ({ ...d, _payModeLocked: true }))
|
||||
@@ -209,14 +233,14 @@ export function applyPayModeSwitch(
|
||||
return [...yjfRows, newDjRow]
|
||||
}
|
||||
|
||||
if (isInstallmentPayMode(fromMode) && isInstallmentPayMode(toMode) && fromMode !== toMode) {
|
||||
return buildInstallmentDetails(ctx, rows)
|
||||
}
|
||||
|
||||
return rows
|
||||
}
|
||||
|
||||
/** 趸交模式下是否还可添加待缴明细 */
|
||||
export function canAddPaymentDetail(payMode: string, details: DetailLike[]): boolean {
|
||||
if (payMode === 'fq') return true
|
||||
const dfjCount = details.filter(
|
||||
(d) => !isPayDetailLocked(d) && String(d.payStatus || 'dfj') === 'dfj'
|
||||
).length
|
||||
return dfjCount < 1
|
||||
/** 趸交与分期均允许多条缴费明细(合计须等于合同金额) */
|
||||
export function canAddPaymentDetail(_payMode: string, _details: DetailLike[]): boolean {
|
||||
return true
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
/** 分期缴费:期数对齐、应缴日/金额计算(与 ProtocolFormDialog 逻辑一致) */
|
||||
|
||||
import { isInstallmentPayMode } from '@/utils/protocol-payment-presets'
|
||||
|
||||
const DAYS_PER_MONTH = 30
|
||||
|
||||
export const DEFAULT_INSTALLMENT_ADVANCE_DAYS = 30
|
||||
@@ -311,7 +313,7 @@ export function alignFqPaymentDetailsForDisplay(
|
||||
payment: PaymentLike,
|
||||
details: DetailLike[]
|
||||
): DetailLike[] {
|
||||
if (!payment || payment.payMode !== 'fq') return details
|
||||
if (!payment || !isInstallmentPayMode(String(payment.payMode || ''))) return details
|
||||
const count = Number(payment.installmentCount)
|
||||
if (!count || count < 1) return details
|
||||
|
||||
@@ -396,7 +398,7 @@ export function syncFqPaymentDetailRowCount(
|
||||
},
|
||||
paymentDetails: DetailLike[]
|
||||
): void {
|
||||
if (payment.payMode !== 'fq') return
|
||||
if (!isInstallmentPayMode(payment.payMode)) return
|
||||
const count = Number(payment.installmentCount)
|
||||
if (!count || count < 1) return
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/** 采集协议单 · 缴费默认定价表(样本数 × 缴费模式) */
|
||||
|
||||
export type PayMode = 'dj' | 'fq' | 'djfq'
|
||||
|
||||
export type PaymentPreset = {
|
||||
contractAmount: number
|
||||
installmentCount?: number
|
||||
installmentAmounts?: number[]
|
||||
}
|
||||
|
||||
const PRESETS: Record<1 | 2, Partial<Record<PayMode, PaymentPreset>>> = {
|
||||
1: {
|
||||
dj: { contractAmount: 22880 },
|
||||
fq: {
|
||||
contractAmount: 25880,
|
||||
installmentCount: 6,
|
||||
installmentAmounts: [6480, 3880, 3880, 3880, 3880, 3880]
|
||||
}
|
||||
},
|
||||
2: {
|
||||
dj: { contractAmount: 37880 },
|
||||
djfq: {
|
||||
contractAmount: 41000,
|
||||
installmentCount: 4,
|
||||
installmentAmounts: [29360, 3880, 3880, 3880]
|
||||
},
|
||||
fq: {
|
||||
contractAmount: 44000,
|
||||
installmentCount: 5,
|
||||
installmentAmounts: [12960, 7760, 7760, 7760, 7760]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function getActiveSampleCount(samples: Array<{ sampleStatus?: string }>): 1 | 2 {
|
||||
const n = samples.filter((s) => String(s.sampleStatus || '') !== 'yzf').length
|
||||
return (n >= 2 ? 2 : 1) as 1 | 2
|
||||
}
|
||||
|
||||
export function resolvePaymentPreset(
|
||||
sampleCount: 1 | 2,
|
||||
payMode: PayMode
|
||||
): PaymentPreset | null {
|
||||
return PRESETS[sampleCount]?.[payMode] ?? null
|
||||
}
|
||||
|
||||
export function isInstallmentPayMode(payMode: string): boolean {
|
||||
return payMode === 'fq' || payMode === 'djfq'
|
||||
}
|
||||
|
||||
export function availablePayModes(sampleCount: 1 | 2): PayMode[] {
|
||||
return sampleCount === 2 ? ['dj', 'djfq', 'fq'] : ['dj', 'fq']
|
||||
}
|
||||
|
||||
/** 校验缴费模式与样本数是否匹配(如 djfq 仅双样本) */
|
||||
export function isPayModeValidForSampleCount(payMode: PayMode, sampleCount: 1 | 2): boolean {
|
||||
return availablePayModes(sampleCount).includes(payMode)
|
||||
}
|
||||
@@ -40,7 +40,7 @@ export type ProtocolStandardImportParsed = {
|
||||
medicalStaff?: string
|
||||
hospitalName?: string
|
||||
salesUserName?: string
|
||||
payMode: 'dj' | 'fq'
|
||||
payMode: 'dj' | 'fq' | 'djfq'
|
||||
contractAmount?: number | null
|
||||
transferTypeLabel?: string
|
||||
paymentTransfers: ProtocolPaymentTransferHint[]
|
||||
@@ -193,12 +193,13 @@ function earliestCollectTime(hints: ProtocolSampleImportHint[]): string | undefi
|
||||
return times.sort((a, b) => a.localeCompare(b))[0]
|
||||
}
|
||||
|
||||
/** 缴费方式:仅「分期」为 fq,其余(含微信/趸交)均为 dj */
|
||||
/** 缴费方式:趸交+分期 → djfq;仅「分期」→ fq;其余 → dj */
|
||||
export function parsePayModeFromText(value: string): {
|
||||
payMode: 'dj' | 'fq'
|
||||
payMode: 'dj' | 'fq' | 'djfq' | 'djfq'
|
||||
transferLabel?: string
|
||||
} {
|
||||
const v = (value || '').trim()
|
||||
if (/趸交\s*[++]\s*分期|趸交.*分期/.test(v)) return { payMode: 'djfq' }
|
||||
if (/分期/.test(v)) return { payMode: 'fq' }
|
||||
if (/微信|支付宝|银行卡|银行|现金/.test(v)) {
|
||||
return { payMode: 'dj', transferLabel: v }
|
||||
|
||||
@@ -117,7 +117,8 @@ export const auditStatusTagType = createTagTypeGetter(auditStatus)
|
||||
|
||||
export const payMode: StatusRegistry = {
|
||||
dj: { label: '趸交', tagType: 'primary' },
|
||||
fq: { label: '分期', tagType: 'warning' }
|
||||
fq: { label: '分期', tagType: 'warning' },
|
||||
djfq: { label: '趸交+分期', tagType: 'warning' }
|
||||
}
|
||||
export const payModeLabel = createLabelGetter(payMode)
|
||||
export const payModeTagType = createTagTypeGetter(payMode)
|
||||
|
||||
@@ -529,10 +529,19 @@
|
||||
<div class="section-subtitle">缴费主表</div>
|
||||
<div class="form-grid form-grid--col6">
|
||||
<el-form-item label="缴费模式">
|
||||
<el-radio-group v-model="formData.payMode" @change="onPayModeChange">
|
||||
<el-radio label="dj">趸交</el-radio>
|
||||
<el-radio label="fq">分期</el-radio>
|
||||
</el-radio-group>
|
||||
<el-select
|
||||
v-model="formData.payMode"
|
||||
placeholder="请选择缴费模式"
|
||||
style="width: 100%"
|
||||
@change="onPayModeChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="opt in payModeOptions"
|
||||
:key="opt.value"
|
||||
:label="opt.label"
|
||||
:value="opt.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同金额(元)">
|
||||
<AmountInput
|
||||
@@ -556,7 +565,7 @@
|
||||
/>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-if="formData.payMode === 'fq'">
|
||||
<template v-if="isInstallmentPayMode(formData.payMode)">
|
||||
<el-form-item label="分期期数">
|
||||
<el-input
|
||||
v-model="formData.installmentCount"
|
||||
@@ -602,39 +611,6 @@
|
||||
</el-form-item>
|
||||
</template>
|
||||
</div>
|
||||
<div v-if="formData.payMode === 'fq'" class="installment-amounts-row">
|
||||
<el-form-item label="分期金额(元)" class="installment-amounts-field">
|
||||
<div class="installment-amounts-cells">
|
||||
<div
|
||||
v-for="(_amount, rIdx) in formData.installmentRatios"
|
||||
:key="rIdx"
|
||||
class="installment-amount-cell"
|
||||
>
|
||||
<span class="installment-amount-cell-no">{{ rIdx + 1 }}期</span>
|
||||
<AmountInput
|
||||
v-model="formData.installmentRatios[rIdx]"
|
||||
:min="0"
|
||||
placeholder="金额"
|
||||
@change="onInstallmentAmountChange(rIdx)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<div class="installment-amounts-summary-row">
|
||||
<span
|
||||
class="installment-amounts-sum"
|
||||
:class="{ 'is-error': !!installmentAmountsError }"
|
||||
>
|
||||
合计 {{ fmtMoney(installmentAmountsSum) }}
|
||||
<template v-if="formData.contractAmount != null">
|
||||
/ 合同 {{ fmtMoney(formData.contractAmount) }}
|
||||
</template>
|
||||
</span>
|
||||
<div v-if="installmentAmountsError" class="form-tip form-tip--error">
|
||||
{{ installmentAmountsError }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 缴费明细 -->
|
||||
@@ -693,7 +669,7 @@
|
||||
type="danger"
|
||||
size="small"
|
||||
class="detail-delete"
|
||||
@click.stop="formData.paymentDetails.splice(dIdx, 1)"
|
||||
@click.stop="removePaymentDetail(dIdx)"
|
||||
>
|
||||
<el-icon><Delete /></el-icon>
|
||||
</el-button>
|
||||
@@ -963,22 +939,28 @@
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import {
|
||||
DEFAULT_INSTALLMENT_ADVANCE_DAYS,
|
||||
isInstallmentAmountsValid,
|
||||
normalizeInstallmentAmounts,
|
||||
resizeInstallmentAmounts,
|
||||
scaleInstallmentAmountsToContract,
|
||||
sumInstallmentAmounts,
|
||||
syncFqPaymentDetailRowCount
|
||||
} from '@/utils/protocol-payment-installment'
|
||||
import {
|
||||
applyPayModeSwitch,
|
||||
canAddPaymentDetail,
|
||||
createPaymentDetailRow,
|
||||
evaluatePayModeSwitch,
|
||||
isPayDetailLocked,
|
||||
markPayDetailLocks,
|
||||
sumPaidAmount,
|
||||
type PayMode
|
||||
} from '@/utils/protocol-pay-mode-switch'
|
||||
import {
|
||||
availablePayModes,
|
||||
getActiveSampleCount,
|
||||
isInstallmentPayMode,
|
||||
isPayModeValidForSampleCount,
|
||||
resolvePaymentPreset,
|
||||
type PayMode as PresetPayMode
|
||||
} from '@/utils/protocol-payment-presets'
|
||||
import {
|
||||
applyFqParamsChange,
|
||||
evaluateFqParamsChange,
|
||||
@@ -1019,6 +1001,21 @@
|
||||
/** 上次确认生效的缴费模式(用于切换取消/拦截时回滚) */
|
||||
const lastConfirmedPayMode = ref<PayMode>('dj')
|
||||
|
||||
const activeSampleCount = computed(() => getActiveSampleCount(formData.samples))
|
||||
|
||||
const payModeOptions = computed(() => {
|
||||
const modes = [...availablePayModes(activeSampleCount.value)]
|
||||
const current = String(formData.payMode || '') as PresetPayMode
|
||||
if (current && !modes.includes(current)) {
|
||||
modes.push(current)
|
||||
}
|
||||
return modes.map((value) => ({ value, label: payModeLabel(value) }))
|
||||
})
|
||||
|
||||
function hasLockedPaymentDetails() {
|
||||
return formData.paymentDetails.some((d) => isPayDetailLocked(d))
|
||||
}
|
||||
|
||||
/** 上次确认生效的分期参数(用于编辑时修改期数/间隔/开始时间回滚) */
|
||||
const lastConfirmedFqParams = ref<FqParams>({
|
||||
installmentCount: null,
|
||||
@@ -1357,6 +1354,9 @@
|
||||
|
||||
function scrollToSection(key: string) {
|
||||
activeFormTab.value = key
|
||||
if (key === 'payment') {
|
||||
maybeApplyPaymentPresetOnTabEnter()
|
||||
}
|
||||
const el = document.getElementById(`form-section-${key}`)
|
||||
if (el) {
|
||||
el.scrollIntoView({ behavior: 'smooth', block: 'start' })
|
||||
@@ -1386,6 +1386,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
function removePaymentDetail(dIdx: number) {
|
||||
const detail = formData.paymentDetails[dIdx]
|
||||
if (detail && isPayDetailLocked(detail)) return
|
||||
formData.paymentDetails.splice(dIdx, 1)
|
||||
syncContractAmountFromPaymentDetails()
|
||||
}
|
||||
|
||||
function addPaymentDetail() {
|
||||
if (!canAddPaymentDetail(formData.payMode, formData.paymentDetails)) return
|
||||
const now = new Date()
|
||||
@@ -1446,8 +1453,13 @@
|
||||
*/
|
||||
function applyFqPaymentDefaults(options?: { resetCountInterval?: boolean }) {
|
||||
const reset = options?.resetCountInterval ?? false
|
||||
const sampleCount = getActiveSampleCount(formData.samples)
|
||||
const preset = resolvePaymentPreset(sampleCount, formData.payMode as PresetPayMode)
|
||||
if (preset?.contractAmount != null) {
|
||||
formData.contractAmount = preset.contractAmount
|
||||
}
|
||||
if (reset || isFqNumericFieldEmpty(formData.installmentCount)) {
|
||||
formData.installmentCount = 6
|
||||
formData.installmentCount = preset?.installmentCount ?? 6
|
||||
}
|
||||
if (reset || isFqNumericFieldEmpty(formData.installmentIntervalMonths)) {
|
||||
formData.installmentIntervalMonths = 6
|
||||
@@ -1459,11 +1471,58 @@
|
||||
formData.installmentAdvanceDays = DEFAULT_INSTALLMENT_ADVANCE_DAYS
|
||||
}
|
||||
const count = toIntOrUndefined(formData.installmentCount) || 6
|
||||
formData.installmentRatios = normalizeInstallmentAmounts(
|
||||
formData.installmentRatios || [],
|
||||
formData.contractAmount,
|
||||
count
|
||||
)
|
||||
if (preset?.installmentAmounts?.length) {
|
||||
formData.installmentRatios = [...preset.installmentAmounts]
|
||||
} else {
|
||||
formData.installmentRatios = normalizeInstallmentAmounts(
|
||||
formData.installmentRatios || [],
|
||||
formData.contractAmount,
|
||||
count
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
function applyPaymentPresetForMode(payMode: PresetPayMode) {
|
||||
const sampleCount = getActiveSampleCount(formData.samples)
|
||||
const preset = resolvePaymentPreset(sampleCount, payMode)
|
||||
if (!preset) return
|
||||
formData.contractAmount = preset.contractAmount
|
||||
if (isInstallmentPayMode(payMode) && preset.installmentCount) {
|
||||
formData.installmentCount = preset.installmentCount
|
||||
if (isFqNumericFieldEmpty(formData.installmentIntervalMonths)) {
|
||||
formData.installmentIntervalMonths = 6
|
||||
}
|
||||
if (!formData.installmentStartDate) {
|
||||
formData.installmentStartDate = defaultInstallmentStartDateYmd()
|
||||
}
|
||||
if (formData.installmentAdvanceDays == null) {
|
||||
formData.installmentAdvanceDays = DEFAULT_INSTALLMENT_ADVANCE_DAYS
|
||||
}
|
||||
formData.installmentRatios = [...(preset.installmentAmounts || [])]
|
||||
formData.paymentDetails = generateInitialFqDetails(
|
||||
getFqParamsFromForm(),
|
||||
preset.contractAmount
|
||||
)
|
||||
initPaymentDetailExpandFlags(formData.paymentDetails)
|
||||
markPayDetailLocks(formData.paymentDetails)
|
||||
syncLastConfirmedFqParams()
|
||||
} else {
|
||||
formData.paymentDetails = [
|
||||
createPaymentDetailRow({
|
||||
dueAmount: preset.contractAmount,
|
||||
installmentDueDate: formData.lumpSumDeadline || '',
|
||||
expanded: true
|
||||
})
|
||||
]
|
||||
initPaymentDetailExpandFlags(formData.paymentDetails)
|
||||
markPayDetailLocks(formData.paymentDetails)
|
||||
}
|
||||
}
|
||||
|
||||
function maybeApplyPaymentPresetOnTabEnter() {
|
||||
if (hasLockedPaymentDetails()) return
|
||||
if (formData.paymentDetails.length > 0) return
|
||||
applyPaymentPresetForMode(formData.payMode as PresetPayMode)
|
||||
}
|
||||
|
||||
function toIntOrUndefined(val: unknown): number | undefined {
|
||||
@@ -1529,7 +1588,7 @@
|
||||
* 与缴费模式切换独立;保留 yjf 已缴行,作废原 dfj 后按剩余金额重建。
|
||||
*/
|
||||
async function handleFqParamsChange() {
|
||||
if (formData.payMode !== 'fq') return
|
||||
if (formData.payMode !== 'fq' && formData.payMode !== 'djfq') return
|
||||
|
||||
const newParams = getFqParamsFromForm()
|
||||
const oldParams = lastConfirmedFqParams.value
|
||||
@@ -1625,25 +1684,35 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (toMode === 'fq') {
|
||||
applyFqPaymentDefaults({ resetCountInterval: false })
|
||||
if (!hasLockedPaymentDetails()) {
|
||||
applyPaymentPresetForMode(toMode as PresetPayMode)
|
||||
} else {
|
||||
if (isInstallmentPayMode(toMode)) {
|
||||
applyFqPaymentDefaults({ resetCountInterval: fromMode === 'dj' })
|
||||
}
|
||||
formData.paymentDetails = applyPayModeSwitch(
|
||||
fromMode,
|
||||
toMode,
|
||||
formData.paymentDetails,
|
||||
payModeSwitchContext()
|
||||
)
|
||||
initPaymentDetailExpandFlags(formData.paymentDetails)
|
||||
markPayDetailLocks(formData.paymentDetails)
|
||||
const preset = resolvePaymentPreset(
|
||||
getActiveSampleCount(formData.samples),
|
||||
toMode as PresetPayMode
|
||||
)
|
||||
if (preset?.contractAmount != null) {
|
||||
formData.contractAmount = preset.contractAmount
|
||||
}
|
||||
}
|
||||
|
||||
formData.paymentDetails = applyPayModeSwitch(
|
||||
fromMode,
|
||||
toMode,
|
||||
formData.paymentDetails,
|
||||
payModeSwitchContext()
|
||||
)
|
||||
initPaymentDetailExpandFlags(formData.paymentDetails)
|
||||
markPayDetailLocks(formData.paymentDetails)
|
||||
|
||||
if (toMode === 'dj') {
|
||||
syncLumpSumDueDate()
|
||||
}
|
||||
|
||||
lastConfirmedPayMode.value = toMode
|
||||
if (toMode === 'fq') {
|
||||
if (isInstallmentPayMode(toMode)) {
|
||||
syncLastConfirmedFqParams()
|
||||
}
|
||||
}
|
||||
@@ -1770,7 +1839,7 @@
|
||||
if (loadedAmounts.length) {
|
||||
formData.installmentRatios = loadedAmounts.map((v: unknown) => Number(v))
|
||||
}
|
||||
if (formData.payMode === 'fq') {
|
||||
if (isInstallmentPayMode(formData.payMode)) {
|
||||
applyFqPaymentDefaults()
|
||||
const count = toIntOrUndefined(formData.installmentCount) || 6
|
||||
formData.installmentRatios = normalizeInstallmentAmounts(
|
||||
@@ -1793,7 +1862,9 @@
|
||||
markPayDetailLocks(formData.paymentDetails)
|
||||
}
|
||||
syncFqPaymentDetailRowCount(fqPaymentContext(), formData.paymentDetails)
|
||||
lastConfirmedPayMode.value = (formData.payMode === 'fq' ? 'fq' : 'dj') as PayMode
|
||||
lastConfirmedPayMode.value = (
|
||||
['fq', 'djfq'].includes(formData.payMode) ? formData.payMode : 'dj'
|
||||
) as PayMode
|
||||
|
||||
const pa =
|
||||
(row as any).protocolAttachments || (bundle.protocol as any)?.protocolAttachments || ''
|
||||
@@ -1880,16 +1951,16 @@
|
||||
async function handleSubmit() {
|
||||
if (!formRef.value) return
|
||||
await formRef.value.validate()
|
||||
if (formData.payMode === 'fq') {
|
||||
if (installmentAmountsError.value) {
|
||||
await ElMessageBox.alert(installmentAmountsError.value, '分期金额无效', { type: 'warning' })
|
||||
return
|
||||
}
|
||||
const amounts = (formData.installmentRatios || []).map((v) => Number(v || 0))
|
||||
if (!isInstallmentAmountsValid(amounts, formData.contractAmount)) {
|
||||
await ElMessageBox.alert('分期金额合计须等于合同金额', '分期金额无效', { type: 'warning' })
|
||||
return
|
||||
}
|
||||
const sampleCount = getActiveSampleCount(formData.samples)
|
||||
if (!isPayModeValidForSampleCount(formData.payMode as PresetPayMode, sampleCount)) {
|
||||
await ElMessageBox.alert(
|
||||
formData.payMode === 'djfq'
|
||||
? '「趸交+分期」仅适用于 2 个样本,请切换缴费模式'
|
||||
: '当前缴费模式与样本数量不匹配,请切换缴费模式',
|
||||
'无法保存',
|
||||
{ type: 'warning' }
|
||||
)
|
||||
return
|
||||
}
|
||||
if (!isEdit.value) {
|
||||
for (const sampleRow of formData.samples) {
|
||||
@@ -1969,8 +2040,7 @@
|
||||
installmentIntervalMonths: toFloatOrUndefined(formData.installmentIntervalMonths),
|
||||
installmentStartDate: formData.installmentStartDate || undefined,
|
||||
installmentAdvanceDays: toIntOrUndefined(formData.installmentAdvanceDays),
|
||||
installmentRatios:
|
||||
formData.payMode === 'fq'
|
||||
installmentRatios: isInstallmentPayMode(formData.payMode)
|
||||
? (formData.installmentRatios || []).map((v) => Number(v || 0))
|
||||
: undefined
|
||||
},
|
||||
@@ -2596,7 +2666,7 @@
|
||||
formData.payMode = parsed.payMode || 'dj'
|
||||
lastConfirmedPayMode.value = formData.payMode as PayMode
|
||||
|
||||
if (parsed.payMode === 'fq') {
|
||||
if (isInstallmentPayMode(parsed.payMode || 'dj')) {
|
||||
applyFqPaymentDefaults()
|
||||
}
|
||||
|
||||
@@ -3111,38 +3181,32 @@
|
||||
handleFqParamsChange()
|
||||
}
|
||||
|
||||
function onInstallmentAmountChange(_changedIdx: number) {
|
||||
syncPaymentDueAmounts()
|
||||
handleFqParamsChange()
|
||||
/** 缴费明细应缴金额之和回写合同金额 */
|
||||
function syncContractAmountFromPaymentDetails() {
|
||||
if (!formData.paymentDetails.length) return
|
||||
const total = formData.paymentDetails.reduce(
|
||||
(sum, d) => sum + (Number(d.dueAmount) || 0),
|
||||
0
|
||||
)
|
||||
formData.contractAmount = Math.round(total * 100) / 100
|
||||
}
|
||||
|
||||
/** 缴费明细应缴金额变更:分期模式下回写分期金额,保持与主表一致 */
|
||||
/** 缴费明细应缴金额变更:分期回写 installmentRatios,并同步合同金额 */
|
||||
function onPaymentDetailDueAmountChange(dIdx: number) {
|
||||
if (formData.payMode !== 'fq') return
|
||||
const detail = formData.paymentDetails[dIdx]
|
||||
if (!detail || isPayDetailLocked(detail)) return
|
||||
const installmentNo = Number(detail.installmentNo)
|
||||
const ratioIdx = installmentNo >= 1 ? installmentNo - 1 : dIdx
|
||||
if (!formData.installmentRatios) formData.installmentRatios = []
|
||||
while (formData.installmentRatios.length <= ratioIdx) {
|
||||
formData.installmentRatios.push(0)
|
||||
if (formData.payMode === 'fq' || formData.payMode === 'djfq') {
|
||||
const installmentNo = Number(detail.installmentNo)
|
||||
const ratioIdx = installmentNo >= 1 ? installmentNo - 1 : dIdx
|
||||
if (!formData.installmentRatios) formData.installmentRatios = []
|
||||
while (formData.installmentRatios.length <= ratioIdx) {
|
||||
formData.installmentRatios.push(0)
|
||||
}
|
||||
formData.installmentRatios[ratioIdx] = Number(detail.dueAmount) || 0
|
||||
}
|
||||
formData.installmentRatios[ratioIdx] = Number(detail.dueAmount) || 0
|
||||
syncContractAmountFromPaymentDetails()
|
||||
}
|
||||
|
||||
const installmentAmountsError = computed(() => {
|
||||
const amounts = formData.installmentRatios || []
|
||||
if (!amounts.length || formData.contractAmount == null) return ''
|
||||
if (amounts.some((v) => Number(v) < 0)) return '分期金额不能为负数'
|
||||
const sum = sumInstallmentAmounts(amounts)
|
||||
if (Math.abs(sum - Number(formData.contractAmount)) > 0.01) {
|
||||
return `分期金额合计须等于合同金额(${fmtMoney(formData.contractAmount)})`
|
||||
}
|
||||
return ''
|
||||
})
|
||||
|
||||
const installmentAmountsSum = computed(() => sumInstallmentAmounts(formData.installmentRatios || []))
|
||||
|
||||
/** 按缴费模式同步各明细应缴费金额(跳过已锁定明细) */
|
||||
function syncPaymentDueAmounts() {
|
||||
const contract = formData.contractAmount
|
||||
@@ -3159,14 +3223,14 @@
|
||||
})
|
||||
return
|
||||
}
|
||||
if (formData.payMode === 'fq') {
|
||||
const count = formData.installmentCount || formData.paymentDetails.length
|
||||
if (formData.payMode === 'fq' || formData.payMode === 'djfq') {
|
||||
const count = Number(formData.installmentCount || formData.paymentDetails.length)
|
||||
if (!count) return
|
||||
const amounts = normalizeInstallmentAmounts(
|
||||
formData.installmentRatios || [],
|
||||
contract,
|
||||
Number(count)
|
||||
)
|
||||
const ratios = formData.installmentRatios || []
|
||||
const amounts =
|
||||
ratios.length === count
|
||||
? ratios.map((v) => Number(v || 0))
|
||||
: normalizeInstallmentAmounts(ratios, null, count)
|
||||
const paidRows = formData.paymentDetails.filter((d) => String(d.payStatus) === 'yjf')
|
||||
paidRows.forEach((d) => {
|
||||
const no = Number(d.installmentNo)
|
||||
@@ -3179,37 +3243,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
/** 合同金额手动变更:等比缩放分期金额并同步应缴费金额 */
|
||||
/** 合同金额手动变更:趸交时同步待缴明细应缴金额 */
|
||||
function onContractAmountChange() {
|
||||
if (formData.payMode === 'fq' && (formData.installmentRatios || []).length) {
|
||||
formData.installmentRatios = scaleInstallmentAmountsToContract(
|
||||
formData.installmentRatios,
|
||||
formData.contractAmount
|
||||
)
|
||||
if (formData.payMode === 'dj') {
|
||||
syncPaymentDueAmounts()
|
||||
}
|
||||
syncPaymentDueAmounts()
|
||||
}
|
||||
|
||||
/** 根据非作废样本价格之和同步合同金额,并联动应缴费金额 */
|
||||
function syncContractAmount() {
|
||||
const total = formData.samples.reduce((sum, s) => {
|
||||
if (s.sampleStatus === 'yzf') return sum
|
||||
return sum + (Number(s.price) || 0)
|
||||
}, 0)
|
||||
const nextContract = Math.round(total * 100) / 100
|
||||
if (formData.payMode === 'fq' && (formData.installmentRatios || []).length) {
|
||||
formData.installmentRatios = scaleInstallmentAmountsToContract(
|
||||
formData.installmentRatios,
|
||||
nextContract
|
||||
)
|
||||
}
|
||||
formData.contractAmount = nextContract
|
||||
syncPaymentDueAmounts()
|
||||
}
|
||||
|
||||
/** 样本价格或状态变更 */
|
||||
/** 样本价格或状态变更(不自动改合同金额) */
|
||||
function onSamplePriceChange() {
|
||||
syncContractAmount()
|
||||
// 保留样本价格字段,不与合同金额联动
|
||||
}
|
||||
|
||||
/* ====== 母亲身份证号 ↔ 出生年月联动 ====== */
|
||||
@@ -3232,6 +3275,22 @@
|
||||
() => calcBirthFromIdCard()
|
||||
)
|
||||
|
||||
/** 样本数变化时按当前缴费模式刷新默认定价(新增单;无已缴锁定明细时整单重填) */
|
||||
watch(activeSampleCount, () => {
|
||||
if (isEdit.value) return
|
||||
if (hasLockedPaymentDetails()) {
|
||||
const preset = resolvePaymentPreset(
|
||||
getActiveSampleCount(formData.samples),
|
||||
formData.payMode as PresetPayMode
|
||||
)
|
||||
if (preset?.contractAmount != null) {
|
||||
formData.contractAmount = preset.contractAmount
|
||||
}
|
||||
return
|
||||
}
|
||||
applyPaymentPresetForMode(formData.payMode as PresetPayMode)
|
||||
})
|
||||
|
||||
/* ====== 趸交截止时间联动 ====== */
|
||||
watch(
|
||||
() => formData.lumpSumDeadline,
|
||||
|
||||
@@ -642,7 +642,7 @@
|
||||
><div class="pm-value">{{ formatYmd(payment?.lumpSumDeadline) }}</div></div
|
||||
>
|
||||
</template>
|
||||
<template v-if="payment?.payMode === 'fq'">
|
||||
<template v-if="isInstallmentPayMode(String(payment?.payMode || ''))">
|
||||
<div class="payment-metric"
|
||||
><div class="pm-label">分期期数</div
|
||||
><div class="pm-value">{{ dash(payment?.installmentCount) }}</div></div
|
||||
@@ -720,11 +720,11 @@
|
||||
<span class="info-label">转账时间</span>
|
||||
<span class="info-value">{{ dash(detail.transferTime) }}</span>
|
||||
</div>
|
||||
<div v-if="payment?.payMode === 'fq'" class="pdc-info-item">
|
||||
<div v-if="isInstallmentPayMode(String(payment?.payMode || ''))" class="pdc-info-item">
|
||||
<span class="info-label">应缴费时间</span>
|
||||
<span class="info-value">{{ formatYmd(detail.installmentDueDate) }}</span>
|
||||
</div>
|
||||
<div v-if="payment?.payMode === 'fq'" class="pdc-info-item">
|
||||
<div v-if="isInstallmentPayMode(String(payment?.payMode || ''))" class="pdc-info-item">
|
||||
<span class="info-label">分期期序号</span>
|
||||
<span class="info-value">{{ dash(detail.installmentNo) }}</span>
|
||||
</div>
|
||||
@@ -1111,6 +1111,7 @@
|
||||
import { loadTransferTypeDict, transferTypeLabel } from '@/utils/protocol-payment-labels'
|
||||
import { loadVoidTypeDict, voidTypeLabel } from '@/utils/void-type-dict'
|
||||
import { formatProtocolDocSubject } from '@/utils/protocol-doc-label'
|
||||
import { isInstallmentPayMode } from '@/utils/protocol-payment-presets'
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
@@ -1492,7 +1493,9 @@
|
||||
const steps: OverviewTimelineStep[] = details.map((d, i) => {
|
||||
const s = String(d.payStatus || '')
|
||||
const name =
|
||||
payment.value?.payMode === 'fq' ? `第${d.installmentNo || i + 1}期` : `缴费${i + 1}`
|
||||
isInstallmentPayMode(String(payment.value?.payMode || ''))
|
||||
? `第${d.installmentNo || i + 1}期`
|
||||
: `缴费${i + 1}`
|
||||
|
||||
if (s === 'ytf') {
|
||||
return {
|
||||
|
||||
+2
-1
@@ -183,6 +183,7 @@
|
||||
payStatusTagType
|
||||
} from '@/utils/status-tag-registry'
|
||||
import type { TagType } from '@/utils/status-tag-registry'
|
||||
import { isInstallmentPayMode } from '@/utils/protocol-payment-presets'
|
||||
|
||||
defineOptions({ name: 'QcWorkOrderProtocolPaymentPanel' })
|
||||
|
||||
@@ -198,7 +199,7 @@
|
||||
hideInstallmentDetailAmounts?: boolean
|
||||
}>()
|
||||
|
||||
const isInstallment = computed(() => props.summary?.payMode === 'fq')
|
||||
const isInstallment = computed(() => isInstallmentPayMode(props.summary?.payMode || ''))
|
||||
|
||||
const isLumpSum = computed(() => props.summary?.payMode === 'dj')
|
||||
|
||||
|
||||
Reference in new issue
Block a user