diff --git a/src/option/settlement/formalSettlement.js b/src/option/settlement/formalSettlement.js index 6e335c0..afdc3c7 100644 --- a/src/option/settlement/formalSettlement.js +++ b/src/option/settlement/formalSettlement.js @@ -12,6 +12,7 @@ * ⚠️ column 数组顺序 = 表格列顺序,搜索专用列统一放在数组最前面。 */ +import { formatSealTypes } from '@/utils/settlement-seal'; import { approvalStatusOptions, invoiceStatusOptions, @@ -24,6 +25,8 @@ import { formalSettlementTableColumns } from './formalSettlementTable'; const textFormatter = (row, value) => value === null || value === undefined || value === '' ? '-' : value; +const sealTypesFormatter = (row, value) => formatSealTypes(value) || '-'; + /** 金额统一展示:两位小数 + 币种 */ const moneyFormatter = (row, value) => `${Number(value || 0).toFixed(2)} ${row?.currency || 'RMB'}`; @@ -72,6 +75,7 @@ const COLUMN_EXTRA = { projectName: { search: true, searchSpan: 5, searchOrder: 11, searchPlaceholder: '请输入' }, deptName: { search: true, searchslot: true, searchSpan: 5, searchOrder: 10 }, contractNo: { search: true, searchSpan: 5, searchOrder: 9, searchPlaceholder: '请输入' }, + sealTypes: { formatter: sealTypesFormatter }, invoiceStatusName: { slot: true }, paymentStatusName: { slot: true }, approvalStatusName: { slot: true }, diff --git a/src/option/settlement/formalSettlementForm.js b/src/option/settlement/formalSettlementForm.js index 5afba6b..c4d4f49 100644 --- a/src/option/settlement/formalSettlementForm.js +++ b/src/option/settlement/formalSettlementForm.js @@ -10,6 +10,12 @@ export const formalSettlementFormFields = [ { label: '结算金额', prop: 'settlementAmount', readonly: true, money: true }, { label: '业务模式', prop: 'businessModel', type: 'select', optionsKey: 'businessModelOptions' }, { label: '运输方式', prop: 'transportType', type: 'select', optionsKey: 'transportTypeOptions' }, + { + label: '用印类型', + prop: 'sealTypes', + type: 'multi-select', + optionsKey: 'sealTypeOptions', + }, { label: '汇率日期', prop: 'exchangeRateDate', type: 'date', required: true }, { label: '结算汇率', prop: 'exchangeRate', type: 'number', required: true }, { label: '本位币合计', prop: 'localSettlementAmount', readonly: true, money: true }, @@ -29,6 +35,7 @@ export const createFormalSettlementForm = () => ({ sourceDetailIds: [], businessModel: '', transportType: '', + sealTypes: [], exchangeRateDate: '', exchangeRate: 1, createUserName: '', diff --git a/src/option/settlement/formalSettlementTable.js b/src/option/settlement/formalSettlementTable.js index 9360d50..6ea7b13 100644 --- a/src/option/settlement/formalSettlementTable.js +++ b/src/option/settlement/formalSettlementTable.js @@ -10,6 +10,7 @@ export const formalSettlementTableColumns = [ { label: '原币结算金额', prop: 'settlementAmount', minWidth: 145, money: true }, { label: '业务模式', prop: 'businessModelName', minWidth: 120 }, { label: '运输方式', prop: 'transportTypeName', minWidth: 120 }, + { label: '用印类型', prop: 'sealTypes', minWidth: 120 }, { label: '本位币结算金额', prop: 'localSettlementAmount', minWidth: 155, money: true }, { label: '结算汇率', prop: 'exchangeRate', minWidth: 110 }, { label: '申请付款金额(含预付)', prop: 'appliedPaymentAmount', minWidth: 185, money: true }, diff --git a/src/option/settlement/preSettlementForm.js b/src/option/settlement/preSettlementForm.js index f5d00ec..1024fbc 100644 --- a/src/option/settlement/preSettlementForm.js +++ b/src/option/settlement/preSettlementForm.js @@ -26,6 +26,12 @@ export const preSettlementFormFields = [ { label: '结算金额', prop: 'settlementAmount', readonly: true, money: true }, { label: '业务模式', prop: 'businessModel', type: 'select', optionsKey: 'businessModelOptions' }, { label: '运输方式', prop: 'transportType', type: 'select', optionsKey: 'transportTypeOptions' }, + { + label: '用印类型', + prop: 'sealTypes', + type: 'multi-select', + optionsKey: 'sealTypeOptions', + }, { label: '汇率日期', prop: 'exchangeRateDate', type: 'date' }, { label: '结算汇率', prop: 'exchangeRate', type: 'number', class: 'exchange-rate-input' }, { label: '本位币合计', prop: 'localSettlementAmount', readonly: true, money: true }, @@ -82,6 +88,7 @@ export const emptyPreSettlementForm = () => ({ settlementAmount: 0, businessModel: '', transportType: '', + sealTypes: [], localCurrency: 'RMB', localSettlementAmount: 0, exchangeRateDate: '', diff --git a/src/option/settlement/preSettlementTable.js b/src/option/settlement/preSettlementTable.js index b253079..134240e 100644 --- a/src/option/settlement/preSettlementTable.js +++ b/src/option/settlement/preSettlementTable.js @@ -10,6 +10,7 @@ export const preSettlementTableColumns = [ { label: '原币结算金额', prop: 'settlementAmount', minWidth: 140, money: true, precision: 2 }, { label: '业务模式', prop: 'businessModelName', minWidth: 120 }, { label: '运输方式', prop: 'transportTypeName', minWidth: 120 }, + { label: '用印类型', prop: 'sealTypes', minWidth: 120 }, { label: '本位币结算金额', prop: 'localSettlementAmount', minWidth: 150, money: true, precision: 2 }, { label: '结算汇率', prop: 'exchangeRate', minWidth: 110, precision: 2 }, { diff --git a/src/utils/mk-approval.js b/src/utils/mk-approval.js index 475dbf0..6415d21 100644 --- a/src/utils/mk-approval.js +++ b/src/utils/mk-approval.js @@ -154,7 +154,7 @@ export function isMkApprovedStatus(bizType, approvalStatus) { * @param {string} [options.subjectName] 标题后缀 * @param {string} [options.approvalStatus] 提交前的审批状态 * @param {boolean} [options.mkEnabled] 调用方已知开关时传入,false 时立即跳过 - * @param {Object} [options.tempVarData] 传给 MK 的临时变量(如项目类型 projectType) + * @param {Object} [options.tempVarData] 传给 MK 的临时变量(如项目类型 projectType、用印类型 sealTypes) * @returns {Promise} true=已发起/复用 MK 流程,false=未开启或已跳过 */ export async function submitMkApprovalFlow({ diff --git a/src/utils/settlement-seal.js b/src/utils/settlement-seal.js new file mode 100644 index 0000000..86e6117 --- /dev/null +++ b/src/utils/settlement-seal.js @@ -0,0 +1,31 @@ +/** 结算单用印类型固定选项(展示顺序固定) */ +export const SETTLEMENT_SEAL_TYPE_OPTIONS = [ + { dictKey: '公章', dictValue: '公章' }, + { dictKey: '业务章', dictValue: '业务章' }, +]; + +const SEAL_TYPE_ORDER = SETTLEMENT_SEAL_TYPE_OPTIONS.map(item => item.dictKey); + +/** + * 解析用印类型为数组(兼容顿号、逗号分隔) + */ +export const parseSealTypes = value => { + if (Array.isArray(value)) { + return value.map(item => String(item || '').trim()).filter(Boolean); + } + if (value === undefined || value === null || value === '') { + return []; + } + return String(value) + .split(/[、,,\s]+/) + .map(item => item.trim()) + .filter(Boolean); +}; + +/** + * 用印类型按固定顺序顿号拼接,供保存与列表展示 + */ +export const formatSealTypes = value => { + const selected = new Set(parseSealTypes(value)); + return SEAL_TYPE_ORDER.filter(item => selected.has(item)).join('、'); +}; diff --git a/src/views/business/contract-change-public-view.vue b/src/views/business/contract-change-public-view.vue index 5e5aa90..6095a60 100644 --- a/src/views/business/contract-change-public-view.vue +++ b/src/views/business/contract-change-public-view.vue @@ -13,8 +13,18 @@ export default { components: { MkPublicShell, ContractManageChange }, methods: { getForm() { - const row = this.$refs.page?.form || {}; - return { ...row, subject: row.contractName || row.contractNo || '' }; + const page = this.$refs.page; + const row = page?.form || {}; + return { + ...row, + partyAJson: row.partyAJson || '', + partyBJson: row.partyBJson || '', + partyCJson: row.partyCJson || '', + partyARows: page?.partyARows || [], + partyBRows: page?.partyBRows || [], + partyCRows: page?.partyCRows || [], + subject: row.contractName || row.contractNo || '', + }; }, }, }; diff --git a/src/views/business/contract-manage-change.vue b/src/views/business/contract-manage-change.vue index e3c1778..bc76ee6 100644 --- a/src/views/business/contract-manage-change.vue +++ b/src/views/business/contract-manage-change.vue @@ -69,11 +69,8 @@ - - - - - + + +
+
{{ party.label }}
+ + + + + + + + + + + + + + + +
+ .dialog-section-title { margin-bottom: 16px; color: #303133; } .contract-basic-section { margin-bottom: 12px; padding: 14px 16px 16px; overflow: hidden; background: #fff; border-bottom: 0; border-radius: 6px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); } .contract-basic-section > .dialog-section-title { margin-bottom: 20px; color: #303133; } .contract-basic-section__grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: 48px; } diff --git a/src/views/business/contract-manage-public-view.vue b/src/views/business/contract-manage-public-view.vue index a0d1fd4..8ca7d44 100644 --- a/src/views/business/contract-manage-public-view.vue +++ b/src/views/business/contract-manage-public-view.vue @@ -13,8 +13,18 @@ export default { components: { MkPublicShell, ContractManage }, methods: { getForm() { - const row = this.$refs.page?.detailRow || {}; - return { ...row, subject: row.contractName || row.contractNo || '' }; + const page = this.$refs.page; + const row = page?.detailRow || {}; + return { + ...row, + partyAJson: row.partyAJson || '', + partyBJson: row.partyBJson || '', + partyCJson: row.partyCJson || '', + partyARows: page?.detailPartyARows || [], + partyBRows: page?.detailPartyBRows || [], + partyCRows: page?.detailPartyCRows || [], + subject: row.contractName || row.contractNo || '', + }; }, }, }; diff --git a/src/views/business/contract-manage.vue b/src/views/business/contract-manage.vue index cbf6ec0..11d76b6 100644 --- a/src/views/business/contract-manage.vue +++ b/src/views/business/contract-manage.vue @@ -174,9 +174,6 @@ {{ detailValue('projectName') }} - {{ detailValue('partyA') }} - {{ detailValue('partyB') }} - {{ detailValue('partyC') || '-' }} {{ detailContractPeriod }} {{ detailValue('organizationName') @@ -239,6 +236,29 @@ +
+
{{ party.label }}
+ + + + + + + + + + + + + + + +
+
项目材料
未上传:{{ missingRequiredAttachmentTypes.join('、') }} @@ -698,7 +698,11 @@ @@ -741,14 +745,26 @@ - +
+
+
调整材料
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ @@ -19,6 +43,36 @@