This commit is contained in:
2025-10-24 22:12:54 +08:00
parent d4ff2a9423
commit 5e34284eb2
5 changed files with 1567 additions and 1312 deletions

BIN
src/assets/word.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -15,6 +15,7 @@
:columns="columns" :columns="columns"
:customRow="customRow" :customRow="customRow"
:pagination="false" :pagination="false"
:selection="selection"
> >
<template #toolbar> <template #toolbar>
<div class="ele-cell"> <div class="ele-cell">
@@ -33,6 +34,19 @@
<span>上传视频</span> <span>上传视频</span>
</a-button> </a-button>
</a-upload> </a-upload>
<a-upload
v-else-if="type == 'file'"
:show-upload-list="false"
accept="*"
:customRequest="onUpload"
>
<a-button type="primary" class="ele-btn-icon">
<template #icon>
<UploadOutlined />
</template>
<span>上传文件</span>
</a-button>
</a-upload>
<a-upload <a-upload
v-else v-else
:show-upload-list="false" :show-upload-list="false"
@@ -222,6 +236,7 @@
} }
]); ]);
const selection = ref([])
// 表格数据源 // 表格数据源
const datasource: DatasourceFunction = ({ page, limit, where, orders }) => { const datasource: DatasourceFunction = ({ page, limit, where, orders }) => {
where = {}; where = {};

View File

@@ -1,5 +1,6 @@
<template> <template>
<a-image-preview-group> <div style="display: inline">
<a-image-preview-group v-if="type !== 'file'">
<a-space> <a-space>
<template v-for="(item, index) in data" :key="index"> <template v-for="(item, index) in data" :key="index">
<div class="image-upload-item" v-if="isImage(item.url)"> <div class="image-upload-item" v-if="isImage(item.url)">
@@ -32,7 +33,8 @@
</a-button> </a-button>
</a-space> </a-space>
</a-image-preview-group> </a-image-preview-group>
<a-button v-else @click="openEdit" type="primary">选择文件</a-button>
</div>
<!-- 选择弹窗 --> <!-- 选择弹窗 -->
<SelectData <SelectData
v-model:visible="showEdit" v-model:visible="showEdit"
@@ -44,11 +46,15 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { PlusOutlined, CloseOutlined, YoutubeOutlined } from '@ant-design/icons-vue'; import {
PlusOutlined,
CloseOutlined,
YoutubeOutlined
} from '@ant-design/icons-vue';
import { ref } from 'vue'; import { ref } from 'vue';
import SelectData from './components/select-data.vue'; import SelectData from './components/select-data.vue';
import { FileRecord } from '@/api/system/file/model'; import { FileRecord } from '@/api/system/file/model';
import { isImage } from "@/utils/common"; import { isImage } from '@/utils/common';
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{

View File

@@ -1,7 +1,7 @@
<!-- 用户编辑弹窗 --> <!-- 用户编辑弹窗 -->
<template> <template>
<a-drawer <a-drawer
:width="`70%`" :width="`95%`"
:visible="visible" :visible="visible"
:confirm-loading="loading" :confirm-loading="loading"
:maxable="maxAble" :maxable="maxAble"
@@ -138,11 +138,16 @@
:id="`section-${index}`" :id="`section-${index}`"
class="audit-section" class="audit-section"
> >
<a-card <a-card style="margin-bottom: 20px" :bordered="false">
:title="`${item.number}、${item.name}`" <template #title>
style="margin-bottom: 20px" <span class="font-bold">{{ `${item.number}${item.name}` }}</span>
:bordered="false" <span class="ml-4 text-gray-400" v-if="item.extra3">{{
> table3Title
}}</span>
<span class="ml-4 text-gray-400" v-if="item.file3">
<SelectFile :data="file3List" type="file"/>
</span>
</template>
<template #extra> <template #extra>
<a-button <a-button
type="primary" type="primary"
@@ -155,7 +160,47 @@
AI生成 AI生成
</a-button> </a-button>
</template> </template>
<a-table :columns="item.columns" bordered :data-source="item.data"></a-table> <template v-if="item.extra3">
<div class="mb-2">
<a-space>
<div
class="btn"
:class="[
table3Title === '重大经济决策调查表'
? 'btn-green'
: 'btn-gray'
]"
@click="changeTable3('重大经济决策调查表')"
>重大经济决策调查表</div
>
<div
class="btn"
:class="[
table3Title === '三重一大' ? 'btn-green' : 'btn-gray'
]"
@click="changeTable3('三重一大')"
>三重一大</div
>
</a-space>
</div>
</template>
<a-table :columns="item.columns" bordered :data-source="item.data">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<a-button type="primary" danger>删除</a-button>
</template>
<template v-if="column.key === 'testResult'">
<span class="text-green-400" v-if="record.testResult === '通过'">通过</span>
<span class="text-red-400" v-else>不通过</span>
</template>
<template v-if="column.key === 'fileIndex'">
<div v-for="(item, index) in record.fileIndex" :key="index">
<img src="@/assets/word.png" style="width: 20px; height: 20px" alt="">
<span class="cursor-pointer text-wrap">{{ item }}</span>
</div>
</template>
</template>
</a-table>
<!-- <div v-if="item.description" class="section-description">--> <!-- <div v-if="item.description" class="section-description">-->
<!-- {{ item.description }}--> <!-- {{ item.description }}-->
<!-- </div>--> <!-- </div>-->
@@ -307,17 +352,20 @@
{ {
title: '会议时间', title: '会议时间',
dataIndex: 'content', dataIndex: 'content',
key: 'content' key: 'content',
width: 120
}, },
{ {
title: '决策事项金额', title: '决策事项金额',
dataIndex: 'amount', dataIndex: 'amount',
key: 'amount' key: 'amount',
width: 120
}, },
{ {
title: '程序程序', title: '程序程序',
dataIndex: 'progress', dataIndex: 'progress',
key: 'progress' key: 'progress',
width: 300
}, },
{ {
title: '执行情况(是/否)', title: '执行情况(是/否)',
@@ -329,11 +377,11 @@
children: [ children: [
{ {
title: '好', title: '好',
dataIndex: 'goods', dataIndex: 'goods'
}, },
{ {
title: '一般', title: '一般',
dataIndex: 'normal', dataIndex: 'normal'
}, },
{ {
title: '差', title: '差',
@@ -354,11 +402,12 @@
const combinedKbIds = ref(''); const combinedKbIds = ref('');
// 九大审计项目导航配置 // 九大审计项目导航配置
const table3Title = ref('重大经济决策调查表');
const navigationItems = ref([ const navigationItems = ref([
{ {
number: '一', number: '一',
name: '审计内容1', name: '审计内容1',
title: '1、审计依据', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计依据内容...', placeholder: '请输入审计依据内容...',
content: '', content: '',
@@ -371,7 +420,7 @@
{ {
number: '二', number: '二',
name: '审计内容2', name: '审计内容2',
title: '2、审计目标', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计目标内容...', placeholder: '请输入审计目标内容...',
content: '', content: '',
@@ -384,9 +433,11 @@
{ {
number: '三', number: '三',
name: '审计内容3', name: '审计内容3',
title: '3、重大经济决策调查表', title: '重大经济决策调查表',
description: '点击"AI生成"按钮生成重大经济决策调查表数据', description: '点击"AI生成"按钮生成重大经济决策调查表数据',
generating: false, generating: false,
extra3: true,
file3: true,
columns: [ columns: [
{ {
title: '序号', title: '序号',
@@ -400,14 +451,14 @@
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
width: 200, width: 200,
align: 'center'
}, },
{ {
title: '会议时间', title: '会议时间',
dataIndex: 'meetingTime', dataIndex: 'meetingTime',
key: 'meetingTime', key: 'meetingTime',
width: 120, align: 'center',
align: 'center' width: 120
}, },
{ {
title: '决策事项金额', title: '决策事项金额',
@@ -420,14 +471,14 @@
title: '程序', title: '程序',
dataIndex: 'procedure', dataIndex: 'procedure',
key: 'procedure', key: 'procedure',
width: 180, align: 'center',
customRender: ({ text }) => text || '程序未记录' customRender: ({ text }) => text || '程序未记录'
}, },
{ {
title: '执行情况(是/否)', title: '执行情况(是/否)',
dataIndex: 'executionStatus', dataIndex: 'executionStatus',
key: 'executionStatus', key: 'executionStatus',
width: 100, width: 80,
align: 'center' align: 'center'
}, },
{ {
@@ -439,7 +490,7 @@
key: 'goods', key: 'goods',
width: 60, width: 60,
align: 'center', align: 'center',
customRender: ({ text }) => text === '是' ? '✅' : '' customRender: ({ text }) => (text === '是' ? '✅' : '')
}, },
{ {
title: '一般', title: '一般',
@@ -447,7 +498,7 @@
key: 'normal', key: 'normal',
width: 60, width: 60,
align: 'center', align: 'center',
customRender: ({ text }) => text === '是' ? '✅' : '' customRender: ({ text }) => (text === '是' ? '✅' : '')
}, },
{ {
title: '差', title: '差',
@@ -455,9 +506,15 @@
key: 'bad', key: 'bad',
width: 60, width: 60,
align: 'center', align: 'center',
customRender: ({ text }) => text === '是' ? '✅' : '' customRender: ({ text }) => (text === '是' ? '✅' : '')
} }
] ]
},
{
title: '操作',
key: 'action',
align: 'center',
width: 140
} }
], ],
data: [] data: []
@@ -465,7 +522,7 @@
{ {
number: '四', number: '四',
name: '审计内容4', name: '审计内容4',
title: '4、被审计单位基本情况', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
generating: false, generating: false,
columns: columns.value columns: columns.value
@@ -473,7 +530,7 @@
{ {
number: '五', number: '五',
name: '审计内容5', name: '审计内容5',
title: '5、审计内容和重点及审计方法', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
generating: false, generating: false,
columns: [ columns: [
@@ -560,7 +617,7 @@
{ {
number: '六', number: '六',
name: '审计内容6', name: '审计内容6',
title: '6、重要风险的识别及应对', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
generating: false, generating: false,
columns: columns.value columns: columns.value
@@ -568,7 +625,7 @@
{ {
number: '七', number: '七',
name: '审计内容7', name: '审计内容7',
title: '7、审计技术方法', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计技术方法内容...', placeholder: '请输入审计技术方法内容...',
content: '', content: '',
@@ -581,7 +638,7 @@
{ {
number: '八', number: '八',
name: '审计内容8', name: '审计内容8',
title: '8、工作步骤与时间安排', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入工作步骤与时间安排内容...', placeholder: '请输入工作步骤与时间安排内容...',
content: '', content: '',
@@ -594,7 +651,7 @@
{ {
number: '九', number: '九',
name: '审计内容9', name: '审计内容9',
title: '9、审计工作的组织实施', title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑', description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计工作的组织实施内容...', placeholder: '请输入审计工作的组织实施内容...',
content: '', content: '',
@@ -606,6 +663,170 @@
} }
]); ]);
const file3List = ref([])
const changeTable3 = (title) => {
table3Title.value = title;
if (title === '三重一大') {
navigationItems.value[2].columns = [
{
title: '',
dataIndex: 'index',
key: 'index',
width: 120,
align: 'center'
},
{
title: '政策内容',
dataIndex: 'content',
key: 'content',
align: 'center'
},
{
title: '集团制度',
dataIndex: 'groupSystem',
key: 'groupSystem',
align: 'center'
},
{
title: '公司制定',
dataIndex: 'companyCustom',
key: 'companyCustom',
align: 'center'
},
{
title: '检查的证据及测试内容',
dataIndex: 'testContent',
key: 'testContent',
align: 'center'
},
{
title: '测试结果',
dataIndex: 'testResult',
key: 'testResult',
align: 'center'
},
{
title: '工作底稿索引',
dataIndex: 'fileIndex',
key: 'fileIndex',
align: 'center',
width: 140,
ellipsis: true,
},
{
title: '操作',
key: 'action',
align: 'center',
width: 100,
}
];
navigationItems.value[2].data = [
{
index: '重大决策',
content: '',
groupSystem: '',
companyCustom: '',
testContent: '',
testResult: '通过',
fileIndex: ['中央部门单位2023年预算执行等情况审计结果.doc']
}
];
} else {
navigationItems.value[2].columns = [
{
title: '序号',
dataIndex: 'index',
key: 'index',
width: 80,
align: 'center'
},
{
title: '重大经济决策事项',
dataIndex: 'name',
key: 'name',
width: 200,
align: 'center'
},
{
title: '会议时间',
dataIndex: 'meetingTime',
key: 'meetingTime',
align: 'center',
width: 120
},
{
title: '决策事项金额',
dataIndex: 'decisionAmount',
key: 'decisionAmount',
width: 120,
align: 'center'
},
{
title: '程序',
dataIndex: 'procedure',
key: 'procedure',
align: 'center',
customRender: ({ text }) => text || '程序未记录'
},
{
title: '执行情况(是/否)',
dataIndex: 'executionStatus',
key: 'executionStatus',
width: 80,
align: 'center'
},
{
title: '执行效果(是否实现决策目标)',
children: [
{
title: '好',
dataIndex: 'goods',
key: 'goods',
width: 60,
align: 'center',
customRender: ({ text }) => (text === '是' ? '✅' : '')
},
{
title: '一般',
dataIndex: 'normal',
key: 'normal',
width: 60,
align: 'center',
customRender: ({ text }) => (text === '是' ? '✅' : '')
},
{
title: '差',
dataIndex: 'bad',
key: 'bad',
width: 60,
align: 'center',
customRender: ({ text }) => (text === '是' ? '✅' : '')
}
]
},
{
title: '操作',
key: 'action',
align: 'center',
width: 140
}
];
navigationItems.value[2].data = [
{
index: 1,
name: '千汇公司废水处理站扩容升级改造项目',
meetingTime: '2024-01-03',
decisionAmount: '190万元',
procedure:
'经专题会议研究并组织外部专家二次评勖审(《2023年第九次总办会会议材料汇总》),形成方案后提交总经理办公会审鈀还户,以记名投票方式全票通过。议案履行了可行性论证、专家咨询、集体讨论和会议决策程序,符台《广西千汇食品有限公司总经理办公会议事规则(试行)》第十条、第十八条关于重大项目投资业务决策程序的要求。',
executionStatus: '是',
goods: '是'
}
];
}
};
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'done'): void; (e: 'done'): void;
(e: 'update:visible', visible: boolean): void; (e: 'update:visible', visible: boolean): void;
@@ -938,7 +1159,8 @@
section.generating = true; section.generating = true;
// 构建history - 将当前已有的数据作为历史记录 // 构建history - 将当前已有的数据作为历史记录
const history = section.data && section.data.length > 0 const history =
section.data && section.data.length > 0
? JSON.stringify(section.data, null, 2) ? JSON.stringify(section.data, null, 2)
: ''; : '';
@@ -991,7 +1213,6 @@
section.suggestion = ''; section.suggestion = '';
message.success(`成功生成 ${tableData.length} 条重大经济决策记录`); message.success(`成功生成 ${tableData.length} 条重大经济决策记录`);
} else { } else {
const errorMsg = result.data?.error || result.message || '生成失败'; const errorMsg = result.data?.error || result.message || '生成失败';
throw new Error(errorMsg); throw new Error(errorMsg);
@@ -1393,4 +1614,17 @@
right: 30px; right: 30px;
bottom: 30px; bottom: 30px;
} }
.btn {
padding: 5px 10px;
color: white;
border-radius: 999px;
cursor: pointer;
}
.btn-gray {
background-color: #bbbbbb;
}
.btn-green {
background-color: #479b33;
}
</style> </style>

View File

@@ -99,7 +99,7 @@
<div> <div>
<a-space> <a-space>
<a class="action-btn bg-blue-500" @click="openReport(record)" <a class="action-btn bg-blue-500" @click="openReport(record)"
>1生成报告</a >1生成审计方案</a
> >
<a class="action-btn bg-green-600" @click="openReportContent(record)">2审计内容</a> <a class="action-btn bg-green-600" @click="openReportContent(record)">2审计内容</a>
<a class="action-btn bg-red-600" @click="openAuditCheck(record)" <a class="action-btn bg-red-600" @click="openAuditCheck(record)"
@@ -578,7 +578,7 @@
{ {
title: '操作', title: '操作',
key: 'action', key: 'action',
width: 220, width: 260,
fixed: 'right', fixed: 'right',
align: 'center', align: 'center',
hideInSetting: true hideInSetting: true