feat(pwl):添加审计核查页面

This commit is contained in:
2025-10-12 18:34:30 +08:00
parent def887f5ac
commit 39e79f2844
2 changed files with 531 additions and 12 deletions

View File

@@ -0,0 +1,506 @@
<template>
<!-- 审计核查弹窗 -->
<a-drawer
:width="`90%`"
:visible="visible"
:confirm-loading="loading"
:maxable="true"
:title="`审计核查 - ${form.name || ''}`"
:body-style="{ paddingBottom: '8px', background: '#f5f5f5' }"
@update:visible="updateVisible"
:maskClosable="false"
:footer="null"
>
<div class="audit-container">
<!-- 顶部操作区 -->
<div class="action-bar">
<div class="title">审计发现问题情况表</div>
<div class="buttons">
<a-space>
<a-button type="primary" @click="addProblem" class="action-button">
<template #icon><PlusOutlined /></template>
新增问题
</a-button>
<a-button @click="generateProblems" :loading="generating" class="action-button">
<template #icon><RobotOutlined /></template>
AI生成问题
</a-button>
<a-button @click="exportExcel" class="action-button">
<template #icon><ExportOutlined /></template>
导出Excel
</a-button>
<a-button type="danger" @click="saveData" class="action-button">
<template #icon><SaveOutlined /></template>
保存数据
</a-button>
</a-space>
</div>
</div>
<!-- 问题列表表格 -->
<a-card :bordered="false" class="table-card">
<a-table
:dataSource="problemList"
:columns="columns"
:scroll="{ x: 1500 }"
:pagination="false"
rowKey="id"
size="middle"
bordered
>
<template #bodyCell="{ column, record, index }">
<!-- 序号列 -->
<template v-if="column.dataIndex === 'index'">
{{ index + 1 }}
</template>
<!-- 金额列 -->
<template v-if="column.dataIndex === 'amount'">
<a-input-number
v-model:value="record.amount"
:min="0"
:precision="2"
style="width: 100%"
:bordered="false"
/>
</template>
<!-- 整改类型列 -->
<template v-if="column.dataIndex === 'rectificationType'">
<a-select
v-model:value="record.rectificationType"
style="width: 100%"
:bordered="false"
>
<a-select-option value="立行立改">立行立改</a-select-option>
<a-select-option value="限期整改">限期整改</a-select-option>
<a-select-option value="长期整改">长期整改</a-select-option>
</a-select>
</template>
<!-- 整改时限列 -->
<template v-if="column.dataIndex === 'deadline'">
<a-date-picker
v-model:value="record.deadline"
style="width: 100%"
:bordered="false"
/>
</template>
<!-- 操作列 -->
<template v-if="column.dataIndex === 'action'">
<a-space>
<a-button type="link" @click="editProblem(record)">
编辑
</a-button>
<a-button type="link" danger @click="deleteProblem(index)">
删除
</a-button>
</a-space>
</template>
</template>
</a-table>
</a-card>
<!-- 其他问题区域 -->
<a-card :bordered="false" class="other-problems-card">
<template #title>审计发现的其他问题未在报告正文反映</template>
<a-textarea
v-model:value="otherProblems"
:rows="4"
placeholder="请输入其他审计发现问题..."
/>
</a-card>
<!-- 问题编辑弹窗 -->
<a-modal
v-model:visible="showEditModal"
:title="editingProblem.id ? '编辑问题' : '新增问题'"
width="800px"
@ok="saveProblem"
@cancel="cancelEdit"
>
<a-form layout="vertical">
<a-form-item label="问题表述" required>
<a-textarea
v-model:value="editingProblem.problemDescription"
:rows="3"
placeholder="请输入问题表述"
/>
</a-form-item>
<a-form-item label="问题明细">
<a-textarea
v-model:value="editingProblem.problemDetails"
:rows="3"
placeholder="请输入问题明细"
/>
</a-form-item>
<a-form-item label="法规依据">
<a-textarea
v-model:value="editingProblem.legalBasis"
:rows="3"
placeholder="请输入法规依据"
/>
</a-form-item>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="涉及金额(万元)">
<a-input-number
v-model:value="editingProblem.amount"
:min="0"
:precision="2"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="整改类型">
<a-select v-model:value="editingProblem.rectificationType">
<a-select-option value="立行立改">立行立改</a-select-option>
<a-select-option value="限期整改">限期整改</a-select-option>
<a-select-option value="长期整改">长期整改</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-form-item label="具体责任界定">
<a-textarea
v-model:value="editingProblem.responsibility"
:rows="2"
placeholder="请输入具体责任界定"
/>
</a-form-item>
<a-form-item label="整改要求">
<a-textarea
v-model:value="editingProblem.rectificationRequirement"
:rows="2"
placeholder="请输入整改要求"
/>
</a-form-item>
<a-form-item label="整改时限">
<a-date-picker
v-model:value="editingProblem.deadline"
style="width: 100%"
/>
</a-form-item>
<a-form-item label="审计建议">
<a-textarea
v-model:value="editingProblem.auditSuggestion"
:rows="3"
placeholder="请输入审计建议"
/>
</a-form-item>
</a-form>
</a-modal>
</div>
</a-drawer>
</template>
<script lang="ts" setup>
import { ref, reactive, watch } from 'vue';
import { message } from 'ant-design-vue';
import {
PlusOutlined,
RobotOutlined,
ExportOutlined,
SaveOutlined
} from '@ant-design/icons-vue';
import type { PwlProject } from '@/api/pwl/pwlProject/model';
// Props 定义
const props = defineProps<{
visible: boolean;
data?: PwlProject | null;
}>();
// Emits 定义
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
// 表单数据
const form = reactive<PwlProject>({
id: undefined,
name: undefined,
code: undefined,
});
// 状态变量
const problemList = ref<any[]>([]);
const otherProblems = ref('');
const loading = ref(false);
const generating = ref(false);
const showEditModal = ref(false);
const editingProblem = ref<any>({
problemDescription: '',
problemDetails: '',
legalBasis: '',
amount: 0,
responsibility: '',
rectificationType: '',
rectificationRequirement: '',
deadline: null,
auditSuggestion: ''
});
// 表格列定义
const columns = [
{
title: '序号',
dataIndex: 'index',
width: 60,
fixed: 'left'
},
{
title: '问题表述',
dataIndex: 'problemDescription',
width: 200,
ellipsis: true
},
{
title: '问题明细',
dataIndex: 'problemDetails',
width: 200,
ellipsis: true
},
{
title: '法规依据',
dataIndex: 'legalBasis',
width: 200,
ellipsis: true
},
{
title: '涉及金额(万元)',
dataIndex: 'amount',
width: 120
},
{
title: '具体责任界定',
dataIndex: 'responsibility',
width: 150,
ellipsis: true
},
{
title: '整改类型',
dataIndex: 'rectificationType',
width: 120
},
{
title: '整改要求',
dataIndex: 'rectificationRequirement',
width: 150,
ellipsis: true
},
{
title: '整改时限',
dataIndex: 'deadline',
width: 120
},
{
title: '审计建议',
dataIndex: 'auditSuggestion',
width: 150,
ellipsis: true
},
{
title: '操作',
dataIndex: 'action',
width: 120,
fixed: 'right'
}
];
// 更新visible
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
// 新增问题
const addProblem = () => {
editingProblem.value = {
problemDescription: '',
problemDetails: '',
legalBasis: '',
amount: 0,
responsibility: '',
rectificationType: '',
rectificationRequirement: '',
deadline: null,
auditSuggestion: ''
};
showEditModal.value = true;
};
// 编辑问题
const editProblem = (problem: any) => {
editingProblem.value = { ...problem };
showEditModal.value = true;
};
// 保存问题
const saveProblem = () => {
if (!editingProblem.value.problemDescription) {
message.warning('请输入问题表述');
return;
}
if (!editingProblem.value.id) {
editingProblem.value.id = Date.now();
problemList.value.push({ ...editingProblem.value });
} else {
const index = problemList.value.findIndex(p => p.id === editingProblem.value.id);
if (index !== -1) {
problemList.value[index] = { ...editingProblem.value };
}
}
message.success('保存成功');
showEditModal.value = false;
};
// 取消编辑
const cancelEdit = () => {
showEditModal.value = false;
};
// 删除问题
const deleteProblem = (index: number) => {
problemList.value.splice(index, 1);
message.success('删除成功');
};
// AI生成问题
const generateProblems = async () => {
generating.value = true;
try {
await new Promise(resolve => setTimeout(resolve, 2000));
const sampleProblems = [
{
id: Date.now(),
problemDescription: '内部控制制度的制定和执行情况,未建立代管业务相关的管理办法',
problemDetails: '审计发现,企业管理公司未建立代管业务的管理办法及代管业务流程机制。',
legalBasis: '上述情况不符合《企业内部控制基本规范》第四条"企业建立与实施内部控制,应当贯穿决策、执行和监督全过程,覆盖企业及其所属单位的各种业务和事项。"的规定。',
amount: 0,
responsibility: '罗世东同志、莫咏麟同志对任期内问题负有领导责任',
rectificationType: '限期整改',
rectificationRequirement: '建立健全代管业务管理制度',
deadline: null,
auditSuggestion: '建议尽快制定代管业务相关管理办法,明确业务流程和职责分工'
}
];
problemList.value = [...problemList.value, ...sampleProblems];
message.success('问题生成成功');
} catch (error) {
message.error('问题生成失败');
} finally {
generating.value = false;
}
};
// 导出Excel
const exportExcel = () => {
message.info('导出功能开发中...');
};
// 保存数据
const saveData = () => {
const dataToSave = {
problems: problemList.value,
otherProblems: otherProblems.value
};
console.log('保存的数据:', dataToSave);
message.success('数据保存成功');
};
// 加载审计核查数据
const loadAuditCheckData = () => {
problemList.value = [];
otherProblems.value = '';
};
// 监听数据变化
watch(
() => props.data,
(data) => {
if (data) {
Object.assign(form, data);
loadAuditCheckData();
}
}
);
</script>
<style lang="less" scoped>
.audit-container {
.action-bar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
background: white;
padding: 16px;
border-radius: 4px;
.title {
font-size: 16px;
font-weight: bold;
color: #1890ff;
}
.action-button {
border-radius: 20px;
transition: all 0.3s ease;
&:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(24, 144, 255, 0.15);
}
}
}
.table-card {
margin-bottom: 16px;
:deep(.ant-table) {
.ant-table-thead > tr > th {
background: #1890ff;
color: white;
text-align: center;
}
.ant-table-tbody > tr > td {
.ant-input,
.ant-input-number-input,
.ant-select-selector,
.ant-picker {
&:hover {
background: #f5f5f5;
}
}
}
.ant-table-row:hover {
.ant-input,
.ant-input-number-input,
.ant-select-selector,
.ant-picker {
background: #f5f5f5;
}
}
}
}
.other-problems-card {
:deep(.ant-card-head) {
background: #fff2e8;
border-bottom: 1px solid #ffd8bf;
}
:deep(.ant-card-head-title) {
color: #873800;
font-weight: bold;
}
}
}
</style>

