diff --git a/web-admin/src/views/crm/contract/components/ContractDetailDialog.vue b/web-admin/src/views/crm/contract/components/ContractDetailDialog.vue index a9bff9f0b..a90fe7487 100644 --- a/web-admin/src/views/crm/contract/components/ContractDetailDialog.vue +++ b/web-admin/src/views/crm/contract/components/ContractDetailDialog.vue @@ -890,6 +890,10 @@ import UploadDialog from './UploadDialog.vue'; import ContractFormDialog from './ContractFormDialog.vue'; import ViewKvTable from '@/components/business/system-view-dialog/ViewKvTable.vue'; import type { ViewField } from '@/components/business/system-view-dialog/types'; +import { + parseSettlementClauseDrafts, + resolveSettlementClauseContent +} from '../settlementClause'; const CustomerDetailDialog = defineAsyncComponent( () => import('@/views/crm/customer/CustomerDetailDialog.vue') @@ -1864,36 +1868,12 @@ const replacePlaceholders = (htmlContent: string, contractData: ContractVO | und '暂无产品信息'; // 定义替换映射表 - const getDefaultSettlementClauseContent = (method?: string): string => { - if (method === 'advance_payment') { - return '款到发货。需方付款后安排发货,需方收到货物后,供方开具13%增值税专用发票。'; - } - return '货到付款,需方收到供方货物后,供方开具13%增值税专用发票,无异议后,以现汇方式月结。'; - }; - const parseSettlementClauseDrafts = (raw?: string): Record => { - if (!raw) return {}; - try { - const parsed = JSON.parse(raw); - if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { - return {}; - } - const drafts: Record = {}; - Object.entries(parsed).forEach(([key, value]) => { - if (typeof value === 'string' && value.trim()) { - drafts[key] = value.trim(); - } - }); - return drafts; - } catch (error) { - console.warn('解析第五条草稿失败,使用默认文案', error); - return {}; - } - }; - const getSettlementClauseContent = (): string => { - const method = contractData.settlementMethod || 'arrive_payment'; - const drafts = parseSettlementClauseDrafts(contractData.settlementClauseDrafts); - return drafts[method] || getDefaultSettlementClauseContent(method); - }; + const getSettlementClauseContent = (): string => + resolveSettlementClauseContent({ + settlementMethod: contractData.settlementMethod, + settlementClauseDrafts: contractData.settlementClauseDrafts, + labelResolver: (method) => dictStore.getLabel('crm_settlement_method', method) || undefined + }); const replacements: Record = { // 合同基本信息 @@ -2068,26 +2048,6 @@ const extractFifthClauseContent = (htmlContent: string): string => { return content.replace(/\u00a0/g, ' ').trim(); }; -const parseSettlementClauseDrafts = (raw?: string): Record => { - if (!raw) return {}; - try { - const parsed = JSON.parse(raw); - if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { - return {}; - } - const drafts: Record = {}; - Object.entries(parsed).forEach(([key, value]) => { - if (typeof value === 'string' && value.trim()) { - drafts[key] = value.trim(); - } - }); - return drafts; - } catch (error) { - console.warn('解析第五条草稿失败,使用空草稿', error); - return {}; - } -}; - /** 生成合同HTML模版 */ const generateContractTemplate = (contractData: ContractVO | undefined): string => { if (!contractData) return ''; diff --git a/web-admin/src/views/crm/contract/detail.vue b/web-admin/src/views/crm/contract/detail.vue index 46992ca87..0e248c4fa 100644 --- a/web-admin/src/views/crm/contract/detail.vue +++ b/web-admin/src/views/crm/contract/detail.vue @@ -1085,6 +1085,10 @@ import TinyMceEditor from '@/components/TinyMceEditor/index.vue'; import { getOpportunity } from '@/api/crm/opportunity'; import { getQuote } from '@/api/crm/quote'; import { isFrameworkContractType, isContractEditableStatus, getContractReeditConfirmMessage } from './contractType'; +import { + parseSettlementClauseDrafts, + resolveSettlementClauseContent +} from './settlementClause'; import { parseCrmAttachmentField, resolveCrmAttachmentFiles, @@ -1415,38 +1419,12 @@ const handleGeneratePdf = async () => { } }; -const getDefaultSettlementClauseContent = (settlementMethod?: string): string => { - if (settlementMethod === 'advance_payment') { - return '款到发货。需方付款后安排发货,需方收到货物后,供方开具13%增值税专用发票。'; - } - return '货到付款,需方收到供方货物后,供方开具13%增值税专用发票,无异议后,以现汇方式月结。'; -}; - -const parseSettlementClauseDrafts = (raw?: string): Record => { - if (!raw) return {}; - try { - const parsed = JSON.parse(raw); - if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { - return {}; - } - const drafts: Record = {}; - Object.entries(parsed).forEach(([key, value]) => { - if (typeof value === 'string' && value.trim()) { - drafts[key] = value.trim(); - } - }); - return drafts; - } catch (error) { - console.warn('解析第五条草稿失败,回退到默认文案', error); - return {}; - } -}; - -const getSettlementClauseContent = (contractData: ContractVO): string => { - const method = contractData.settlementMethod || 'arrive_payment'; - const drafts = parseSettlementClauseDrafts(contractData.settlementClauseDrafts); - return drafts[method] || getDefaultSettlementClauseContent(method); -}; +const getSettlementClauseContent = (contractData: ContractVO): string => + resolveSettlementClauseContent({ + settlementMethod: contractData.settlementMethod, + settlementClauseDrafts: contractData.settlementClauseDrafts, + labelResolver: (method) => dictStore.getLabel('crm_settlement_method', method) || undefined + }); const extractSettlementClauseContent = (htmlContent: string): string => { const marker = '第五条、结算方式及期限';