1、调整配载、总单
2、新增收付款模块
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
<template>
|
||||
<el-dialog v-model="visible" :title="title" width="96%" top="2vh" append-to-body destroy-on-close>
|
||||
<component
|
||||
:is="editorContainer"
|
||||
v-bind="editorContainerProps"
|
||||
@update:model-value="visible = $event"
|
||||
>
|
||||
<div v-loading="loading" class="formal-editor">
|
||||
<section-card title="结算基本信息">
|
||||
<el-form
|
||||
@@ -164,15 +168,27 @@
|
||||
</el-table>
|
||||
</section-card>
|
||||
</div>
|
||||
<template #footer>
|
||||
<template v-if="!pageMode" #footer>
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button v-if="editable" type="primary" :loading="saving" @click="handleSave"
|
||||
>提交</el-button
|
||||
>
|
||||
</template>
|
||||
<div v-if="pageMode" class="formal-editor__page-actions">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button v-if="editable" type="primary" :loading="saving" @click="handleSave">
|
||||
提交
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<el-dialog v-model="candidate.visible" title="选择预结算单" width="88%" append-to-body>
|
||||
<el-form :model="candidate.query" inline label-position="right" label-width="160px" class="formal-editor__candidate-search">
|
||||
<el-form
|
||||
:model="candidate.query"
|
||||
inline
|
||||
label-position="right"
|
||||
label-width="160px"
|
||||
class="formal-editor__candidate-search"
|
||||
>
|
||||
<el-form-item label="预结算单号"
|
||||
><el-input v-model="candidate.query.preSettlementNo" clearable
|
||||
/></el-form-item>
|
||||
@@ -222,7 +238,13 @@
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog v-model="detailCandidate.visible" title="选择结算明细" width="92%" append-to-body>
|
||||
<el-form :model="detailCandidate.query" inline label-position="right" label-width="160px" class="formal-editor__detail-search">
|
||||
<el-form
|
||||
:model="detailCandidate.query"
|
||||
inline
|
||||
label-position="right"
|
||||
label-width="160px"
|
||||
class="formal-editor__detail-search"
|
||||
>
|
||||
<el-form-item label="批次号"
|
||||
><el-input v-model="detailCandidate.query.batchNo" clearable
|
||||
/></el-form-item>
|
||||
@@ -344,7 +366,7 @@
|
||||
></template
|
||||
>
|
||||
</el-dialog>
|
||||
</el-dialog>
|
||||
</component>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -371,7 +393,16 @@ import {
|
||||
|
||||
export default {
|
||||
name: 'FormalSettlementEditor',
|
||||
props: { modelValue: Boolean, recordId: [String, Number], readonly: Boolean },
|
||||
props: {
|
||||
modelValue: Boolean,
|
||||
recordId: [String, Number],
|
||||
readonly: Boolean,
|
||||
pageMode: Boolean,
|
||||
initialData: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
emits: ['update:modelValue', 'success'],
|
||||
data() {
|
||||
return {
|
||||
@@ -446,6 +477,22 @@ export default {
|
||||
this.$emit('update:modelValue', value);
|
||||
},
|
||||
},
|
||||
editorContainer() {
|
||||
return this.pageMode ? 'div' : 'el-dialog';
|
||||
},
|
||||
editorContainerProps() {
|
||||
if (this.pageMode) {
|
||||
return { class: 'formal-editor-shell formal-editor-shell--page' };
|
||||
}
|
||||
return {
|
||||
modelValue: this.visible,
|
||||
title: this.title,
|
||||
width: '96%',
|
||||
top: '2vh',
|
||||
appendToBody: true,
|
||||
destroyOnClose: true,
|
||||
};
|
||||
},
|
||||
editable() {
|
||||
return !this.readonly;
|
||||
},
|
||||
@@ -454,8 +501,11 @@ export default {
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
modelValue(value) {
|
||||
if (value) this.initialize();
|
||||
modelValue: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
if (value) this.initialize();
|
||||
},
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
@@ -468,6 +518,7 @@ export default {
|
||||
await this.loadContracts();
|
||||
if (!this.recordId) {
|
||||
this.form.exchangeRateDate = this.$dayjs().format('YYYY-MM-DD');
|
||||
if (this.initialData) this.applyInitialData();
|
||||
return;
|
||||
}
|
||||
this.loading = true;
|
||||
@@ -490,6 +541,55 @@ export default {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
applyInitialData() {
|
||||
const rows = Array.isArray(this.initialData?.rows) ? this.initialData.rows : [];
|
||||
if (!rows.length) return;
|
||||
const first = rows[0];
|
||||
const settlementType = this.initialData.settlementType || first.settlementType || 'payable';
|
||||
const contractId = first.contractId || null;
|
||||
if (!this.contracts.some(item => String(item.id) === String(contractId))) {
|
||||
this.contracts.push({
|
||||
id: contractId,
|
||||
contractNo: first.contractNo,
|
||||
contractName: first.contractName,
|
||||
projectId: first.projectId,
|
||||
projectName: first.projectName,
|
||||
deptId: first.deptId,
|
||||
deptName: first.deptName,
|
||||
payerName: first.payerName,
|
||||
payeeName: first.payeeName,
|
||||
settlementType,
|
||||
});
|
||||
}
|
||||
this.handleContractChange(contractId);
|
||||
Object.assign(this.form, {
|
||||
contractId,
|
||||
contractNo: first.contractNo || this.form.contractNo,
|
||||
contractName: first.contractName || this.form.contractName,
|
||||
projectId: first.projectId || this.form.projectId,
|
||||
projectName: first.projectName || this.form.projectName,
|
||||
deptId: first.deptId || this.form.deptId,
|
||||
deptName: first.deptName || this.form.deptName,
|
||||
payerName: first.payerName || this.form.payerName,
|
||||
payeeName: first.payeeName || this.form.payeeName,
|
||||
settlementType,
|
||||
settlementTypeName: settlementType === 'receivable' ? '应收' : '应付',
|
||||
currency: first.currency || 'RMB',
|
||||
});
|
||||
this.details = rows.map(row => ({
|
||||
...row,
|
||||
sourceDetailId: row.sourceDetailId || row.id,
|
||||
settlementAmountTax:
|
||||
row.settlementAmountTax ?? row.totalAmount ?? row.afterAmount ?? row.settlementAmount,
|
||||
}));
|
||||
this.form.sourceDetailIds = this.details.map(item => item.sourceDetailId);
|
||||
this.form.settlementAmount = this.details.reduce(
|
||||
(total, item) => total + Number(item.settlementAmountTax || 0),
|
||||
0
|
||||
);
|
||||
this.form.localSettlementAmount =
|
||||
this.form.settlementAmount * Number(this.form.exchangeRate || 1);
|
||||
},
|
||||
async loadContracts(keyword = '') {
|
||||
const response = await getContractOptions(keyword);
|
||||
this.contracts = this.unwrapData(response) || [];
|
||||
@@ -497,7 +597,9 @@ export default {
|
||||
handleContractChange(id) {
|
||||
const contract = this.contracts.find(item => String(item.id) === String(id));
|
||||
if (!contract) return;
|
||||
const formalSettlementId = this.form.id;
|
||||
Object.assign(this.form, contract, {
|
||||
id: formalSettlementId,
|
||||
contractId: contract.id,
|
||||
settlementTypeName: contract.settlementType === 'receivable' ? '应收' : '应付',
|
||||
});
|
||||
@@ -724,6 +826,13 @@ export default {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
.formal-editor__page-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
padding: 16px 0 4px;
|
||||
border-top: 1px solid #eff1f7;
|
||||
gap: 8px;
|
||||
}
|
||||
.formal-editor__links {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
Reference in New Issue
Block a user