View File

@@ -69,22 +69,24 @@
</a-tooltip>
</template>
<template v-if="column.key === 'action'">
<div>
<a class="text-pink-500" @click="openReport(record)">生成报告</a>
<a-divider type="vertical"/>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical"/>
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</div>
<div>
<a @click="openCaseManagement(record)">材料分析</a>
<a-divider type="vertical"/>
<a @click="openDocumentManagement(record)">项目文档</a>
<a-divider type="vertical"/>
<a @click="openEdit(record)">修改</a>
</div>
<div>
<a class="text-pink-500" @click="openReport(record)">生成报告</a>
<a-divider type="vertical"/>
<a class="text-yellow-500" @click="openAuditCheck(record)">审计核查</a>
<a-divider type="vertical"/>
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</div>
</template>
</template>
@@ -95,6 +97,8 @@
<Edit v-model:visible="showEdit" :data="current" @done="reload"/>
<!-- 生成报告 -->
<Report v-model:visible="showReport" :data="current" @done="reload"/>
<!-- 审计核查弹窗 -->
<AuditCheck v-model:visible="showAuditCheck" :data="current" @done="reload"/>
<!-- 添加文档管理弹窗 -->
<a-modal
@@ -161,6 +165,7 @@ import {getPageTitle} from "@/utils/common";
import Extra from "./components/extra.vue";
import Import from '@/views/oa/oaCompany/components/Import.vue';
import {getKnowledgeBaseDocuments, deleteKnowledgeBaseDocument} from '@/api/ai/knowledgeBase';
import AuditCheck from "./components/auditCheck.vue";
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
@@ -173,6 +178,8 @@ const current = ref<PwlProject | null>(null);
const showEdit = ref(false);
// 是否显示报告弹窗
const showReport = ref(false);
// 是否显示审计核查弹窗
const showAuditCheck = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// const draftUser = ref<string[]>([]);
@@ -216,6 +223,12 @@ const docColumns = ref([
}
]);
// 打开审计核查弹窗
const openAuditCheck = (record: PwlProject) => {
current.value = record;
showAuditCheck.value = true;
};
// 打开材料分析
const openCaseManagement = (record: PwlProject) => {
if (!record.analysisLibrary) {