|
|
@@ -8,54 +8,62 @@
|
|
|
|
|
|
<!-- 搜索表单 -->
|
|
|
<el-card shadow="hover" class="search-card">
|
|
|
- <el-form :model="queryParams" :inline="true">
|
|
|
- <el-form-item label="合同编号">
|
|
|
- <el-input v-model="queryParams.contractNo" placeholder="请输入合同编号" clearable style="width: 200px;" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="合同名称">
|
|
|
- <el-input v-model="queryParams.contractName" placeholder="请输入合同名称" clearable style="width: 200px;" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="合同类型">
|
|
|
- <el-select v-model="queryParams.contractType" placeholder="请选择" clearable style="width: 150px;">
|
|
|
- <el-option
|
|
|
- v-for="item in contractTypeDict"
|
|
|
- :key="item.dictValue"
|
|
|
- :label="item.dictLabel"
|
|
|
- :value="item.dictValue"
|
|
|
- />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="开始时间">
|
|
|
- <el-date-picker
|
|
|
- v-model="queryParams.contractStartTime"
|
|
|
- type="date"
|
|
|
- placeholder="请选择"
|
|
|
- style="width: 150px;"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="结束时间">
|
|
|
- <el-date-picker
|
|
|
- v-model="queryParams.contractEndTime"
|
|
|
- type="date"
|
|
|
- placeholder="请选择"
|
|
|
- style="width: 150px;"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="合同状态">
|
|
|
- <el-select v-model="queryParams.contractStatus" placeholder="请选择" clearable style="width: 150px;">
|
|
|
- <el-option
|
|
|
- v-for="item in contractStatusDict"
|
|
|
- :key="item.dictValue"
|
|
|
- :label="item.dictLabel"
|
|
|
- :value="item.dictValue"
|
|
|
- />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
|
|
|
- <el-button icon="Refresh" @click="handleReset">重置</el-button>
|
|
|
- <el-button type="primary" @click="handleAdd">创建合同</el-button>
|
|
|
- </el-form-item>
|
|
|
+ <el-form :model="queryParams" label-width="80px">
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="合同编号">
|
|
|
+ <el-input v-model="queryParams.contractNo" placeholder="请输入合同编号" clearable style="width: 100%;" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="合同名称">
|
|
|
+ <el-input v-model="queryParams.contractName" placeholder="请输入合同名称" clearable style="width: 100%;" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="合同类型">
|
|
|
+ <el-select v-model="queryParams.contractType" placeholder="请选择" clearable style="width: 100%;">
|
|
|
+ <el-option
|
|
|
+ v-for="item in contractTypeDict"
|
|
|
+ :key="item.dictValue"
|
|
|
+ :label="item.dictLabel"
|
|
|
+ :value="item.dictValue"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="合同状态">
|
|
|
+ <el-select v-model="queryParams.contractStatus" placeholder="请选择" clearable style="width: 100%;">
|
|
|
+ <el-option
|
|
|
+ v-for="item in contractStatusDict"
|
|
|
+ :key="item.dictValue"
|
|
|
+ :label="item.dictLabel"
|
|
|
+ :value="item.dictValue"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="开始时间">
|
|
|
+ <el-date-picker v-model="queryParams.contractStartTime" type="date" placeholder="请选择" style="width: 100%;" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="结束时间">
|
|
|
+ <el-date-picker v-model="queryParams.contractEndTime" type="date" placeholder="请选择" style="width: 100%;" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label-width="0px">
|
|
|
+ <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
|
|
|
+ <el-button icon="Refresh" @click="handleReset">重置</el-button>
|
|
|
+ <el-button type="primary" icon="Plus" @click="handleAdd">创建合同</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
</el-form>
|
|
|
</el-card>
|
|
|
|
|
|
@@ -73,7 +81,7 @@
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="contractAmount" label="金额(万)" align="center">
|
|
|
<template #default="scope">
|
|
|
- <span>{{ scope.row.contractAmount || '-' }}</span>
|
|
|
+ <span>{{ formatWanAmount(scope.row.contractAmount) }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="contractStartTime" label="起始时间" align="center">
|
|
|
@@ -276,8 +284,16 @@
|
|
|
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button @click="contractDialogVisible = false">取消</el-button>
|
|
|
- <el-button v-if="!contractDialogReadonly" type="primary" @click="handleContractSubmit" :loading="contractSubmitLoading">确定</el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="contractDialogReadonly"
|
|
|
+ type="primary"
|
|
|
+ @click="handleApprove"
|
|
|
+ :loading="approveLoading"
|
|
|
+ >审核通过</el-button>
|
|
|
+ <template v-else>
|
|
|
+ <el-button @click="contractDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="handleContractSubmit" :loading="contractSubmitLoading">确定</el-button>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
@@ -297,6 +313,47 @@ import { listByIds } from '@/api/system/oss';
|
|
|
const route = useRoute();
|
|
|
const router = useRouter();
|
|
|
|
|
|
+const wanToYuanString = (value: unknown): string => {
|
|
|
+ const raw = String(value ?? '').trim();
|
|
|
+ if (!raw) return '';
|
|
|
+
|
|
|
+ const normalized = raw.replace(/,/g, '');
|
|
|
+ const match = normalized.match(/^(-?)(\d+)(?:\.(\d+))?$/);
|
|
|
+ if (!match) return '';
|
|
|
+
|
|
|
+ const sign = match[1] ? '-' : '';
|
|
|
+ const intPart = match[2] || '0';
|
|
|
+ const fracRaw = match[3] || '';
|
|
|
+ const fracPart = (fracRaw + '0000').slice(0, 4);
|
|
|
+
|
|
|
+ const base = BigInt(intPart) * 10000n + BigInt(fracPart);
|
|
|
+ return sign ? '-' + base.toString() : base.toString();
|
|
|
+};
|
|
|
+
|
|
|
+const yuanToWanString = (value: unknown): string => {
|
|
|
+ const raw = String(value ?? '').trim();
|
|
|
+ if (!raw) return '';
|
|
|
+
|
|
|
+ const normalized = raw.replace(/,/g, '');
|
|
|
+ const match = normalized.match(/^(-?)(\d+)$/);
|
|
|
+ if (!match) return '';
|
|
|
+
|
|
|
+ const sign = match[1] ? '-' : '';
|
|
|
+ const amount = BigInt(match[2] || '0');
|
|
|
+ const intPart = amount / 10000n;
|
|
|
+ const fracPart = amount % 10000n;
|
|
|
+
|
|
|
+ const fracPadded = fracPart.toString().padStart(4, '0');
|
|
|
+ const fracTrimmed = fracPadded.replace(/0+$/, '');
|
|
|
+ const result = fracTrimmed ? `${intPart.toString()}.${fracTrimmed}` : intPart.toString();
|
|
|
+ return sign ? '-' + result : result;
|
|
|
+};
|
|
|
+
|
|
|
+const formatWanAmount = (value: unknown) => {
|
|
|
+ const v = yuanToWanString(value);
|
|
|
+ return v ? v : '-';
|
|
|
+};
|
|
|
+
|
|
|
const loading = ref(false);
|
|
|
const contractList = ref<any[]>([]);
|
|
|
|
|
|
@@ -305,6 +362,7 @@ const contractDialogVisible = ref(false);
|
|
|
const contractDialogTitle = ref('');
|
|
|
const contractDialogReadonly = ref(false);
|
|
|
const contractSubmitLoading = ref(false);
|
|
|
+const approveLoading = ref(false);
|
|
|
const contractFormRef = ref();
|
|
|
|
|
|
// 合同表单
|
|
|
@@ -486,7 +544,10 @@ const handleAdd = () => {
|
|
|
|
|
|
/** 查看合同 */
|
|
|
const handleView = (row: any) => {
|
|
|
- contractForm.value = { ...row };
|
|
|
+ contractForm.value = {
|
|
|
+ ...row,
|
|
|
+ contractAmount: yuanToWanString(row?.contractAmount)
|
|
|
+ };
|
|
|
contractDialogTitle.value = '查看合同';
|
|
|
contractDialogReadonly.value = true;
|
|
|
contractDialogVisible.value = true;
|
|
|
@@ -494,7 +555,10 @@ const handleView = (row: any) => {
|
|
|
|
|
|
/** 编辑合同 */
|
|
|
const handleEdit = (row: any) => {
|
|
|
- contractForm.value = { ...row };
|
|
|
+ contractForm.value = {
|
|
|
+ ...row,
|
|
|
+ contractAmount: yuanToWanString(row?.contractAmount)
|
|
|
+ };
|
|
|
contractDialogTitle.value = '修改合同';
|
|
|
contractDialogReadonly.value = false;
|
|
|
contractDialogVisible.value = true;
|
|
|
@@ -506,7 +570,11 @@ const handleContractSubmit = async () => {
|
|
|
if (valid) {
|
|
|
contractSubmitLoading.value = true;
|
|
|
try {
|
|
|
- await updateContract(contractForm.value);
|
|
|
+ const payload = {
|
|
|
+ ...contractForm.value,
|
|
|
+ contractAmount: wanToYuanString(contractForm.value.contractAmount)
|
|
|
+ };
|
|
|
+ await updateContract(payload);
|
|
|
ElMessage.success('修改成功');
|
|
|
contractDialogVisible.value = false;
|
|
|
// 刷新列表
|
|
|
@@ -521,6 +589,35 @@ const handleContractSubmit = async () => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+/** 审核通过 */
|
|
|
+const handleApprove = async () => {
|
|
|
+ try {
|
|
|
+ await ElMessageBox.confirm('确认审核通过该合同吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ });
|
|
|
+ } catch {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ approveLoading.value = true;
|
|
|
+ try {
|
|
|
+ await updateContract({
|
|
|
+ id: contractForm.value?.id,
|
|
|
+ contractStatus: 1
|
|
|
+ });
|
|
|
+ ElMessage.success('审核通过成功');
|
|
|
+ contractDialogVisible.value = false;
|
|
|
+ getContractList();
|
|
|
+ } catch (e) {
|
|
|
+ console.error('审核通过失败:', e);
|
|
|
+ ElMessage.error('审核通过失败');
|
|
|
+ } finally {
|
|
|
+ approveLoading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
/** 查看附件 */
|
|
|
const handleViewAttachment = async (row: any) => {
|
|
|
if (!row.contractAttachment) {
|
|
|
@@ -562,32 +659,6 @@ const handleViewAttachment = async (row: any) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-/** 审核通过 */
|
|
|
-const handleApprove = async (row: any) => {
|
|
|
- try {
|
|
|
- await ElMessageBox.confirm('确认审核通过该合同吗?', '提示', {
|
|
|
- confirmButtonText: '确定',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning'
|
|
|
- });
|
|
|
-
|
|
|
- // 更新合同状态为审核通过(状态改为1)
|
|
|
- await updateContract({
|
|
|
- ...row,
|
|
|
- contractStatus: 1
|
|
|
- });
|
|
|
-
|
|
|
- ElMessage.success('审核通过');
|
|
|
- // 刷新列表
|
|
|
- getContractList();
|
|
|
- } catch (e: any) {
|
|
|
- if (e !== 'cancel') {
|
|
|
- console.error('审核失败:', e);
|
|
|
- ElMessage.error('审核失败');
|
|
|
- }
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
/** 格式化日期 */
|
|
|
const formatDate = (date: string | Date) => {
|
|
|
if (!date) return '-';
|