feat(pwl):添加审计核查页面
This commit is contained in:
506
src/views/pwl/pwlProject/components/auditCheck.vue
Normal file
506
src/views/pwl/pwlProject/components/auditCheck.vue
Normal 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>
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user