1、调整收付款
2、调整基础配置 3、调整结算
This commit is contained in:
@@ -18,25 +18,22 @@
|
||||
<el-row :gutter="24">
|
||||
<el-col v-for="field in formFields" :key="field.prop" :span="field.span || 6">
|
||||
<el-form-item :label="field.label" :prop="field.prop">
|
||||
<el-select
|
||||
<el-input
|
||||
v-if="field.type === 'contract'"
|
||||
v-model="form.contractId"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
:remote-method="loadContractOptions"
|
||||
:loading="contractLoading"
|
||||
v-model="form.contractName"
|
||||
readonly
|
||||
:disabled="!editable || details.length > 0"
|
||||
placeholder="请选择合同"
|
||||
@change="handleContractChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in contractOptions"
|
||||
:key="item.id"
|
||||
:label="`${item.contractName}(${item.contractNo || '-'})`"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
<template #append>
|
||||
<el-button
|
||||
:disabled="!editable || details.length > 0"
|
||||
@click="openContractDialog"
|
||||
>
|
||||
选择
|
||||
</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
<el-date-picker
|
||||
v-else-if="field.type === 'date'"
|
||||
v-model="form[field.prop]"
|
||||
@@ -126,6 +123,9 @@
|
||||
<el-input-number
|
||||
v-else-if="editable && column.prop === 'adjustAmount'"
|
||||
v-model="row.adjustAmount"
|
||||
:class="{
|
||||
'pre-settlement-editor__negative-amount': Number(row.adjustAmount || 0) < 0,
|
||||
}"
|
||||
:precision="2"
|
||||
:controls="false"
|
||||
@change="recalculateSummaryRow(row)"
|
||||
@@ -136,7 +136,13 @@
|
||||
maxlength="50"
|
||||
show-word-limit
|
||||
/>
|
||||
<span v-else-if="isSummaryMoney(column.prop)">
|
||||
<span
|
||||
v-else-if="isSummaryMoney(column.prop)"
|
||||
:class="{
|
||||
'pre-settlement-editor__negative-amount':
|
||||
column.prop === 'adjustAmount' && Number(row.adjustAmount || 0) < 0,
|
||||
}"
|
||||
>
|
||||
{{ formatMoney(row[column.prop], form.currency) }}
|
||||
</span>
|
||||
<span v-else-if="column.prop === 'feeType'">
|
||||
@@ -393,7 +399,9 @@
|
||||
|
||||
<template v-if="!pageMode" #footer>
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button v-if="editable" type="primary" plain :loading="saving" @click="saveDraft(false)">保存</el-button>
|
||||
<el-button v-if="editable" type="primary" plain :loading="saving" @click="saveDraft(false)"
|
||||
>保存</el-button
|
||||
>
|
||||
<el-button
|
||||
v-if="editable && hasPermission('pre_settlement_submit')"
|
||||
type="primary"
|
||||
@@ -405,7 +413,9 @@
|
||||
</template>
|
||||
<div v-if="pageMode" class="pre-settlement-editor__page-actions">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button v-if="editable" type="primary" plain :loading="saving" @click="saveDraft(false)">保存</el-button>
|
||||
<el-button v-if="editable" type="primary" plain :loading="saving" @click="saveDraft(false)"
|
||||
>保存</el-button
|
||||
>
|
||||
<el-button
|
||||
v-if="editable && hasPermission('pre_settlement_submit')"
|
||||
type="primary"
|
||||
@@ -492,6 +502,164 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog
|
||||
v-model="contractDialog.visible"
|
||||
title="选择合同"
|
||||
width="92%"
|
||||
append-to-body
|
||||
destroy-on-close
|
||||
class="pre-settlement-contract-dialog"
|
||||
>
|
||||
<el-form
|
||||
:model="contractDialog.query"
|
||||
inline
|
||||
label-position="right"
|
||||
label-width="auto"
|
||||
class="pre-settlement-editor__contract-filter"
|
||||
@submit.prevent
|
||||
>
|
||||
<el-form-item label="合同编号">
|
||||
<el-input
|
||||
v-model="contractDialog.query.contractNo"
|
||||
clearable
|
||||
placeholder="请输入"
|
||||
@keyup.enter="loadContractRows"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同名称">
|
||||
<el-input
|
||||
v-model="contractDialog.query.contractName"
|
||||
clearable
|
||||
placeholder="请输入"
|
||||
@keyup.enter="loadContractRows"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属项目">
|
||||
<el-input
|
||||
v-model="contractDialog.query.projectName"
|
||||
clearable
|
||||
placeholder="请输入"
|
||||
@keyup.enter="loadContractRows"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属组织">
|
||||
<el-input
|
||||
v-model="contractDialog.query.organizationName"
|
||||
clearable
|
||||
placeholder="请输入"
|
||||
@keyup.enter="loadContractRows"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同类别">
|
||||
<el-select v-model="contractDialog.query.contractCategory" clearable placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in contractCategoryOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="签约类型">
|
||||
<el-select v-model="contractDialog.query.signType" clearable placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in signTypeOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="生效类型">
|
||||
<el-select v-model="contractDialog.query.effectiveType" clearable placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in effectiveTypeOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同阶段">
|
||||
<el-select v-model="contractDialog.query.contractStage" clearable placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in contractStageOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="contractDialog.expanded" label="审核状态">
|
||||
<el-select v-model="contractDialog.query.approvalStatus" clearable placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in contractApprovalStatusOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item class="pre-settlement-editor__contract-filter-actions">
|
||||
<el-button type="primary" @click="searchContractRows">查询</el-button>
|
||||
<el-button @click="resetContractQuery">重置</el-button>
|
||||
<el-button text @click="contractDialog.expanded = !contractDialog.expanded">
|
||||
{{ contractDialog.expanded ? '收起' : '展开' }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table
|
||||
v-loading="contractDialog.loading"
|
||||
:data="contractDialog.rows"
|
||||
border
|
||||
highlight-current-row
|
||||
@current-change="contractDialog.current = $event"
|
||||
@row-dblclick="selectContract"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="64" align="center" />
|
||||
<el-table-column
|
||||
v-for="column in contractSelectionColumns"
|
||||
:key="column.prop"
|
||||
:prop="column.prop"
|
||||
:label="column.label"
|
||||
:min-width="column.minWidth"
|
||||
align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<span v-if="column.prop === 'organizationName'">{{
|
||||
row.organizationName || row.deptName || '-'
|
||||
}}</span>
|
||||
<span v-else-if="column.prop === 'contractCategory'">{{
|
||||
contractCategoryName(row.contractCategory)
|
||||
}}</span>
|
||||
<span v-else-if="column.prop === 'signType'">{{ signTypeName(row.signType) }}</span>
|
||||
<span v-else>{{ displayValue(row[column.prop]) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="90" fixed="right" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-link type="primary" @click.stop="selectContract(row)">选择</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="pre-settlement-editor__pagination">
|
||||
<el-pagination
|
||||
v-model:current-page="contractDialog.page.current"
|
||||
v-model:page-size="contractDialog.page.size"
|
||||
:total="contractDialog.page.total"
|
||||
:page-sizes="[10, 20, 50, 100]"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
@current-change="loadContractRows"
|
||||
@size-change="handleContractSizeChange"
|
||||
/>
|
||||
</div>
|
||||
<template #footer>
|
||||
<el-button @click="contractDialog.visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="selectContract(contractDialog.current)">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog
|
||||
v-model="adjustDialog.visible"
|
||||
title="结算明细调整"
|
||||
@@ -613,7 +781,7 @@ import { mapGetters } from 'vuex';
|
||||
import {
|
||||
adjustDetail,
|
||||
getCandidateDetails,
|
||||
getContractOptions,
|
||||
getContractList,
|
||||
getDetail,
|
||||
getDetailFees,
|
||||
getFeeOptions,
|
||||
@@ -627,6 +795,13 @@ import {
|
||||
preSettlementFormFields,
|
||||
preSettlementFormRules,
|
||||
} from '@/option/settlement/preSettlementForm';
|
||||
import {
|
||||
contractApprovalStatusOptions,
|
||||
contractCategoryOptions,
|
||||
contractStageOptions,
|
||||
effectiveTypeOptions,
|
||||
signTypeOptions,
|
||||
} from '@/option/business/common';
|
||||
import {
|
||||
advanceColumns,
|
||||
candidateDetailColumns,
|
||||
@@ -675,8 +850,45 @@ export default {
|
||||
advanceTableColumns: advanceColumns,
|
||||
changeTableColumns: changeRecordColumns,
|
||||
candidateColumns: candidateDetailColumns,
|
||||
contractLoading: false,
|
||||
contractOptions: [],
|
||||
contractCategoryOptions,
|
||||
signTypeOptions,
|
||||
effectiveTypeOptions,
|
||||
contractStageOptions,
|
||||
contractApprovalStatusOptions,
|
||||
contractSelectionColumns: [
|
||||
{ prop: 'contractNo', label: '合同编号', minWidth: 180 },
|
||||
{ prop: 'contractName', label: '合同名称', minWidth: 220 },
|
||||
{ prop: 'projectName', label: '所属项目', minWidth: 170 },
|
||||
{ prop: 'organizationName', label: '所属组织', minWidth: 170 },
|
||||
{ prop: 'contractCategory', label: '合同类别', minWidth: 130 },
|
||||
{ prop: 'signType', label: '签约类型', minWidth: 120 },
|
||||
{ prop: 'partyA', label: '甲方', minWidth: 170 },
|
||||
{ prop: 'partyB', label: '乙方', minWidth: 170 },
|
||||
{ prop: 'startDate', label: '开始日期', minWidth: 130 },
|
||||
{ prop: 'endDate', label: '结束日期', minWidth: 130 },
|
||||
{ prop: 'temporaryStartDate', label: '临时效力起', minWidth: 130 },
|
||||
{ prop: 'temporaryEndDate', label: '临时效力止', minWidth: 130 },
|
||||
],
|
||||
contractDialog: {
|
||||
visible: false,
|
||||
loading: false,
|
||||
expanded: false,
|
||||
rows: [],
|
||||
current: null,
|
||||
query: {
|
||||
contractNo: '',
|
||||
contractName: '',
|
||||
projectName: '',
|
||||
organizationName: '',
|
||||
contractCategory: '',
|
||||
signType: '',
|
||||
effectiveType: '',
|
||||
contractStage: '',
|
||||
approvalStatus: '',
|
||||
},
|
||||
page: { current: 1, size: 10, total: 0 },
|
||||
},
|
||||
feeOptions: [],
|
||||
feeCategoryOptions: [],
|
||||
transportTypeOptions: [],
|
||||
@@ -857,7 +1069,6 @@ export default {
|
||||
},
|
||||
async initialize() {
|
||||
this.resetEditor();
|
||||
await this.loadContractOptions('');
|
||||
await this.loadFeeOptions();
|
||||
await this.loadFeeCategoryOptions();
|
||||
if (this.pageMode) await this.loadTransportTypeOptions();
|
||||
@@ -935,6 +1146,12 @@ export default {
|
||||
this.changeRecords = [];
|
||||
this.attachments = [];
|
||||
this.selectedAttachmentRows = [];
|
||||
this.contractOptions = [];
|
||||
this.contractDialog.visible = false;
|
||||
this.contractDialog.expanded = false;
|
||||
this.contractDialog.rows = [];
|
||||
this.contractDialog.current = null;
|
||||
this.contractDialog.page = { current: 1, size: 10, total: 0 };
|
||||
this.$nextTick(() => this.$refs.formRef?.clearValidate());
|
||||
},
|
||||
async loadDetail() {
|
||||
@@ -969,15 +1186,85 @@ export default {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async loadContractOptions(keyword = '') {
|
||||
this.contractLoading = true;
|
||||
openContractDialog() {
|
||||
if (!this.editable || this.details.length > 0) return;
|
||||
this.contractDialog.visible = true;
|
||||
this.contractDialog.expanded = false;
|
||||
this.contractDialog.current = null;
|
||||
this.contractDialog.page.current = 1;
|
||||
this.loadContractRows();
|
||||
},
|
||||
async loadContractRows() {
|
||||
this.contractDialog.loading = true;
|
||||
try {
|
||||
const { data } = await getContractOptions(keyword);
|
||||
this.contractOptions = data?.data || [];
|
||||
const { data } = await getContractList(
|
||||
this.contractDialog.page.current,
|
||||
this.contractDialog.page.size,
|
||||
{ ...this.contractDialog.query }
|
||||
);
|
||||
const page = data?.data || {};
|
||||
this.contractDialog.rows = page.records || [];
|
||||
this.contractDialog.page.total = Number(page.total || 0);
|
||||
} finally {
|
||||
this.contractLoading = false;
|
||||
this.contractDialog.loading = false;
|
||||
}
|
||||
},
|
||||
searchContractRows() {
|
||||
this.contractDialog.page.current = 1;
|
||||
this.loadContractRows();
|
||||
},
|
||||
resetContractQuery() {
|
||||
this.contractDialog.query = {
|
||||
contractNo: '',
|
||||
contractName: '',
|
||||
projectName: '',
|
||||
organizationName: '',
|
||||
contractCategory: '',
|
||||
signType: '',
|
||||
effectiveType: '',
|
||||
contractStage: '',
|
||||
approvalStatus: '',
|
||||
};
|
||||
this.searchContractRows();
|
||||
},
|
||||
handleContractSizeChange() {
|
||||
this.contractDialog.page.current = 1;
|
||||
this.loadContractRows();
|
||||
},
|
||||
selectContract(row) {
|
||||
if (!row) {
|
||||
this.$message.warning('请选择合同');
|
||||
return;
|
||||
}
|
||||
const contract = {
|
||||
...row,
|
||||
deptId: row.deptId || row.organizationId,
|
||||
deptName: row.deptName || row.organizationName,
|
||||
partyA: row.partyA || row.payerName,
|
||||
partyB: row.partyB || row.payeeName,
|
||||
settlementType:
|
||||
row.settlementType || (row.contractCategory === '客户合同' ? 'receivable' : 'payable'),
|
||||
};
|
||||
const index = this.contractOptions.findIndex(item => String(item.id) === String(contract.id));
|
||||
if (index >= 0) this.contractOptions.splice(index, 1, contract);
|
||||
else this.contractOptions.push(contract);
|
||||
this.handleContractChange(contract.id);
|
||||
this.contractDialog.visible = false;
|
||||
this.contractDialog.current = null;
|
||||
this.$refs.formRef?.clearValidate('contractId');
|
||||
},
|
||||
contractCategoryName(value) {
|
||||
return (
|
||||
this.contractCategoryOptions.find(item => String(item.value) === String(value))?.label ||
|
||||
this.displayValue(value)
|
||||
);
|
||||
},
|
||||
signTypeName(value) {
|
||||
return (
|
||||
this.signTypeOptions.find(item => String(item.value) === String(value))?.label ||
|
||||
this.displayValue(value)
|
||||
);
|
||||
},
|
||||
async loadFeeOptions() {
|
||||
const { data } = await getFeeOptions();
|
||||
this.feeOptions = data?.data || [];
|
||||
@@ -993,6 +1280,7 @@ export default {
|
||||
handleContractChange(id) {
|
||||
const contract = this.contractOptions.find(item => String(item.id) === String(id));
|
||||
if (!contract) {
|
||||
this.form.contractId = '';
|
||||
this.form.contractNo = '';
|
||||
this.form.contractName = '';
|
||||
this.form.projectId = '';
|
||||
@@ -1004,6 +1292,7 @@ export default {
|
||||
this.summaryFees = [];
|
||||
return;
|
||||
}
|
||||
this.form.contractId = contract.id;
|
||||
this.form.contractNo = contract.contractNo;
|
||||
this.form.contractName = contract.contractName;
|
||||
this.form.projectId = contract.projectId;
|
||||
@@ -1166,9 +1455,7 @@ export default {
|
||||
this.details.forEach(row => {
|
||||
const feeItems = this.parseFeeItems(row.feeItemsJson || row.feeItems);
|
||||
const feeItemEntries = Object.entries(feeItems);
|
||||
feeItemEntries.forEach(([feeItem, amount]) =>
|
||||
appendSummary(feeItem, amount, row.feeType)
|
||||
);
|
||||
feeItemEntries.forEach(([feeItem, amount]) => appendSummary(feeItem, amount, row.feeType));
|
||||
|
||||
let knownAmount = feeItemEntries.reduce(
|
||||
(total, [, amount]) => total + Number(amount || 0),
|
||||
@@ -1186,11 +1473,7 @@ export default {
|
||||
}
|
||||
|
||||
const totalAmount = Number(
|
||||
row.settlementAmountTax ??
|
||||
row.totalAmount ??
|
||||
row.afterAmount ??
|
||||
row.settlementAmount ??
|
||||
0
|
||||
row.settlementAmountTax ?? row.totalAmount ?? row.afterAmount ?? row.settlementAmount ?? 0
|
||||
);
|
||||
const residualAmount = Number((totalAmount - knownAmount).toFixed(2));
|
||||
if (Math.abs(residualAmount) >= 0.005) {
|
||||
@@ -1621,6 +1904,39 @@ export default {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
&__contract-filter {
|
||||
display: grid !important;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
gap: 8px 24px;
|
||||
margin-bottom: 16px;
|
||||
|
||||
:deep(.el-form-item) {
|
||||
display: flex;
|
||||
min-width: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
:deep(.el-form-item__content) {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
:deep(.el-input),
|
||||
:deep(.el-select) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
&__contract-filter-actions {
|
||||
grid-column: 1 / -1;
|
||||
width: 100%;
|
||||
justify-content: flex-end;
|
||||
|
||||
:deep(.el-form-item__content) {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
&__attachment-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -1649,6 +1965,14 @@ export default {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
&__negative-amount {
|
||||
color: var(--el-color-danger);
|
||||
}
|
||||
|
||||
:deep(.pre-settlement-editor__negative-amount .el-input__inner) {
|
||||
color: var(--el-color-danger);
|
||||
}
|
||||
|
||||
&__pagination {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
|
||||
Reference in New Issue
Block a user