Merge branch 'refs/heads/feature/bfi-api-rate' into feature/hcs-api-p0-web
# Conflicts: # src/option/business/contract-manage.js
This commit is contained in:
@@ -36,23 +36,25 @@
|
||||
<el-col v-if="isSettlementRelatedType" :span="6"
|
||||
><el-form-item label="结算单号" prop="referenceId">
|
||||
<div class="payment-form-page__settlement-nos">
|
||||
<template v-if="referenceSettlementLinks.length">
|
||||
<el-link
|
||||
<el-select
|
||||
ref="settlementNoSelectRef"
|
||||
:model-value="referenceSettlementNos"
|
||||
multiple
|
||||
collapse-tags
|
||||
collapse-tags-tooltip
|
||||
:max-collapse-tags="1"
|
||||
:disabled="readonly"
|
||||
placeholder="请输入"
|
||||
class="payment-form-page__settlement-select"
|
||||
@visible-change="handleSettlementSelectVisible"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in referenceSettlementLinks"
|
||||
:key="`${item.id || item.settlementNo}`"
|
||||
type="primary"
|
||||
@click="openSettlementDetail(item)"
|
||||
>
|
||||
{{ item.settlementNo }}
|
||||
</el-link>
|
||||
</template>
|
||||
<el-input
|
||||
v-else
|
||||
v-model="referenceLabel"
|
||||
readonly
|
||||
:disabled="readonly"
|
||||
placeholder="请选择预结算/正式结算单"
|
||||
/>
|
||||
:label="item.settlementNo"
|
||||
:value="item.settlementNo"
|
||||
/>
|
||||
</el-select>
|
||||
<el-button
|
||||
v-if="!readonly"
|
||||
class="payment-form-page__settlement-select-btn"
|
||||
@@ -100,7 +102,7 @@
|
||||
<el-option
|
||||
v-for="item in contractOptions"
|
||||
:key="item.id"
|
||||
:label="item.contractName || item.contractNo"
|
||||
:label="formatContractOptionLabel(item)"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -256,7 +258,7 @@
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</section-card>
|
||||
<section-card v-if="isSettlementRelatedType" title="发票信息">
|
||||
<section-card v-if="showInvoiceSection" title="发票信息">
|
||||
<el-table :data="form.invoices" border>
|
||||
<el-table-column type="index" label="序号" width="70" />
|
||||
<el-table-column prop="settlementNo" label="结算单号" min-width="120">
|
||||
@@ -360,19 +362,22 @@
|
||||
value="special_approval" /><el-option
|
||||
label="其他"
|
||||
value="other" /></el-select></template></el-table-column
|
||||
><el-table-column label="文件名" min-width="220"
|
||||
><el-table-column
|
||||
label="文件名"
|
||||
min-width="220"
|
||||
show-overflow-tooltip
|
||||
class-name="is-ellipsis-link"
|
||||
><template #default="{ row }"
|
||||
><div
|
||||
class="payment-form-page__attachment-file-name-cell"
|
||||
:title="attachmentFileName(row) || '-'"
|
||||
>
|
||||
<span
|
||||
class="payment-form-page__attachment-file-name"
|
||||
:class="{ 'is-disabled': !attachmentFileUrl(row) }"
|
||||
@click="attachmentFileUrl(row) && previewAttachment(row)"
|
||||
>{{ attachmentFileName(row) || '-' }}</span
|
||||
>
|
||||
</div></template
|
||||
><span
|
||||
class="attachment-file-name"
|
||||
:class="{ 'is-disabled': !attachmentFileUrl(row) }"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
@click="attachmentFileUrl(row) && previewAttachment(row)"
|
||||
@keydown.enter="attachmentFileUrl(row) && previewAttachment(row)"
|
||||
@keydown.space.prevent="attachmentFileUrl(row) && previewAttachment(row)"
|
||||
>{{ attachmentFileName(row) || '-' }}</span
|
||||
></template
|
||||
></el-table-column
|
||||
><el-table-column label="附件描述" min-width="220"
|
||||
><template #default="{ row }"
|
||||
@@ -448,7 +453,7 @@
|
||||
></el-table
|
||||
>
|
||||
<div v-else>
|
||||
<div class="payment-form-page__reference-search">
|
||||
<el-card class="payment-form-page__reference-search">
|
||||
<el-form
|
||||
:model="referenceQuery"
|
||||
label-position="right"
|
||||
@@ -486,7 +491,7 @@
|
||||
<el-button @click="resetReferenceSearch">清空</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-tabs v-model="referenceTab" @tab-change="handleReferenceTabChange">
|
||||
<el-tab-pane v-if="canSelectFormalSettlement" label="正式结算单" name="formal">
|
||||
<el-table
|
||||
@@ -677,6 +682,7 @@ import {
|
||||
getList as getCustomerArchiveList,
|
||||
} from '@/api/vehicle/customer-archive';
|
||||
import { readSettlementTransfer, removeSettlementTransfer } from '@/utils/settlement-transfer';
|
||||
import { formatContractOptionLabel } from '@/utils/contract';
|
||||
import { downloadFileByUrl } from '@/utils/util';
|
||||
import { submitMkApprovalFlow } from '@/utils/mk-approval';
|
||||
import {
|
||||
@@ -898,6 +904,10 @@ export default {
|
||||
isSettlementRelatedType() {
|
||||
return ['progress_advance', 'settlement_payment'].includes(this.form.paymentType);
|
||||
},
|
||||
// 项目预付、进度预付不展示发票信息,仅尾款付款展示
|
||||
showInvoiceSection() {
|
||||
return this.form.paymentType === 'settlement_payment';
|
||||
},
|
||||
canSelectPreSettlement() {
|
||||
// 进度预付仅预结算;尾款付款可正式/预结算
|
||||
return ['progress_advance', 'settlement_payment'].includes(this.form.paymentType);
|
||||
@@ -950,6 +960,9 @@ export default {
|
||||
referenceType: this.form.preSettlementId ? 'pre' : 'formal',
|
||||
}));
|
||||
},
|
||||
referenceSettlementNos() {
|
||||
return this.referenceSettlementLinks.map(item => item.settlementNo).filter(Boolean);
|
||||
},
|
||||
settlementRows() {
|
||||
if (this.referenceRows.length) {
|
||||
return this.referenceRows.map(item => ({
|
||||
@@ -1060,6 +1073,7 @@ export default {
|
||||
this.initialize();
|
||||
},
|
||||
methods: {
|
||||
formatContractOptionLabel,
|
||||
hasPermission(code) {
|
||||
return this.permission?.[code] !== false;
|
||||
},
|
||||
@@ -1083,7 +1097,7 @@ export default {
|
||||
!this.form.preSettlementId &&
|
||||
!this.form.preSettlementIds?.length
|
||||
) {
|
||||
callback(new Error('请选择结算单'));
|
||||
callback(new Error('请输入'));
|
||||
return;
|
||||
}
|
||||
callback();
|
||||
@@ -1144,7 +1158,7 @@ export default {
|
||||
callback();
|
||||
},
|
||||
validateInvoices() {
|
||||
if (this.form.paymentType === 'project_advance') return;
|
||||
if (!this.showInvoiceSection) return;
|
||||
for (const invoice of this.form.invoices || []) {
|
||||
if (String(invoice.settlementNo || '').length > 100) {
|
||||
throw new Error('结算单号不能超过100个字符');
|
||||
@@ -1926,6 +1940,7 @@ export default {
|
||||
this.contractPaymentRatioExceeded = exceeded;
|
||||
},
|
||||
handleTypeChange() {
|
||||
// 切换类型时清空发票;预付类型本身也不再展示/提交发票
|
||||
this.form.invoices = [];
|
||||
this.paymentRecords = [];
|
||||
Object.assign(this.form, {
|
||||
@@ -2130,8 +2145,20 @@ export default {
|
||||
const project = this.projectOptions.find(item => String(item.id) === String(projectId));
|
||||
this.form.projectName = project?.projectName || project?.projectShortName || '';
|
||||
Object.assign(this.form, {
|
||||
deptId: project?.undertakeDeptId || project?.businessDeptId || null,
|
||||
deptName: project?.undertakeDeptName || project?.businessDeptName || '',
|
||||
deptId:
|
||||
String(project?.undertakeDeptId || '')
|
||||
.split(/[,,]/)
|
||||
.map(item => item.trim())
|
||||
.find(Boolean) ||
|
||||
project?.businessDeptId ||
|
||||
null,
|
||||
deptName:
|
||||
String(project?.undertakeDeptName || '')
|
||||
.split(/[,,、]/)
|
||||
.map(item => item.trim())
|
||||
.find(Boolean) ||
|
||||
project?.businessDeptName ||
|
||||
'',
|
||||
contractId: null,
|
||||
contractNo: '',
|
||||
contractName: '',
|
||||
@@ -2299,6 +2326,13 @@ export default {
|
||||
}
|
||||
return Promise.all(loaders);
|
||||
},
|
||||
handleSettlementSelectVisible(visible) {
|
||||
// 结算单号仅做展示,通过「选择」按钮维护,避免下拉改值
|
||||
if (!visible) return;
|
||||
this.$nextTick(() => {
|
||||
this.$refs.settlementNoSelectRef?.blur?.();
|
||||
});
|
||||
},
|
||||
handleReferenceSearch() {
|
||||
this.formalPage.current = 1;
|
||||
this.prePage.current = 1;
|
||||
@@ -2662,7 +2696,7 @@ export default {
|
||||
attachmentsJson: JSON.stringify(attachments || []),
|
||||
remark,
|
||||
invoices:
|
||||
paymentType === 'project_advance'
|
||||
paymentType === 'project_advance' || paymentType === 'progress_advance'
|
||||
? []
|
||||
: invoices.map(invoice => ({
|
||||
settlementNo: invoice.settlementNo || '',
|
||||
@@ -2772,13 +2806,18 @@ export default {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
flex-wrap: wrap;
|
||||
width: 100%;
|
||||
min-height: 32px;
|
||||
}
|
||||
.payment-form-page__settlement-nos :deep(.el-input) {
|
||||
.payment-form-page__settlement-select {
|
||||
flex: 1;
|
||||
min-width: 120px;
|
||||
min-width: 0;
|
||||
}
|
||||
.payment-form-page__settlement-select :deep(.el-select__wrapper) {
|
||||
width: 100%;
|
||||
}
|
||||
.payment-form-page__settlement-select :deep(.el-tag__close) {
|
||||
display: none;
|
||||
}
|
||||
.payment-form-page__settlement-select-btn {
|
||||
flex-shrink: 0;
|
||||
@@ -2855,38 +2894,6 @@ export default {
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.payment-form-page__attachment-file-name-cell {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
text-align: left;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.payment-form-page__attachment-file-name {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
color: var(--el-text-color-regular);
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
transition: color 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
&.is-disabled {
|
||||
color: var(--el-text-color-regular);
|
||||
cursor: default;
|
||||
|
||||
&:hover {
|
||||
color: var(--el-text-color-regular);
|
||||
}
|
||||
}
|
||||
}
|
||||
.payment-form-page__attachment-upload .vehicle-attachment-upload {
|
||||
width: auto;
|
||||
}
|
||||
@@ -2894,7 +2901,7 @@ export default {
|
||||
display: inline-flex;
|
||||
}
|
||||
.payment-form-page :deep(.el-form-item) {
|
||||
margin-bottom: 14px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.payment-form-page :deep(.el-input-number .el-input__inner) {
|
||||
text-align: left;
|
||||
|
||||
Reference in New Issue
Block a user