1、修复基础配置

2、修复业务模块
3、拆分页面代码
This commit is contained in:
2026-09-03 03:31:30 +08:00
parent 008ec7a6a8
commit 6f0f1842cb
25 changed files with 22346 additions and 192 deletions
+104 -19
View File
@@ -239,16 +239,6 @@
placeholder="请选择签订日期"
/>
</el-form-item>
<el-form-item label="结算类型" prop="settlementMode">
<el-select v-model="form.settlementMode" placeholder="请选择结算类型">
<el-option
v-for="item in settlementModeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="合同格式" prop="contractFormat">
<el-select v-model="form.contractFormat" placeholder="请选择合同格式">
<el-option
@@ -273,12 +263,39 @@
><template #suffix>份</template></el-input
>
</el-form-item>
<el-form-item label="回款账期">
<el-form-item label="结算币种" prop="settlementCurrency">
<el-select v-model="form.settlementCurrency" placeholder="请选择结算币种" clearable>
<el-option
v-for="item in settlementCurrencyOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="结算方式" prop="settlementMode">
<el-select v-model="form.settlementMode" placeholder="请选择结算方式" clearable>
<el-option
v-for="item in settlementModeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="开票周期">
<el-input
v-model="form.invoiceCycle"
placeholder="请输入"
@input="value => positiveIntegerInput('invoiceCycle', value)"
><template #suffix>天</template></el-input>
</el-form-item>
<el-form-item label="回款账期">
<el-input
v-model="form.paymentDays"
placeholder="请输入"
@input="value => integerInput('paymentDays', value)"
/>
><template #suffix>天</template></el-input>
</el-form-item>
</div>
<el-form-item label="备注" prop="remark" class="contract-manage-form__remark">
@@ -605,9 +622,6 @@
<el-descriptions-item label="签订日期">{{
detailValue('signDate')
}}</el-descriptions-item>
<el-descriptions-item label="结算类型">{{
detailValue('settlementMode')
}}</el-descriptions-item>
<el-descriptions-item label="合同格式">{{
detailValue('contractFormat')
}}</el-descriptions-item>
@@ -617,6 +631,15 @@
<el-descriptions-item label="一式">{{
detailUnitValue('copyCount', '份')
}}</el-descriptions-item>
<el-descriptions-item label="结算币种">{{
detailDictionaryValue('settlementCurrency', settlementCurrencyOptions)
}}</el-descriptions-item>
<el-descriptions-item label="结算方式">{{
detailDictionaryValue('settlementMode', settlementModeOptions)
}}</el-descriptions-item>
<el-descriptions-item label="开票周期">{{
detailUnitValue('invoiceCycle', '天')
}}</el-descriptions-item>
<el-descriptions-item label="回款账期">{{
detailUnitValue('paymentDays', '天')
}}</el-descriptions-item>
@@ -787,6 +810,8 @@ import * as api from '@/api/business/contract-manage';
import { getList as getProjectList } from '@/api/business/project-apply';
import { getList as getCustomerArchiveList } from '@/api/vehicle/customer-archive';
import { getDeptTree } from '@/api/system/dept';
import { getDictionary as getSystemDictionary } from '@/api/system/dict';
import { getDictionary as getBizDictionary } from '@/api/system/dictbiz';
import { config, option } from '@/option/business/contract-manage';
import { getToken } from '@/utils/auth';
import { downloadFileByUrl, downloadXls } from '@/utils/util';
@@ -831,6 +856,8 @@ const defaultForm = () => ({
contractFormat: '',
legalSealFlag: 0,
copyCount: '',
settlementCurrency: '',
invoiceCycle: '',
paymentDays: '',
startDate: '',
endDate: '',
@@ -1114,14 +1141,27 @@ export default {
contractName: [{ required: true, message: '请输入合同名称', trigger: 'blur' }],
contractCategory: [{ required: true, message: '请选择合同类别', trigger: 'change' }],
signType: [{ required: true, message: '请选择签约类型', trigger: 'change' }],
settlementCurrency: [{ required: true, message: '请选择结算币种', trigger: 'change' }],
projectName: [{ required: true, message: '请选择所属项目', trigger: 'change' }],
organizationName: [{ required: true, message: '请选择所属组织', trigger: 'change' }],
partyA: [{ required: true, message: '请选择甲方', trigger: 'change' }],
partyB: [{ required: true, message: '请选择乙方', trigger: 'change' }],
signDate: [{ required: true, message: '请选择签订日期', trigger: 'change' }],
settlementMode: [{ required: true, message: '请选择结算类型', trigger: 'change' }],
settlementMode: [{ required: true, message: '请选择结算方式', trigger: 'change' }],
contractFormat: [{ required: true, message: '请选择合同格式', trigger: 'change' }],
legalSealFlag: [{ required: true, message: '请选择是否需要加盖法人章', trigger: 'change' }],
invoiceCycle: [
{
validator: (rule, value, callback) => {
if (value === '' || value === undefined || value === null) return callback();
if (!/^\d+$/.test(String(value)) || Number(value) < 1) {
return callback(new Error('开票周期只能输入正整数'));
}
callback();
},
trigger: 'blur',
},
],
startDate: [{ required: true, message: '请选择开始日期', trigger: 'change' }],
endDate: [{ required: true, message: '请选择结束日期', trigger: 'change' }],
},
@@ -1129,6 +1169,8 @@ export default {
projectOptions: [],
projectLoading: false,
selectedProjectId: '',
settlementCurrencyOptions: [],
settlementModeDictOptions: [],
contractPartyAOptions: [],
contractPartyBOptions: [],
contractPartyLoading: false,
@@ -1223,7 +1265,9 @@ export default {
return this.columnOptions('effectiveType');
},
settlementModeOptions() {
return this.columnOptions('settlementMode');
return this.settlementModeDictOptions.length
? this.settlementModeDictOptions
: this.columnOptions('settlementMode');
},
contractFormatOptions() {
return this.columnOptions('contractFormat');
@@ -1315,6 +1359,7 @@ export default {
},
created() {
this.loadProjectOptions();
this.loadSettlementDictionaries();
this.loadOrganizationOptions();
if (this.isFormPage) this.initFormPage();
},
@@ -1504,6 +1549,7 @@ export default {
...defaultForm(),
...detail,
copyCount: normalizeOptionalInteger(detail.copyCount, ''),
invoiceCycle: normalizeOptionalInteger(detail.invoiceCycle, ''),
paymentDays: normalizeOptionalInteger(detail.paymentDays, ''),
feeGenerationMode:
detail.feeGenerationMode || (Number(detail.billingEnabled) === 0 ? 'manual' : 'system'),
@@ -1548,6 +1594,10 @@ export default {
this.$message.warning('请选择合同类别');
return false;
}
if (!this.form.settlementCurrency) {
this.$message.warning('请选择结算币种');
return false;
}
if (['temporary', 'formal', 'edit'].includes(action) && !this.form.signType) {
this.$message.warning('请选择签约类型');
return false;
@@ -1561,7 +1611,7 @@ export default {
['startDate', '合同开始日期'],
['endDate', '合同结束日期'],
['signDate', '签订日期'],
['settlementMode', '结算类型'],
['settlementMode', '结算方式'],
['contractFormat', '合同格式'],
];
const empty = required.find(([prop]) => !this.form[prop]);
@@ -1580,6 +1630,7 @@ export default {
return {
...this.form,
copyCount: normalizeOptionalInteger(this.form.copyCount),
invoiceCycle: normalizeOptionalInteger(this.form.invoiceCycle),
paymentDays: normalizeOptionalInteger(this.form.paymentDays),
billingEnabled: this.form.feeGenerationMode === 'manual' ? 0 : 1,
contractFileJson: JSON.stringify(this.contractFileRows),
@@ -1656,6 +1707,29 @@ export default {
this.projectLoading = false;
});
},
loadSettlementDictionaries() {
Promise.all([
getSystemDictionary({ code: 'currency_type' }),
getBizDictionary({ code: 'settle_method' }),
]).then(([currencyRes, methodRes]) => {
const records = response => {
const data = response?.data?.data || response?.data || [];
return Array.isArray(data) ? data : data.records || [];
};
this.settlementCurrencyOptions = records(currencyRes).map(item => ({
label: `${item.dictKey} - ${item.dictValue}`,
value: item.dictKey,
}));
this.settlementModeDictOptions = records(methodRes).map(item => ({
label: item.dictValue,
value: item.dictKey,
}));
['settlementMode'].forEach(prop => {
const column = this.findColumn(this.tableOption.column, prop);
if (column) column.dicData = this.settlementModeDictOptions;
});
});
},
syncCurrentProjectOption() {
if (!this.form.projectId || !this.form.projectName) return;
if (this.projectOptions.some(item => String(item.id) === String(this.form.projectId))) return;
@@ -1664,12 +1738,13 @@ export default {
handleProjectChange(projectId) {
const project = this.projectOptions.find(item => String(item.id) === String(projectId));
if (!project) {
Object.assign(this.form, { projectId: '', projectName: '' });
Object.assign(this.form, { projectId: '', projectName: '', settlementMode: '' });
return;
}
Object.assign(this.form, {
projectId: project.id,
projectName: project.projectName || '',
settlementMode: project.settlementMode || this.form.settlementMode || '',
});
},
loadContractPartyOptions() {
@@ -1806,6 +1881,10 @@ export default {
integerInput(prop, value) {
this.form[prop] = String(value || '').replace(/\D/g, '');
},
positiveIntegerInput(prop, value) {
const normalized = String(value || '').replace(/\D/g, '').replace(/^0+/, '');
this.form[prop] = normalized;
},
previewAttachment(row, rows = []) {
const url = attachmentUrl(row);
if (!url) {
@@ -1996,6 +2075,7 @@ export default {
this.detailRow = {
...detail,
copyCount: normalizeOptionalInteger(detail.copyCount),
invoiceCycle: normalizeOptionalInteger(detail.invoiceCycle),
paymentDays: normalizeOptionalInteger(detail.paymentDays),
};
this.detailContractFileRows = parseArray(detail.contractFileJson);
@@ -2054,6 +2134,11 @@ export default {
if (prop === 'feeGenerationMode') return value === 'manual' ? '手动生成' : '系统生成';
return this.displayValue(value);
},
detailDictionaryValue(prop, options = []) {
const value = this.detailRow[prop];
if (value === undefined || value === null || value === '') return '-';
return options.find(item => String(item.value) === String(value))?.label || value;
},
handleOperation(operation, row) {
if (operation.action === 'startChange') {
this.$router.push({ path: '/business/contract-manage/change', query: { id: row.id } });