1、完善审计内容

2、文件分割
This commit is contained in:
2025-11-15 04:06:50 +08:00
parent 25217525b1
commit fa26684612
10 changed files with 3064 additions and 2040 deletions

View File

@@ -0,0 +1,332 @@
<template>
<a-modal
v-model:visible="showDocSelect"
title="选择文档"
width="1200px"
:footer="null"
wrap-class-name="doc-select-modal"
@cancel="handleDocSelectCancel"
>
<div class="doc-select-container">
<div class="doc-layout">
<!-- 左侧目录树 -->
<div class="dir-tree-panel">
<div class="dir-header">
<span>文档目录</span>
</div>
<div class="tree-container">
<a-tree
v-if="treeData.length > 0"
:tree-data="treeData"
:expanded-keys="expandedKeys"
:selected-keys="selectedKeys"
:load-data="onLoadData"
@expand="onExpand"
@select="onSelect"
:field-names="{ title: 'name', key: 'id', children: 'children' }"
checkable
:checked-keys="checkedDirKeys"
@check="onDirCheck"
>
<template #title="{ name, id }">
<span :class="{ 'active-dir': selectedKeys[0] === id }">{{
name
}}</span>
</template>
</a-tree>
<a-empty v-else :image="simpleImage" description="暂无目录" />
</div>
</div>
<!-- 右侧文档列表 -->
<div class="doc-list-panel">
<div class="doc-header">
<div class="doc-actions">
<span class="doc-tips"
>已选择 {{ checkedDirKeys.length }} 个目录,
{{ selectedFileKeys.length }} 个文件</span
>
<a-space>
<a-button @click="clearSelection">清空选择</a-button>
<a-button type="primary" @click="confirmSelection"
>确认选择</a-button
>
</a-space>
</div>
</div>
<div class="doc-content">
<a-table
:dataSource="docList"
:columns="docColumns"
:loading="docLoading"
rowKey="id"
:scroll="{ y: 400 }"
:pagination="pagination"
@change="handleTableChange"
size="middle"
:row-selection="{
selectedRowKeys: selectedFileKeys,
onChange: onFileSelectionChange,
type: 'checkbox'
}"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'fileName'">
<div style="display: flex; align-items: center; gap: 8px">
<FileOutlined />
<span>{{ record.fileName }}</span>
</div>
</template>
<template v-if="column.key === 'fileSize'">
{{ formatFileSize(record.fileSize) }}
</template>
<template v-if="column.key === 'fileType'">
<a-tag color="blue">{{ record.fileType }}</a-tag>
</template>
</template>
</a-table>
</div>
</div>
</div>
</div>
</a-modal>
</template>
<script setup lang="ts">
import { computed, ref } from 'vue';
import { FileOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import { Empty } from 'ant-design-vue';
import { listAiCloudDoc } from '@/api/ai/aiCloudDoc';
import { listAiCloudFile } from '@/api/ai/aiCloudFile';
import type { AiCloudDoc } from '@/api/ai/aiCloudDoc/model';
import type { AiCloudFile } from '@/api/ai/aiCloudFile/model';
const showDocSelect = defineModel();
const props = defineProps<{
currentCompanyId: number;
}>();
// 树形结构相关
const expandedKeys = ref<(string | number)[]>([]);
const selectedKeys = ref<(string | number)[]>([]);
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
// const currentKbId = ref('');
// const currentKbName = ref('');
const docColumns = ref([
{
title: '文件名',
dataIndex: 'fileName',
key: 'fileName',
ellipsis: true
},
{
title: '文件大小',
dataIndex: 'fileSize',
key: 'fileSize',
width: 120
},
{
title: '文件类型',
dataIndex: 'fileType',
key: 'fileType',
width: 120,
ellipsis: true
},
{
title: '上传时间',
dataIndex: 'uploadTime',
key: 'uploadTime',
width: 180
}
]);
// 计算树形数据
const docList = ref<AiCloudFile[]>([]);
const docLoading = ref(false);
const allDirs = ref<AiCloudDoc[]>([]);
const treeData = computed(() => {
const buildTree = (parentId: number = 0): any[] => {
return allDirs.value
.filter((item) => item.parentId === parentId)
.map((item) => ({
...item,
key: item.id,
title: item.name,
children: buildTree(item.id),
isLeaf:
allDirs.value.filter((child) => child.parentId === item.id)
.length === 0
}));
};
return buildTree(0);
});
const lastSelectedDirKeys = ref<(string | number)[]>([]);
const lastSelectedFileKeys = ref<(string | number)[]>([]);
// const currentSectionIndex = ref(2); // 默认是审计内容3
const selectedDocList = ref<string[]>([]);
const selectedFileList = ref<string[]>([]);
const selectedFileKeys = ref<(string | number)[]>([]);
const checkedDirKeys = ref<(string | number)[]>([]); // 新增勾选的目录keys
const handleDocSelectCancel = () => {
// 保存当前选择状态
lastSelectedDirKeys.value = [...checkedDirKeys.value];
lastSelectedFileKeys.value = [...selectedFileKeys.value];
showDocSelect.value = false;
};
const confirmSelection = () => {
// 保存当前选择状态
lastSelectedDirKeys.value = [...checkedDirKeys.value];
lastSelectedFileKeys.value = [...selectedFileKeys.value];
message.success(
`已选择 ${checkedDirKeys.value.length} 个目录和 ${selectedFileKeys.value.length} 个文件`
);
showDocSelect.value = false;
};
const loadAllCloudDocs = async () => {
try {
const params = {
companyId: props.currentCompanyId
};
const result = await listAiCloudDoc(params);
allDirs.value = result || [];
// 默认展开根节点并选中第一个目录
if (allDirs.value.length > 0) {
const rootDirs = allDirs.value.filter((item) => item.parentId === 0);
if (rootDirs.length > 0) {
expandedKeys.value = [0];
// 如果已经有选中的目录,保持选中状态,否则选中第一个目录
if (selectedKeys.value.length === 0) {
selectedKeys.value = [rootDirs[0].id!];
}
loadCloudFiles();
}
}
} catch (error) {
message.error('加载目录列表失败');
console.error('加载目录错误:', error);
}
};
// 树节点展开
const onExpand = (keys: (string | number)[]) => {
expandedKeys.value = keys;
};
// 树节点选择
const onSelect = (keys: (string | number)[]) => {
selectedKeys.value = keys;
pagination.value.current = 1;
loadCloudFiles();
};
// 新增:目录勾选处理
const onDirCheck = (checkedKeys: (string | number)[]) => {
checkedDirKeys.value = checkedKeys;
selectedDocList.value = checkedKeys.map((key) => key.toString());
};
// 异步加载子节点
const onLoadData = () => {
return new Promise<void>((resolve) => {
resolve();
});
};
// 表格分页变化处理
const pagination = ref({
current: 1,
pageSize: 10,
total: 0,
showSizeChanger: false,
showQuickJumper: true,
showTotal: (total: number) => `${total}`,
pageSizeOptions: ['10', '20', '50', '100']
});
const handleTableChange = (pag: any) => {
pagination.value.current = pag.current;
pagination.value.pageSize = pag.pageSize;
loadCloudFiles();
};
// 文件选择变化
const onFileSelectionChange = (
selectedRowKeys: (string | number)[],
selectedRows: AiCloudFile[]
) => {
selectedFileKeys.value = selectedRowKeys;
selectedFileList.value = selectedRows.map((row) => row.id!.toString());
};
// 清空选择
const clearSelection = () => {
selectedDocList.value = [];
selectedFileList.value = [];
selectedFileKeys.value = [];
checkedDirKeys.value = []; // 新增:清空勾选的目录
// 重新选择当前目录
if (selectedKeys.value.length > 0) {
selectedDocList.value = [selectedKeys.value[0].toString()];
checkedDirKeys.value = [selectedKeys.value[0]]; // 新增:重新勾选当前目录
}
};
const loadCloudFiles = async () => {
docLoading.value = true;
try {
if (!selectedKeys.value.length) {
docList.value = [];
pagination.value.total = 0;
return;
}
const params = {
docId: parseInt(selectedKeys.value[0].toString()),
page: pagination.value.current,
pageSize: pagination.value.pageSize
};
const result: any = await listAiCloudFile(params);
if (result && result.records) {
docList.value = result.records;
pagination.value.total = result.total;
} else {
docList.value = result || [];
pagination.value.total = docList.value.length;
}
} catch (error) {
message.error('加载文件列表失败');
console.error('加载文件错误:', error);
} finally {
docLoading.value = false;
}
};
// 格式化文件大小
const formatFileSize = (size: number) => {
if (!size) return '-';
if (size < 1024) return size + ' B';
if (size < 1024 * 1024) return (size / 1024).toFixed(1) + ' KB';
return (size / (1024 * 1024)).toFixed(1) + ' MB';
};
const open = () => {
showDocSelect.value = true;
loadAllCloudDocs();
};
defineExpose({ open });
</script>

View File

@@ -0,0 +1,35 @@
<template>
<a-space>
<div
v-for="(item, index) in btns"
:key="index"
class="btn"
:class="[title === item ? 'btn-green' : 'btn-gray']"
@click="onChange(item)"
>{{ item }}</div
>
</a-space>
</template>
<script setup lang="ts">
defineProps({
title: {
type: String,
default: ''
},
btns: {
type: Array,
default: () => []
}
});
const emits = defineEmits(['change']);
const onChange = (title: string) => {
emits('change', title);
};
</script>
<style lang="less" scoped>
@import '../style/style.scss';
</style>

View File

@@ -0,0 +1,54 @@
export default [
{
title: '序号',
dataIndex: 'index',
key: 'index',
width: 80,
align: 'center'
},
{
title: '重大经济决策事项',
dataIndex: 'name',
key: 'name'
},
{
title: '会议时间',
dataIndex: 'content',
key: 'content',
width: 120
},
{
title: '决策事项金额',
dataIndex: 'amount',
key: 'amount',
width: 120
},
{
title: '程序程序',
dataIndex: 'progress',
key: 'progress',
width: 300
},
{
title: '执行情况(是/否)',
dataIndex: 'done',
key: 'done'
},
{
title: '执行效果(是否实现决策目标)',
children: [
{
title: '好',
dataIndex: 'goods'
},
{
title: '一般',
dataIndex: 'normal'
},
{
title: '差',
dataIndex: 'bad'
}
]
}
];

View File

@@ -0,0 +1,97 @@
import navigationItems from '@/views/pwl/pwlProject/components/data/navigationItems';
export const scrollToSection = (index: number) => {
const element = document.getElementById(`section-${index}`);
if (element) {
element.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
};
export const getScrollContainer = () => {
return document.querySelector('.ant-modal-body');
};
/* 监听滚动位置更新当前章节 */
export const handleScroll = () => {
const sections = navigationItems.map((_, index) =>
document.getElementById(`section-${index}`)
);
const scrollContainer = getScrollContainer();
if (!scrollContainer) return;
const containerTop = scrollContainer.getBoundingClientRect().top;
for (let i = sections.length - 1; i >= 0; i--) {
const section = sections[i];
if (section) {
const sectionTop = section.getBoundingClientRect().top - containerTop;
if (sectionTop <= 100) {
// 100px 的偏移量
currentSection.value = i;
break;
}
}
}
};
/* 新增:构建导出数据的公共方法 */
export const buildExportData = () => {
const exportData: any = {
from00: form.code,
from10: navigationItems[0].content,
from20: navigationItems[1].content,
from30: navigationItems[2].content
};
// 被审计单位基本情况
const basicInfoSection: any = navigationItems[3];
if (basicInfoSection?.children) {
exportData.from41 = basicInfoSection.children[0].content;
exportData.from42 = basicInfoSection.children[1].content;
exportData.from43 = basicInfoSection.children[2].content;
exportData.from44 = [basicInfoSection.children[3].content];
exportData.from45 = basicInfoSection.children[4].content;
}
// 审计内容和重点及审计方法
const auditContentSection: any = navigationItems[4];
if (auditContentSection?.children) {
exportData.from51 = auditContentSection.children[0].content;
exportData.from52 = auditContentSection.children[1].content;
exportData.from53 = auditContentSection.children[2].content;
exportData.from54 = auditContentSection.children[3].content;
exportData.from55 = auditContentSection.children[4].content;
exportData.from56 = auditContentSection.children[5].content;
exportData.from57 = auditContentSection.children[6].content;
exportData.from58 = auditContentSection.children[7].content;
}
// 重要风险的识别及应对
const riskSection: any = navigationItems[5];
if (riskSection?.children) {
exportData.from61 = riskSection.children[0].content;
exportData.from62 = riskSection.children[1].content;
}
// 其他部分
exportData.from70 = navigationItems[6].content;
exportData.from80 = navigationItems[7].content;
exportData.from90 = navigationItems[8].content;
return exportData;
};
export const hasContent = (section: any) => {
if (!section) return false;
if (section.children) {
return section.children.some((child) => child.content?.trim());
}
return !!section.content?.trim();
};

View File

@@ -0,0 +1,637 @@
import columns from './columns';
import table3Columns from '@/views/pwl/pwlProject/components/data/table3Columns';
import table1Columns from '@/views/pwl/pwlProject/components/data/table1Columns';
import table4Columns from '@/views/pwl/pwlProject/components/data/table4Columns';
import { ref } from 'vue';
export default ref([
{
number: '一',
name: '审计内容1',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计依据内容...',
content: '',
suggestion: '',
formCommit: 10,
rows: 10,
generating: false,
extra1: true,
file1: true,
mode: 'table',
columns: table1Columns.columns0
},
{
number: '二',
name: '审计内容2',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计目标内容...',
content: '',
suggestion: '',
formCommit: 20,
rows: 6,
generating: false,
mode: 'text'
},
{
number: '三',
name: '审计内容3',
title: '重大经济决策调查表',
description: '点击"AI生成"按钮生成重大经济决策调查表数据',
generating: false,
extra3: true,
file3: true,
generateMethod: null,
mode: 'table',
columns: table3Columns.columns0,
data: []
},
{
number: '四',
name: '审计内容4',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
generating: false,
mode: 'table',
columns: table4Columns.columns0
},
{
number: '五',
name: '审计内容5',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
generating: false,
mode: 'text',
columns: []
},
{
number: '六',
name: '审计内容6',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
generating: false,
mode: 'text',
textareaList: [
{
label: '审查财务支出凭据',
rows: 8,
content: ''
},
{
label: '是否存在应报政府采购而未报的情',
rows: 8,
content: ''
},
{
label: '已执行政府采购的名单',
rows: 8,
content: ''
},
{
label: '单一采购来源',
rows: 8,
content: ''
}
],
columns: []
},
{
number: '七',
name: '审计内容7',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计技术方法内容...',
content: '',
suggestion: '',
formCommit: 70,
rows: 8,
generating: false,
mode: 'text',
columns
},
{
number: '八',
name: '审计内容8',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入工作步骤与时间安排内容...',
content: '',
suggestion: '',
formCommit: 80,
rows: 10,
generating: false,
mode: 'radio',
radioList: [
{
label: '1审计是否确定内部控制职能部门或牵头部门。',
content: ''
},
{
label: '2审计是否建立单位各部门在内部控制中的沟通协调和联动机制。',
content: ''
},
{
label:
'3审计是否建立健全集体研究、专家论证和技术咨询相结合的议事决策机制是否建立经济活动风险定期评估机制。',
content: ''
},
{
label:
'4审计是否建立健全岗位责任制明确各岗位职责与分工办理业务和事项的权限范围、审批程序和相关责任。',
content: ''
},
{
label:
'5审计是否建立健全内部监督机制明确各相关部门或岗位在内部监督中的职责权限规定内部监督的程序和要求是否定期对内部控制建立与实施情况进行内部监督检查与自我评价。重点关注内部审计监督制度和内部审计机构是否健全等。',
content: ''
},
{
label:
'6审计是否建立工作人员的培训、评价、轮岗制度应持从业资格证上岗的岗位人员是否都持有从业资格证书。',
content: ''
},
{
label:
'7是否建立健全预算编制、审批、执行、决算与评价等预算内部管理制度。',
content: ''
},
{
label:
'8是否按照国家统一的会计制度对经济业务进行账务处理并编制财务会计报告。',
content: ''
},
{
label:
'9是否建立健全单位财务管理制度、收入、支出内部管理制度明确单位经济活动的各项支出标准、明确支出报销流程是否建立健全票据管理制度是否建立健全债务内部管理制度。重点关注货币资金管理制度和财务报销制度包括货币资金业务岗位责任货币资金业务不相容岗位分离、制约和监督货币资金收支控制现金日记账登记与核对银行账户管理资金管理关键岗位的稽核等方面有无制度规定。财务报销管理中支出审批权限和报销审核、不相容职务分离等方面有无控制制度',
content: ''
},
{
label:
'10是否建立健全政府采购预算与计划管理、政府采购活动管理、验收管理等政府采购内部管理制度。物资采购重点关注预算、政府采购、验收、付款等物资采购关键环节的内部管理与控制制度是否健全',
content: ''
},
{
label:
'11是否建立健全资产内部管理制度重点关注资产的购置、验收、分配、使用、维修、处置、财务核算等管理制度是否健全是否建立健全对外投资的责任追究制度。',
content: ''
},
{
label:
'12是否建立健全业务管理制度。关注各业务管理环节的管理办法或制度是否健全。',
content: ''
},
{
label: '13是否建立健全合同内部管理制度',
content: ''
}
],
textareaList: [
{
label: '内部控制的有效性',
rows: 8,
content: ''
},
{
label: '对所属单位(企业)的管理和监督的情况',
rows: 8,
content: ''
},
{
label: '被审计领导干部任职期间新增加或新变动的重要管理或业务',
rows: 8,
content: ''
},
{
label: '单一采购来源',
rows: 8,
content: ''
}
]
},
{
number: '九',
name: '审计内容9',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计工作的组织实施内容...',
content: '',
suggestion: '',
formCommit: 90,
rows: 8,
generating: false,
mode: 'text'
},
{
number: '十',
name: '审计内容10',
title: '',
description: '点击"AI生成"按钮让AI为您生成该部分内容或直接在下方编辑',
placeholder: '请输入审计工作的组织实施内容...',
content: '',
suggestion: '',
formCommit: 90,
rows: 8,
generating: false,
mode: 'table',
columns: [
{
title: '大类',
dataIndex: 'col0',
key: '',
align: 'center',
customCell: (row, index) => {
if (index === 0) return { rowSpan: 37 };
else if (index === 37) return { rowSpan: 3 };
else if (index === 40) return { rowSpan: 3 };
return { rowSpan: 0 };
}
},
{
title: '子类',
dataIndex: 'col1',
key: '',
align: 'center',
customCell: (row, index) => {
if (index === 0) return { rowSpan: 17 };
else if (index === 17) return { rowSpan: 8 };
else if (index === 25) return { rowSpan: 8 };
else if (index === 33) return { rowSpan: 4 };
else if (index === 37) return { rowSpan: 3 };
else if (index === 40) return { rowSpan: 3 };
return { rowSpan: 0 };
}
},
{
title: '小类',
dataIndex: 'col2',
key: '',
align: 'center',
customCell: (row, index) => {
console.log(index, row);
if (
[4, 17, 22, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 42].includes(
index
)
)
return { rowSpan: 1 };
else if ([18, 20, 23, 30, 35, 40].includes(index)) return { rowSpan: 2 };
if (index === 0) return { rowSpan: 4 };
else if (index === 5) return { rowSpan: 4 };
else if (index === 9) return { rowSpan: 5 };
else if (index === 14) return { rowSpan: 3 };
return { rowSpan: 0 };
}
},
{
title: '内容',
dataIndex: 'content',
key: '',
align: 'center'
},
{
title: '执行情况',
dataIndex: 'result',
key: '',
align: 'center'
},
{
title: '工作底稿索引',
dataIndex: 'workPaperIndex',
key: 'workPaperIndex',
align: 'center',
width: 140,
ellipsis: true
},
{
title: '操作',
key: 'action',
align: 'center',
width: 140
}
],
data: [
{
id: 1,
col0: '一、落实党风廉政建设责任制',
col1: '落实主体责任和监督责任',
col2: '强化组织领导',
content: '建立责任清单、明确党组、纪检责任'
},
{
id: 2,
col0: '',
col1: '',
col2: '',
content:
'建立健全反腐败领导机制,人员调整后及时进行分工,并全年召开两次以上协调会'
},
{
id: 3,
col0: '',
col1: '',
col2: '',
content:
'主要领导认真履行第一责任人责任对党风廉政建设重要工作亲自部署、重大问题亲自过问、重点环节亲自协调、重要案件亲自督办5次以上'
},
{
id: 4,
col0: '',
col1: '',
col2: '',
content:
'领导班子其他成员对职责范围内的党风廉政建设承担主要责任与分管联系部门研究安排党风廉政建设工作4次以上'
},
{
id: 5,
col0: '',
col1: '',
col2: '及时部署工作任务',
content:
'有党风廉政建设任务分工方案党组专题研究部署党风廉政建设工作4次以上'
},
{
id: 6,
col0: '',
col1: '',
col2: '层层传到责任和压力',
content:
'主要领导检查和调研党风廉政建设各一次以上,每年听取分管联系部门的党风廉政建设一次以上且每年亲自上廉政党课不少于1次'
},
{
id: 7,
col0: '',
col1: '',
col2: '',
content:
'分管领导对分管联系部门党风廉政建设检查和调研各1次以上每年听取分管联系部门的党风廉政建设情况汇报一次以上到分管联系部门上廉政党课1次以上'
},
{
id: 8,
col0: '',
col1: '',
col2: '',
content:
'党组、纪检组注重抓早抓小经常进行咬耳扯袖、红脸出汗及时开展约谈、集体廉政谈话等工作3次以上'
},
{
id: 9,
col0: '',
col1: '',
col2: '',
content: '开展述责评议工作'
},
{
id: 10,
col0: '',
col1: '',
col2: '坚持“一案双查”',
content:
'对发生在本单位的较严重的违反政治纪律、组织纪律等问题进行“一案双查”'
},
{
id: 11,
col0: '',
col1: '',
col2: '',
content: '出现“四风”和腐败等顶风违纪问题的'
},
{
id: 12,
col0: '',
col1: '',
col2: '',
content: '出现区域性系统性违纪违法问题突出的'
},
{
id: 13,
col0: '',
col1: '',
col2: '',
content: '出现上级交办的党风廉政建设事项不传达部署和落实的'
},
{
id: 14,
col0: '',
col1: '',
col2: '',
content:
'出现违纪行为隐瞒不报压案不查等问题而未进行责任追究被中央、自治区进行挂牌督办或直接问责、约谈'
},
{
id: 15,
col0: '',
col1: '',
col2: '及时汇报工作情况',
content: '党组、纪检组向自治区党委、纪委汇报“两个”责任落实情况两次以上'
},
{
id: 16,
col0: '',
col1: '',
col2: '',
content: '班子成员年底向自治区纪委报送个人落实“两个责任”情况报告'
},
{
id: 17,
col0: '',
col1: '',
col2: '',
content: '按照自治区纪委部署开展其他工作,并按时报送总结报告的'
},
{
id: 18,
col0: '',
col1: '落实中央八项规定精神工作',
col2: '开展监督检查',
content: '部署开展监督检查3次以上'
},
{
id: 19,
col0: '',
col1: '',
col2: '报送数据和资料',
content: '每月按时报送中央八项规定精神案件有关统计数据和有关资料'
},
{
id: 20,
col0: '',
col1: '',
col2: '',
content: '每月不按时报送或未按要求报送的'
},
{
id: 21,
col0: '',
col1: '',
col2: '查办违反中央八项规定精神案件',
content: '及时查处监督检查中发现的问题和中央、自治区转办督办的问题线索'
},
{
id: 22,
col0: '',
col1: '',
col2: '',
content:
'出现违反中央八项规定精神问题被上级查处的,或查处但问责太轻,被上级责令重新查办'
},
{
id: 23,
col0: '',
col1: '',
col2: '通报曝光',
content: '对受到党纪政纪处分的问题全部进行通报曝光的'
},
{
id: 24,
col0: '',
col1: '',
col2: '清退干部职工多占住房',
content: '到年底还不能完成干部职工多占住房清退的'
},
{
id: 25,
col0: '',
col1: '',
col2: '',
content: '信访反映清房工作不到位被查实的'
},
{
id: 26,
col0: '',
col1: '开展查处发生在群众身边的“四风”和腐败问题专项工作',
col2: '及时梳理处置问题线索',
content: '对收到或者上级交办问题线索进行转办督办或直接查办的'
},
{
id: 27,
col0: '',
col1: '',
col2: '查处一批案件',
content: '因查处案件不力被自治区约谈或通报批评的'
},
{
id: 28,
col0: '',
col1: '',
col2: '通报曝光一批典型案件',
content: '对查处的案件进行通报曝光'
},
{
id: 29,
col0: '',
col1: '',
col2: '营造氛围',
content: '加大宣传力度,用典型案例进行警示教育'
},
{
id: 30,
col0: '',
col1: '',
col2: '督促违纪人员主动交代问题',
content:
'以文件形式或在网络、报纸、电视等媒介上发布公告,督促违纪人员主动交代问题并主动上缴违纪所得'
},
{
id: 31,
col0: '',
col1: '',
col2: '进行总结并建立长效机制',
content: '没有在6月20日前进行总结'
},
{
id: 32,
col0: '',
col1: '',
col2: '',
content: '没有结合专项工作中发现存在的突出问题建立完善制度措施'
},
{
id: 33,
col0: '',
col1: '',
col2: '专项工作纳入常态化治理',
content: '6月后在全部二层单位开展专项工作'
},
{
id: 34,
col0: '',
col1: '严明纪律确保政令畅通',
col2: '严明政治纪律和组织纪律',
content: '有违反政治纪律等问题被中央、自治区查处的'
},
{
id: 35,
col0: '',
col1: '',
col2: '按时完成中央和自治区重大决策部署',
content: '出现问题被中央、自治区问责的'
},
{
id: 36,
col0: '',
col1: '',
col2: '按时完成转办督办案件',
content: '按时完成自治区纪委转办督办的党风政风类案件'
},
{
id: 37,
col0: '',
col1: '',
col2: '',
content: '不按时完成或不完成的'
},
{
id: 38,
col0: '二、巡视整改工作',
col1: '',
col2: '',
content: '严格执行月报告制度'
},
{
id: 39,
col0: '',
col1: '',
col2: '',
content: '按时完成整改任务'
},
{
id: 40,
col0: '',
col1: '',
col2: '',
content: '因巡视整改不给力被追究'
},
{
id: 41,
col0: '三、深化纪律检查体制改革',
col1: '',
col2: '聚焦主业主责,持续深化“三转”工作',
content: '纪检组长或纪工委书记不分管具体业务工作,专职抓执纪监督问责工作'
},
{
id: 42,
col0: '',
col1: '',
col2: '',
content: '检查发现有参与业务工作'
},
{
id: 43,
col0: '',
col1: '',
col2: '健全完善深化纪检体制改革的相关制度文件并抓好贯彻落实',
content: '年底前制定有1项以上配套制度文件'
}
]
}
]);

View File

@@ -0,0 +1,347 @@
export const columns0 = [
{
title: '序号',
dataIndex: 'index',
key: 'index',
width: 80,
align: 'center'
},
{
title: '单位名称',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '规格',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '经费来源',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '编制数额',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '编制数额',
align: 'center',
children: [
{
title: '其他编制',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '事业编制',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '实用人员',
align: 'center',
children: [
{
title: '参公人数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '聘用人数',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '领导职数',
align: 'center',
children: [
{
title: '处级',
align: 'center',
children: [
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '科级',
align: 'center',
children: [
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '股级',
align: 'center',
children: [
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
}
]
}
]
},
{
title: '参公单位非领导职数',
align: 'center',
children: [
{
title: '处级',
align: 'center',
children: [
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '科级',
align: 'center',
children: [
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '股级',
align: 'center',
children: [
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '核定数',
dataIndex: '',
key: '',
align: 'center'
}
]
}
]
},
{
title: '岗位设置',
align: 'center',
children: [
{
title: '管理岗位',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '专业技术岗位',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '工勤技能岗位',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '工作底稿索引',
dataIndex: 'workPaperIndex',
key: 'workPaperIndex',
align: 'center',
width: 140,
ellipsis: true
},
{
title: '操作',
key: 'action',
align: 'center',
width: 100
}
];
export const columns1 = [
{
title: '单位',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '姓名',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '部门',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '职务',
align: 'center',
children: [
{
title: '党内',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '行政',
dataIndex: '',
key: '',
align: 'center'
}
]
},
{
title: '任职期间',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '主要工作责任',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '备注',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '工作底稿索引',
dataIndex: 'workPaperIndex',
key: 'workPaperIndex',
align: 'center',
width: 140,
ellipsis: true
},
{
title: '操作',
key: 'action',
align: 'center',
width: 140
}
];
export const columns2 = [
{
title: '内容',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '2020年',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '2021年',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '2022年',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '2023年',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '工作底稿索引',
dataIndex: 'workPaperIndex',
key: 'workPaperIndex',
align: 'center',
width: 140,
ellipsis: true
},
{
title: '操作',
key: 'action',
align: 'center',
width: 140
}
];
export default { columns0, columns1, columns2 }

View File

@@ -0,0 +1,137 @@
export const columns0 = [
{
title: '',
dataIndex: 'category',
key: 'category',
width: 120,
align: 'center'
},
{
title: '政策内容',
dataIndex: 'policyContent',
key: 'policyContent',
align: 'center'
},
{
title: '集团制度',
dataIndex: 'groupSystem',
key: 'groupSystem',
align: 'center'
},
{
title: '公司制度',
dataIndex: 'companyFormulation',
key: 'companyFormulation',
align: 'center'
},
{
title: '公司执行情况',
dataIndex: 'checkEvidence',
key: 'checkEvidence',
align: 'center'
},
{
title: '执行结果',
dataIndex: 'testResult',
key: 'testResult',
align: 'center',
customRender: ({ text }) => {
if (text === '通过') return '<span style="color: #52c41a">通过</span>';
if (text === '不通过')
return '<span style="color: #ff4d4f">不通过</span>';
return text;
}
},
{
title: '工作底稿索引',
dataIndex: 'workPaperIndex',
key: 'workPaperIndex',
align: 'center',
width: 140,
ellipsis: true
},
{
title: '操作',
key: 'action',
align: 'center',
width: 100
}
];
export const columns1 = [
{
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'
},
{
title: '执行情况(是/否)',
dataIndex: 'executionStatus',
key: 'executionStatus',
width: 80,
align: 'center'
},
{
title: '执行效果(是否实现决策目标)',
children: [
{
title: '好',
dataIndex: 'goods',
key: 'goods',
width: 60,
align: 'center'
},
{
title: '一般',
dataIndex: 'normal',
key: 'normal',
width: 60,
align: 'center'
},
{
title: '差',
dataIndex: 'bad',
key: 'bad',
width: 60,
align: 'center'
}
]
},
{
title: '操作',
key: 'action',
align: 'center',
width: 140
}
];
export default { columns0, columns1 };

View File

@@ -0,0 +1,86 @@
export const columns0 = [
{
title: '序号',
dataIndex: '',
key: '',
width: 120,
align: 'center'
},
{
title: '年度',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '上级主管部门下达目标责任制',
align: 'center',
children: [
{
title: '下达文件',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '完成情况',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '未完成原因',
dataIndex: '',
key: '',
align: 'center'
},
]
},
{
title: '单位自定下达目标责任制',
align: 'center',
children: [
{
title: '计划文件',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '完成情况',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '未完成原因',
dataIndex: '',
key: '',
align: 'center'
},
]
},
{
title: '备注',
dataIndex: '',
key: '',
align: 'center'
},
{
title: '工作底稿索引',
dataIndex: 'workPaperIndex',
key: 'workPaperIndex',
align: 'center',
width: 140,
ellipsis: true
},
{
title: '操作',
key: 'action',
align: 'center',
width: 100
}
];
export default { columns0 };

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,456 @@
.audit-content {
.audit-section {
.child-title {
font-weight: 600;
font-size: 15px;
color: #333;
margin-bottom: 8px;
padding-left: 8px;
border-left: 3px solid #1890ff;
display: flex;
justify-content: space-between;
align-items: center;
.ant-btn {
margin-left: 0;
}
}
}
}
.question-prompt {
color: #1677ff;
font-weight: 500;
margin-bottom: 8px;
font-size: 14px;
cursor: pointer;
display: flex;
align-items: center;
&::before {
content: '✍️';
margin-right: 6px;
font-size: 16px;
}
&:hover {
color: #0958d9;
}
}
.suggestion-textarea {
&:focus {
border-color: #1677ff !important;
box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.1) !important;
}
&:hover {
border-color: #4096ff !important;
}
}
/* textarea内嵌按钮样式 */
.textarea-with-button {
position: relative;
.suggestion-textarea-inner {
padding-right: 70px !important;
border-radius: 6px;
&:focus {
border-color: #1677ff !important;
box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.1) !important;
}
&:hover {
border-color: #4096ff !important;
}
}
.send-button-inner {
position: absolute;
right: 8px;
bottom: 8px;
z-index: 10;
padding: 4px 12px;
height: 28px;
font-size: 12px;
&:hover {
transform: none;
box-shadow: 0 2px 8px rgba(24, 144, 255, 0.3);
}
}
}
:deep(.export-button) {
border: 2px solid #ff4d4f !important;
border-radius: 20px !important;
&:hover,
&:focus {
border-color: #ff7875 !important;
box-shadow: 0 0 8px rgba(255, 77, 79, 0.3);
}
}
/* 统一设置所有按钮为圆角 */
:deep(.ant-btn) {
border-radius: 20px !important;
transition: all 0.3s ease;
&:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
}
/* 发送按钮特殊样式 */
:deep(.ant-btn-primary) {
border-radius: 20px !important;
&:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(24, 144, 255, 0.3);
}
}
/* 生成全部方案按钮橙色样式 */
:deep(.generate-all-button) {
background-color: #ff7b00 !important;
border-color: #ff7b00 !important;
&:hover {
background-color: #e56500 !important;
border-color: #e56500 !important;
box-shadow: 0 4px 12px rgba(255, 123, 0, 0.4) !important;
}
&:focus {
background-color: #e56500 !important;
border-color: #e56500 !important;
box-shadow: 0 4px 12px rgba(255, 123, 0, 0.4) !important;
}
}
.navigation-container {
.nav-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 12px;
margin-bottom: 20px;
}
.nav-button {
height: 48px;
border-radius: 20px !important;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 16px;
text-align: left;
.nav-number {
font-weight: bold;
margin-right: 8px;
min-width: 20px;
}
.nav-text {
flex: 1;
font-size: 14px;
}
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
&.active {
box-shadow: 0 4px 12px rgba(24, 144, 255, 0.3);
}
}
.progress-container {
display: flex;
align-items: center;
gap: 12px;
.progress-bar {
flex: 1;
height: 6px;
background: #f0f0f0;
border-radius: 3px;
overflow: hidden;
.progress-fill {
height: 100%;
background: linear-gradient(90deg, #1890ff, #52c41a);
border-radius: 3px;
transition: width 0.3s ease;
}
}
.progress-text {
font-size: 12px;
color: #666;
min-width: 40px;
text-align: center;
}
}
}
.audit-content {
.audit-section {
scroll-margin-top: 20px;
.section-description {
color: #999999;
font-size: 14px;
margin-bottom: 8px;
padding: 12px;
background: #f8f9fa;
border-radius: 6px;
}
.child-section {
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px dashed #e8e8e8;
&:last-child {
border-bottom: none;
margin-bottom: 0;
}
}
.child-title {
font-weight: 600;
font-size: 15px;
color: #333;
margin-bottom: 8px;
padding-left: 8px;
border-left: 3px solid #1890ff;
}
.content-textarea {
border-radius: 6px;
transition: all 0.3s ease;
&:focus {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
}
}
}
:deep(.ant-card-head) {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
border-radius: 6px 6px 0 0;
}
:deep(.ant-card-body) {
padding: 20px;
}
:deep(.ant-back-top) {
right: 30px;
bottom: 30px;
}
.btn {
padding: 5px 10px;
color: white;
border-radius: 999px;
cursor: pointer;
}
.btn-gray {
background-color: #bbbbbb;
}
.btn-green {
background-color: #479b33;
}
/* 选择文件按钮样式 */
.select-file-btn {
color: #1890ff;
font-size: 12px;
padding: 2px 8px;
border: 1px solid #d9d9d9;
border-radius: 4px;
background: #fff;
&:hover {
color: #40a9ff;
border-color: #40a9ff;
}
}
/* 文档选择弹窗样式 */
.doc-select-container {
height: 550px;
}
.doc-layout {
display: flex;
height: 100%;
gap: 16px;
}
.dir-tree-panel {
width: 280px;
border: 1px solid #e8e8e8;
border-radius: 6px;
display: flex;
flex-direction: column;
flex-shrink: 0;
}
.dir-header {
padding: 12px 16px;
border-bottom: 1px solid #e8e8e8;
background: #fafafa;
display: flex;
justify-content: space-between;
align-items: center;
font-weight: 500;
}
.tree-container {
flex: 1;
padding: 8px;
overflow: auto;
}
.doc-list-panel {
flex: 1;
display: flex;
flex-direction: column;
border: 1px solid #e8e8e8;
border-radius: 6px;
min-width: 0;
overflow: hidden;
}
.doc-header {
padding: 12px 16px;
border-bottom: 1px solid #e8e8e8;
background: #fafafa;
}
.doc-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.doc-tips {
color: #1890ff;
font-size: 14px;
font-weight: 500;
}
.doc-content {
flex: 1;
padding: 16px;
display: flex;
flex-direction: column;
overflow: hidden;
min-width: 0;
}
/* 树节点激活样式 */
:deep(.active-dir) {
color: #1890ff;
font-weight: 500;
}
:deep(.ant-tree-node-content-wrapper) {
border-radius: 4px;
transition: all 0.3s;
}
:deep(.ant-tree-node-content-wrapper:hover) {
background-color: #f5f5f5;
}
:deep(.ant-tree .ant-tree-treenode-selected .ant-tree-node-content-wrapper) {
background-color: #e6f7ff;
}
/* 优化表格样式 */
:deep(.doc-select-modal .ant-modal-body) {
padding: 16px;
}
:deep(.doc-content .ant-table-wrapper) {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
:deep(.doc-content .ant-spin-nested-loading) {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
:deep(.doc-content .ant-spin-container) {
flex: 1;
display: flex;
flex-direction: column;
height: 100%;
min-width: 0;
}
:deep(.doc-content .ant-table) {
width: 100%;
flex: 1;
}
:deep(.doc-content .ant-table-container) {
flex: 1;
display: flex;
flex-direction: column;
}
:deep(.doc-content .ant-table-body) {
flex: 1;
}
:deep(.doc-content .ant-table-thead > tr > th) {
background: #fafafa;
font-weight: 600;
white-space: nowrap;
}
:deep(.doc-content .ant-table-tbody > tr > td) {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 文件名列特殊处理,允许换行 */
:deep(.doc-content .ant-table-tbody > tr > td:first-child) {
white-space: normal;
word-break: break-word;
line-height: 1.4;
max-width: 400px;
}
/* 分页样式调整 */
:deep(.doc-content .ant-pagination) {
margin-top: 16px;
margin-bottom: 0;
}
:deep(.doc-content .ant-table-pagination) {
margin-top: 16px;
margin-bottom: 0;
flex-shrink: 0;
}