feat(ai): 添加AI云文档管理功能
- 新增.gitignore文件配置,忽略IDE和构建相关文件 - 添加AbstractAuditContentService抽象类,提供审计内容服务通用方法 - 创建AiCloudDataCenterUtil工具类,封装阿里云百炼服务API操作 - 新增AiCloudDoc实体类,定义AI云文档目录表结构 - 实现AiCloudDocController控制器,提供文档目录CRUD接口 - 添加前端页面模板文件,支持新增配置和TSX组件生成
This commit is contained in:
44
.gitignore
vendored
Normal file
44
.gitignore
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**
|
||||
!**/src/test/**
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
/cert/
|
||||
/src/main/resources/dev/
|
||||
|
||||
### macOS ###
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
/file/
|
||||
/websoft-modules.log
|
||||
41
Dockerfile
Normal file
41
Dockerfile
Normal file
@@ -0,0 +1,41 @@
|
||||
# 使用更小的 Alpine Linux + OpenJDK 17 镜像
|
||||
FROM openjdk:17-jdk-alpine
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /app
|
||||
|
||||
# 创建日志目录
|
||||
RUN mkdir -p /app/logs
|
||||
|
||||
# 创建上传文件目录
|
||||
RUN mkdir -p /app/uploads
|
||||
|
||||
# 安装wget用于健康检查,并添加应用用户(安全考虑)
|
||||
RUN apk add --no-cache wget && \
|
||||
addgroup -g 1000 appgroup && \
|
||||
adduser -D -u 1000 -G appgroup appuser
|
||||
|
||||
# 复制jar包到容器
|
||||
COPY target/*.jar app.jar
|
||||
|
||||
# 设置目录权限
|
||||
RUN chown -R appuser:appgroup /app
|
||||
|
||||
# 切换到应用用户
|
||||
USER appuser
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 9200
|
||||
|
||||
# 设置JVM参数
|
||||
ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom"
|
||||
|
||||
# 设置Spring Profile
|
||||
ENV SPRING_PROFILES_ACTIVE=prod
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:9200/actuator/health || exit 1
|
||||
|
||||
# 启动应用
|
||||
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
|
||||
286
README.md
Normal file
286
README.md
Normal file
@@ -0,0 +1,286 @@
|
||||
<div align="center">
|
||||
<h1>🚀 WebSoft API</h1>
|
||||
<p><strong>基于 Spring Boot + MyBatis Plus 的企业级后端API服务</strong></p>
|
||||
|
||||
<p>
|
||||
<img src="https://img.shields.io/badge/Java-1.8+-ED8B00" alt="Java">
|
||||
<img src="https://img.shields.io/badge/Spring%20Boot-2.5.4-6DB33F" alt="Spring Boot">
|
||||
<img src="https://img.shields.io/badge/MyBatis%20Plus-3.4.3-blue" alt="MyBatis Plus">
|
||||
<img src="https://img.shields.io/badge/MySQL-8.0+-4479A1" alt="MySQL">
|
||||
<img src="https://img.shields.io/badge/Redis-6.0+-DC382D" alt="Redis">
|
||||
<img src="https://img.shields.io/badge/License-MIT-blue" alt="License">
|
||||
</p>
|
||||
</div>
|
||||
|
||||
## 📖 项目简介
|
||||
|
||||
WebSoft API 是一个基于 **Spring Boot + MyBatis Plus** 构建的现代化企业级后端API服务,采用最新的Java技术栈:
|
||||
|
||||
- **核心框架**:Spring Boot 2.5.4 + Spring Security + Spring AOP
|
||||
- **数据访问**:MyBatis Plus 3.4.3 + Druid 连接池
|
||||
- **数据库**:MySQL + Redis
|
||||
- **文档工具**:Swagger 3.0 + Knife4j
|
||||
- **工具库**:Hutool、Lombok、FastJSON
|
||||
|
||||
|
||||
|
||||
## 项目演示
|
||||
| 后台管理系统 | https://mp.websoft.top |
|
||||
|--------|-------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 测试账号 | 13800010123,123456
|
||||
| 正式账号 | [立即注册](https://mp.websoft.top/register/?inviteCode=github) |
|
||||
| 关注公众号 |  |
|
||||
|
||||
|
||||
|
||||
|
||||
## 🛠️ 技术栈
|
||||
|
||||
### 核心框架
|
||||
| 技术 | 版本 | 说明 |
|
||||
|------|------|------|
|
||||
| Java | 1.8+ | 编程语言 |
|
||||
| Spring Boot | 2.5.4 | 微服务框架 |
|
||||
| Spring Security | 5.5.x | 安全框架 |
|
||||
| MyBatis Plus | 3.4.3 | ORM框架 |
|
||||
| MySQL | 8.0+ | 关系型数据库 |
|
||||
| Redis | 6.0+ | 缓存数据库 |
|
||||
| Druid | 1.2.6 | 数据库连接池 |
|
||||
|
||||
### 功能组件
|
||||
- **Swagger 3.0 + Knife4j** - API文档生成与测试
|
||||
- **JWT** - 用户认证与授权
|
||||
- **Hutool** - Java工具类库
|
||||
- **EasyPOI** - Excel文件处理
|
||||
- **阿里云OSS** - 对象存储服务
|
||||
- **微信支付/支付宝** - 支付集成
|
||||
- **Socket.IO** - 实时通信
|
||||
- **MQTT** - 物联网消息传输
|
||||
|
||||
## 📋 环境要求
|
||||
|
||||
### 基础环境
|
||||
- ☕ **Java 1.8+**
|
||||
- 🗄️ **MySQL 8.0+**
|
||||
- 🔴 **Redis 6.0+**
|
||||
- 📦 **Maven 3.6+**
|
||||
|
||||
### 开发工具
|
||||
- **推荐**:IntelliJ IDEA / Eclipse
|
||||
- **插件**:Lombok Plugin、MyBatis Plugin
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 克隆项目
|
||||
```bash
|
||||
git clone https://github.com/websoft-top/mp-java.git
|
||||
cd mp-java
|
||||
```
|
||||
|
||||
### 2. 数据库配置
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE websoft_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 导入数据库脚本(如果有的话)
|
||||
-- source /path/to/database.sql
|
||||
```
|
||||
|
||||
### 3. 配置文件
|
||||
编辑 `src/main/resources/application-dev.yml` 文件,配置数据库连接:
|
||||
```yaml
|
||||
spring:
|
||||
datasource:
|
||||
url: jdbc:mysql://localhost:3306/websoft_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
|
||||
username: your_username
|
||||
password: your_password
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password: your_redis_password
|
||||
```
|
||||
|
||||
### 4. 启动项目
|
||||
```bash
|
||||
# 使用 Maven 启动
|
||||
mvn spring-boot:run
|
||||
|
||||
# 或者使用 IDE 直接运行 WebSoftApplication.java
|
||||
```
|
||||
|
||||
访问 `http://localhost:9200` 即可看到API服务。
|
||||
|
||||
### 5. API文档
|
||||
启动项目后,访问以下地址查看API文档:
|
||||
- Swagger UI: `http://localhost:9200/swagger-ui/index.html`
|
||||
- Knife4j: `http://localhost:9200/doc.html`
|
||||
|
||||
## ⚙️ 配置说明
|
||||
|
||||
### 数据库配置
|
||||
在 `application-dev.yml` 中配置数据库连接:
|
||||
```yaml
|
||||
spring:
|
||||
datasource:
|
||||
url: jdbc:mysql://localhost:3306/websoft_db
|
||||
username: root
|
||||
password: your_password
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
```
|
||||
|
||||
### Redis配置
|
||||
```yaml
|
||||
spring:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password: your_redis_password
|
||||
database: 0
|
||||
```
|
||||
|
||||
### 阿里云OSS配置
|
||||
```yaml
|
||||
config:
|
||||
endpoint: https://oss-cn-shenzhen.aliyuncs.com
|
||||
accessKeyId: your_access_key_id
|
||||
accessKeySecret: your_access_key_secret
|
||||
bucketName: your_bucket_name
|
||||
bucketDomain: https://your-domain.com
|
||||
```
|
||||
|
||||
### 其他配置
|
||||
- **JWT密钥**:`config.token-key` 用于JWT令牌加密
|
||||
- **文件上传路径**:`config.upload-path` 本地文件存储路径
|
||||
- **邮件服务**:配置SMTP服务器用于发送邮件
|
||||
|
||||
## 🎯 核心功能
|
||||
|
||||
### 🔐 用户认证与授权
|
||||
- **JWT认证**:基于JSON Web Token的用户认证
|
||||
- **Spring Security**:完整的安全框架集成
|
||||
- **角色权限**:基于RBAC的权限控制
|
||||
- **图形验证码**:防止恶意登录
|
||||
|
||||
### 📝 内容管理系统(CMS)
|
||||
- **文章管理**:支持富文本内容管理
|
||||
- **媒体文件**:图片/视频文件上传与管理
|
||||
- **分类管理**:内容分类与标签管理
|
||||
- **SEO优化**:搜索引擎优化支持
|
||||
|
||||
### 🛒 电商系统
|
||||
- **商品管理**:商品信息、规格、库存管理
|
||||
- **订单系统**:完整的订单流程管理
|
||||
- **支付集成**:支持微信支付、支付宝
|
||||
- **物流跟踪**:快递100物流查询集成
|
||||
|
||||
### 🔧 系统管理
|
||||
- **用户管理**:用户信息维护与管理
|
||||
- **系统配置**:动态配置管理
|
||||
- **日志监控**:系统操作日志记录
|
||||
- **数据备份**:数据库备份与恢复
|
||||
|
||||
### 📊 数据分析
|
||||
- **统计报表**:业务数据统计分析
|
||||
- **图表展示**:数据可视化展示
|
||||
- **导出功能**:Excel数据导出
|
||||
- **实时监控**:系统性能监控
|
||||
|
||||
## 🏗️ 项目结构
|
||||
|
||||
```
|
||||
src/main/java/com/gxwebsoft/
|
||||
├── WebSoftApplication.java # 启动类
|
||||
├── cms/ # 内容管理模块
|
||||
│ ├── controller/ # 控制器层
|
||||
│ ├── service/ # 业务逻辑层
|
||||
│ ├── mapper/ # 数据访问层
|
||||
│ └── entity/ # 实体类
|
||||
├── shop/ # 商城模块
|
||||
│ ├── controller/
|
||||
│ ├── service/
|
||||
│ ├── mapper/
|
||||
│ └── entity/
|
||||
├── common/ # 公共模块
|
||||
│ ├── core/ # 核心配置
|
||||
│ ├── utils/ # 工具类
|
||||
│ └── exception/ # 异常处理
|
||||
└── resources/
|
||||
├── application.yml # 主配置文件
|
||||
├── application-dev.yml # 开发环境配置
|
||||
└── application-prod.yml# 生产环境配置
|
||||
```
|
||||
|
||||
## 🔧 开发规范
|
||||
|
||||
### 代码结构
|
||||
- **Controller层**:处理HTTP请求,参数验证
|
||||
- **Service层**:业务逻辑处理,事务管理
|
||||
- **Mapper层**:数据访问,SQL映射
|
||||
- **Entity层**:数据实体,数据库表映射
|
||||
|
||||
### 命名规范
|
||||
- **类名**:使用大驼峰命名法(PascalCase)
|
||||
- **方法名**:使用小驼峰命名法(camelCase)
|
||||
- **常量**:使用全大写,下划线分隔
|
||||
- **包名**:使用小写字母,点分隔
|
||||
|
||||
## 📚 API文档
|
||||
|
||||
项目集成了Swagger和Knife4j,提供完整的API文档:
|
||||
|
||||
### 访问地址
|
||||
- **Swagger UI**: `http://localhost:9200/swagger-ui/index.html`
|
||||
- **Knife4j**: `http://localhost:9200/doc.html`
|
||||
|
||||
### 主要接口模块
|
||||
- **用户认证**: `/api/auth/**` - 登录、注册、权限验证
|
||||
- **用户管理**: `/api/user/**` - 用户CRUD操作
|
||||
- **内容管理**: `/api/cms/**` - 文章、媒体文件管理
|
||||
- **商城管理**: `/api/shop/**` - 商品、订单管理
|
||||
- **系统管理**: `/api/system/**` - 系统配置、日志管理
|
||||
|
||||
## 🚀 部署指南
|
||||
|
||||
### 开发环境部署
|
||||
```bash
|
||||
# 1. 启动MySQL和Redis服务
|
||||
# 2. 创建数据库并导入初始数据
|
||||
# 3. 修改配置文件
|
||||
# 4. 启动应用
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
### 生产环境部署
|
||||
```bash
|
||||
# 1. 打包应用
|
||||
mvn clean package -Dmaven.test.skip=true
|
||||
|
||||
# 2. 运行jar包
|
||||
java -jar target/com-gxwebsoft-modules-1.5.0.jar --spring.profiles.active=prod
|
||||
|
||||
# 3. 使用Docker部署(可选)
|
||||
docker build -t websoft-api .
|
||||
docker run -d -p 9200:9200 websoft-api
|
||||
```
|
||||
|
||||
## 🤝 贡献指南
|
||||
|
||||
1. Fork 本仓库
|
||||
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
|
||||
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
||||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
||||
5. 打开 Pull Request
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情
|
||||
|
||||
## 📞 联系我们
|
||||
|
||||
- 官网:https://websoft.top
|
||||
- 邮箱:170083662@qq.top
|
||||
- QQ群:479713884
|
||||
|
||||
---
|
||||
|
||||
⭐ 如果这个项目对您有帮助,请给我们一个星标!
|
||||
38
docker-compose.yml
Normal file
38
docker-compose.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# 应用服务
|
||||
cms-api:
|
||||
build: .
|
||||
container_name: cms-api
|
||||
ports:
|
||||
- "9200:9200"
|
||||
environment:
|
||||
- SPRING_PROFILES_ACTIVE=prod
|
||||
- JAVA_OPTS=-Xms512m -Xmx1024m
|
||||
volumes:
|
||||
# 证书挂载卷 - 将宿主机证书目录挂载到容器
|
||||
- ./certs:/app/certs:ro
|
||||
# 日志挂载卷
|
||||
- ./logs:/app/logs
|
||||
# 上传文件挂载卷
|
||||
- ./uploads:/app/uploads
|
||||
networks:
|
||||
- cms-network
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9200/actuator/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
networks:
|
||||
cms-network:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
driver: local
|
||||
redis_data:
|
||||
driver: local
|
||||
188
docker-deploy-guide.md
Normal file
188
docker-deploy-guide.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# Docker容器化部署指南
|
||||
|
||||
## 支付证书问题解决方案
|
||||
|
||||
本项目已经解决了Docker容器中支付证书路径失效的问题,支持多种证书加载方式。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
project-root/
|
||||
├── Dockerfile
|
||||
├── docker-compose.yml
|
||||
├── certs/ # 证书目录(需要手动创建)
|
||||
│ ├── wechat/ # 微信支付证书
|
||||
│ │ ├── apiclient_key.pem
|
||||
│ │ ├── apiclient_cert.pem
|
||||
│ │ └── wechatpay_cert.pem
|
||||
│ └── alipay/ # 支付宝证书
|
||||
│ ├── app_private_key.pem
|
||||
│ ├── appCertPublicKey.crt
|
||||
│ ├── alipayCertPublicKey.crt
|
||||
│ └── alipayRootCert.crt
|
||||
├── logs/ # 日志目录
|
||||
├── uploads/ # 上传文件目录
|
||||
└── src/
|
||||
```
|
||||
|
||||
## 部署步骤
|
||||
|
||||
### 1. 准备证书文件
|
||||
|
||||
创建证书目录并放置证书文件:
|
||||
|
||||
```bash
|
||||
# 创建证书目录
|
||||
mkdir -p certs/wechat
|
||||
mkdir -p certs/alipay
|
||||
|
||||
# 复制微信支付证书到对应目录
|
||||
cp /path/to/your/apiclient_key.pem certs/wechat/
|
||||
cp /path/to/your/apiclient_cert.pem certs/wechat/
|
||||
cp /path/to/your/wechatpay_cert.pem certs/wechat/
|
||||
|
||||
# 复制支付宝证书到对应目录
|
||||
cp /path/to/your/app_private_key.pem certs/alipay/
|
||||
cp /path/to/your/appCertPublicKey.crt certs/alipay/
|
||||
cp /path/to/your/alipayCertPublicKey.crt certs/alipay/
|
||||
cp /path/to/your/alipayRootCert.crt certs/alipay/
|
||||
|
||||
# 设置证书文件权限(只读)
|
||||
chmod -R 444 certs/
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
创建 `.env` 文件(可选):
|
||||
|
||||
```bash
|
||||
# 应用配置
|
||||
SPRING_PROFILES_ACTIVE=prod
|
||||
JAVA_OPTS=-Xms512m -Xmx1024m
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_PASSWORD=root123456
|
||||
MYSQL_DATABASE=modules
|
||||
MYSQL_USER=modules
|
||||
MYSQL_PASSWORD=8YdLnk7KsPAyDXGA
|
||||
|
||||
# Redis配置
|
||||
REDIS_PASSWORD=redis_WSDb88
|
||||
```
|
||||
|
||||
### 3. 构建和启动
|
||||
|
||||
```bash
|
||||
# 构建应用
|
||||
mvn clean package -DskipTests
|
||||
|
||||
# 启动所有服务
|
||||
docker-compose up -d
|
||||
|
||||
# 查看服务状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看应用日志
|
||||
docker-compose logs -f cms-app
|
||||
```
|
||||
|
||||
### 4. 验证部署
|
||||
|
||||
```bash
|
||||
# 检查应用健康状态
|
||||
curl http://localhost:9200/actuator/health
|
||||
|
||||
# 检查证书是否正确加载
|
||||
docker exec cms-java-app ls -la /app/certs/
|
||||
```
|
||||
|
||||
## 证书加载模式
|
||||
|
||||
### 开发环境 (CLASSPATH)
|
||||
- 证书文件放在 `src/main/resources/certs/` 目录下
|
||||
- 打包时会包含在jar包中
|
||||
- 适合开发和测试环境
|
||||
|
||||
### 生产环境 (VOLUME)
|
||||
- 证书文件通过Docker挂载卷加载
|
||||
- 证书文件在宿主机上,挂载到容器的 `/app/certs` 目录
|
||||
- 支持证书文件的动态更新(重启容器后生效)
|
||||
|
||||
### 文件系统模式 (FILESYSTEM)
|
||||
- 直接从文件系统路径加载证书
|
||||
- 适合传统部署方式
|
||||
|
||||
## 配置说明
|
||||
|
||||
### application.yml 配置
|
||||
|
||||
```yaml
|
||||
certificate:
|
||||
load-mode: VOLUME # 证书加载模式
|
||||
cert-root-path: /app/certs # 证书根目录
|
||||
|
||||
wechat-pay:
|
||||
dev:
|
||||
api-v3-key: "your-api-v3-key"
|
||||
private-key-file: "apiclient_key.pem"
|
||||
apiclient-cert-file: "apiclient_cert.pem"
|
||||
wechatpay-cert-file: "wechatpay_cert.pem"
|
||||
```
|
||||
|
||||
### 环境特定配置
|
||||
|
||||
- **开发环境**: `application-dev.yml` - 使用CLASSPATH模式
|
||||
- **生产环境**: `application-prod.yml` - 使用VOLUME模式
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 1. 证书文件找不到
|
||||
|
||||
```bash
|
||||
# 检查证书文件是否存在
|
||||
docker exec cms-java-app ls -la /app/certs/
|
||||
|
||||
# 检查文件权限
|
||||
docker exec cms-java-app ls -la /app/certs/wechat/
|
||||
```
|
||||
|
||||
### 2. 支付接口调用失败
|
||||
|
||||
```bash
|
||||
# 查看应用日志
|
||||
docker-compose logs cms-app | grep -i cert
|
||||
|
||||
# 检查证书配置
|
||||
docker exec cms-java-app cat /app/application.yml | grep -A 10 certificate
|
||||
```
|
||||
|
||||
### 3. 容器启动失败
|
||||
|
||||
```bash
|
||||
# 查看详细错误信息
|
||||
docker-compose logs cms-app
|
||||
|
||||
# 检查容器状态
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. **证书文件权限**: 设置为只读权限 (444)
|
||||
2. **证书目录权限**: 限制访问权限
|
||||
3. **敏感信息**: 使用环境变量或Docker secrets管理敏感配置
|
||||
4. **网络安全**: 使用内部网络,限制端口暴露
|
||||
|
||||
## 更新证书
|
||||
|
||||
1. 停止应用容器:`docker-compose stop cms-app`
|
||||
2. 更新证书文件到 `certs/` 目录
|
||||
3. 重启应用容器:`docker-compose start cms-app`
|
||||
|
||||
## 监控和日志
|
||||
|
||||
- 应用日志:`./logs/` 目录
|
||||
- 容器日志:`docker-compose logs`
|
||||
- 健康检查:访问 `/actuator/health` 端点
|
||||
|
||||
通过以上配置,你的应用在Docker容器中就能正确加载支付证书了!
|
||||
427
pom.xml
Normal file
427
pom.xml
Normal file
@@ -0,0 +1,427 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.gxwebsoft</groupId>
|
||||
<artifactId>com-gxwebsoft-modules</artifactId>
|
||||
<version>1.5.0</version>
|
||||
|
||||
<name>com-gxwebsoft-api</name>
|
||||
<description>WebSoftApi project for Spring Boot</description>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.7.18</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<java.version>17</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- spring-boot-devtools -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
<scope>runtime</scope>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- spring-boot-test -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- spring-boot-web -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Jackson JSR310 support for Java 8 time -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- spring-boot-aop -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- spring-boot-configuration-processor -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- lombok -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- mysql -->
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- druid -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
<version>1.2.20</version>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis-plus -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>3.4.3.3</version>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis-plus 连表插件-->
|
||||
<dependency>
|
||||
<groupId>com.github.yulichang</groupId>
|
||||
<artifactId>mybatis-plus-join-boot-starter</artifactId>
|
||||
<version>1.4.5</version>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis-plus-generator -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
<version>3.4.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- hutool -->
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-core</artifactId>
|
||||
<version>5.8.25</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-extra</artifactId>
|
||||
<version>5.8.25</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-http</artifactId>
|
||||
<version>5.8.25</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-crypto</artifactId>
|
||||
<version>5.8.25</version>
|
||||
</dependency>
|
||||
|
||||
<!-- easy poi -->
|
||||
<dependency>
|
||||
<groupId>cn.afterturn</groupId>
|
||||
<artifactId>easypoi-base</artifactId>
|
||||
<version>4.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- tika, 用于FileServer获取content-type -->
|
||||
<dependency>
|
||||
<groupId>org.apache.tika</groupId>
|
||||
<artifactId>tika-core</artifactId>
|
||||
<version>2.9.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- open office, 用于文档转pdf实现在线预览 -->
|
||||
<dependency>
|
||||
<groupId>com.github.livesense</groupId>
|
||||
<artifactId>jodconverter-core</artifactId>
|
||||
<version>1.0.5</version>
|
||||
</dependency>
|
||||
|
||||
<!-- spring-boot-mail -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-mail</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 模板引擎, 用于邮件、代码生成等 -->
|
||||
<dependency>
|
||||
<groupId>com.ibeetl</groupId>
|
||||
<artifactId>beetl</artifactId>
|
||||
<version>3.15.10.RELEASE</version>
|
||||
</dependency>
|
||||
|
||||
<!-- SpringDoc OpenAPI 3 -->
|
||||
<dependency>
|
||||
<groupId>org.springdoc</groupId>
|
||||
<artifactId>springdoc-openapi-ui</artifactId>
|
||||
<version>1.7.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- spring security -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- jjwt -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.11.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.11.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.11.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- 图形验证码 -->
|
||||
<dependency>
|
||||
<groupId>com.github.whvcse</groupId>
|
||||
<artifactId>easy-captcha</artifactId>
|
||||
<version>1.6.2</version>
|
||||
</dependency>
|
||||
|
||||
<!--Redis-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 阿里SDK -->
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>aliyun-java-sdk-core</artifactId>
|
||||
<version>4.4.3</version>
|
||||
</dependency>
|
||||
<!--阿里支付 老版本 SDK-->
|
||||
<dependency>
|
||||
<groupId>com.alipay.sdk</groupId>
|
||||
<artifactId>alipay-sdk-java</artifactId>
|
||||
<version>4.35.0.ALL</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk18on -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk18on</artifactId>
|
||||
<version>1.77</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
|
||||
<dependency>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<version>1.3.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>2.0.43</version>
|
||||
</dependency>
|
||||
|
||||
<!--二维码-->
|
||||
<dependency>
|
||||
<groupId>com.google.zxing</groupId>
|
||||
<artifactId>core</artifactId>
|
||||
<version>3.5.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.10.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.vaadin.external.google</groupId>
|
||||
<artifactId>android-json</artifactId>
|
||||
<version>0.0.20131108.vaadin1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- socketio -->
|
||||
<dependency>
|
||||
<groupId>com.corundumstudio.socketio</groupId>
|
||||
<artifactId>netty-socketio</artifactId>
|
||||
<version>2.0.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 微信支付 APIv3 Java SDK-->
|
||||
<dependency>
|
||||
<groupId>com.github.wechatpay-apiv3</groupId>
|
||||
<artifactId>wechatpay-java</artifactId>
|
||||
<version>0.2.17</version>
|
||||
</dependency>
|
||||
|
||||
<!-- MQTT -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.integration</groupId>
|
||||
<artifactId>spring-integration-mqtt</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.paho</groupId>
|
||||
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
|
||||
<version>1.2.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.binarywang</groupId>
|
||||
<artifactId>weixin-java-miniapp</artifactId>
|
||||
<version>4.6.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.binarywang</groupId>
|
||||
<artifactId>weixin-java-mp</artifactId>
|
||||
<version>4.6.0</version> <!-- 请替换为最新版本号 -->
|
||||
</dependency>
|
||||
|
||||
<!-- 阿里云 OSS -->
|
||||
<dependency>
|
||||
<groupId>com.aliyun.oss</groupId>
|
||||
<artifactId>aliyun-sdk-oss</artifactId>
|
||||
<version>3.17.4</version>
|
||||
</dependency>
|
||||
<!-- 快递100-->
|
||||
<dependency>
|
||||
<groupId>com.github.kuaidi100-api</groupId>
|
||||
<artifactId>sdk</artifactId>
|
||||
<version>1.0.13</version>
|
||||
</dependency>
|
||||
|
||||
<!--诺诺开票接口-->
|
||||
<dependency>
|
||||
<groupId>com.nuonuo</groupId>
|
||||
<artifactId>open-sdk</artifactId>
|
||||
<version>1.0.5.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- knife4j for SpringDoc OpenAPI -->
|
||||
<dependency>
|
||||
<groupId>com.github.xiaoymin</groupId>
|
||||
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
|
||||
<version>4.3.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.belerweb</groupId>
|
||||
<artifactId>pinyin4j</artifactId>
|
||||
<version>2.5.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 机器翻译 -->
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>alimt20181012</artifactId>
|
||||
<version>1.0.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>tea-openapi</artifactId>
|
||||
<version>0.2.5</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>4.12.0</version>
|
||||
</dependency>
|
||||
<!-- 可选:用来做内存缓存 access_token -->
|
||||
<dependency>
|
||||
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||
<artifactId>caffeine</artifactId>
|
||||
<version>3.1.8</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.freewayso</groupId>
|
||||
<artifactId>image-combiner</artifactId>
|
||||
<version>2.6.9</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>bailian20231229</artifactId>
|
||||
<version>2.4.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
<includes>
|
||||
<include>**/*Mapper.xml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>**</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.project-lombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>17</source>
|
||||
<target>17</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<skipTests>true</skipTests>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>aliYunMaven</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
</project>
|
||||
31
src/main/java/com/gxwebsoft/WebSoftApplication.java
Normal file
31
src/main/java/com/gxwebsoft/WebSoftApplication.java
Normal file
@@ -0,0 +1,31 @@
|
||||
package com.gxwebsoft;
|
||||
|
||||
import com.gxwebsoft.common.core.config.ConfigProperties;
|
||||
import com.gxwebsoft.common.core.config.MqttProperties;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
import org.springframework.web.socket.config.annotation.EnableWebSocket;
|
||||
|
||||
/**
|
||||
* 启动类
|
||||
* Created by WebSoft on 2018-02-22 11:29:03
|
||||
*/
|
||||
@EnableAsync
|
||||
@EnableTransactionManagement
|
||||
@MapperScan("com.gxwebsoft.**.mapper")
|
||||
@EnableConfigurationProperties({ConfigProperties.class, MqttProperties.class})
|
||||
@SpringBootApplication
|
||||
@EnableScheduling
|
||||
@EnableWebSocket
|
||||
public class WebSoftApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(WebSoftApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
120
src/main/java/com/gxwebsoft/ai/config/AuditExcelStyle.java
Normal file
120
src/main/java/com/gxwebsoft/ai/config/AuditExcelStyle.java
Normal file
@@ -0,0 +1,120 @@
|
||||
package com.gxwebsoft.ai.config;
|
||||
|
||||
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
||||
import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
|
||||
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
|
||||
/**
|
||||
* 自定义Excel导出样式
|
||||
*/
|
||||
public class AuditExcelStyle implements IExcelExportStyler {
|
||||
|
||||
private Workbook workbook;
|
||||
|
||||
public AuditExcelStyle(Workbook workbook) {
|
||||
this.workbook = workbook;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellStyle getHeaderStyle(short color) {
|
||||
CellStyle style = workbook.createCellStyle();
|
||||
|
||||
// 设置边框
|
||||
style.setBorderBottom(BorderStyle.THIN);
|
||||
style.setBorderLeft(BorderStyle.THIN);
|
||||
style.setBorderRight(BorderStyle.THIN);
|
||||
style.setBorderTop(BorderStyle.THIN);
|
||||
|
||||
// 设置背景色 - 浅蓝色
|
||||
style.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
|
||||
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
|
||||
// 设置字体
|
||||
Font font = workbook.createFont();
|
||||
font.setBold(true);
|
||||
font.setFontHeightInPoints((short) 11);
|
||||
font.setColor(IndexedColors.BLACK.getIndex());
|
||||
style.setFont(font);
|
||||
|
||||
// 居中对齐
|
||||
style.setAlignment(HorizontalAlignment.CENTER);
|
||||
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellStyle getTitleStyle(short color) {
|
||||
CellStyle style = workbook.createCellStyle();
|
||||
|
||||
// 设置边框
|
||||
style.setBorderBottom(BorderStyle.MEDIUM);
|
||||
style.setBorderLeft(BorderStyle.MEDIUM);
|
||||
style.setBorderRight(BorderStyle.MEDIUM);
|
||||
style.setBorderTop(BorderStyle.MEDIUM);
|
||||
|
||||
// 设置背景色 - 深蓝色
|
||||
style.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
|
||||
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
|
||||
// 设置字体
|
||||
Font font = workbook.createFont();
|
||||
font.setBold(true);
|
||||
font.setFontHeightInPoints((short) 14);
|
||||
font.setColor(IndexedColors.BLACK.getIndex());
|
||||
style.setFont(font);
|
||||
|
||||
// 居中对齐
|
||||
style.setAlignment(HorizontalAlignment.CENTER);
|
||||
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellStyle getStyles(boolean noneStyler, ExcelExportEntity entity) {
|
||||
CellStyle style = workbook.createCellStyle();
|
||||
|
||||
// 设置边框
|
||||
style.setBorderBottom(BorderStyle.THIN);
|
||||
style.setBorderLeft(BorderStyle.THIN);
|
||||
style.setBorderRight(BorderStyle.THIN);
|
||||
style.setBorderTop(BorderStyle.THIN);
|
||||
|
||||
// 设置字体
|
||||
Font font = workbook.createFont();
|
||||
font.setFontHeightInPoints((short) 10);
|
||||
style.setFont(font);
|
||||
|
||||
// 自动换行
|
||||
style.setWrapText(true);
|
||||
|
||||
// 垂直居中
|
||||
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
|
||||
// 根据列名设置不同的水平对齐方式
|
||||
if (entity != null && entity.getName() != null) {
|
||||
switch (entity.getName()) {
|
||||
case "类别":
|
||||
case "测试结果":
|
||||
style.setAlignment(HorizontalAlignment.CENTER);
|
||||
break;
|
||||
default:
|
||||
style.setAlignment(HorizontalAlignment.LEFT);
|
||||
}
|
||||
}
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) {
|
||||
return getStyles(false, entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
|
||||
return getStyles(false, null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.gxwebsoft.ai.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Data
|
||||
@Component
|
||||
@ConfigurationProperties(prefix = "aliyun.knowledge-base")
|
||||
public class KnowledgeBaseConfig {
|
||||
|
||||
private String accessKeyId;
|
||||
private String accessKeySecret;
|
||||
private String workspaceId;
|
||||
private String topCategoryId;
|
||||
}
|
||||
16
src/main/java/com/gxwebsoft/ai/config/TemplateConfig.java
Normal file
16
src/main/java/com/gxwebsoft/ai/config/TemplateConfig.java
Normal file
@@ -0,0 +1,16 @@
|
||||
package com.gxwebsoft.ai.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Data
|
||||
@Component
|
||||
@ConfigurationProperties(prefix = "ai.template")
|
||||
public class TemplateConfig {
|
||||
|
||||
private String wordTemplatePath;
|
||||
|
||||
private String evidenceTemplatePath;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,432 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 党风廉政建设责任制审计常量类
|
||||
*/
|
||||
public class AuditContent10PartyConductConstants {
|
||||
|
||||
// 大类定义
|
||||
public static final String CATEGORY_TARGET_RESPONSIBILITY = "落实党风廉政建设责任制";
|
||||
public static final String CATEGORY_INSPECTION_RECTIFICATION = "巡视整改工作";
|
||||
public static final String CATEGORY_DISCIPLINE_REFORM = "深化纪律检查体制改革";
|
||||
|
||||
// 子类定义 - 落实党风廉政建设责任制
|
||||
public static final String SUBCATEGORY_MAIN_RESPONSIBILITY = "落实主体责任和监督责任";
|
||||
public static final String SUBCATEGORY_EIGHT_REGULATIONS = "落实中央八项规定精神工作";
|
||||
public static final String SUBCATEGORY_ANTI_CORRUPTION = "开展查处发生在群众身边的\"四风\"和腐败问题专项工作";
|
||||
public static final String SUBCATEGORY_DISCIPLINE_ENFORCEMENT = "严明纪律确保政令畅通";
|
||||
|
||||
// 子类定义 - 巡视整改工作
|
||||
public static final String SUBCATEGORY_MONTHLY_REPORT = "严格执行月报告制度";
|
||||
public static final String SUBCATEGORY_RECTIFICATION_TASK = "按时完成整改任务";
|
||||
public static final String SUBCATEGORY_RECTIFICATION_ACCOUNTABILITY = "因巡视整改不给力被追究";
|
||||
|
||||
// 子类定义 - 深化纪律检查体制改革
|
||||
public static final String SUBCATEGORY_THREE_TURNS = "聚焦主业主责,持续深化\"三转\"工作";
|
||||
public static final String SUBCATEGORY_SYSTEM_CONSTRUCTION = "健全完善深化纪检体制改革的相关制度文件并抓好贯彻落实";
|
||||
|
||||
// 小类定义
|
||||
public static final String DETAIL_LEADERSHIP_STRENGTHENING = "1 强化组织领导";
|
||||
public static final String DETAIL_TASK_DEPLOYMENT = "2 及时部署工作任务";
|
||||
public static final String DETAIL_PRESSURE_TRANSMISSION = "3 层层传到责任和压力";
|
||||
public static final String DETAIL_CASE_DOUBLE_CHECK = "4 坚持\"一案双查\"";
|
||||
public static final String DETAIL_WORK_REPORTING = "5 及时汇报工作情况";
|
||||
public static final String DETAIL_INSPECTION_AND_SUPERVISION = "1 开展监督检查";
|
||||
public static final String DETAIL_DATA_SUBMISSION = "2 报送数据和资料";
|
||||
public static final String DETAIL_CASE_HANDLING = "3 查办违反中央八项规定精神案件";
|
||||
public static final String DETAIL_EXPOSURE_NOTIFICATION = "4 通报曝光";
|
||||
public static final String DETAIL_HOUSING_CLEARANCE = "5 清退干部职工多占住房";
|
||||
public static final String DETAIL_PROBLEM_CLUE_HANDLING = "1 及时梳理处置问题线索";
|
||||
public static final String DETAIL_CASE_INVESTIGATION = "2 查处一批案件";
|
||||
public static final String DETAIL_TYPICAL_CASE_EXPOSURE = "3 通报曝光一批典型案件";
|
||||
public static final String DETAIL_ATMOSPHERE_CREATION = "4 营造氛围";
|
||||
public static final String DETAIL_PROBLEM_CONFESSION = "5 督促违纪人员主动交代问题";
|
||||
public static final String DETAIL_SUMMARY_AND_MECHANISM = "6 进行总结并建立长效机制";
|
||||
public static final String DETAIL_NORMALIZED_GOVERNANCE = "7 专项工作纳入常态化治理";
|
||||
public static final String DETAIL_POLITICAL_DISCIPLINE = "1 严明政治纪律和组织纪律";
|
||||
public static final String DETAIL_MAJOR_DECISION = "2 按时完成中央和自治区重大决策部署";
|
||||
public static final String DETAIL_CASE_COMPLETION = "3 按时完成转办督办案件";
|
||||
|
||||
// 大类与子类映射关系
|
||||
public static final Map<String, List<String>> CATEGORY_SUBCATEGORY_MAP = new HashMap<>();
|
||||
static {
|
||||
// 落实党风廉政建设责任制
|
||||
CATEGORY_SUBCATEGORY_MAP.put(CATEGORY_TARGET_RESPONSIBILITY, Arrays.asList(
|
||||
SUBCATEGORY_MAIN_RESPONSIBILITY,
|
||||
SUBCATEGORY_EIGHT_REGULATIONS,
|
||||
SUBCATEGORY_ANTI_CORRUPTION,
|
||||
SUBCATEGORY_DISCIPLINE_ENFORCEMENT
|
||||
));
|
||||
|
||||
// 巡视整改工作
|
||||
CATEGORY_SUBCATEGORY_MAP.put(CATEGORY_INSPECTION_RECTIFICATION, Arrays.asList(
|
||||
SUBCATEGORY_MONTHLY_REPORT,
|
||||
SUBCATEGORY_RECTIFICATION_TASK,
|
||||
SUBCATEGORY_RECTIFICATION_ACCOUNTABILITY
|
||||
));
|
||||
|
||||
// 深化纪律检查体制改革
|
||||
CATEGORY_SUBCATEGORY_MAP.put(CATEGORY_DISCIPLINE_REFORM, Arrays.asList(
|
||||
SUBCATEGORY_THREE_TURNS,
|
||||
SUBCATEGORY_SYSTEM_CONSTRUCTION
|
||||
));
|
||||
}
|
||||
|
||||
// 子类与小类映射关系
|
||||
public static final Map<String, List<String>> SUBCATEGORY_DETAIL_MAP = new HashMap<>();
|
||||
static {
|
||||
// 落实主体责任和监督责任
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_MAIN_RESPONSIBILITY, Arrays.asList(
|
||||
DETAIL_LEADERSHIP_STRENGTHENING,
|
||||
DETAIL_TASK_DEPLOYMENT,
|
||||
DETAIL_PRESSURE_TRANSMISSION,
|
||||
DETAIL_CASE_DOUBLE_CHECK,
|
||||
DETAIL_WORK_REPORTING
|
||||
));
|
||||
|
||||
// 落实中央八项规定精神工作
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_EIGHT_REGULATIONS, Arrays.asList(
|
||||
DETAIL_INSPECTION_AND_SUPERVISION,
|
||||
DETAIL_DATA_SUBMISSION,
|
||||
DETAIL_CASE_HANDLING,
|
||||
DETAIL_EXPOSURE_NOTIFICATION,
|
||||
DETAIL_HOUSING_CLEARANCE
|
||||
));
|
||||
|
||||
// 开展查处发生在群众身边的"四风"和腐败问题专项工作
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_ANTI_CORRUPTION, Arrays.asList(
|
||||
DETAIL_PROBLEM_CLUE_HANDLING,
|
||||
DETAIL_CASE_INVESTIGATION,
|
||||
DETAIL_TYPICAL_CASE_EXPOSURE,
|
||||
DETAIL_ATMOSPHERE_CREATION,
|
||||
DETAIL_PROBLEM_CONFESSION,
|
||||
DETAIL_SUMMARY_AND_MECHANISM,
|
||||
DETAIL_NORMALIZED_GOVERNANCE
|
||||
));
|
||||
|
||||
// 严明纪律确保政令畅通
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_DISCIPLINE_ENFORCEMENT, Arrays.asList(
|
||||
DETAIL_POLITICAL_DISCIPLINE,
|
||||
DETAIL_MAJOR_DECISION,
|
||||
DETAIL_CASE_COMPLETION
|
||||
));
|
||||
|
||||
// 巡视整改工作的子类
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_MONTHLY_REPORT, Arrays.asList("1 严格执行月报告制度"));
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_RECTIFICATION_TASK, Arrays.asList("2 按时完成整改任务"));
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_RECTIFICATION_ACCOUNTABILITY, Arrays.asList("3 因巡视整改不给力被追究"));
|
||||
|
||||
// 深化纪律检查体制改革的子类
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_THREE_TURNS, Arrays.asList("1 聚焦主业主责,持续深化\"三转\"工作"));
|
||||
SUBCATEGORY_DETAIL_MAP.put(SUBCATEGORY_SYSTEM_CONSTRUCTION, Arrays.asList("2 健全完善深化纪检体制改革的相关制度文件并抓好贯彻落实"));
|
||||
}
|
||||
|
||||
// 固定顺序的示例数据列表(按审计内容10.txt中的顺序)
|
||||
private static final List<JSONObject> FIXED_ORDER_EXAMPLE_DATA = new ArrayList<>();
|
||||
static {
|
||||
// 落实主体责任和监督责任
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "1 强化组织领导", "建立责任清单、明确党组、纪检责任");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "1 强化组织领导", "建立健全反腐败领导机制,人员调整后及时进行分工,并全年召开两次以上协调会");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "1 强化组织领导", "主要领导认真履行第一责任人责任,对党风廉政建设重要工作亲自部署、重大问题亲自过问、重点环节亲自协调、重要案件亲自督办5次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "1 强化组织领导", "领导班子其他成员对职责范围内的党风廉政建设承担主要责任,与分管联系部门研究安排党风廉政建设工作4次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "2 及时部署工作任务", "有党风廉政建设任务分工方案,党组专题研究部署党风廉政建设工作4次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "3 层层传到责任和压力", "主要领导检查和调研党风廉政建设各一次以上,每年听取分管联系部门的党风廉政建设一次以上,且每年亲自上廉政党课不少于1次");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "3 层层传到责任和压力", "分管领导对分管联系部门党风廉政建设检查和调研各1次以上,每年听取分管联系部门的党风廉政建设情况汇报一次以上,到分管联系部门上廉政党课1次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "3 层层传到责任和压力", "党组、纪检组注重抓早抓小,经常进行咬耳扯袖、红脸出汗,及时开展约谈、集体廉政谈话等工作3次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "3 层层传到责任和压力", "开展述责评议工作");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "4 坚持\"一案双查\"", "对发生在本单位的较严重的违反政治纪律、组织纪律等问题进行\"一案双查\"");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "4 坚持\"一案双查\"", "出现\"四风\"和腐败等顶风违纪问题的");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "4 坚持\"一案双查\"", "出现区域性系统性违纪违法问题突出的");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "4 坚持\"一案双查\"", "出现上级交办的党风廉政建设事项不传达部署和落实的");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "4 坚持\"一案双查\"", "出现违纪行为隐瞒不报压案不查等问题而未进行责任追究被中央、自治区进行挂牌督办或直接问责、约谈等");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "5 及时汇报工作情况", "党组、纪检组向自治区党委、纪委汇报\"两个\"责任落实情况两次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "5 及时汇报工作情况", "班子成员年底向自治区纪委报送个人落实\"两个责任\"情况报告");
|
||||
addExampleData("落实党风廉政建设责任制", "落实主体责任和监督责任", "5 及时汇报工作情况", "按照自治区纪委部署开展其他工作,并按时报送总结报告的");
|
||||
|
||||
// 落实中央八项规定精神工作
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "1 开展监督检查", "部署开展监督检查3次以上");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "2 报送数据和资料", "每月按时报送中央八项规定精神案件有关统计数据和有关资料");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "2 报送数据和资料", "每月不按时报送或未按要求报送的");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "3 查办违反中央八项规定精神案件", "及时查处监督检查中发现的问题和中央、自治区转办督办的问题线索");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "3 查办违反中央八项规定精神案件", "出现违反中央八项规定精神问题被上级查处的,或查处但问责太轻,被上级责令重新查办");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "4 通报曝光", "对受到党纪政纪处分的问题全部进行通报曝光的");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "5 清退干部职工多占住房", "到年底还不能完成干部职工多占住房清退的");
|
||||
addExampleData("落实党风廉政建设责任制", "落实中央八项规定精神工作", "5 清退干部职工多占住房", "信访反映清房工作不到位被查实的");
|
||||
|
||||
// 开展查处发生在群众身边的"四风"和腐败问题专项工作
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "1 及时梳理处置问题线索", "对收到或者上级交办问题线索进行转办督办或直接查办的");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "2 查处一批案件", "因查处案件不力被自治区约谈或通报批评的");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "3 通报曝光一批典型案件", "对查处的案件进行通报曝光");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "4 营造氛围", "加大宣传力度,用典型案例进行警示教育");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "5 督促违纪人员主动交代问题", "以文件形式或在网络、报纸、电视等媒介上发布公告,督促违纪人员主动交代问题并主动上缴违纪所得");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "6 进行总结并建立长效机制", "没有在6月20日前进行总结");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "6 进行总结并建立长效机制", "没有结合专项工作中发现存在的突出问题建立完善制度措施");
|
||||
addExampleData("落实党风廉政建设责任制", "开展查处发生在群众身边的\"四风\"和腐败问题专项工作", "7 专项工作纳入常态化治理", "6月后,在全部二层单位开展专项工作");
|
||||
|
||||
// 严明纪律确保政令畅通
|
||||
addExampleData("落实党风廉政建设责任制", "严明纪律确保政令畅通", "1 严明政治纪律和组织纪律", "有违反政治纪律等问题被中央、自治区查处的");
|
||||
addExampleData("落实党风廉政建设责任制", "严明纪律确保政令畅通", "2 按时完成中央和自治区重大决策部署", "出现问题被中央、自治区问责的");
|
||||
addExampleData("落实党风廉政建设责任制", "严明纪律确保政令畅通", "3 按时完成转办督办案件", "按时完成自治区纪委转办督办的党风政风类案件");
|
||||
addExampleData("落实党风廉政建设责任制", "严明纪律确保政令畅通", "3 按时完成转办督办案件", "不按时完成或不完成的");
|
||||
|
||||
// 巡视整改工作
|
||||
addExampleData("巡视整改工作", "严格执行月报告制度", "1 严格执行月报告制度", "严格执行月报告制度");
|
||||
addExampleData("巡视整改工作", "按时完成整改任务", "2 按时完成整改任务", "按时完成整改任务");
|
||||
addExampleData("巡视整改工作", "因巡视整改不给力被追究", "3 因巡视整改不给力被追究", "因巡视整改不给力被追究");
|
||||
|
||||
// 深化纪律检查体制改革
|
||||
addExampleData("深化纪律检查体制改革", "聚焦主业主责,持续深化\"三转\"工作", "1 聚焦主业主责,持续深化\"三转\"工作", "纪检组长或纪工委书记不分管具体业务工作,专职抓执纪监督问责工作");
|
||||
addExampleData("深化纪律检查体制改革", "聚焦主业主责,持续深化\"三转\"工作", "1 聚焦主业主责,持续深化\"三转\"工作", "检查发现有参与业务工作");
|
||||
addExampleData("深化纪律检查体制改革", "健全完善深化纪检体制改革的相关制度文件并抓好贯彻落实", "2 健全完善深化纪检体制改革的相关制度文件并抓好贯彻落实", "年底前制定有1项以上配套制度文件");
|
||||
}
|
||||
|
||||
private static void addExampleData(String category, String subCategory, String detailCategory, String content) {
|
||||
JSONObject obj = new JSONObject();
|
||||
obj.put("category", category);
|
||||
obj.put("subCategory", subCategory);
|
||||
obj.put("detailCategory", detailCategory);
|
||||
obj.put("content", content);
|
||||
obj.put("executionStatus", "");
|
||||
obj.put("workPaperIndex", "[\"实际存在的完整文件名1||FileUrl1\", \"实际存在的完整文件名2||FileUrl2\", \"...\"]");
|
||||
// obj.put("workPaperIndex", "[\"实际存在的完整FileId1\", \"实际存在的完整FileId2\", \"...\"]");
|
||||
FIXED_ORDER_EXAMPLE_DATA.add(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有固定顺序的示例数据
|
||||
*/
|
||||
public static List<JSONObject> getFixedOrderExampleData() {
|
||||
return new ArrayList<>(FIXED_ORDER_EXAMPLE_DATA);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定子类的示例数据
|
||||
*/
|
||||
public static JSONArray getExampleDataBySubCategory(String subCategory) {
|
||||
JSONArray result = new JSONArray();
|
||||
for (JSONObject example : FIXED_ORDER_EXAMPLE_DATA) {
|
||||
if (subCategory.equals(example.getString("subCategory"))) {
|
||||
result.add(example);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取固定顺序的内容列表
|
||||
*/
|
||||
public static List<String> getFixedOrderContentList() {
|
||||
List<String> contentList = new ArrayList<>();
|
||||
for (JSONObject example : FIXED_ORDER_EXAMPLE_DATA) {
|
||||
contentList.add(example.getString("content"));
|
||||
}
|
||||
return contentList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取内容在固定顺序中的索引
|
||||
*/
|
||||
public static int getContentFixedOrderIndex(String content) {
|
||||
List<String> fixedOrder = getFixedOrderContentList();
|
||||
int index = fixedOrder.indexOf(content);
|
||||
return index != -1 ? index : Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有子类列表(包括所有大类的子类)
|
||||
*/
|
||||
public static List<String> getAllSubCategories() {
|
||||
List<String> allSubCategories = new ArrayList<>();
|
||||
for (List<String> subCategories : CATEGORY_SUBCATEGORY_MAP.values()) {
|
||||
allSubCategories.addAll(subCategories);
|
||||
}
|
||||
return allSubCategories;
|
||||
}
|
||||
|
||||
// 大类顺序 - 用于排序
|
||||
public static final List<String> CATEGORY_ORDER = Arrays.asList(
|
||||
CATEGORY_TARGET_RESPONSIBILITY,
|
||||
CATEGORY_INSPECTION_RECTIFICATION,
|
||||
CATEGORY_DISCIPLINE_REFORM
|
||||
);
|
||||
|
||||
// 大类描述
|
||||
public static final Map<String, String> CATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_TARGET_RESPONSIBILITY, "落实党风廉政建设主体责任和监督责任");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_INSPECTION_RECTIFICATION, "巡视反馈问题的整改落实情况");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_DISCIPLINE_REFORM, "深化纪律检查体制改革工作情况");
|
||||
}
|
||||
|
||||
// 子类描述
|
||||
public static final Map<String, String> SUBCATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_MAIN_RESPONSIBILITY, "党委主体责任和纪委监督责任落实情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_EIGHT_REGULATIONS, "中央八项规定精神落实情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_ANTI_CORRUPTION, "查处群众身边腐败问题工作情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_DISCIPLINE_ENFORCEMENT, "纪律执行和政令畅通情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_MONTHLY_REPORT, "巡视整改月报告制度执行情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_RECTIFICATION_TASK, "巡视整改任务完成情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_RECTIFICATION_ACCOUNTABILITY, "巡视整改责任追究情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_THREE_TURNS, "纪检机构转职能、转方式、转作风工作情况");
|
||||
SUBCATEGORY_DESCRIPTIONS.put(SUBCATEGORY_SYSTEM_CONSTRUCTION, "纪检体制改革制度建设情况");
|
||||
}
|
||||
|
||||
// 执行状态选项
|
||||
public static final String STATUS_IMPLEMENTED = "已落实";
|
||||
public static final String STATUS_PARTIALLY_IMPLEMENTED = "部分落实";
|
||||
public static final String STATUS_NOT_IMPLEMENTED = "未落实";
|
||||
public static final String STATUS_NOT_APPLICABLE = "不适用";
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("党风廉政建设", 10);
|
||||
KEYWORD_WEIGHTS.put("主体责任", 9);
|
||||
KEYWORD_WEIGHTS.put("监督责任", 9);
|
||||
KEYWORD_WEIGHTS.put("中央八项规定", 8);
|
||||
KEYWORD_WEIGHTS.put("廉洁从业", 8);
|
||||
KEYWORD_WEIGHTS.put("巡视整改", 7);
|
||||
KEYWORD_WEIGHTS.put("纪律检查", 7);
|
||||
KEYWORD_WEIGHTS.put("廉政谈话", 6);
|
||||
KEYWORD_WEIGHTS.put("一案双查", 6);
|
||||
KEYWORD_WEIGHTS.put("四风", 5);
|
||||
KEYWORD_WEIGHTS.put("腐败", 5);
|
||||
}
|
||||
|
||||
// 工作底稿关键词
|
||||
public static final Map<String, String> WORK_PAPER_KEYWORDS = new HashMap<>();
|
||||
static {
|
||||
WORK_PAPER_KEYWORDS.put("会议纪要", "党委会议纪要、党风廉政建设专题会议纪要");
|
||||
WORK_PAPER_KEYWORDS.put("责任清单", "党风廉政建设责任清单、主体责任清单");
|
||||
WORK_PAPER_KEYWORDS.put("检查报告", "党风廉政建设检查报告、巡视整改报告");
|
||||
WORK_PAPER_KEYWORDS.put("谈话记录", "廉政谈话记录、提醒谈话记录");
|
||||
WORK_PAPER_KEYWORDS.put("制度文件", "党风廉政建设制度、廉洁从业规定");
|
||||
WORK_PAPER_KEYWORDS.put("审批文件", "津补贴审批文件、车辆配备审批");
|
||||
WORK_PAPER_KEYWORDS.put("举报材料", "信访举报材料、问题线索登记");
|
||||
}
|
||||
|
||||
/**
|
||||
* 对廉政情况数据进行排序(提供给ServiceImpl使用)
|
||||
*/
|
||||
public static void sortPartyConductData(JSONArray data) {
|
||||
if (data == null || data.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 转换为List进行排序
|
||||
List<JSONObject> dataList = new ArrayList<>();
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
dataList.add(data.getJSONObject(i));
|
||||
}
|
||||
|
||||
// 排序:优先按固定顺序,其次按类别
|
||||
dataList.sort(AuditContent10PartyConductConstants::compareJSONObject);
|
||||
|
||||
// 清空原数组并添加排序后的数据
|
||||
data.clear();
|
||||
data.addAll(dataList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较两个JSON对象的排序
|
||||
*/
|
||||
public static int compareJSONObject(JSONObject o1, JSONObject o2) {
|
||||
String content1 = o1.getString("content");
|
||||
String content2 = o2.getString("content");
|
||||
|
||||
// 1. 按固定顺序排序
|
||||
int index1 = getContentFixedOrderIndex(content1);
|
||||
int index2 = getContentFixedOrderIndex(content2);
|
||||
|
||||
if (index1 != index2) {
|
||||
return Integer.compare(index1, index2);
|
||||
}
|
||||
|
||||
// 2. 如果都不在固定顺序中,按类别排序
|
||||
return compareByCategory(o1, o2);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按照大类、子类、小类排序
|
||||
*/
|
||||
public static int compareByCategory(JSONObject o1, JSONObject o2) {
|
||||
// 清理子类字符串用于比较
|
||||
String cleanSubCategory1 = cleanSubCategory(o1.getString("subCategory"));
|
||||
String cleanSubCategory2 = cleanSubCategory(o2.getString("subCategory"));
|
||||
|
||||
// 1. 按大类排序
|
||||
String category1 = o1.getString("category");
|
||||
String category2 = o2.getString("category");
|
||||
|
||||
int categoryIndex1 = CATEGORY_ORDER.indexOf(category1);
|
||||
int categoryIndex2 = CATEGORY_ORDER.indexOf(category2);
|
||||
|
||||
if (categoryIndex1 != categoryIndex2) {
|
||||
return Integer.compare(categoryIndex1, categoryIndex2);
|
||||
}
|
||||
|
||||
// 2. 按子类排序
|
||||
String subCategory1 = o1.getString("subCategory");
|
||||
String subCategory2 = o2.getString("subCategory");
|
||||
|
||||
List<String> subCategories = CATEGORY_SUBCATEGORY_MAP.get(category1);
|
||||
if (subCategories != null) {
|
||||
int subCategoryIndex1 = subCategories.indexOf(subCategory1);
|
||||
int subCategoryIndex2 = subCategories.indexOf(subCategory2);
|
||||
|
||||
if (subCategoryIndex1 != subCategoryIndex2) {
|
||||
return Integer.compare(subCategoryIndex1, subCategoryIndex2);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 按小类排序
|
||||
String detailCategory1 = o1.getString("detailCategory");
|
||||
String detailCategory2 = o2.getString("detailCategory");
|
||||
|
||||
List<String> detailCategories = SUBCATEGORY_DETAIL_MAP.get(subCategory1);
|
||||
if (detailCategories != null) {
|
||||
int detailCategoryIndex1 = detailCategories.indexOf(detailCategory1);
|
||||
int detailCategoryIndex2 = detailCategories.indexOf(detailCategory2);
|
||||
|
||||
if (detailCategoryIndex1 != detailCategoryIndex2) {
|
||||
return Integer.compare(detailCategoryIndex1, detailCategoryIndex2);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 如果小类也相同,按内容排序
|
||||
String content1 = o1.getString("content");
|
||||
String content2 = o2.getString("content");
|
||||
return content1.compareTo(content2);
|
||||
}
|
||||
|
||||
private static String cleanSubCategory(String subCategory) {
|
||||
if (subCategory == null) return "";
|
||||
if (subCategory.contains(" - ")) {
|
||||
return subCategory.split(" - ")[0].trim();
|
||||
}
|
||||
return subCategory;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定子类的示例数据JSON字符串
|
||||
*/
|
||||
public static String getExampleDataJsonString(String subCategory) {
|
||||
JSONArray exampleData = getExampleDataBySubCategory(subCategory);
|
||||
if (exampleData == null || exampleData.isEmpty()) {
|
||||
return "[]";
|
||||
}
|
||||
|
||||
// 直接使用FastJSON的序列化,确保正确转义即可
|
||||
return exampleData.toJSONString();
|
||||
}
|
||||
|
||||
private AuditContent10PartyConductConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 审计内容11-历史审计问题整改常量类
|
||||
*/
|
||||
public class AuditContent11HistoryConstants {
|
||||
|
||||
// 审计类型分类
|
||||
public static final String AUDIT_TYPE_INTERNAL = "内部审计";
|
||||
public static final String AUDIT_TYPE_EXTERNAL = "外部审计";
|
||||
public static final String AUDIT_TYPE_SPECIAL = "专项审计";
|
||||
public static final String AUDIT_TYPE_ECONOMIC = "经济责任审计";
|
||||
|
||||
// 整改状态
|
||||
public static final String STATUS_COMPLETED = "已完成";
|
||||
public static final String STATUS_IN_PROGRESS = "整改中";
|
||||
public static final String STATUS_NOT_STARTED = "未整改";
|
||||
public static final String STATUS_PARTIAL = "部分整改";
|
||||
|
||||
// 审计重点分类
|
||||
public static final String FOCUS_SYSTEM_MECHANISM = "制度机制建立情况";
|
||||
public static final String FOCUS_HISTORICAL_ISSUES = "历史遗留问题处理";
|
||||
public static final String FOCUS_RECTIFICATION_EFFECT = "整改数量及效果";
|
||||
public static final String FOCUS_SYSTEM_IMPROVEMENT = "制度完善情况";
|
||||
public static final String FOCUS_SELF_RECTIFICATION = "自行发现整改情况";
|
||||
|
||||
// 审计方法关键词
|
||||
public static final String METHOD_REVIEW_REPORT = "审阅审计报告";
|
||||
public static final String METHOD_REVIEW_RECTIFICATION = "审阅整改报告";
|
||||
public static final String METHOD_VERIFY_RECTIFICATION = "核实整改情况";
|
||||
public static final String METHOD_INTERVIEW = "个别访谈";
|
||||
public static final String METHOD_REVIEW_DOCS = "查阅相关资料";
|
||||
|
||||
// 分类描述
|
||||
public static final Map<String, String> FOCUS_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
FOCUS_DESCRIPTIONS.put(FOCUS_SYSTEM_MECHANISM, "是否有处理历史遗留问题的制度机制");
|
||||
FOCUS_DESCRIPTIONS.put(FOCUS_HISTORICAL_ISSUES, "任期内是否有处理非任期的历史遗留问题");
|
||||
FOCUS_DESCRIPTIONS.put(FOCUS_RECTIFICATION_EFFECT, "对历次审计检查发现的问题整改的数量及效果");
|
||||
FOCUS_DESCRIPTIONS.put(FOCUS_SYSTEM_IMPROVEMENT, "历次审计检查发现问题后是否有完善相关制度");
|
||||
FOCUS_DESCRIPTIONS.put(FOCUS_SELF_RECTIFICATION, "历次审计没有发现的问题是否自行发现并整改完善");
|
||||
}
|
||||
|
||||
// 审计方法描述
|
||||
public static final Map<String, String> METHOD_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
METHOD_DESCRIPTIONS.put(METHOD_REVIEW_REPORT, "审阅任职期间审计报告");
|
||||
METHOD_DESCRIPTIONS.put(METHOD_REVIEW_RECTIFICATION, "审阅整改情况报告");
|
||||
METHOD_DESCRIPTIONS.put(METHOD_VERIFY_RECTIFICATION, "对提出问题整改情况逐一进行核实");
|
||||
METHOD_DESCRIPTIONS.put(METHOD_INTERVIEW, "通过个别访谈了解情况");
|
||||
METHOD_DESCRIPTIONS.put(METHOD_REVIEW_DOCS, "查阅相关资料了解单位存在的历年遗留问题和处理情况");
|
||||
}
|
||||
|
||||
// 关键词权重(用于知识检索排序)
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("审计发现问题", 10);
|
||||
KEYWORD_WEIGHTS.put("问题整改", 9);
|
||||
KEYWORD_WEIGHTS.put("整改情况", 9);
|
||||
KEYWORD_WEIGHTS.put("整改报告", 8);
|
||||
KEYWORD_WEIGHTS.put("审计报告", 8);
|
||||
KEYWORD_WEIGHTS.put("历史遗留问题", 9);
|
||||
KEYWORD_WEIGHTS.put("制度机制", 7);
|
||||
KEYWORD_WEIGHTS.put("整改措施", 7);
|
||||
KEYWORD_WEIGHTS.put("整改责任人", 6);
|
||||
KEYWORD_WEIGHTS.put("整改完成", 6);
|
||||
KEYWORD_WEIGHTS.put("审计年度", 5);
|
||||
KEYWORD_WEIGHTS.put("审计类型", 5);
|
||||
KEYWORD_WEIGHTS.put("经济责任审计", 6);
|
||||
}
|
||||
|
||||
// 整改要求常见关键词
|
||||
public static final String[] RECTIFICATION_REQUIREMENT_KEYWORDS = {
|
||||
"限期整改", "建立机制", "完善制度", "责任追究", "资金追回",
|
||||
"规范管理", "加强内控", "落实责任", "建立台账", "跟踪检查"
|
||||
};
|
||||
|
||||
// 整改措施常见关键词
|
||||
public static final String[] RECTIFICATION_MEASURES_KEYWORDS = {
|
||||
"修订制度", "完善流程", "加强培训", "调整人员", "资金归还",
|
||||
"建立台账", "完善手续", "强化监督", "责任追究", "定期检查"
|
||||
};
|
||||
|
||||
private AuditContent11HistoryConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 八项规定制度常量类
|
||||
*/
|
||||
public class AuditContent1EightRegConstants {
|
||||
|
||||
// 八项规定分类定义
|
||||
public static final String CATEGORY_RESEARCH = "改进调查研究";
|
||||
public static final String CATEGORY_MEETINGS = "精简会议活动";
|
||||
public static final String CATEGORY_DOCUMENTS = "精简文件简报";
|
||||
public static final String CATEGORY_VISITS = "规范出访活动";
|
||||
public static final String CATEGORY_GUARD_WORK = "改进警卫工作";
|
||||
public static final String CATEGORY_NEWS_REPORT = "改进新闻报道";
|
||||
public static final String CATEGORY_PUBLICATIONS = "严格文稿发表";
|
||||
public static final String CATEGORY_ECONOMY = "厉行勤俭节约";
|
||||
|
||||
// 分类描述
|
||||
public static final Map<String, String> CATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_RESEARCH, "改进调查研究相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MEETINGS, "精简会议活动相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_DOCUMENTS, "精简文件简报相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_VISITS, "规范出访活动相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_GUARD_WORK, "改进警卫工作相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_NEWS_REPORT, "改进新闻报道相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_PUBLICATIONS, "严格文稿发表相关要求");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_ECONOMY, "厉行勤俭节约相关要求");
|
||||
}
|
||||
|
||||
// 政策内容 - 中共中央八项规定
|
||||
public static final Map<String, String> POLICY_CONTENTS = new HashMap<>();
|
||||
static {
|
||||
POLICY_CONTENTS.put(CATEGORY_RESEARCH,
|
||||
"中央政治局全体同志要改进调查研究,到基层调研要深入了解真实情况,总结经验、研究问题、解决困难、指导工作,向群众学习、向实践学习,多同群众座谈,多同干部谈心,多商量讨论,多解剖典型。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_MEETINGS,
|
||||
"要精简会议活动,切实改进会风,严格控制以中央名义召开的各类全国性会议和举行的重大活动,不开泛泛部署工作和提要求的会,未经中央批准一律不出席各类剪彩、奠基活动和庆祝会、纪念会、表彰会、博览会、研讨会及各类论坛;提高会议实效,开短会、讲短话,力戒空话、套话。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_DOCUMENTS,
|
||||
"要精简文件简报,切实改进文风,没有实质内容、可发可不发的文件、简报一律不发。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_VISITS,
|
||||
"要规范出访活动,从外交工作大局需要出发合理安排出访活动,严格控制出访随行人员,严格按照规定乘坐交通工具,一般不安排中资机构、华侨华人、留学生代表等到机场迎送。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_GUARD_WORK,
|
||||
"要改进警卫工作,坚持有利于联系群众的原则,减少交通管制,一般情况下不得封路、不清场闭馆。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_NEWS_REPORT,
|
||||
"要改进新闻报道,中央政治局同志出席会议和活动应根据工作需要、新闻价值、社会效果决定是否报道,进一步压缩报道的数量、字数、时长。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_PUBLICATIONS,
|
||||
"要严格文稿发表,除中央统一安排外,个人不公开出版著作、讲话单行本,不发贺信、贺电,不题词、题字。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_ECONOMY,
|
||||
"要厉行勤俭节约,严格遵守廉洁从政有关规定,严格执行住房、车辆配备等有关工作和生活待遇的规定。");
|
||||
}
|
||||
|
||||
// 实施细则内容 - 中央八项规定实施细则
|
||||
public static final Map<String, String> IMPLEMENTATION_DETAILS = new HashMap<>();
|
||||
static {
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_RESEARCH,
|
||||
"注重实际效果。安排中央政治局委员到基层调研要紧紧围绕调研主题,实事求是地安排考查内容,为领导同志深入基层、深入群众、深入实际创造条件。\n" +
|
||||
"减少陪同人员。中央政治局常委到地方考察调研,陪同的中央和国家机关有关部门负责同志不超过5人,省(自治区、直辖市)陪同的负责同志不超过3人。\n" +
|
||||
"简化接待工作。中央政治局委员在地方考察调研期间,不张贴悬挂横幅标语,不安排群众迎送,不铺设迎宾地毯,不摆放花草,不组织专场文艺表演。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_MEETINGS,
|
||||
"减少会议活动。各地区各部门要本着务实高效的原则,严格清理、切实减少各类会议活动,能不开的坚决不开,可以合并的坚决合并。\n" +
|
||||
"控制会议活动规模和时间。严格控制各类会议活动规模,减少参加人员。各部门召开的全国性会议,只安排与会议内容密切相关的部门参加,人数不超过300人,时间不超过2天。\n" +
|
||||
"严格控制会议活动经费。各地区各部门举办会议活动,要严格执行有关规定,厉行节约,反对铺张浪费。严禁提高会议用餐、住宿标准,严禁组织高消费娱乐、健身活动。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_DOCUMENTS,
|
||||
"减少各类文件简报。凡国家法律法规和党内法规已作出明确规定的,一律不再制发文件。没有实质内容、可发可不发的文件简报,一律不发。\n" +
|
||||
"提高文件简报的质量和时效。各地区各部门应严格按照中央办公厅、国务院办公厅的有关要求,对文件和简报资料的报送程序和格式进行规范。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_VISITS,
|
||||
"合理安排出访。围绕外交工作需要合理制定年度出访总体方案,中央政治局委员每人每年出访不超过1次,时间不超过10天。\n" +
|
||||
"控制随行人员。严格根据工作需要安排陪同人员和工作人员。\n" +
|
||||
"规范乘机安排。严格按照规定乘坐交通工具。\n" +
|
||||
"简化机场迎送和接待工作。中央政治局委员出访,各有关驻外使领馆不安排中资机构、华侨华人和留学生代表到机场迎送。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_GUARD_WORK,
|
||||
"改进警卫工作。中央政治局委员的警卫工作,要坚持有利于联系群众的原则,实行内紧外松的警卫方式,减少扰民。中央政治局委员出行时要减少交通管制,不得封路。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_NEWS_REPORT,
|
||||
"简化中央政治局委员出席会议活动新闻报道。要根据工作需要、新闻价值、社会效果决定是否报道。出席一般性会议和活动不作报道。\n" +
|
||||
"精简全国性会议活动新闻报道。经中央批准举办的全国性会议活动,除中共中央总书记外,中央政治局常委出席的,文字稿不超过1000字。\n" +
|
||||
"规范中央政治局委员考察调研活动新闻报道。考察调研活动新闻报道要多反映群众关心的实质性内容,更好贴近实际、贴近生活、贴近群众。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_PUBLICATIONS,
|
||||
"规范其他新闻报道。经中央批准,中央政治局常委和从中央政治局常委职务上退下来的同志出版著作等作品,由新华社播发简短出版消息。");
|
||||
|
||||
IMPLEMENTATION_DETAILS.put(CATEGORY_ECONOMY,
|
||||
"严格控制会议活动经费。各地区各部门举办会议活动,要严格执行有关规定,厉行节约,反对铺张浪费。\n" +
|
||||
"简化机场迎送和接待工作。驻外使领馆和其他驻外机构一律不得向代表团赠送礼品,外方所赠礼品应严格按国家有关规定处理。");
|
||||
}
|
||||
|
||||
|
||||
// 审计建议内容 - 新增的审计建议
|
||||
public static final Map<String, String> AUDIT_SUGGESTIONS = new HashMap<>();
|
||||
static {
|
||||
AUDIT_SUGGESTIONS.put(CATEGORY_RESEARCH,
|
||||
"如审查后认定:确为缺少系统性规范和调研记录。建议:\n" +
|
||||
"1.补足制度短板,系统性规范公司层面调研工作管理要求;\n" +
|
||||
"2.强化过程管理与材料归档,确保调研活动可视、可查、可评,切实发挥服务决策、解决问题的实效。");
|
||||
|
||||
AUDIT_SUGGESTIONS.put(CATEGORY_MEETINGS,
|
||||
"如审查确认被审计单位存在未严格遵循《中央八项规定》中关于'精简会议活动'的规定,可提出审计建议:\n" +
|
||||
"建议减少不必要的会议数量,提高会议质量和效率,避免因频繁开会而造成人力资源浪费。在召开会议前,应明确会议的具体目的和议题,避免无目标、无计划的会议。");
|
||||
|
||||
AUDIT_SUGGESTIONS.put(CATEGORY_VISITS,
|
||||
"如审查确认被审计单位存在未严格遵循《中央八项规定》中关于'轻车简从''不得扰民'的要求,可提出审计建议:\n" +
|
||||
"切实规范领导人员公务出行管理,严格贯彻落实'轻车简从''不得扰民'等要求。明确规定考察线路须事前报备、严格控制随员及车辆规模、严禁超标接待与礼仪迎送、严禁使用警车等非必要车辆疏导清场。责立健全常态化监管与问责机制,确保有关规定执行到位,对违规行为严肃追责。");
|
||||
|
||||
AUDIT_SUGGESTIONS.put(CATEGORY_GUARD_WORK,
|
||||
"如审查确认被审计单位存在未严格遵循《中央八项规定》中关于'轻车简从''不得扰民'的要求,可提出审计建议:\n" +
|
||||
"切实规范领导人员公务出行管理,严格贯彻落实'轻车简从''不得扰民'等要求。明确规定考察线路须事前报备、严格控制随员及车辆规模、严禁超标接待与礼仪迎送、严禁使用警车等非必要车辆疏导清场。责立健全常态化监管与问责机制,确保有关规定执行到位,对违规行为严肃追责。");
|
||||
|
||||
AUDIT_SUGGESTIONS.put(CATEGORY_ECONOMY,
|
||||
"如审查后认定:确为会议活动经费超支。可提出审计建议:\n" +
|
||||
"强化会议活动经费预算控制,严查支出明细,杜绝超标准住宿餐饮、高消费活动、豪华布置及纪念品发放。\n\n" +
|
||||
"其他建议:\n" +
|
||||
"1.各直属企业定期对内部控制情况开展实质性评价,杜绝形式主义。\n" +
|
||||
"2.上级公司强化对下属企业的监督与检查,保障相关制度有效执行。");
|
||||
}
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("八项规定", 10);
|
||||
KEYWORD_WEIGHTS.put("调查研究", 9);
|
||||
KEYWORD_WEIGHTS.put("会议活动", 9);
|
||||
KEYWORD_WEIGHTS.put("文件简报", 9);
|
||||
KEYWORD_WEIGHTS.put("出访活动", 9);
|
||||
KEYWORD_WEIGHTS.put("警卫工作", 9);
|
||||
KEYWORD_WEIGHTS.put("新闻报道", 9);
|
||||
KEYWORD_WEIGHTS.put("文稿发表", 9);
|
||||
KEYWORD_WEIGHTS.put("勤俭节约", 9);
|
||||
KEYWORD_WEIGHTS.put("实施细则", 8);
|
||||
KEYWORD_WEIGHTS.put("接待标准", 7);
|
||||
KEYWORD_WEIGHTS.put("经费管理", 7);
|
||||
}
|
||||
|
||||
private AuditContent1EightRegConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 支出情况表常量类
|
||||
*/
|
||||
public class AuditContent1ExpenseConstants {
|
||||
|
||||
// 支出类型分类
|
||||
public static final String EXPENSE_TYPE_RECEPTION = "公务接待";
|
||||
public static final String EXPENSE_TYPE_OVERSEAS = "出国";
|
||||
public static final String EXPENSE_TYPE_VEHICLE = "公车运行维护";
|
||||
public static final String EXPENSE_TYPE_MEETING = "会议培训费";
|
||||
|
||||
// 年度范围 - 根据知识库动态确定,这里提供默认起始年份
|
||||
public static final int DEFAULT_START_YEAR = 2020;
|
||||
public static final int DEFAULT_END_YEAR = 2023;
|
||||
|
||||
// 分类描述
|
||||
public static final Map<String, String> EXPENSE_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
EXPENSE_DESCRIPTIONS.put(EXPENSE_TYPE_RECEPTION, "公务接待费用支出情况");
|
||||
EXPENSE_DESCRIPTIONS.put(EXPENSE_TYPE_OVERSEAS, "出国(出境)费用支出情况");
|
||||
EXPENSE_DESCRIPTIONS.put(EXPENSE_TYPE_VEHICLE, "公车运行维护费用支出情况");
|
||||
EXPENSE_DESCRIPTIONS.put(EXPENSE_TYPE_MEETING, "会议、培训费用支出情况");
|
||||
}
|
||||
|
||||
// 数据格式要求 - 简化版
|
||||
public static final String DATA_FORMAT_REQUIREMENT =
|
||||
"请严格按照以下JSON格式生成数据,每类支出每个年度至少1条记录,总共至少16条记录:\n" +
|
||||
"[\n" +
|
||||
" {\n" +
|
||||
" \"expenseType\": \"公务接待/出国/公车运行维护/会议培训费\",\n" +
|
||||
" \"year\": \"具体年份(根据知识库中的连续四个完整年度)\",\n" +
|
||||
" \"finalStatementAmount\": \"决算报表数\",\n" +
|
||||
" \"initialBudgetAmount\": \"年初预算数\",\n" +
|
||||
" \"changePercentage\": \"增减百分比\",\n" +
|
||||
" \"budgetRatio\": \"占年初预算比例\",\n" +
|
||||
" \"remark\": \"备注信息\",\n" +
|
||||
" \"dataSource\": \"数据来源文件\",\n" +
|
||||
// " \"workPaperIndex\": [\"FileId1\", \"FileId2\"]\n" +
|
||||
" \"workPaperIndex\": [\"实际存在的完整文件名1||FileUrl1\", \"实际存在的完整文件名2||FileUrl2\"]\n" +
|
||||
" }\n" +
|
||||
"]";
|
||||
|
||||
// 关键词权重 - 增强工程类排除
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
// 高优先级:直接支出关键词
|
||||
KEYWORD_WEIGHTS.put("公务接待", 15);
|
||||
KEYWORD_WEIGHTS.put("出国", 15);
|
||||
KEYWORD_WEIGHTS.put("公车运行维护", 15);
|
||||
KEYWORD_WEIGHTS.put("会议培训费", 15);
|
||||
KEYWORD_WEIGHTS.put("三公经费", 14);
|
||||
KEYWORD_WEIGHTS.put("接待费", 13);
|
||||
KEYWORD_WEIGHTS.put("差旅费", 12);
|
||||
KEYWORD_WEIGHTS.put("车辆费", 12);
|
||||
KEYWORD_WEIGHTS.put("会务费", 12);
|
||||
KEYWORD_WEIGHTS.put("培训费", 12);
|
||||
|
||||
// 中优先级:财务文档
|
||||
KEYWORD_WEIGHTS.put("决算报表", 10);
|
||||
KEYWORD_WEIGHTS.put("预算报表", 10);
|
||||
KEYWORD_WEIGHTS.put("财务报表", 9);
|
||||
KEYWORD_WEIGHTS.put("部门决算", 9);
|
||||
KEYWORD_WEIGHTS.put("部门预算", 9);
|
||||
KEYWORD_WEIGHTS.put("预算执行", 8);
|
||||
|
||||
// 年份关键词(中等优先级,用于识别年度)
|
||||
KEYWORD_WEIGHTS.put("年度", 7);
|
||||
KEYWORD_WEIGHTS.put("年报表", 7);
|
||||
KEYWORD_WEIGHTS.put("年度决算", 8);
|
||||
KEYWORD_WEIGHTS.put("年度预算", 8);
|
||||
|
||||
// 低优先级:通用财务
|
||||
KEYWORD_WEIGHTS.put("支出", 7);
|
||||
KEYWORD_WEIGHTS.put("费用", 6);
|
||||
KEYWORD_WEIGHTS.put("年度报告", 6);
|
||||
|
||||
// 排除工程类(负权重)
|
||||
KEYWORD_WEIGHTS.put("工程造价", -20);
|
||||
KEYWORD_WEIGHTS.put("概预算", -20);
|
||||
KEYWORD_WEIGHTS.put("工程款", -15);
|
||||
KEYWORD_WEIGHTS.put("施工", -15);
|
||||
KEYWORD_WEIGHTS.put("项目投资", -15);
|
||||
KEYWORD_WEIGHTS.put("基建", -15);
|
||||
}
|
||||
|
||||
// 需要排除的工程类关键词
|
||||
public static final String[] ENGINEERING_EXCLUDE_KEYWORDS = {
|
||||
"工程造价", "概预算", "工程概算", "工程预算", "工程结算",
|
||||
"施工合同", "工程款", "项目投资", "基建", "工程项目"
|
||||
};
|
||||
|
||||
// 年份正则表达式,用于从知识库中提取年份
|
||||
public static final String YEAR_PATTERN = "20\\d{2}";
|
||||
|
||||
// 最近几年范围(用于查询构建)
|
||||
public static final int RECENT_YEARS_COUNT = 4;
|
||||
|
||||
private AuditContent1ExpenseConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 领导班子名单常量类
|
||||
*/
|
||||
public class AuditContent1LeaderListConstants {
|
||||
|
||||
// 领导职位分类
|
||||
public static final String CATEGORY_PARTY_LEADERS = "党组织领导班子";
|
||||
public static final String CATEGORY_ADMIN_LEADERS = "行政领导班子";
|
||||
public static final String CATEGORY_DEPARTMENT_LEADERS = "部门负责人";
|
||||
|
||||
// 分类描述
|
||||
public static final Map<String, String> CATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_PARTY_LEADERS, "党组织领导班子成员信息");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_ADMIN_LEADERS, "行政领导班子成员信息");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_DEPARTMENT_LEADERS, "各部门负责人信息");
|
||||
}
|
||||
|
||||
// 数据格式要求
|
||||
public static final String DATA_FORMAT_REQUIREMENT =
|
||||
"每条记录应包含以下字段:\n" +
|
||||
"- unit:单位名称\n" +
|
||||
"- name:姓名\n" +
|
||||
"- department:所在部门\n" +
|
||||
"- partyPosition:党内职务\n" +
|
||||
"- adminPosition:行政职务\n" +
|
||||
"- tenurePeriod:任职期间(格式:YYYY.MM-YYYY.MM)\n" +
|
||||
"- mainResponsibilities:主要工作责任\n" +
|
||||
"- remark:备注信息\n" +
|
||||
// "- workPaperIndex:[相关文件FileId]";
|
||||
"- workPaperIndex:[\"实际存在的完整文件名1||FileUrl1\"]";
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("领导班子", 10);
|
||||
KEYWORD_WEIGHTS.put("领导成员", 9);
|
||||
KEYWORD_WEIGHTS.put("任职", 8);
|
||||
KEYWORD_WEIGHTS.put("职务", 8);
|
||||
KEYWORD_WEIGHTS.put("职责", 7);
|
||||
KEYWORD_WEIGHTS.put("分工", 7);
|
||||
KEYWORD_WEIGHTS.put("党组", 9);
|
||||
KEYWORD_WEIGHTS.put("党委", 9);
|
||||
KEYWORD_WEIGHTS.put("支部书记", 8);
|
||||
KEYWORD_WEIGHTS.put("局长", 8);
|
||||
KEYWORD_WEIGHTS.put("处长", 7);
|
||||
KEYWORD_WEIGHTS.put("科长", 7);
|
||||
}
|
||||
|
||||
private AuditContent1LeaderListConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容2-单位发展战略执行常量类
|
||||
* 基于五大发展理念优化为5个分类
|
||||
*/
|
||||
public class AuditContent2StrategyConstants {
|
||||
|
||||
// 分类定义 - 基于五大发展理念优化为5个分类
|
||||
public static final String CATEGORY_GOVERNANCE_REFORM = "法人治理与改革创新";
|
||||
public static final String CATEGORY_DEVELOPMENT_STRATEGY = "发展规划与协调推进";
|
||||
public static final String CATEGORY_RISK_PREVENTION = "风险防控与绿色发展";
|
||||
public static final String CATEGORY_SOCIAL_ENVIRONMENTAL = "社会责任与开放共享";
|
||||
public static final String CATEGORY_PERFORMANCE_ASSESSMENT = "绩效考核与创新发展";
|
||||
|
||||
// 分类顺序
|
||||
public static final List<String> CATEGORY_ORDER = Arrays.asList(
|
||||
CATEGORY_GOVERNANCE_REFORM,
|
||||
CATEGORY_DEVELOPMENT_STRATEGY,
|
||||
CATEGORY_RISK_PREVENTION,
|
||||
CATEGORY_SOCIAL_ENVIRONMENTAL,
|
||||
CATEGORY_PERFORMANCE_ASSESSMENT
|
||||
);
|
||||
|
||||
// 分类描述(对应五大发展理念)
|
||||
public static final Map<String, String> CATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_GOVERNANCE_REFORM,
|
||||
"公司法人治理结构、薪酬制度改革、国有资产管理体制等改革创新情况");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_DEVELOPMENT_STRATEGY,
|
||||
"单位重要发展规划和政策措施的制定、执行和效果等协调发展情况");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_RISK_PREVENTION,
|
||||
"金融业务风险、债务风险防控、污染防治等绿色发展情况");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_SOCIAL_ENVIRONMENTAL,
|
||||
"精准扶贫、环境保护等社会责任履行和开放共享情况");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_PERFORMANCE_ASSESSMENT,
|
||||
"各项考核指标完成情况的真实性、准确性等创新发展情况");
|
||||
}
|
||||
|
||||
// 分类与五大发展理念对应关系
|
||||
public static final Map<String, String> CATEGORY_DEVELOPMENT_CONCEPT = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DEVELOPMENT_CONCEPT.put(CATEGORY_GOVERNANCE_REFORM, "创新");
|
||||
CATEGORY_DEVELOPMENT_CONCEPT.put(CATEGORY_DEVELOPMENT_STRATEGY, "协调");
|
||||
CATEGORY_DEVELOPMENT_CONCEPT.put(CATEGORY_RISK_PREVENTION, "绿色");
|
||||
CATEGORY_DEVELOPMENT_CONCEPT.put(CATEGORY_SOCIAL_ENVIRONMENTAL, "开放共享");
|
||||
CATEGORY_DEVELOPMENT_CONCEPT.put(CATEGORY_PERFORMANCE_ASSESSMENT, "创新");
|
||||
}
|
||||
|
||||
// 分类查询关键词
|
||||
public static final Map<String, List<String>> CATEGORY_QUERIES = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_QUERIES.put(CATEGORY_GOVERNANCE_REFORM,
|
||||
Arrays.asList("法人治理 薪酬改革 国有资产管理", "改革创新 治理结构 董事会"));
|
||||
CATEGORY_QUERIES.put(CATEGORY_DEVELOPMENT_STRATEGY,
|
||||
Arrays.asList("混合所有制 剥离办社会职能 改革措施", "协调发展 改革方案 政策落实"));
|
||||
CATEGORY_QUERIES.put(CATEGORY_RISK_PREVENTION,
|
||||
Arrays.asList("发展规划 金融风险 债务风险", "绿色发展 风险防控 资产负债率"));
|
||||
CATEGORY_QUERIES.put(CATEGORY_SOCIAL_ENVIRONMENTAL,
|
||||
Arrays.asList("精准扶贫 污染防治 环境保护", "开放共享 社会责任 定点扶贫"));
|
||||
CATEGORY_QUERIES.put(CATEGORY_PERFORMANCE_ASSESSMENT,
|
||||
Arrays.asList("考核指标 经营业绩 目标责任", "创新发展 数据核实 完成情况"));
|
||||
}
|
||||
|
||||
// 完整的审计框架(原Excel内容)
|
||||
public static final String AUDIT_FRAMEWORK =
|
||||
"审计内容框架:\n" +
|
||||
"1. 公司法人治理结构建立健全情况。是否贯彻落实将党组织研究讨论作为董事会、经理层决策重大问题前置程序的要求;是否加强董事会建设、有效落实董事会职权;各治理主体是否职责明确、落实到位。\n" +
|
||||
"2. 薪酬制度改革情况。薪酬分配差异化改革过程中是否存在进展不平衡、政策不配套、任务不协调等问题;有无超工资总额列支工资性支出;企业领导人员在核定的年度薪酬之外领取报酬,是否严格规范履职待遇、业务支出,有无将公款用于个人支出等问题。\n" +
|
||||
"3. 完善国有资产管理体制方面。有关部门是否建立健全监管权力清单和责任清单,是否存在越位、缺位、不到位等问题;国有资本投资、运营公司改革试点工作的情况,有无要求方案部署不够明确、资本授权及经营资质受限、相关企业未制定时间表路线图、未与兼并重组等改革试点任务协同推进、资本运营偏离改革方向、战略性前瞻性产业投资不增反降、党政机关和事业单位所属企业的国有资本纳入经营性国有资产集中统一监管体系推进迟缓、国有资本经营预算管理不到位等问题。\n" +
|
||||
"4. 发展混合所有制经济方面。是否存在\"混而不改\",改革流于形式、效果不佳的问题;清产核资、评估定价、转让交易、登记确权等相关政策、审批和实施程序是否合法合规,在国有资产和产权转让过程中是否存在国有资产流失等问题;员工持股试点推进过程中存在的政策性障碍。此外,还要从国有企业改革工作总休上关注,混合所有制改革作为国有企业改革的重要突破口的作用发挥情况。\n" +
|
||||
"5. 剥离办社会职能和解决历史遗留问题方面。国有企业有无制定时间表路线图,是否按时限完成国有企业职工家属区\"三供一业\"分离移交,剥离国有企业办医疗、教育等公共服务机构,对国有企业退休人员实行社会化管理,推进厂办大集体改革等问题,遇到什么困难、需要什么政策和多少资金支持,等等;相关部门的配套政策是否建立健全。\n" +
|
||||
"6. 国有企业改革措施是否制定?制定的措施是否符合党中央、国务院、省市的相关文件规定和精神。\n" +
|
||||
"7. 企业年度工作报告中关于改革措施的落实情况,进度是否符合预期,是否违反整体改革措施计划。规划执行情况材料是否合规、完整。企业境外资产、投资管理办法和内控制度,及企业向国资委等有关部门报送的境外资产产权登记情况和境外资产财务报表数据等,是否合规、完整、符合企业实际情况。企业制定的公司发展规划,包括总规划和专项规划(如主业、国际化、金融、财务、人力资源、建设、生产、营销、科技、信息化、安全应急、企业文化等),是否符合企业整体实际情况,是否符合党中央、国务院、省市的相关文件规定和精神。公司发展规划滚动调整情况是否符合实际情况,是否为了减轻企业目标故意调整。公司发展规划中提及的制定依据,是否符合国家有关部门制定的行业产业发展规划等。\n" +
|
||||
"8. 金融业务风险。关注金融业务服务实体经济和主业发展情况,有无脱实向虚、通过金融产品将资金违规投向房地产、地方政府融资平台、产能过剩等限制或禁止领域的问题;关注企业开展境外金融衍生品情况,有无违规开展业务造成重大损失或损失风险等;关注银行、证券、保险、信托等金融子企业的资产管理规模及经营情况,风险管控机制是否健全,业务运营是否合规,有无信贷资金、金融资产造成重大损失的问题,有无金融产品逾期或违规展期、不良资产比率较高、风险与收益不匹配、本金偿付风险或违约风险大等问题;关注企业债券发行、委托理财、对外担保等金融业务开展中存在的突出问题,是否造成重大损失或损失风险等。\n" +
|
||||
"9. 债务风险。关注企业落实降杠杆减负债政策情况,是否存在企业资产负债率居高不下、超过警戒线或管控线甚至资不抵债,有无建立健全企业债务风险防控机制,发挥资产负债约束机制作用,债务结构是否合理,有无违规对不符合国家产业政策的企业实施债转股,有无违规通过\"名股实债\"等方式变相举债或形成重大隐性债务,以及虚假去杠杆等问题。\n" +
|
||||
"10. 精准扶贫政策落实情况。关注企业在精准扶贫相关政策落实、项目安排、资金使用等方面的推进情况,是否落实企业定点扶贫工作的任务要求,有无出台具体帮扶措施,履行帮扶责任定点扶贫的目标对象、工作举措、资金使用等是否精准;有无通过发展产业、对接市场、安置就业等多种方式开展精准扶贫行动;以中央企业贫困地区产业投资基金、贫困地区产业发展基金等为代表的央企产业扶贫基金出资额是否及时足额缴纳、有无大量资金闲置和项目运营效果不佳等问题。\n" +
|
||||
"11. 污染防治工作推进情况。企业贯彻落实生态环境保护和环境污染防治相关政策措施情况,重点是打蹴蓝天保卫战、打好碧水保卫战和推进净土保卫战等相关措施的落实情况。是否存在非法占地、违规改变土地使用条件、倒卖土地、土地闲置的问题;企业是否完成国家节能减排任务目标,有无不顾生态环境盲目决策和建设项目,造成重大环境污染和资源损毁等问题;有无违规偷排、漏排、超排废渣废液废气,瞒报、漏报检测数据,有无违规堆放、未按规定处理工业危险废弃物、危险化学品等问题;对所属企业发生的破坏生态环境情况,是否存在追责问责不到位等问题。企业是否建立能源消耗及污染物排放统计台账;是否按时定期将本企业节能减排汇总报表和总结分析报告报送有关部门,有无漏报、迟报、不按要求报送;重点类、关注类企业是否在总结分析报告中开展与同行业节能减排技术指标的对标和分析。\n" +
|
||||
"12. 对照国资委、财政部、工业和信息化部等与企业签订的年度经营业绩责任书、任期经营业绩责任书、中央单位定点扶贫工作责任书等,梳理企业承担的考核内容和指标。\n" +
|
||||
"13. 对于可以量化的审计事项,利用大数据分析方法,系统收集和整理各类考核指标信息,建立企业考核指标数据库,对照企业提供的财务或相关统计报表,检查企业完成情况。检查相关指标的原始数据、计算方法、计算过程,核实其真实性和准确性,对于依靠人工填报、设置调整系数、与以往年度相差较大或与考核值相差较小的数据,重点审计真实性、完整性、准确性。\n";
|
||||
|
||||
// 审计目标说明
|
||||
public static final String AUDIT_OBJECTIVE =
|
||||
"审计目标:检查被审计领导干部任职期间在" +
|
||||
"创新、协调、绿色、开放、共享五大发展理念指引下," +
|
||||
"合法合规制定本部门发展规划和发展思路," +
|
||||
"推动规划和政策措施实施的时间表、路线图及其执行效果。";
|
||||
|
||||
// 分类与审计框架片段的映射
|
||||
public static final Map<String, String> CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_GOVERNANCE_REFORM,
|
||||
"审计内容框架(法人治理与改革创新相关):\n" +
|
||||
"1. 公司法人治理结构建立健全情况。是否贯彻落实将党组织研究讨论作为董事会、经理层决策重大问题前置程序的要求;是否加强董事会建设、有效落实董事会职权;各治理主体是否职责明确、落实到位。\n" +
|
||||
"2. 薪酬制度改革情况。薪酬分配差异化改革过程中是否存在进展不平衡、政策不配套、任务不协调等问题;有无超工资总额列支工资性支出;企业领导人员在核定的年度薪酬之外领取报酬,是否严格规范履职待遇、业务支出,有无将公款用于个人支出等问题。\n" +
|
||||
"3. 完善国有资产管理体制方面。有关部门是否建立健全监管权力清单和责任清单,是否存在越位、缺位、不到位等问题;国有资本投资、运营公司改革试点工作的情况,有无要求方案部署不够明确、资本授权及经营资质受限、相关企业未制定时间表路线图、未与兼并重组等改革试点任务协同推进、资本运营偏离改革方向、战略性前瞻性产业投资不增反降、党政机关和事业单位所属企业的国有资本纳入经营性国有资产集中统一监管体系推进迟缓、国有资本经营预算管理不到位等问题。\n");
|
||||
|
||||
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_DEVELOPMENT_STRATEGY,
|
||||
"审计内容框架(发展规划与协调推进相关):\n" +
|
||||
"4. 发展混合所有制经济方面。是否存在\"混而不改\",改革流于形式、效果不佳的问题;清产核资、评估定价、转让交易、登记确权等相关政策、审批和实施程序是否合法合规,在国有资产和产权转让过程中是否存在国有资产流失等问题;员工持股试点推进过程中存在的政策性障碍。此外,还要从国有企业改革工作总休上关注,混合所有制改革作为国有企业改革的重要突破口的作用发挥情况。\n" +
|
||||
"5. 剥离办社会职能和解决历史遗留问题方面。国有企业有无制定时间表路线图,是否按时限完成国有企业职工家属区\"三供一业\"分离移交,剥离国有企业办医疗、教育等公共服务机构,对国有企业退休人员实行社会化管理,推进厂办大集体改革等问题,遇到什么困难、需要什么政策和多少资金支持,等等;相关部门的配套政策是否建立健全。\n" +
|
||||
"6. 国有企业改革措施是否制定?制定的措施是否符合党中央、国务院、省市的相关文件规定和精神。\n");
|
||||
|
||||
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_RISK_PREVENTION,
|
||||
"审计内容框架(风险防控与绿色发展相关):\n" +
|
||||
"7. 企业年度工作报告中关于改革措施的落实情况,进度是否符合预期,是否违反整体改革措施计划。规划执行情况材料是否合规、完整。企业境外资产、投资管理办法和内控制度,及企业向国资委等有关部门报送的境外资产产权登记情况和境外资产财务报表数据等,是否合规、完整、符合企业实际情况。企业制定的公司发展规划,包括总规划和专项规划(如主业、国际化、金融、财务、人力资源、建设、生产、营销、科技、信息化、安全应急、企业文化等),是否符合企业整体实际情况,是否符合党中央、国务院、省市的相关文件规定和精神。公司发展规划滚动调整情况是否符合实际情况,是否为了减轻企业目标故意调整。公司发展规划中提及的制定依据,是否符合国家有关部门制定的行业产业发展规划等。\n" +
|
||||
"8. 金融业务风险。关注金融业务服务实体经济和主业发展情况,有无脱实向虚、通过金融产品将资金违规投向房地产、地方政府融资平台、产能过剩等限制或禁止领域的问题;关注企业开展境外金融衍生品情况,有无违规开展业务造成重大损失或损失风险等;关注银行、证券、保险、信托等金融子企业的资产管理规模及经营情况,风险管控机制是否健全,业务运营是否合规,有无信贷资金、金融资产造成重大损失的问题,有无金融产品逾期或违规展期、不良资产比率较高、风险与收益不匹配、本金偿付风险或违约风险大等问题;关注企业债券发行、委托理财、对外担保等金融业务开展中存在的突出问题,是否造成重大损失或损失风险等。\n" +
|
||||
"9. 债务风险。关注企业落实降杠杆减负债政策情况,是否存在企业资产负债率居高不下、超过警戒线或管控线甚至资不抵债,有无建立健全企业债务风险防控机制,发挥资产负债约束机制作用,债务结构是否合理,有无违规对不符合国家产业政策的企业实施债转股,有无违规通过\"名股实债\"等方式变相举债或形成重大隐性债务,以及虚假去杠杆等问题。\n");
|
||||
|
||||
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_SOCIAL_ENVIRONMENTAL,
|
||||
"审计内容框架(社会责任与开放共享相关):\n" +
|
||||
"10. 精准扶贫政策落实情况。关注企业在精准扶贫相关政策落实、项目安排、资金使用等方面的推进情况,是否落实企业定点扶贫工作的任务要求,有无出台具体帮扶措施,履行帮扶责任定点扶贫的目标对象、工作举措、资金使用等是否精准;有无通过发展产业、对接市场、安置就业等多种方式开展精准扶贫行动;以中央企业贫困地区产业投资基金、贫困地区产业发展基金等为代表的央企产业扶贫基金出资额是否及时足额缴纳、有无大量资金闲置和项目运营效果不佳等问题。\n" +
|
||||
"11. 污染防治工作推进情况。企业贯彻落实生态环境保护和环境污染防治相关政策措施情况,重点是打蹴蓝天保卫战、打好碧水保卫战和推进净土保卫战等相关措施的落实情况。是否存在非法占地、违规改变土地使用条件、倒卖土地、土地闲置的问题;企业是否完成国家节能减排任务目标,有无不顾生态环境盲目决策和建设项目,造成重大环境污染和资源损毁等问题;有无违规偷排、漏排、超排废渣废液废气,瞒报、漏报检测数据,有无违规堆放、未按规定处理工业危险废弃物、危险化学品等问题;对所属企业发生的破坏生态环境情况,是否存在追责问责不到位等问题。企业是否建立能源消耗及污染物排放统计台账;是否按时定期将本企业节能减排汇总报表和总结分析报告报送有关部门,有无漏报、迟报、不按要求报送;重点类、关注类企业是否在总结分析报告中开展与同行业节能减排技术指标的对标和分析。\n");
|
||||
|
||||
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_PERFORMANCE_ASSESSMENT,
|
||||
"审计内容框架(绩效考核与创新发展相关):\n" +
|
||||
"12. 对照国资委、财政部、工业和信息化部等与企业签订的年度经营业绩责任书、任期经营业绩责任书、中央单位定点扶贫工作责任书等,梳理企业承担的考核内容和指标。\n" +
|
||||
"13. 对于可以量化的审计事项,利用大数据分析方法,系统收集和整理各类考核指标信息,建立企业考核指标数据库,对照企业提供的财务或相关统计报表,检查企业完成情况。检查相关指标的原始数据、计算方法、计算过程,核实其真实性和准确性,对于依靠人工填报、设置调整系数、与以往年度相差较大或与考核值相差较小的数据,重点审计真实性、完整性、准确性。\n");
|
||||
}
|
||||
|
||||
// 获取分类的简要审计框架概述
|
||||
public static String getBriefAuditFrameworkForCategory(String category) {
|
||||
switch (category) {
|
||||
case CATEGORY_GOVERNANCE_REFORM:
|
||||
return "重点审计:法人治理结构、薪酬改革、国有资产管理等改革创新情况(创新理念)";
|
||||
case CATEGORY_DEVELOPMENT_STRATEGY:
|
||||
return "重点审计:混合所有制改革、剥离办社会职能、改革措施制定等协调发展情况(协调理念)";
|
||||
case CATEGORY_RISK_PREVENTION:
|
||||
return "重点审计:发展规划执行、金融业务风险、债务风险等绿色发展情况(绿色理念)";
|
||||
case CATEGORY_SOCIAL_ENVIRONMENTAL:
|
||||
return "重点审计:精准扶贫、污染防治等社会责任履行情况(开放共享理念)";
|
||||
case CATEGORY_PERFORMANCE_ASSESSMENT:
|
||||
return "重点审计:考核指标完成情况的真实性、准确性等创新发展情况(创新理念)";
|
||||
default:
|
||||
return "审计单位发展战略执行情况";
|
||||
}
|
||||
}
|
||||
|
||||
// 审计工作原则
|
||||
public static final String AUDIT_PRINCIPLES =
|
||||
"审计工作原则:\n" +
|
||||
"1. 基于审计框架,结合企业实际情况生成具体审计内容\n" +
|
||||
"2. 审计内容要具体可操作,避免笼统描述\n" +
|
||||
"3. 检查证据要真实具体,有文件依据\n" +
|
||||
"4. 测试结果判定要严格,有充分依据\n" +
|
||||
"5. 工作底稿索引要准确对应实际文件\n" +
|
||||
"6. 注重评估五大发展理念贯彻情况\n" +
|
||||
"7. 必须深入分析实际执行情况(结果),重点检查:\n" +
|
||||
" (1) 是否有会议纪要等材料证明决策按照党组织委员会→公司领导班子→董事会逐级落实;\n" +
|
||||
" (2) 是否有相应材料对执行内容进行说明和证明,展示具体的执行过程和执行效果。";
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
// 创新类关键词
|
||||
KEYWORD_WEIGHTS.put("法人治理", 10);
|
||||
KEYWORD_WEIGHTS.put("薪酬改革", 9);
|
||||
KEYWORD_WEIGHTS.put("改革创新", 9);
|
||||
KEYWORD_WEIGHTS.put("混合所有制", 9);
|
||||
|
||||
// 协调类关键词
|
||||
KEYWORD_WEIGHTS.put("发展规划", 10);
|
||||
KEYWORD_WEIGHTS.put("协调发展", 8);
|
||||
KEYWORD_WEIGHTS.put("改革措施", 8);
|
||||
|
||||
// 绿色类关键词
|
||||
KEYWORD_WEIGHTS.put("金融风险", 9);
|
||||
KEYWORD_WEIGHTS.put("债务风险", 9);
|
||||
KEYWORD_WEIGHTS.put("资产负债率", 8);
|
||||
KEYWORD_WEIGHTS.put("污染防治", 8);
|
||||
|
||||
// 开放共享类关键词
|
||||
KEYWORD_WEIGHTS.put("精准扶贫", 9);
|
||||
KEYWORD_WEIGHTS.put("环境保护", 8);
|
||||
KEYWORD_WEIGHTS.put("社会责任", 8);
|
||||
|
||||
// 通用关键词
|
||||
KEYWORD_WEIGHTS.put("发展战略", 10);
|
||||
KEYWORD_WEIGHTS.put("考核指标", 8);
|
||||
KEYWORD_WEIGHTS.put("年度报告", 7);
|
||||
KEYWORD_WEIGHTS.put("工作底稿", 6);
|
||||
KEYWORD_WEIGHTS.put("审计证据", 6);
|
||||
}
|
||||
|
||||
// 各知识源检索限制
|
||||
public static final Map<String, Integer> SOURCE_LIMITS = new HashMap<>();
|
||||
static {
|
||||
SOURCE_LIMITS.put("enterprise", 120);
|
||||
SOURCE_LIMITS.put("regulation", 60);
|
||||
SOURCE_LIMITS.put("auditCase", 40);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
/**
|
||||
* 重大经济决策调查表常量类
|
||||
*/
|
||||
public class AuditContent3DecisionConstants {
|
||||
|
||||
// 审计关键点、审计方法步骤
|
||||
public static final String AUDIT_FOCUS_AND_METHODS =
|
||||
"## 重大经济决策调查表审计重点\n" +
|
||||
"重大经济事项的决策、执行和效果情况,具体包括重大预算管理、重大项目实施、重大采购项目、重大投资项目、重大外包业务、重大资产处置、大额资金使用的决策和执行情况等。\n\n" +
|
||||
"## 重点关注\n" +
|
||||
"\"三重一大\"集体决策制度是否建立健全。重大经济、经营活动必须进行集体决策的标准和必须参加决策的人员是否制定有规定,规定的集体决策的程序(签到表、决策纪要、最终形成的决策、决策人员的签字确认意见等)是否完整,是否有应集体决策而未集体决策的问题,是否有应参加集体决策的人因不合理理由不得参加集体决策的问题,形成的集体决策意见是否符合国家、自治区规定。\n\n" +
|
||||
"## 审计方法及步骤\n" +
|
||||
"1. 查阅单位制度,检查议事制度是否建立,查看重大事项进行集体决策的规定,查阅相关会议记录资料,检查会议签到表、会议纪要、会议决定内容及决策参与人员签字确认意见,以确认会议集体决策程序的完整性;对照重大决策内容,检查相关对应资料,确认集体决策内容是否符合国家、自治区规定。\n" +
|
||||
"2. 抽查一些重大经济决策事项,比如重大建设项目、维修、大宗物资采购、企业投资运营等,审查其决策的背景、决策的过程、决策的执行和落实情况,决策的效果情况,以此来确定是否符合国家、自治区相关规定,执行是否有效。";
|
||||
|
||||
// 通用查询词
|
||||
public static final String[] GLOBAL_REGULATION_QUERIES = {
|
||||
"重大经济决策 法律法规",
|
||||
"三重一大 政策规定",
|
||||
"集体决策 制度规定"
|
||||
};
|
||||
|
||||
public static final String[] GLOBAL_AUDIT_CASE_QUERIES = {
|
||||
"重大经济决策 审计案例",
|
||||
"三重一大 检查方法"
|
||||
};
|
||||
|
||||
private AuditContent3DecisionConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 三重一大制度常量类
|
||||
*/
|
||||
public class AuditContent3TripleConstants {
|
||||
|
||||
// 分类定义
|
||||
public static final String CATEGORY_MAJOR_DECISION = "重大决策";
|
||||
public static final String CATEGORY_PERSONNEL_APPOINTMENT = "重要人事任免";
|
||||
public static final String CATEGORY_MAJOR_PROJECT = "重大项目安排";
|
||||
public static final String CATEGORY_LARGE_FUND_OPERATION = "大额度资金运作";
|
||||
public static final String CATEGORY_DECISION_PROCEDURE = "决策权力主体和程序";
|
||||
|
||||
// 分类描述
|
||||
public static final Map<String, String> CATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_DECISION, "重大决策事项的定义和范围");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_PERSONNEL_APPOINTMENT, "重要人事任免事项的定义和范围");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_PROJECT, "重大项目安排事项的定义和范围");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_LARGE_FUND_OPERATION, "大额度资金运作事项的定义和范围");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_DECISION_PROCEDURE, "决策权力主体和程序的规定");
|
||||
}
|
||||
|
||||
// 政策内容
|
||||
public static final Map<String, String> POLICY_CONTENTS = new HashMap<>();
|
||||
static {
|
||||
POLICY_CONTENTS.put(CATEGORY_MAJOR_DECISION,
|
||||
"1.重大决策事项:是指依照《中华人民共和国公司法》、《中华人民共和国全民所有制工业企业法》、《中华人民共和国企业国有资产法》、《中华人民共和国商业银行法》、《中华人民共和国证券法》、《中华人民共和国保险法》以及其他有关法律法规和党内法规规定的应当由股东大会(股东会)、董事会、未设董事会的经理班子、职工代表大会和党委(党组)决定的事项。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_PERSONNEL_APPOINTMENT,
|
||||
"2.重要人事任免事项:是指企业直接管理的领导人员以及其他经营管理人员的职务调整事项。主要包括企业中层以上经营管理人员和下属企业、单位领导班子成员的任免、聘用、解除聘用和后备人选的确定,向控股和参股企业委派股东代表,推荐董事会、监事会成员和经理、财务负责人,以及其他重要人事任免事项。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_MAJOR_PROJECT,
|
||||
"3、重大项目安排事项:是指对企业资产规模、资本结构、盈利能力以及生产装备、技术状况等产生重要影响的项目的设立和安排。主要包括年度投资计划,融资、担保项目,期权、期货等金融衍生业务,重要设备和技术引进,采购大宗物资和购买服务,重大工程建设项目,以及其他重大项目安排事项。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_LARGE_FUND_OPERATION,
|
||||
"4.大额度资金运作事项:是指超过由企业或者履行国有资产出资人职责的机构所规定的企业领导人员有权调动、使用的资金限额的资金调动和使用。主要包括年度预算内大额度资金调动和使用,超预算的资金调动和使用,对外大额捐赠、赞助,以及其他大额度资金运作事项。");
|
||||
|
||||
POLICY_CONTENTS.put(CATEGORY_DECISION_PROCEDURE,
|
||||
"");
|
||||
}
|
||||
|
||||
// 集团制度
|
||||
public static final Map<String, String> GROUP_SYSTEMS = new HashMap<>();
|
||||
static {
|
||||
GROUP_SYSTEMS.put(CATEGORY_MAJOR_DECISION,
|
||||
"第四条重大决策的范围(一)集团公司贯彻执行国家法律法规,自治区战略部署及重要决策,以及上级主管部门重要决定等的重大举措;(二)集团公司章程制订和重要修订;集团公司重大基本管理制度,包括\"三重一大\"决策、投资、担保、资产交易、收入分配、人事、财务理,授权管理以及责任追究等重大管理制度的制订和重大修订;(三)集团公司生产经营方针、发展战略和中长期发展规划,以及重大投融资规划;(四)集团公司及重要子企业主业确定及变更;集团公司投资设立各类二级企业方案;集团公司及二级子公司发生分立、合并、重组,破产、解散及产权变更、增减资本方案;集团公司及所属子公司改制、股份制改造、混合所有制改革等方案;(五)集团公司重大财务管理事项,包括年度财务预算、年度财务决算、利润分配方案、亏损弥补方案;(六)集团公司内部收入分配事项,包括年度工资总额方案、职工工资、奖金、分流安置、劳动保护和劳动保险等事关职工切身利益的重大事项;集团公司所属部门、二级企业负责人年度考核结果及年度薪酬兑现方案;(七)集团公司制订或实施股权激励和员工持股计划;(八)集团公司及所属企业国有股权比例由控股变为非控股或国有股权由参股变为控股的事项;(九)集团公司及所属企业单笔金额为300万元及以上对外重大担保事项,集团公司及所属企业重大关联交易事项、内部借款单笔金额为2000万元及以上事项;(十)集团公司及所属企业产权(资产)对外非公开协议转让、无偿划转及公开进场转让单笔金额为300万元及以上的事项;集团公司内部重组整合进行的产权(资产)非公开协议转让、无偿划转单笔金额为300万元及以上的事项;(十一)集团公司及所属企业重大资产损失、大额不良资产、核销单笔金额为20万元及以上的事项;集团公司及所属企业单笔放弃金额为30万元及以上的重大权益事项;(十二)集团公司内部机构改革方案,内部管理机构设立和调整方案,内部定岗、定编,定员、定责方案;(十三)集团公司党建群团工作的重大事项、方案;(十四)集团公司董事会年度工作报告、经理层年度工作报告、年度依法治企工作报告,年度内部控制体系工作报告等重要报告;(十五)集团公司应对重大法律纠纷、安全稳定,重大突发事件的重大措施及方案;(十六)法律法规和企业章程规定的事项,以及集团公司认为需要集体决策的关系到企业全局性、方向性、战略性的其他重大事项。");
|
||||
|
||||
GROUP_SYSTEMS.put(CATEGORY_PERSONNEL_APPOINTMENT,
|
||||
"第五条重要人事任免的范围(一)对集团公司中层管理人员、二级子公司领导班子成员的任免或聘用、解聘;相当于集团公司中层副职及以上的职业经理人的选聘、解聘;(二)按照企业章程约定,委派、提名、推荐集团公司非全资二级企业董事会、监事会成员和高级经营管理人员;(三)提名或委派集团公司三级企业董事长或执行董事、总经理人选;(四)集团公司中层管理人员后备人选;(五)涉及集团公司总部中层管理人员以及二级子公司班子成员的重要奖惩,对违犯党纪政纪干部职工的处理;(六)重大人事变动及其他人事管理的重要事项。");
|
||||
|
||||
GROUP_SYSTEMS.put(CATEGORY_MAJOR_PROJECT,
|
||||
"(一)集团公司年度投资计划方案;(二)集团公司年度融资计划方案;(三)集团公司及所属企业总投资额为3000万元及以上的投资项目(投资项目范围按集团公司投资管理办法明确的投资项目范围) ;(四)应当向自治区国资委报告的重大投资管理事项;(五)其他需要集体研究决定的重要项目安排事项。");
|
||||
|
||||
GROUP_SYSTEMS.put(CATEGORY_LARGE_FUND_OPERATION,
|
||||
"(一)除重大决策事项、重大项目安排事项外,涉及单笔7000万元及以上的年度预算内大额度资金使用事项;(二)除重大决策事项、重大项目安排事项外,涉及单笔5000万元及以上的预算外大额度经营性资金的使用事项;(三)预算外非经营性单笔100万元及以上、广西美术馆艺术品收藏单件或单次收藏一批100万元及以上的大额资金使用事项;(四)集团公司及所属企业10万元及以上的对外捐赠、财务资助、公益慈善及用于脱贫攻坚(乡村振兴)等涉及企业政治责任和社会责任方面的重要事项;(五)公司单份工程签证涉及工程造价变更金额为500万元及以上的项目资金支出和其他大额度资金运作事项。");
|
||||
|
||||
GROUP_SYSTEMS.put(CATEGORY_DECISION_PROCEDURE,
|
||||
"第十一条 凡属\"三重一大\"事项,应按规定程序决策,除遇重大突发事件和紧急情况外,应由领导班子以党委会、董事会或经理层会议形式集体讨论决定,不得以传阅会签或个别征求意见等方式代替集体决策。第十二条 集团公司决策主体权力运行必须坚持落实党组织的法定地位,规范党组织参与\"三重一大\"决策程序,确保党组织的领导核心和政治核心作用有效发挥。要坚持把党委研究讨论作为董事会、经理层决策重大问题的前置程序,在集团公司董事会决策前,对涉及企业改革发展稳定,重大经营管理和职工切身利益的\"三重一大\"事项决策事项,集团公司党委应当组织有关人员对决策事项进行调研和论证,提出意见建议,充分体现党组织对决策的定向把关作用,确保决策的合法性科学性、准确性。在董事会决策中,进入董事会的党委班子成员要按照党委的决定在董事会上充分发表意见,保证党委的意图在决策中得到体现。在董事会决策后,党委要建立\"三重一大\"决策事项跟踪问效制度、定期汇报制度、事后考核制度等,确保党的决策部署在企业贯彻好、执行好、落实好。第十三条 集团公司党委会、董事会,经理层对\"三重一大\"事项进行决策的具体程序和议题准备、表决、记录等事项严格按照集团公司党委会议事规则、董事会议事规则、总经理办公会议事规则规定的程序和要求执行。第十四条 集团公司研究决定企业改制及经营管理方面的重大问题、涉及职工切身利益的重大事项、制定重要的规章制度,应当听取企业工会的意见,并通过职工代表大会或者其他形式听取职工群众的意见和建议。按照国家有关规定须经职工代表大会或者职工大会审议通过的事项,履行相关程序后董事会或经理层方可批准或者作出决议。涉及重大决策、重大项目、大额度资金的使用,有合同意向的,应将合同的主要条款提交会议讨论。第十五条 \"三重一大\"事项经集体决策后,企业领导人员应当按照分工和职责组织实施。遇有分工和职责交叉的,应明确牵头落实人员。个人对集体决策有不同意见的,可以保留,但在作出新的决策前,应无条件执行。同时,可按组织程序向上级组织反映意见。第十六条 企业\"三重一大\"事项经集体决策后,应及时向自治区国资委报告有关决策情况。特别是属于重大报告事项的应按要求及时上报自治区国资委备案。自治区人民政府、自治区国资委另有规定需要报审、报批和备案的,按规定程序办理。");
|
||||
}
|
||||
|
||||
// 公司制度
|
||||
public static final Map<String, String> COMPANY_FORMULATIONS = new HashMap<>();
|
||||
static {
|
||||
COMPANY_FORMULATIONS.put(CATEGORY_MAJOR_DECISION,
|
||||
"(一)贯彻执行国家法律法规、自治区战略部署及集团公司的重要决策,以及上级主管部门重要决定等的重大举措;(二)章程制订和重要修订;重大基本管理制度,包括\"三重一大\"决策、投资、担保、资产交易、收入分配、人事、财务管理、授权管理以及责任追究等重大管理制度的制订和重大修订;(三)生产经营方针、发展战略和中长期发展规划,以及重大投融资规划;(四)公司主业确定及变更;投资设立各类企业方案;发生分立、合并、重组、破产、解散及产权变更、增减资本方案;公司及所属企业改制、股份制改造、混合所有制改革等方案;(五)重大财务管理事项,包括年度财务预算、年度财务决算、利润分配方案、亏损弥补方案;(六)内部收入分配事项,包括年度工资总额方案、职工工资、奖金、分流安置、劳动保护和劳动保险等事关职工切身利益的重大事项;所属部门年度考核结果及年度薪酬兑现方案;(七)制订或实施股权激励和员工持股计划;(八)公司国有股权比例由控股变为非控股或国有股权由参股变为控股的事项;(九)公司对外担保事项,公司重大关联交易事项和内部借款单笔100万元及以上的事项;(十)公司产权(资产)对外非公开协议转让、无偿划转及公开进场转让;公司内部重组整合进行的产权(资产)非公开协议转让、无偿划转的事项;(十一)公司重大资产损失、大额不良资产核销单笔金额为1万元及以上的事项;公司单笔放弃1万元及以上的重大权益事项;(十二)公司内部机构改革方案,内部管理机构设立和调整方案,内部定岗、定编、定员、定责方案;(十三)公司党建群团工作的重大事项、方案;(十四)公司年度工作报告、经理层年度工作报告、年度依法治企工作报告、年度内部控制体系工作报告等重要报告;(十五)公司应对重大法律纠纷、安全稳定、重大突发事件的措施及方案;(十六)法律法规和企业章程规定的事项,以及公司认为需要集体决策的关系到企业全局性、方向性、战略性的其他重大事项。");
|
||||
|
||||
COMPANY_FORMULATIONS.put(CATEGORY_PERSONNEL_APPOINTMENT,
|
||||
"(一)对公司中层管理人员(包括重大项目负责人)的任免或聘用、解除聘用和后备人选的推荐、确定;(二)委派、提名、推荐董事、监事和经理层、财务负责人;(三)干部员工的奖惩;(四)重大人事变动及其他人事管理的重要事项。");
|
||||
|
||||
COMPANY_FORMULATIONS.put(CATEGORY_MAJOR_PROJECT,
|
||||
"(一)企业年度投资计划和投资方案;(二)企业年度融资计划和融资方案,包括银行借贷、上市、发行债券等;(三)企业50万元及以上的投资项目以及非主业投资项目;(四)企业的重大技术改造方案、重要技术设备引进项目;(五)重大、关键性的设备引进和重要物资设备购置等重大招投标管理项目;(六)应当向自治区国资委或广西旅游发展集团有限公司(以下简称\"集团公司\")报告的重大投资管理事项;(七)其他需要集体研究决定的重要项目安排事项。");
|
||||
|
||||
COMPANY_FORMULATIONS.put(CATEGORY_LARGE_FUND_OPERATION,
|
||||
"(一)除重大决策事项、重大项目安排事项外,涉及单笔500万元及以上的年度预算内大额度资金调动和使用;(二)除重大决策事项、重大项目安排事项外,涉及单笔50万元及以上的预算外大额度资金调动和使用;(三)除重大决策事项、重大项目安排事项外,涉及单笔10万元及以上的非生产性支出;(四)单份工程签证及造价变更额度为10万元及以上的;(五)企业对外捐赠、赞助在1万元及以上的事项;(六)其他大额度资金运作事项。");
|
||||
|
||||
COMPANY_FORMULATIONS.put(CATEGORY_DECISION_PROCEDURE,
|
||||
"第十一条 凡属\"三重一大\"事项,党支部委员会成员应参加党支部委员会议对议题进行前置研究审议,保证党组织的意图在决策中得到体现。不得以传阅会签或个别征求意见等方式代替集体决策。第十二条 公司决策主体权力运行必须坚持落实党组织的法定地位,规范党组织参与\"三重一大\"决策程序,确保党组织的领导核心和政治核心作用有效发挥。要坚持把党支部研究讨论作为总经理办公会决策重大问题的前置程序。在总经理办公会会议决策前,对涉及企业改革发展稳定、重大经营管理和职工切身利益的\"三重一大\"事项决策事项,党支部应当组织有关人员对决策事项进行调研和论证,提出意见建议,充分体现党支部对决策的定向把关作用,确保决策的合法性、科学性、准确性。在总经理办公会的决策中,担任执行董事的党支部领导班子成员要按照党支部的决定在总经理办公会上充分发表意见,保证党支部的意图在决策中得到体现。在总经理办公会决策后,党支部要建立\"三重一大\"决策事项跟踪问效制度、定期汇报制度、事后考核制度等,确保党的决策部署在企业贯彻好、执行好、落实好。第十三条 公司党支部、经理层对\"三重一大\"事项进行决策的具体程序和议题准备、表决、记录等事项严格按照公司相关议事规则规定的程序和要求执行。第十四条 公司研究决定企业改制及经营管理方面的重大问题、涉及职工切身利益的重大事项、制定重要的规章制度,应当听取企业工会的意见,并通过职工代表大会或者其他形式听取职工群众的意见和建议。按照国家有关规定须经职工代表大会或者职工大会审议通过的事项,履行相关程序后经理层方可批准或者作出决议。涉及重大决策、重大项目、大额度资金的使用,有合同意向的,应将合同的主要条款提交会议讨论。第十五条 \"三重一大\"事项经集体决策后,企业领导人员应当按照分工和职责组织实施。遇有分工和职责交叉的,应明确牵头落实人员。个人对集体决策有不同意见的,可以保留,但在作出新的决策前,应无条件执行。同时,可按组织程序向上级组织反映意见。");
|
||||
}
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("三重一大", 10);
|
||||
KEYWORD_WEIGHTS.put("重大决策", 9);
|
||||
KEYWORD_WEIGHTS.put("重要人事任免", 9);
|
||||
KEYWORD_WEIGHTS.put("重大项目安排", 9);
|
||||
KEYWORD_WEIGHTS.put("大额度资金运作", 9);
|
||||
KEYWORD_WEIGHTS.put("决策程序", 8);
|
||||
KEYWORD_WEIGHTS.put("党委会", 7);
|
||||
KEYWORD_WEIGHTS.put("董事会", 7);
|
||||
KEYWORD_WEIGHTS.put("总经理办公会", 7);
|
||||
KEYWORD_WEIGHTS.put("集体决策", 8);
|
||||
KEYWORD_WEIGHTS.put("会议纪要", 6);
|
||||
KEYWORD_WEIGHTS.put("金额标准", 6);
|
||||
}
|
||||
|
||||
private AuditContent3TripleConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容4-目标责任制完成情况常量类
|
||||
* 审计目标:检查被审计领导干部任职期间目标责任制的完成情况
|
||||
*/
|
||||
public class AuditContent4TargetConstants {
|
||||
|
||||
// 分类定义
|
||||
public static final String CATEGORY_TARGET_RESPONSIBILITY = "目标责任制完成情况";
|
||||
|
||||
// 审计框架核心(基于Excel内容优化)
|
||||
public static final String AUDIT_FRAMEWORK =
|
||||
"审计核心:检查目标责任制的制定、执行和完成情况\n\n" +
|
||||
"重点关注:\n" +
|
||||
"1. 对照被审计人所在单位的职责和主要业务\n" +
|
||||
"2. 上级主管部门是否规定有目标责任\n" +
|
||||
"3. 单位是否制定有目标责任\n" +
|
||||
"4. 检查审计目标责任的完成情况\n\n" +
|
||||
"审计方法及步骤:\n" +
|
||||
"1. 审阅上级主管部门下达或单位自定的目标责任制,对照完成情况,检查目标责任制的落实效果\n" +
|
||||
"2. 主要以单位自定的目标任务为衡量标准\n" +
|
||||
"3. 对已完成任务的部分,检查是否真实完成\n" +
|
||||
"4. 对未完成任务的部分,检查未完成的原因\n\n" +
|
||||
"特别说明:\n" +
|
||||
"1. 如果企业没有制定单位自定的目标责任制,请填写\"企业未制定年度目标计划\"\n" +
|
||||
"2. 如果知识库中没有单位自定目标的信息,请根据企业实际情况推断可能的计划内容\n" +
|
||||
"3. 单位自定目标应包括:年度工作计划、部门工作目标、绩效考核指标等";
|
||||
|
||||
// 审计目标
|
||||
public static final String AUDIT_OBJECTIVE =
|
||||
"检查目标责任制的制定、执行和完成情况,评估落实效果和完成质量。";
|
||||
|
||||
// 审计工作原则
|
||||
public static final String AUDIT_PRINCIPLES =
|
||||
"审计工作原则:\n" +
|
||||
"1. 以目标责任制文件为依据,对照完成情况\n" +
|
||||
"2. 优先使用上级主管部门下达的目标任务作为衡量标准\n" +
|
||||
"3. 如无上级目标任务,则以单位自定目标为衡量标准\n" +
|
||||
"4. 重点关注已完成任务的真实性、未完成任务的客观原因\n" +
|
||||
"5. 注重目标责任与单位职责的匹配性\n" +
|
||||
"6. 考核评价机制是否健全有效";
|
||||
|
||||
// 关键词权重(聚焦核心概念)
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
// 核心概念
|
||||
KEYWORD_WEIGHTS.put("目标责任", 10);
|
||||
KEYWORD_WEIGHTS.put("目标责任制", 10);
|
||||
KEYWORD_WEIGHTS.put("目标任务", 9);
|
||||
|
||||
// 完成情况
|
||||
KEYWORD_WEIGHTS.put("完成情况", 10);
|
||||
KEYWORD_WEIGHTS.put("落实情况", 9);
|
||||
KEYWORD_WEIGHTS.put("完成率", 8);
|
||||
|
||||
// 文件依据
|
||||
KEYWORD_WEIGHTS.put("下达文件", 9);
|
||||
KEYWORD_WEIGHTS.put("计划文件", 9);
|
||||
KEYWORD_WEIGHTS.put("责任书", 8);
|
||||
KEYWORD_WEIGHTS.put("考核办法", 8);
|
||||
|
||||
// 审计相关
|
||||
KEYWORD_WEIGHTS.put("考核指标", 8);
|
||||
KEYWORD_WEIGHTS.put("未完成", 7);
|
||||
KEYWORD_WEIGHTS.put("已完成", 7);
|
||||
KEYWORD_WEIGHTS.put("上级主管", 7);
|
||||
}
|
||||
|
||||
// 审计要点提示
|
||||
public static final String AUDIT_KEY_POINTS =
|
||||
"审计要点:\n" +
|
||||
"1. 检查目标责任文件完整性\n" +
|
||||
"2. 核实完成数据的真实性\n" +
|
||||
"3. 分析未完成原因合理性\n" +
|
||||
"4. 评估目标制定科学性\n" +
|
||||
"5. 检查考核执行规范性";
|
||||
|
||||
// 数据格式要求
|
||||
public static final String DATA_FORMAT_INSTRUCTION =
|
||||
"JSON数组格式,包含以下字段:\n" +
|
||||
"1. index: 序号\n" +
|
||||
"2. year: 年度\n" +
|
||||
"3. superiorFile: 上级下达文件\n" +
|
||||
"4. superiorCompletion: 上级完成情况\n" +
|
||||
"5. superiorReason: 上级未完成原因\n" +
|
||||
"6. selfPlan: 单位自定计划\n" +
|
||||
"7. selfCompletion: 自定完成情况\n" +
|
||||
"8. selfReason: 自定未完成原因\n" +
|
||||
"9. remark: 备注\n" +
|
||||
// "10. workPaperIndex: [相关文件FileId]";
|
||||
"10. workPaperIndex: [相关文件的完整文件名||FileUrl]";
|
||||
|
||||
// 获取分类的简要审计框架概述
|
||||
public static String getBriefAuditFrameworkForCategory(String category) {
|
||||
if (CATEGORY_TARGET_RESPONSIBILITY.equals(category)) {
|
||||
return "审计目标责任制的制定、执行和完成情况,评估落实效果";
|
||||
}
|
||||
return "审计目标责任制完成情况";
|
||||
}
|
||||
|
||||
// 字段映射(用于前端展示)
|
||||
public static final Map<String, String> FIELD_DISPLAY_NAMES = new HashMap<>();
|
||||
static {
|
||||
FIELD_DISPLAY_NAMES.put("index", "序号");
|
||||
FIELD_DISPLAY_NAMES.put("year", "年度");
|
||||
FIELD_DISPLAY_NAMES.put("superiorFile", "上级下达文件");
|
||||
FIELD_DISPLAY_NAMES.put("superiorCompletion", "上级完成情况");
|
||||
FIELD_DISPLAY_NAMES.put("superiorReason", "上级未完成原因");
|
||||
FIELD_DISPLAY_NAMES.put("selfPlan", "单位自定计划");
|
||||
FIELD_DISPLAY_NAMES.put("selfCompletion", "自定完成情况");
|
||||
FIELD_DISPLAY_NAMES.put("selfReason", "自定未完成原因");
|
||||
FIELD_DISPLAY_NAMES.put("remark", "备注");
|
||||
FIELD_DISPLAY_NAMES.put("workPaperIndex", "工作底稿索引");
|
||||
}
|
||||
|
||||
// 审计证据要求
|
||||
public static final String AUDIT_EVIDENCE_REQUIREMENTS =
|
||||
"审计证据要求:\n" +
|
||||
"1. 查阅文件:目标责任制相关文件、计划、实施方案\n" +
|
||||
"2. 查阅记录:完成情况报告、考核记录、会议纪要\n" +
|
||||
"3. 查阅数据:统计数据、财务报表、进度报表\n" +
|
||||
"4. 查阅凭证:相关凭证、合同、协议\n" +
|
||||
"5. 现场核实:必要时进行现场核实和访谈";
|
||||
|
||||
// 输出格式要求
|
||||
public static final String OUTPUT_FORMAT =
|
||||
"输出格式(JSON数组):\n" +
|
||||
"[\n" +
|
||||
" {\n" +
|
||||
" \"index\": 序号,\n" +
|
||||
" \"year\": \"年度\",\n" +
|
||||
" \"superiorFile\": \"上级主管部门下达文件名称和文号\",\n" +
|
||||
" \"superiorCompletion\": \"上级目标完成情况(已完成/部分完成/未完成)\",\n" +
|
||||
" \"superiorReason\": \"上级目标未完成原因(如已完成,填'无未完成原因')\",\n" +
|
||||
" \"selfPlan\": \"单位自定计划文件名称\",\n" +
|
||||
" \"selfCompletion\": \"自定目标完成情况(已完成/部分完成/未完成)\",\n" +
|
||||
" \"selfReason\": \"自定目标未完成原因(如已完成,填'无未完成原因')\",\n" +
|
||||
" \"remark\": \"备注\",\n" +
|
||||
// " \"workPaperIndex\": [\"实际存在的完整FileId1\", \"实际存在的完整FileId2\", ...]\n" +
|
||||
" \"workPaperIndex\": [\"实际存在的完整文件名1||FileUrl1\", \"实际存在的完整文件名2||FileUrl2\", ...]\n" +
|
||||
" }\n" +
|
||||
"]\n\n" +
|
||||
"重要说明:\n" +
|
||||
"1. 每个审计记录对应一个具体的文件或目标\n" +
|
||||
"2. 同一年度可能有多个目标责任,每个都应生成独立的审计记录\n" +
|
||||
"3. 尽可能从知识库中提取所有相关信息,生成尽可能多的记录";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,260 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容5-预算执行情况审计常量类
|
||||
* 审计目标:检查预算执行的进度、合规性、效果,分析预算执行偏差原因,评估预算执行效益
|
||||
*/
|
||||
public class AuditContent5BudgetExecutionConstants {
|
||||
|
||||
// 分类定义
|
||||
public static final String CATEGORY_BUDGET_EXECUTION = "预算执行情况审计";
|
||||
|
||||
// 审计框架核心
|
||||
public static final String AUDIT_FRAMEWORK =
|
||||
"**审计核心:**\n" +
|
||||
"预算执行情况审计。包括预算执行进度、执行合规性、执行效果评估、预算执行偏差分析、\n" +
|
||||
"资金到位情况、项目执行进度、预算执行率、资金使用效益、执行风险预警、整改措施落实等情况。\n\n" +
|
||||
|
||||
"**重点关注:**\n" +
|
||||
"1. 预算执行率是否达到预期目标,是否存在执行进度滞后问题\n" +
|
||||
"2. 资金是否按时足额到位,是否存在资金沉淀或短缺问题\n" +
|
||||
"3. 预算执行是否合规,是否存在超预算、无预算执行问题\n" +
|
||||
"4. 项目执行进度是否符合计划,是否存在项目延期问题\n" +
|
||||
"5. 预算调整是否及时报批,是否存在擅自调整预算问题\n" +
|
||||
"6. 预算执行效益如何,是否达到预期经济效益和社会效益\n" +
|
||||
"7. 预算执行是否存在偏差,偏差原因是否合理\n" +
|
||||
"8. 预算执行监控是否到位,是否存在风险预警机制\n" +
|
||||
"9. 预算执行问题整改是否及时有效,整改措施是否落实\n" +
|
||||
"10. 预算执行信息公开是否及时准确,透明度如何\n" +
|
||||
"11. 预算执行考核评价机制是否健全,考核结果是否应用\n" +
|
||||
"12. 预算执行信息化水平如何,是否实现动态监控\n" +
|
||||
"13. 预算执行与决算衔接是否顺畅,数据是否一致\n" +
|
||||
"14. 预算执行对单位履职和事业发展的支撑作用如何\n" +
|
||||
"15. 预算执行中是否存在挤占挪用、虚列支出等问题\n" +
|
||||
"16. 预算执行与政府采购、资产管理等是否协调衔接\n\n" +
|
||||
|
||||
"**审计方法及步骤:**\n" +
|
||||
"1. 预算执行进度审计:\n" +
|
||||
" (1) 审阅被审计领导干部任职期间的预算执行进度报表、月度/季度/年度执行分析报告\n" +
|
||||
" (2) 对比预算安排与实际执行数据,计算预算执行率、资金到位率等关键指标\n" +
|
||||
" (3) 分析执行进度滞后项目的原因,检查是否存在客观障碍或主观问题\n" +
|
||||
" (4) 检查预算执行台账是否完整,执行记录是否及时准确\n\n" +
|
||||
|
||||
"2. 预算执行合规性审计:\n" +
|
||||
" (1) 对比预算批复文件与会计账务处理,检查预算执行是否严格按照批复执行\n" +
|
||||
" (2) 检查是否存在超预算执行、无预算执行、预算科目调剂等违规问题\n" +
|
||||
" (3) 审查预算调整审批手续是否完备,是否存在擅自调整预算问题\n" +
|
||||
" (4) 检查资金支付凭证是否合规,支付审批流程是否完整\n\n" +
|
||||
|
||||
"3. 预算执行效果审计:\n" +
|
||||
" (1) 对照项目可行性研究报告和评审报告,检查项目预期目标实现情况\n" +
|
||||
" (2) 运用成本效益分析方法,评估预算资金使用效益\n" +
|
||||
" (3) 实地查看项目实施情况,验证项目实际效果\n" +
|
||||
" (4) 调查相关受益群体,了解项目社会效益和满意度\n\n" +
|
||||
|
||||
"4. 预算执行偏差分析:\n" +
|
||||
" (1) 分析预算执行偏差数据,找出偏差较大的项目和科目\n" +
|
||||
" (2) 通过访谈、座谈等方式了解偏差产生的原因\n" +
|
||||
" (3) 评估偏差是否合理,是否存在管理问题\n" +
|
||||
" (4) 检查是否建立偏差分析机制和整改措施\n\n" +
|
||||
|
||||
"5. 预算执行风险管理审计:\n" +
|
||||
" (1) 检查是否建立预算执行风险预警机制\n" +
|
||||
" (2) 评估风险预警指标是否科学合理\n" +
|
||||
" (3) 检查风险预警响应和处置是否及时有效\n" +
|
||||
" (4) 审查风险防范措施是否落实到位\n\n" +
|
||||
|
||||
"6. 预算执行整改审计:\n" +
|
||||
" (1) 检查以往审计发现问题的整改情况\n" +
|
||||
" (2) 评估整改措施的有效性和落实情况\n" +
|
||||
" (3) 检查是否存在屡审屡犯问题\n" +
|
||||
" (4) 评估整改长效机制建设情况\n\n" +
|
||||
|
||||
"7. 预算执行信息化审计:\n" +
|
||||
" (1) 检查预算执行信息系统建设情况\n" +
|
||||
" (2) 评估系统功能是否满足预算执行监控需求\n" +
|
||||
" (3) 检查系统数据是否准确完整\n" +
|
||||
" (4) 评估信息化对预算执行管理的支撑作用";
|
||||
|
||||
// 审计目标
|
||||
public static final String AUDIT_OBJECTIVE =
|
||||
"全面检查预算执行全过程,包括执行进度、执行合规性、执行效果、执行偏差分析、\n" +
|
||||
"风险管理、整改落实等,确保预算资金规范高效使用,提高预算执行质量和效益。";
|
||||
|
||||
// 审计工作原则
|
||||
public static final String AUDIT_PRINCIPLES =
|
||||
"审计工作原则:\n" +
|
||||
"1. 以《预算法》、《预算法实施条例》及相关财政法规为依据\n" +
|
||||
"2. 全面覆盖预算执行的所有环节和方面\n" +
|
||||
"3. 重点关注预算执行率、资金到位率等关键指标\n" +
|
||||
"4. 检查预算执行合规性和规范性\n" +
|
||||
"5. 评估预算执行效果和效益\n" +
|
||||
"6. 分析预算执行偏差原因\n" +
|
||||
"7. 关注预算执行风险防控\n" +
|
||||
"8. 检查审计问题整改情况\n" +
|
||||
"9. 促进预算执行管理完善\n" +
|
||||
"10. 提高财政资金使用效益";
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
// 预算执行核心概念
|
||||
KEYWORD_WEIGHTS.put("预算执行", 10);
|
||||
KEYWORD_WEIGHTS.put("执行进度", 9);
|
||||
KEYWORD_WEIGHTS.put("执行率", 10);
|
||||
KEYWORD_WEIGHTS.put("资金到位", 9);
|
||||
KEYWORD_WEIGHTS.put("执行合规", 8);
|
||||
|
||||
// 预算执行指标
|
||||
KEYWORD_WEIGHTS.put("执行偏差", 8);
|
||||
KEYWORD_WEIGHTS.put("预算调整", 7);
|
||||
KEYWORD_WEIGHTS.put("超预算", 8);
|
||||
KEYWORD_WEIGHTS.put("无预算", 8);
|
||||
KEYWORD_WEIGHTS.put("科目调剂", 7);
|
||||
|
||||
// 执行效果和效益
|
||||
KEYWORD_WEIGHTS.put("执行效果", 8);
|
||||
KEYWORD_WEIGHTS.put("资金效益", 8);
|
||||
KEYWORD_WEIGHTS.put("成本效益", 7);
|
||||
KEYWORD_WEIGHTS.put("社会效益", 7);
|
||||
KEYWORD_WEIGHTS.put("经济效益", 7);
|
||||
|
||||
// 执行风险管理
|
||||
KEYWORD_WEIGHTS.put("风险预警", 7);
|
||||
KEYWORD_WEIGHTS.put("执行风险", 7);
|
||||
KEYWORD_WEIGHTS.put("风险防控", 6);
|
||||
KEYWORD_WEIGHTS.put("预警机制", 6);
|
||||
|
||||
// 执行监控和整改
|
||||
KEYWORD_WEIGHTS.put("执行监控", 7);
|
||||
KEYWORD_WEIGHTS.put("动态监控", 6);
|
||||
KEYWORD_WEIGHTS.put("整改措施", 7);
|
||||
KEYWORD_WEIGHTS.put("整改落实", 7);
|
||||
KEYWORD_WEIGHTS.put("屡审屡犯", 6);
|
||||
|
||||
// 文件类型
|
||||
KEYWORD_WEIGHTS.put("执行报表", 8);
|
||||
KEYWORD_WEIGHTS.put("进度报表", 8);
|
||||
KEYWORD_WEIGHTS.put("执行分析", 7);
|
||||
KEYWORD_WEIGHTS.put("执行报告", 7);
|
||||
KEYWORD_WEIGHTS.put("支付凭证", 7);
|
||||
KEYWORD_WEIGHTS.put("拨款凭证", 7);
|
||||
}
|
||||
|
||||
// 审计要点提示
|
||||
public static final String AUDIT_KEY_POINTS =
|
||||
"**审计要点:**\n" +
|
||||
"1. 检查预算执行率是否达到预期目标,分析执行进度滞后原因\n" +
|
||||
"2. 核实资金是否按时足额到位,是否存在资金沉淀问题\n" +
|
||||
"3. 审查预算执行是否合规,是否存在超预算、无预算执行\n" +
|
||||
"4. 检查项目执行进度是否符合计划,是否存在项目延期\n" +
|
||||
"5. 评估预算调整审批是否及时合规\n" +
|
||||
"6. 分析预算执行偏差原因是否合理\n" +
|
||||
"7. 评估预算执行效益是否达到预期目标\n" +
|
||||
"8. 检查预算执行风险预警机制是否健全\n" +
|
||||
"9. 审查审计问题整改是否及时有效\n" +
|
||||
"10. 评估预算执行信息化水平\n" +
|
||||
"11. 检查预算执行信息公开情况\n" +
|
||||
"12. 评估预算执行考核评价机制\n" +
|
||||
"13. 检查预算执行与决算衔接情况\n" +
|
||||
"14. 分析预算执行对单位发展的支撑作用\n" +
|
||||
"15. 检查是否存在挤占挪用、虚列支出问题\n" +
|
||||
"16. 评估预算执行管理完善程度";
|
||||
|
||||
// 数据格式要求
|
||||
public static final String OUTPUT_FORMAT =
|
||||
"**输出格式(JSON数组):**\n" +
|
||||
"[\n" +
|
||||
" {\n" +
|
||||
" \"index\": 序号,\n" +
|
||||
" \"project\": \"项目名称\",\n" +
|
||||
" \"lastYearCarryOver\": \"上年结转\",\n" +
|
||||
" \"currentYearBudgetTotal\": \"本年预算小计\",\n" +
|
||||
" \"initialApprovedBudget\": \"年初批复预算数\",\n" +
|
||||
" \"additionalBudgetAmount\": \"追加预算数\",\n" +
|
||||
" \"actualAppropriation\": \"实际拨款数\",\n" +
|
||||
" \"indicatorBalance\": \"指标结余\",\n" +
|
||||
// " \"workPaperIndex\": [\"实际存在的完整FileId1\", \"实际存在的完整FileId2\", ...]\n" +
|
||||
" \"workPaperIndex\": [\"实际存在的完整文件名1||FileUrl1\", \"实际存在的完整文件名2||FileUrl2\", ...]\n" +
|
||||
" }\n" +
|
||||
"]\n\n" +
|
||||
"**重要说明:**\n" +
|
||||
"1. 每个审计记录对应一个具体的预算项目或执行事项\n" +
|
||||
"2. 尽可能全面识别所有预算执行项目和环节\n" +
|
||||
"3. 金额字段应填写具体数值,如\"1,000,000.00\"\n" +
|
||||
"4. 百分比字段应填写具体百分比,如\"85.50%\"\n" +
|
||||
"5. workPaperIndex必须填写实际查阅的文件名称\n" +
|
||||
"6. 对于无数据的字段,可填写\"-\"或留空\n" +
|
||||
"7. 尽可能多地生成审计记录,覆盖所有预算执行方面\n" +
|
||||
"8. 重点关注预算执行率低于80%或高于120%的项目\n" +
|
||||
"9. 深入分析预算执行偏差的根本原因";
|
||||
|
||||
// 审计证据要求
|
||||
public static final String AUDIT_EVIDENCE_REQUIREMENTS =
|
||||
"**审计证据要求:**\n" +
|
||||
"1. 预算执行相关文件:预算执行进度报表、月度/季度/年度执行分析报告\n" +
|
||||
"2. 资金拨付文件:拨款凭证、银行回单、付款审批单\n" +
|
||||
"3. 预算调整文件:预算调整审批文件、追加预算审批单\n" +
|
||||
"4. 项目执行文件:项目进度报告、项目验收报告、项目结算资料\n" +
|
||||
"5. 财务核算文件:会计账簿、会计凭证、银行对账单\n" +
|
||||
"6. 执行监控文件:预算执行台账、执行监控记录、风险预警记录\n" +
|
||||
"7. 整改落实文件:审计问题整改报告、整改措施落实证明\n" +
|
||||
"8. 考核评价文件:预算执行考核方案、考核结果、奖惩记录\n" +
|
||||
"9. 信息系统文件:预算执行系统截图、数据导出报表\n" +
|
||||
"10. 现场核实资料:实地查看记录、座谈记录、调查问卷";
|
||||
|
||||
// 字段映射(用于前端展示)
|
||||
public static final Map<String, String> FIELD_DISPLAY_NAMES = new HashMap<>();
|
||||
static {
|
||||
FIELD_DISPLAY_NAMES.put("index", "序号");
|
||||
FIELD_DISPLAY_NAMES.put("project", "项目名称");
|
||||
FIELD_DISPLAY_NAMES.put("lastYearCarryOver", "上年结转");
|
||||
FIELD_DISPLAY_NAMES.put("currentYearBudgetTotal", "本年预算小计");
|
||||
FIELD_DISPLAY_NAMES.put("initialApprovedBudget", "年初批复预算数");
|
||||
FIELD_DISPLAY_NAMES.put("additionalBudgetAmount", "追加预算数");
|
||||
FIELD_DISPLAY_NAMES.put("actualAppropriation", "实际拨款数");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorBalance", "指标结余");
|
||||
FIELD_DISPLAY_NAMES.put("workPaperIndex", "工作底稿索引");
|
||||
}
|
||||
|
||||
// 获取分类的简要审计框架概述
|
||||
public static String getBriefAuditFrameworkForCategory(String category) {
|
||||
if (CATEGORY_BUDGET_EXECUTION.equals(category)) {
|
||||
return "全面审计预算执行全过程,包括执行进度、合规性、效果、偏差分析、风险管理、整改落实等情况";
|
||||
}
|
||||
return "全面审计预算执行情况";
|
||||
}
|
||||
|
||||
// 审计项目类型(常见预算执行项目)
|
||||
public static final List<String> AUDIT_PROJECT_TYPES = Arrays.asList(
|
||||
"基本支出-人员经费执行",
|
||||
"基本支出-公用经费执行",
|
||||
"项目支出-专项业务费执行",
|
||||
"项目支出-设备购置费执行",
|
||||
"项目支出-大型修缮费执行",
|
||||
"项目支出-信息网络购建费执行",
|
||||
"项目支出-基础设施建设费执行",
|
||||
"项目支出-会议费执行",
|
||||
"项目支出-培训费执行",
|
||||
"项目支出-差旅费执行",
|
||||
"项目支出-劳务费执行",
|
||||
"项目支出-咨询费执行",
|
||||
"项目支出-委托业务费执行",
|
||||
"政府采购项目执行",
|
||||
"科研项目经费执行",
|
||||
"基建项目资金执行",
|
||||
"信息化项目执行",
|
||||
"培训项目执行",
|
||||
"会议项目执行",
|
||||
"差旅费执行",
|
||||
"办公设备购置执行",
|
||||
"车辆运行维护费执行",
|
||||
"物业管理费执行",
|
||||
"租赁费执行",
|
||||
"维修维护费执行",
|
||||
"专用材料费执行",
|
||||
"其他商品和服务支出执行"
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,323 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容5-预算管理审计常量类
|
||||
* 审计目标:检查预算编制的完整准确、预算调整审批的合规,以及预算支出的真实合法合规情况
|
||||
*/
|
||||
public class AuditContent5BudgetManageConstants {
|
||||
|
||||
// 分类定义
|
||||
public static final String CATEGORY_BUDGET_MANAGEMENT = "预算管理审计";
|
||||
|
||||
// 审计框架核心(完整基于Excel内容)
|
||||
public static final String AUDIT_FRAMEWORK =
|
||||
"**审计核心:**\n" +
|
||||
"财政财务管理情况。包括预算编制的完整准确、预算调整审批的合规,以及预算支出的真实合法合规情况;\n" +
|
||||
"财务收支的真实、合法和效益情况;自然资源资产管理和生态环境保护责任的履行情况;\n" +
|
||||
"境外机构、境外资产和境外经济活动的真实、合法和效益情况。\n\n" +
|
||||
|
||||
"**重点关注:**\n" +
|
||||
"1. 是否存在应纳入部门预算管理的各项收支未纳入预算编报\n" +
|
||||
"2. 项目预算编制不细化导致预算执行率低\n" +
|
||||
"3. 将独立核算的经营收支编入部门预算\n" +
|
||||
"4. 将预算拨款在不同预算科目之间相互调剂使用\n" +
|
||||
"5. 年初未安排预算、在年中又追加的预算调整事项是否合理\n" +
|
||||
"6. 有无未经批复自行调整部门预算的问题\n" +
|
||||
"7. 部门预算的项目是否全部都是本单位的业务\n" +
|
||||
"8. 是否有所设立企业的经营收支性质的预算项目\n" +
|
||||
"9. 预算支出中是否存在以虚假经济业务套取财政资金等问题\n" +
|
||||
"10. 预算收支的效益性,项目效益、效果等预期目标的实现情况\n" +
|
||||
"11. 国有资产配置是否按规定实行政府采购\n" +
|
||||
"12. 国有资产对外投资和收益以及国有资产保值增值的情况\n" +
|
||||
"13. 政府采购执行情况,是否存在规避政府采购的情况\n" +
|
||||
"14. 项目实施及管理情况,项目资金安全、实施进度\n" +
|
||||
"15. 债权债务的情况,债务可控程度,债权形成呆账的比例\n" +
|
||||
"16. 工会、饭堂财务收支情况,有无将经营收入放进工会、饭堂核算\n\n" +
|
||||
|
||||
"**审计方法及步骤:**\n" +
|
||||
"1. 部门预算编报及调整情况审计:\n" +
|
||||
" (1) 审阅被审计领导干部任职期间的部门预算、决算资料,分析预算收入来源渠道和使用方向,将各年度收支预算进行对比,检查收入预算编报的完整性,支出预算编报的真实性、准确性。\n" +
|
||||
" (2) 审阅项目预算申报文本,对项目的可行性研究报告、评审报告进行审查,通过实地调查或座谈等方法了解项目准备情况和进展情况,检查项目预算申报的规范性,项目预算有无细化到具体执行单位。\n" +
|
||||
" (3) 审阅预算调整文件,审查申报、审批手续的完整性,重点关注年初未安排预算、在年中又追加的预算调整事项是否合理。有无未经批复自行调整部门预算的问题。\n" +
|
||||
" (4) 审阅部门预算的项目是否全部都是本单位的业务,检查是否有所设立企业的经营收支性质的预算项目。\n" +
|
||||
" (5) 将预算下达文件与会计账务处理相对比,检查两者的项目名称一致,是否相互调剂项目预算。\n\n" +
|
||||
|
||||
"2. 预算执行和财政财务收支情况审计:\n" +
|
||||
" (1) 必须了解被审计单位设置的财务帐套有哪些,核实现金、银行的流水账和会计凭证保存的银行账户对账单是否一致,现金、银行的流动是否正常,有没有转到可疑的、无关的银行账户的现象。\n" +
|
||||
" (2) 核实财务软件的记录与被审计单位提供及保存的纸质版的账簿是否一致,核实财务帐套设置的明细科目是否与预算批复的明细科目一致。\n" +
|
||||
" (3) 核实财务帐套的支出数是否与决算报表一致,有无调整财务帐套支出数以达到不超出预算目的的现象,有无不按财务帐套支出数填报决算报表,以达到不超出预算目的的现象。\n" +
|
||||
" (4) 核实财务帐套上基本支出加项目支出的\"三公\"经费等的支出数,对比预算下达的\"三公经费\"等预算数,检查是否超预算。\n" +
|
||||
" (5) 审阅被审计领导干部任职期间所在单位各年度预算、决算资料,编制收入和支出情况分析表,将各年度收入和支出规模和结构进行对比,运用分析性复核的方法分析收入和支出的变化趋势,考虑合理的变动因素,审查不合理的变化及差异,检查收入和支出的总体规模、结构是否与单位职责履行、事业发展目标或者所承担重要事项相匹配。\n" +
|
||||
" (6) 对照收入和支出预算和决算,审查被审计领导干部任职期间部门各年度的会计账簿和凭证,检查预算收入、预算支出的真实性。审阅项目预算申报文本,对照项目预算支出明细,审查会计账簿和凭证,检查是否存在挤占挪用项目资金等问题。实地观察项目执行情况,检查是否存在虚报项目套取财政资金、将所属企业开支纳入预算核算等问题。\n" +
|
||||
" (7) 结合新执行的预算绩效考核方法,审查被审计领导干部任职期间各年度的会计账簿、凭证和有关业务资料,运用成本效益分析方法,检查预算收支的效益性,对照项目可行性研究报告和评审报告以及年度目标责任制,检查项目效益、效果等预期目标的实现情况,以及对经济社会发展产生的影响。\n\n" +
|
||||
|
||||
"3. 国有资产的管理情况审计:\n" +
|
||||
" (1) 审阅国有资产采购合同及招投标文件等资料,检查国有资产购置是否按规定实行政府采购。\n" +
|
||||
" (2) 审阅固定资产登记台账与会计明细账,审查账账是否相符。根据固定资产类别或领用单位等进行抽查盘点,审查账实是否相符,已报废固定资产是否及时予以报废、核销。\n" +
|
||||
" (3) 审阅国有资产出租、出借、报废核销的上级主管部门和财政部门的批准文件,检查手续是否完整。\n" +
|
||||
" (4) 审阅国有资产处置收入的评估文件、上级主管部门和财政部门的核准文件,对比市场价格,检查处置收入是否合理,是否具备完整的处置手续。\n" +
|
||||
" (5) 审阅国有资产处置收入的会计处理凭证及上缴财政国库的会计处理凭证,检查处置收益是否已纳入\"收支两条线\"管理。审计房屋出租是否按照规定上平台招租,可调查周边租金水平,来进行对比。\n" +
|
||||
" (6) 审阅国有资产对外投资,提供抵押、担保的上级主管部门和财政部门的审计文件,以及提供抵押、担保的合同,检查审批手续是否齐全,是否真实、合法;计算本单位国有资产保值增值率,检查本单位国有资产保值增值的情况;审计被审计单位划拨、借用给设立企业的资产来源是否清晰。\n\n" +
|
||||
|
||||
"4. 政府采购执行情况审计:\n" +
|
||||
" (1) 审查财务支出凭据,和\"固定资产\"科目,检查是否全部固定资产的采购都是通过具备政府采购手续的。\n" +
|
||||
" (2) 对照政府采购文件和目录,查阅财务支出,审计是否存在应报政府采购而未报的情况,特别注意成批的易耗品、一般资产也要执行政府采购。审计时,必须将有可能是批量采购而拆解采购的线索联系起来,看采购的时间、品目,是否应当同时购置的,采取分散购置,规避政府采购,发现此类情况的,除追究违反政府采购法的责任外,还要追踪至货物、服务的提供方,检查是否存在关联交易,交易价格是否合理,是否存在利益输送。\n" +
|
||||
" (3) 将年度内所有已执行政府采购的名单列出,与政府采购预算报表核对,审计是否按照预算采购,有无乱采购、无预算采购。凡是发现无预算采购的,都要关注采购价格和关联方交易、利益输送。\n" +
|
||||
" (4) 对实施单一采购的,核对政府采购目录,检查是否属于单一采购来源的要求。如果不属于单一采购来源的,也要关注采购价格和关联方交易、利益输送。\n\n" +
|
||||
|
||||
"5. 项目实施及管理情况审计:\n" +
|
||||
" 关注各单位实施项目的资金安全,实施进度、财务收支以及项目的会计核算及项目管理的相关手续。\n\n" +
|
||||
|
||||
"6. 债权债务的情况审计:\n" +
|
||||
" (1) 检查审计期末的应收款与应付款借方余额的形成年限,对超过3年未收取的应收款项,询问形成呆账的原因,以及有无采取措施收取。计算3年以上呆账占应收款项的比例,如果占比较高,检查是否建立有坏账的处理机制。\n" +
|
||||
" (2) 检查审计期末的应付款和应收款的贷方余额,对大额的部分,了解形成的原因、被审计单位的偿还能力。\n\n" +
|
||||
|
||||
"7. 工会、饭堂财务收支情况审计:\n" +
|
||||
" 重点关注有无将房屋租金、经营收入等放进工会、饭堂核算的现象;工会开支范围和标准是否超过文件规定。";
|
||||
|
||||
// 审计目标
|
||||
public static final String AUDIT_OBJECTIVE =
|
||||
"全面检查预算管理的各个方面,包括预算编制的完整准确、预算调整审批的合规、预算支出的真实合法合规情况、\n" +
|
||||
"财务收支的真实合法和效益、国有资产管理、政府采购执行、项目实施管理、债权债务管理、工会饭堂财务等,\n" +
|
||||
"确保财政资金使用的规范性、有效性和安全性。";
|
||||
|
||||
// 审计工作原则
|
||||
public static final String AUDIT_PRINCIPLES =
|
||||
"审计工作原则:\n" +
|
||||
"1. 以《预算法》、《政府采购法》、《国有资产管理办法》及相关财政法规为依据\n" +
|
||||
"2. 全面覆盖预算管理的所有环节和方面\n" +
|
||||
"3. 检查预算收入编报的完整性和支出编报的真实性、准确性\n" +
|
||||
"4. 关注项目预算申报的规范性和细化程度\n" +
|
||||
"5. 检查预算调整审批手续的合规性\n" +
|
||||
"6. 核实部门预算项目的相关性\n" +
|
||||
"7. 检查预算下达与账务处理的一致性\n" +
|
||||
"8. 审查国有资产管理的合规性和效益性\n" +
|
||||
"9. 监督政府采购执行的规范性\n" +
|
||||
"10. 评估项目实施和管理的有效性\n" +
|
||||
"11. 分析债权债务的风险控制\n" +
|
||||
"12. 核查工会饭堂财务的合规性";
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
// 预算管理核心概念
|
||||
KEYWORD_WEIGHTS.put("部门预算", 10);
|
||||
KEYWORD_WEIGHTS.put("预算编制", 10);
|
||||
KEYWORD_WEIGHTS.put("预算调整", 9);
|
||||
KEYWORD_WEIGHTS.put("预算执行", 9);
|
||||
KEYWORD_WEIGHTS.put("预算决算", 9);
|
||||
|
||||
// 预算科目和指标
|
||||
KEYWORD_WEIGHTS.put("预算科目", 8);
|
||||
KEYWORD_WEIGHTS.put("指标来源", 8);
|
||||
KEYWORD_WEIGHTS.put("指标运用", 8);
|
||||
KEYWORD_WEIGHTS.put("指标结余", 7);
|
||||
|
||||
// 资金类型和用途
|
||||
KEYWORD_WEIGHTS.put("财政拨款", 8);
|
||||
KEYWORD_WEIGHTS.put("工资统发", 7);
|
||||
KEYWORD_WEIGHTS.put("政府采购", 8);
|
||||
KEYWORD_WEIGHTS.put("财政管理专户", 6);
|
||||
KEYWORD_WEIGHTS.put("基本支出", 8);
|
||||
KEYWORD_WEIGHTS.put("项目支出", 8);
|
||||
|
||||
// 审计要点和方法
|
||||
KEYWORD_WEIGHTS.put("项目预算", 8);
|
||||
KEYWORD_WEIGHTS.put("预算申报", 7);
|
||||
KEYWORD_WEIGHTS.put("预算审批", 7);
|
||||
KEYWORD_WEIGHTS.put("预算调剂", 7);
|
||||
KEYWORD_WEIGHTS.put("国有资产", 8);
|
||||
KEYWORD_WEIGHTS.put("固定资产", 7);
|
||||
KEYWORD_WEIGHTS.put("政府采购", 7);
|
||||
KEYWORD_WEIGHTS.put("债权债务", 6);
|
||||
KEYWORD_WEIGHTS.put("工会饭堂", 5);
|
||||
|
||||
// 文件类型
|
||||
KEYWORD_WEIGHTS.put("预算报表", 7);
|
||||
KEYWORD_WEIGHTS.put("决算报表", 7);
|
||||
KEYWORD_WEIGHTS.put("可行性研究", 6);
|
||||
KEYWORD_WEIGHTS.put("评审报告", 6);
|
||||
KEYWORD_WEIGHTS.put("会计账簿", 6);
|
||||
KEYWORD_WEIGHTS.put("会计凭证", 6);
|
||||
}
|
||||
|
||||
// 审计要点提示
|
||||
public static final String AUDIT_KEY_POINTS =
|
||||
"**审计要点(基于Excel完整内容):**\n" +
|
||||
"1. 检查应纳入部门预算管理的各项收支是否全部纳入预算编报\n" +
|
||||
"2. 核实项目预算是否细化到具体执行单位\n" +
|
||||
"3. 审查预算调整审批手续是否完整合规\n" +
|
||||
"4. 检查是否存在将经营收支编入部门预算的情况\n" +
|
||||
"5. 核实预算拨款是否在不同科目间违规调剂使用\n" +
|
||||
"6. 检查年初未安排预算、年中追加事项的合理性\n" +
|
||||
"7. 核实部门预算项目是否全部为本单位业务\n" +
|
||||
"8. 检查是否将设立企业的经营收支纳入部门预算\n" +
|
||||
"9. 检查预算支出中是否存在以虚假经济业务套取财政资金\n" +
|
||||
"10. 审查预算收支的效益性,项目效益、效果等预期目标的实现情况\n" +
|
||||
"11. 检查国有资产配置是否按规定实行政府采购\n" +
|
||||
"12. 检查国有资产对外投资和收益以及国有资产保值增值情况\n" +
|
||||
"13. 审计政府采购执行情况,是否存在规避政府采购\n" +
|
||||
"14. 关注项目实施及管理情况,项目资金安全、实施进度\n" +
|
||||
"15. 检查债权债务的情况,债务可控程度,债权形成呆账的比例\n" +
|
||||
"16. 审计工会、饭堂财务收支情况,有无将经营收入放进工会、饭堂核算";
|
||||
|
||||
// 数据格式要求
|
||||
public static final String OUTPUT_FORMAT =
|
||||
"**输出格式(JSON数组):**\n" +
|
||||
"[\n" +
|
||||
" {\n" +
|
||||
" \"index\": 序号,\n" +
|
||||
" \"budgetSubject\": \"预算科目名称\",\n" +
|
||||
" \"indicatorSource\": \"指标来源\",\n" +
|
||||
" \"indicatorSourceTotal\": \"指标来源合计\",\n" +
|
||||
" \"indicatorSourceLastYearBalance\": \"上年结余\",\n" +
|
||||
" \"indicatorSourceInitialBudget\": \"年初部门预算\",\n" +
|
||||
" \"indicatorSourceAdditionalBudget\": \"追加(减)预算\",\n" +
|
||||
" \"indicatorUseTotal\": \"指标运用合计\",\n" +
|
||||
" \"indicatorUseAppropriationSubtotal\": \"拨款小计\",\n" +
|
||||
" \"indicatorUseAppropriation\": \"拨款\",\n" +
|
||||
" \"indicatorUseSalaryPayment\": \"工资统发\",\n" +
|
||||
" \"indicatorUseGovProcurement\": \"政府采购\",\n" +
|
||||
" \"financeManagementAccount\": \"财政管理专户\",\n" +
|
||||
" \"budgetUsedForOther\": \"部门预算用于其他\",\n" +
|
||||
" \"indicatorBalance\": \"指标结余\",\n" +
|
||||
" \"governmentProcurement\": \"政府采购\",\n" +
|
||||
" \"payableToUnit\": \"应拨单位款\",\n" +
|
||||
" \"other\": \"其他(可简要说明审计发现)\",\n" +
|
||||
// " \"workPaperIndex\": [\"实际存在的完整FileId1\", \"实际存在的完整FileId2\", ...]\n" +
|
||||
" \"workPaperIndex\": [\"实际存在的完整文件名1||FileUrl1\", \"实际存在的完整文件名2||FileUrl2\", ...]\n" +
|
||||
" }\n" +
|
||||
"]\n\n" +
|
||||
"**重要说明:**\n" +
|
||||
"1. 每个审计记录对应一项具体的预算科目或审计事项,尽可能全面识别所有预算科目和审计事项\n" +
|
||||
"2. 预算科目包括但不限于:基本支出(人员经费、公用经费)、项目支出(专项业务费、设备购置费、维修维护费、会议费、培训费、差旅费、劳务费、咨询费、印刷费、邮电费、租赁费、物业管理费、专用材料费、委托业务费、其他商品和服务支出)等\n" +
|
||||
"3. 审计事项应包括:预算管理、财务收支、国有资产管理、政府采购、项目实施、债权债务、工会饭堂财务等各方面\n" +
|
||||
"4. 金额字段应填写具体数值,如\"1,000,000.00\",不能填写简单的\"有\"或\"无\"\n" +
|
||||
"5. workPaperIndex必须填写实际查阅的文件名称,包括各种相关文件\n" +
|
||||
"6. 对于无数据的字段,可填写\"-\"或留空,但不能填写\"无\"\n" +
|
||||
"7. 尽可能多地生成审计记录,覆盖所有可能的预算科目和审计事项,不限制数量\n" +
|
||||
"8. 基于预算编制、调整、执行、决算的全流程进行审计分析\n" +
|
||||
"9. 多多益善,全面反映审计情况";
|
||||
|
||||
// 审计证据要求
|
||||
public static final String AUDIT_EVIDENCE_REQUIREMENTS =
|
||||
"**审计证据要求:**\n" +
|
||||
"1. 预算管理相关文件:部门预算报表、决算报表、项目预算申报文本、可行性研究报告、评审报告\n" +
|
||||
"2. 预算调整相关文件:预算调整审批文件、预算下达文件、追加预算审批单\n" +
|
||||
"3. 财务核算相关文件:会计账簿、会计凭证、银行对账单、现金流水账、财务软件记录\n" +
|
||||
"4. 预算执行相关文件:预算执行进度表、资金拨付记录、拨款凭证、工资发放记录\n" +
|
||||
"5. 国有资产相关文件:固定资产登记台账、资产盘点表、采购合同、招投标文件、资产处置审批文件、资产评估报告、出租出借合同、投资担保合同\n" +
|
||||
"6. 政府采购相关文件:政府采购合同、采购发票、采购目录、采购计划、招标文件、投标文件、中标通知书\n" +
|
||||
"7. 项目实施相关文件:项目合同、项目进度报告、项目验收报告、项目结算资料\n" +
|
||||
"8. 债权债务相关文件:应收应付款明细账、账龄分析表、坏账核销审批文件、债务偿还计划\n" +
|
||||
"9. 工会饭堂相关文件:工会账簿、饭堂收支记录、工会经费使用审批单\n" +
|
||||
"10. 现场核实资料:实地查看记录、座谈记录、业务资料核对记录";
|
||||
|
||||
// 字段映射(用于前端展示)
|
||||
public static final Map<String, String> FIELD_DISPLAY_NAMES = new HashMap<>();
|
||||
static {
|
||||
FIELD_DISPLAY_NAMES.put("index", "序号");
|
||||
FIELD_DISPLAY_NAMES.put("budgetSubject", "预算科目名称");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorSource", "指标来源");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorSourceTotal", "指标来源合计");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorSourceLastYearBalance", "上年结余");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorSourceInitialBudget", "年初部门预算");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorSourceAdditionalBudget", "追加(减)预算");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorUseTotal", "指标运用合计");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorUseAppropriationSubtotal", "拨款小计");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorUseAppropriation", "拨款");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorUseSalaryPayment", "工资统发");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorUseGovProcurement", "政府采购");
|
||||
FIELD_DISPLAY_NAMES.put("financeManagementAccount", "财政管理专户");
|
||||
FIELD_DISPLAY_NAMES.put("budgetUsedForOther", "部门预算用于其他");
|
||||
FIELD_DISPLAY_NAMES.put("indicatorBalance", "指标结余");
|
||||
FIELD_DISPLAY_NAMES.put("governmentProcurement", "政府采购");
|
||||
FIELD_DISPLAY_NAMES.put("payableToUnit", "应拨单位款");
|
||||
FIELD_DISPLAY_NAMES.put("other", "其他(审计发现)");
|
||||
FIELD_DISPLAY_NAMES.put("workPaperIndex", "工作底稿索引");
|
||||
}
|
||||
|
||||
// 获取分类的简要审计框架概述
|
||||
public static String getBriefAuditFrameworkForCategory(String category) {
|
||||
if (CATEGORY_BUDGET_MANAGEMENT.equals(category)) {
|
||||
return "全面审计预算管理的各个方面,包括预算编制、调整、执行、决算的全过程,以及相关的财务收支、国有资产管理、政府采购、项目实施、债权债务、工会饭堂财务等情况";
|
||||
}
|
||||
return "全面审计预算管理情况";
|
||||
}
|
||||
|
||||
// 预算科目类型(更全面的列表)
|
||||
public static final List<String> BUDGET_SUBJECT_TYPES = Arrays.asList(
|
||||
"基本支出-人员经费-工资福利支出",
|
||||
"基本支出-人员经费-社会保障缴费",
|
||||
"基本支出-人员经费-住房公积金",
|
||||
"基本支出-人员经费-其他人员支出",
|
||||
"基本支出-公用经费-办公费",
|
||||
"基本支出-公用经费-印刷费",
|
||||
"基本支出-公用经费-咨询费",
|
||||
"基本支出-公用经费-手续费",
|
||||
"基本支出-公用经费-水费",
|
||||
"基本支出-公用经费-电费",
|
||||
"基本支出-公用经费-邮电费",
|
||||
"基本支出-公用经费-取暖费",
|
||||
"基本支出-公用经费-物业管理费",
|
||||
"基本支出-公用经费-差旅费",
|
||||
"基本支出-公用经费-因公出国(境)费用",
|
||||
"基本支出-公用经费-维修(护)费",
|
||||
"基本支出-公用经费-租赁费",
|
||||
"基本支出-公用经费-会议费",
|
||||
"基本支出-公用经费-培训费",
|
||||
"基本支出-公用经费-公务接待费",
|
||||
"基本支出-公用经费-专用材料费",
|
||||
"基本支出-公用经费-被装购置费",
|
||||
"基本支出-公用经费-专用燃料费",
|
||||
"基本支出-公用经费-劳务费",
|
||||
"基本支出-公用经费-委托业务费",
|
||||
"基本支出-公用经费-工会经费",
|
||||
"基本支出-公用经费-福利费",
|
||||
"基本支出-公用经费-公务用车运行维护费",
|
||||
"基本支出-公用经费-其他交通费用",
|
||||
"基本支出-公用经费-税金及附加费用",
|
||||
"基本支出-公用经费-其他商品和服务支出",
|
||||
"项目支出-专项业务费",
|
||||
"项目支出-设备购置费",
|
||||
"项目支出-大型修缮费",
|
||||
"项目支出-信息网络购建费",
|
||||
"项目支出-基础设施建设费",
|
||||
"项目支出-物资储备费",
|
||||
"项目支出-会议费",
|
||||
"项目支出-培训费",
|
||||
"项目支出-差旅费",
|
||||
"项目支出-劳务费",
|
||||
"项目支出-咨询费",
|
||||
"项目支出-印刷费",
|
||||
"项目支出-邮电费",
|
||||
"项目支出-租赁费",
|
||||
"项目支出-物业管理费",
|
||||
"项目支出-专用材料费",
|
||||
"项目支出-委托业务费",
|
||||
"项目支出-其他商品和服务支出",
|
||||
"经营支出-经营成本",
|
||||
"经营支出-经营费用",
|
||||
"经营支出-经营税金",
|
||||
"对个人和家庭的补助-离休费",
|
||||
"对个人和家庭的补助-退休费",
|
||||
"对个人和家庭的补助-退职(役)费",
|
||||
"对个人和家庭的补助-抚恤金",
|
||||
"对个人和家庭的补助-生活补助",
|
||||
"对个人和家庭的补助-救济费",
|
||||
"对个人和家庭的补助-医疗费补助",
|
||||
"对个人和家庭的补助-助学金",
|
||||
"对个人和家庭的补助-奖励金",
|
||||
"对个人和家庭的补助-生产补贴",
|
||||
"对个人和家庭的补助-住房公积金",
|
||||
"对个人和家庭的补助-提租补贴",
|
||||
"对个人和家庭的补助-购房补贴",
|
||||
"对个人和家庭的补助-其他对个人和家庭的补助",
|
||||
"债务还本支出-国内债务还本",
|
||||
"债务还本支出-国外债务还本",
|
||||
"债务利息支出-国内债务利息",
|
||||
"债务利息支出-国外债务利息"
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容6-国资管理情况常量类
|
||||
* 审计目标:检查国有资产管理情况和政府采购执行情况
|
||||
*/
|
||||
public class AuditContent6StateAssetsConstants {
|
||||
|
||||
// 分类定义
|
||||
public static final String CATEGORY_STATE_ASSETS_MANAGEMENT = "国资管理情况";
|
||||
|
||||
// 审计框架核心(基于Excel内容)
|
||||
public static final String AUDIT_FRAMEWORK =
|
||||
"审计核心:检查国有资产管理情况和政府采购执行情况\n\n" +
|
||||
"重点关注:\n" +
|
||||
"(1)资产配置是否按规定报上级主管部门采取政府采购方式。资产登记不及时、不完整,资产台账和会计明细账不符,应报废、核销的资产长期挂账。未经批准出租、出借资产,报废、核销资产未履行审批手续。资产处置收益未纳入\"收支两条线\"管理。被审计单位有房屋出租,制定资产出租必须进入交易平台的制度后,是否还有私自出租、不进入平台交易的现象。前期出租出去的房屋,未经过平台的,审计其租金水平是否合理。\n" +
|
||||
"(2)国有资产对外投资和收益以及国有资产保值增值的情况。主要关注:是否违规利用国有资产对外投资;是否违规利用国有资产对外提供抵押、担保;国有资产投资收益持续亏损的原因;是否实现国有资产保值增值。\n\n" +
|
||||
"审计方法及步骤:\n" +
|
||||
"(1)审阅国有资产采购合同及招投标文件等资料,检查国有资产购置是否按规定实行政府采购。审阅固定资产登记台账与会计明细账,审查账账是否相符。根据固定资产类别或领用单位等进行抽查盘点,审查账实是否相符,已报废固定资产是否及时予以报废、核销。审阅国有资产出租、出借、报废核销的上级主管部门和财政部门的批准文件,检查手续是否完整。审阅国有资产处置收入的评估文件、上级主管部门和财政部门的核准文件,对比市场价格,检查处置收入是否合理,是否具备完整的处置手续。审阅国有资产处置收入的会计处理凭证及上缴财政国库的会计处理凭证,检查处置收益是否已纳入\"收支两条线\"管理。审计房屋出租是否按照规定上平台招租,可调查周边租金水平,来进行对比。\n" +
|
||||
"(2)审阅国有资产对外投资,提供抵押、担保的上级主管部门和财政部门的审计文件,以及提供抵押、担保的合同,检查审批手续是否齐全,是否真实、合法;计算本单位国有资产保值增值率,检查本单位国有资产保值增值的情况;审计被审计单位划拨、借用给设立企业的资产来源是否清晰。\n\n" +
|
||||
"政府采购执行情况\n\n" +
|
||||
"重点关注:\n" +
|
||||
"是否存在应当报政府采购计划的,未报政府采购计划的情况。包括拆解规避政府采购的情况;是否存在已报政府采购计划,但实际未实施政府采购,而是自行采购的情况,且采购的品类、型号是政府采购目录中具备的,达不到自行采购的条件;是否存在不按政府采购预算的品目,而通过政府采购实施其他品目采购的情况。\n\n" +
|
||||
"审计方法及步骤:\n" +
|
||||
"①审查财务支出凭据,和\"固定资产\"科目,检查是否全部固定资产的采购都是通过具备政府采购手续的。②对照政府采购文件和目录,查阅财务支出,审计是否存在应报政府采购而未报的情况,特别注意成批的易耗品、一般资产也要执行政府采购。审计时,必须将有可能是批量采购而拆解采购的线索联系起来,看采购的时间、品目,是否应当同时购置的,采取分散购置,规避政府采购,发现此类情况的,除追究违反政府采购法的责任外,还要追踪至货物、服务的提供方,检查是否存在关联交易,交易价格是否合理,是否存在利益输送。③将年度内所有已执行政府采购的名单列出,与政府采购预算报表核对,审计是否按照预算采购,有无乱采购、无预算采购。凡是发现无预算采购的,都要关注采购价格和关联方交易、利益输送。④对实施单一采购的,核对政府采购目录,检查是否属于单一采购来源的要求。如果不属于单一采购来源的,也要关注采购价格和关联方交易、利益输送。";
|
||||
|
||||
// 审计目标
|
||||
public static final String AUDIT_OBJECTIVE =
|
||||
"检查国有资产管理情况和政府采购执行情况,确保国有资产安全完整、保值增值,规范政府采购行为。";
|
||||
|
||||
// 审计工作原则
|
||||
public static final String AUDIT_PRINCIPLES =
|
||||
"审计工作原则:\n" +
|
||||
"1. 以国有资产管理制度和政府采购法规为依据\n" +
|
||||
"2. 重点检查资产配置、使用、处置全流程的合规性\n" +
|
||||
"3. 关注资产出租、投资、担保等高风险环节\n" +
|
||||
"4. 核实资产账实相符、账账相符情况\n" +
|
||||
"5. 检查政府采购计划执行的真实性和合规性\n" +
|
||||
"6. 注重发现规避监管、利益输送等违规行为";
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
// 核心概念
|
||||
KEYWORD_WEIGHTS.put("国有资产", 10);
|
||||
KEYWORD_WEIGHTS.put("政府采购", 10);
|
||||
KEYWORD_WEIGHTS.put("资产配置", 9);
|
||||
KEYWORD_WEIGHTS.put("资产出租", 9);
|
||||
|
||||
// 管理流程
|
||||
KEYWORD_WEIGHTS.put("台账", 8);
|
||||
KEYWORD_WEIGHTS.put("会计明细账", 8);
|
||||
KEYWORD_WEIGHTS.put("报废核销", 8);
|
||||
KEYWORD_WEIGHTS.put("处置收益", 7);
|
||||
KEYWORD_WEIGHTS.put("收支两条线", 7);
|
||||
|
||||
// 采购相关
|
||||
KEYWORD_WEIGHTS.put("政府采购计划", 9);
|
||||
KEYWORD_WEIGHTS.put("政府采购目录", 8);
|
||||
KEYWORD_WEIGHTS.put("单一采购", 7);
|
||||
KEYWORD_WEIGHTS.put("规避采购", 8);
|
||||
|
||||
// 投资担保
|
||||
KEYWORD_WEIGHTS.put("对外投资", 9);
|
||||
KEYWORD_WEIGHTS.put("抵押担保", 8);
|
||||
KEYWORD_WEIGHTS.put("保值增值", 8);
|
||||
|
||||
// 合同相关
|
||||
KEYWORD_WEIGHTS.put("租赁合同", 7);
|
||||
KEYWORD_WEIGHTS.put("采购合同", 7);
|
||||
KEYWORD_WEIGHTS.put("招投标", 7);
|
||||
}
|
||||
|
||||
// 审计要点提示
|
||||
public static final String AUDIT_KEY_POINTS =
|
||||
"审计要点:\n" +
|
||||
"1. 检查资产配置是否按规定实施政府采购\n" +
|
||||
"2. 核实资产登记是否及时完整,账实是否相符\n" +
|
||||
"3. 审查资产出租是否进入交易平台\n" +
|
||||
"4. 检查资产处置手续是否完备,收益是否规范管理\n" +
|
||||
"5. 审计对外投资、抵押担保的审批合规性\n" +
|
||||
"6. 检查政府采购计划执行情况,是否存在规避行为\n" +
|
||||
"7. 关注关联交易和利益输送风险";
|
||||
|
||||
// 数据格式要求
|
||||
public static final String OUTPUT_FORMAT =
|
||||
"输出格式(JSON数组):\n" +
|
||||
"[\n" +
|
||||
" {\n" +
|
||||
" \"index\": 序号,\n" +
|
||||
" \"assetName\": \"国有资产名称\",\n" +
|
||||
" \"acquisitionMethod\": \"国有资产取得方式(购置/划拨/接受捐赠/自建等)\",\n" +
|
||||
" \"assetValue\": \"国有资产价值(原值或评估值)\",\n" +
|
||||
" \"assetAddress\": \"国有资产地址\",\n" +
|
||||
" \"area\": \"面积(如适用)\",\n" +
|
||||
" \"tenant\": \"承租方(如未出租填'未出租')\",\n" +
|
||||
" \"contractAmount\": \"合同金额(如未出租填'未出租')\",\n" +
|
||||
" \"leasePeriod\": \"租赁合同起止时间(如未出租填'未出租')\",\n" +
|
||||
" \"rentPaymentTime\": \"国有资产租金缴纳时间(如未出租填'未出租')\",\n" +
|
||||
" \"platformLease\": \"国有资产出租是否上平台(是/否/未出租)\",\n" +
|
||||
" \"approvalDoc\": \"国有资产出租的审批文件(如未出租填'未出租')\",\n" +
|
||||
" \"inBudget\": \"是否纳入预算(是/否)\",\n" +
|
||||
" \"remark\": \"备注(包含资产状态、使用情况、审计发现等)\",\n" +
|
||||
// " \"workPaperIndex\": [\"实际存在的完整FileId1\", \"实际存在的完整FileId2\", ...]\n" +
|
||||
" \"workPaperIndex\": [\"实际存在的完整文件名1||FileUrl1\", \"实际存在的完整文件名2||FileUrl2\", ...]\n" +
|
||||
" }\n" +
|
||||
"]\n\n" +
|
||||
"重要说明:\n" +
|
||||
"1. 每个审计记录对应一项具体的国有资产,尽可能全面识别所有资产\n" +
|
||||
"2. 资产类型包括:房屋建筑物、土地、车辆、机械设备、办公设备、电子设备等\n" +
|
||||
"3. 对于没有出租的资产,相关出租字段填写\"未出租\"\n" +
|
||||
"4. workPaperIndex必须填写实际查阅的文件名称\n" +
|
||||
"5. 备注中应详细描述资产状况、使用情况、合规性评价\n" +
|
||||
"6. 尽可能多地生成审计记录,覆盖所有可能的国有资产\n" +
|
||||
"7. 即使信息不完整,也要基于现有信息生成记录";
|
||||
|
||||
// 审计证据要求
|
||||
public static final String AUDIT_EVIDENCE_REQUIREMENTS =
|
||||
"审计证据要求:\n" +
|
||||
"1. 查阅文件:国有资产登记台账、会计明细账、采购合同、招投标文件\n" +
|
||||
"2. 查阅记录:租赁合同、审批文件、处置评估报告、政府采购计划\n" +
|
||||
"3. 查阅数据:资产价值评估报告、租金缴纳凭证、政府采购目录\n" +
|
||||
"4. 查阅凭证:会计凭证、银行转账记录、审批手续文件\n" +
|
||||
"5. 现场核实:资产实地盘点、租赁现场查看、供应商访谈";
|
||||
|
||||
// 字段映射(用于前端展示)
|
||||
public static final Map<String, String> FIELD_DISPLAY_NAMES = new HashMap<>();
|
||||
static {
|
||||
FIELD_DISPLAY_NAMES.put("index", "序号");
|
||||
FIELD_DISPLAY_NAMES.put("assetName", "国有资产名称");
|
||||
FIELD_DISPLAY_NAMES.put("acquisitionMethod", "国有资产取得方式");
|
||||
FIELD_DISPLAY_NAMES.put("assetValue", "国有资产价值");
|
||||
FIELD_DISPLAY_NAMES.put("assetAddress", "国有资产地址");
|
||||
FIELD_DISPLAY_NAMES.put("area", "面积");
|
||||
FIELD_DISPLAY_NAMES.put("tenant", "承租方");
|
||||
FIELD_DISPLAY_NAMES.put("contractAmount", "合同金额");
|
||||
FIELD_DISPLAY_NAMES.put("leasePeriod", "租赁合同起止时间");
|
||||
FIELD_DISPLAY_NAMES.put("rentPaymentTime", "国有资产租金缴纳时间");
|
||||
FIELD_DISPLAY_NAMES.put("platformLease", "国有资产出租是否上平台");
|
||||
FIELD_DISPLAY_NAMES.put("approvalDoc", "国有资产出租的审批文件");
|
||||
FIELD_DISPLAY_NAMES.put("inBudget", "是否纳入预算");
|
||||
FIELD_DISPLAY_NAMES.put("remark", "备注");
|
||||
FIELD_DISPLAY_NAMES.put("workPaperIndex", "工作底稿索引");
|
||||
}
|
||||
|
||||
// 获取分类的简要审计框架概述
|
||||
public static String getBriefAuditFrameworkForCategory(String category) {
|
||||
if (CATEGORY_STATE_ASSETS_MANAGEMENT.equals(category)) {
|
||||
return "审计国有资产管理和政府采购执行情况,确保资产安全完整和采购规范";
|
||||
}
|
||||
return "审计国资管理情况";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 重大投资情况审计常量类
|
||||
*/
|
||||
public class AuditContent7Constants {
|
||||
|
||||
// 审计类别定义(按审计内容7.txt要求)
|
||||
public static final String CATEGORY_MAJOR_INVESTMENT = "重大对外投资审计";
|
||||
public static final String CATEGORY_MAJOR_PROJECT = "重大工程建设审计";
|
||||
public static final String CATEGORY_MAJOR_CAPITAL = "重大资本运作审计";
|
||||
public static final String CATEGORY_MAJOR_ASSET_DISPOSAL = "重大资产处置审计";
|
||||
public static final String CATEGORY_MAJOR_PROCUREMENT = "重大物资(服务)采购审计";
|
||||
public static final String CATEGORY_MAJOR_GUARANTEE = "重大担保借款审计";
|
||||
|
||||
// 审计类别描述
|
||||
public static final Map<String, String> CATEGORY_DESCRIPTIONS = new HashMap<>();
|
||||
static {
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_INVESTMENT,
|
||||
"核查重大对外投资决策的合规性和民主性、审批手续、可行性研究、效益情况、会计处理、操作过程等");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_PROJECT,
|
||||
"工程建设项目决策程序、审批手续、安全质量、环保要求、效益情况等");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_CAPITAL,
|
||||
"重大资本运作事项决策权限、审批程序、交易对价、资金来源、效益效果等");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_ASSET_DISPOSAL,
|
||||
"重大资产处置决策程序、审批手续、交易价格、操作过程等");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_PROCUREMENT,
|
||||
"重大采购项目可行性、决策程序、采购过程、价格公允性、效益效果等");
|
||||
CATEGORY_DESCRIPTIONS.put(CATEGORY_MAJOR_GUARANTEE,
|
||||
"重大担保借款决策程序、尽职调查、风险控制、后续跟踪等");
|
||||
}
|
||||
|
||||
// 审计方法指令集(从审计内容7.txt提取)
|
||||
public static final Map<String, String> AUDIT_INSTRUCTIONS = new HashMap<>();
|
||||
static {
|
||||
AUDIT_INSTRUCTIONS.put("GENERAL_RULE",
|
||||
"审计方法及步骤:\n" +
|
||||
"(1)收集全部企业的资产负债表和往来明细表,审计企业\"未分配利润\"的情况,对应查看其往来明细表,分析审计企业债务的偿还能力和债券的回收机率。\n" +
|
||||
"(2)收集对其他单位进行投资的项目的收益报表及往来情况,审计投资的效益以及往来款项的回收机率。\n" +
|
||||
"(3)对还在继续运营的特殊情况,审计企业的收益能力,分析继续运行的必要性、效益性。");
|
||||
|
||||
AUDIT_INSTRUCTIONS.put("DECISION_SYSTEM_CHECK",
|
||||
"1、\"决策制度健全性验证\"指令:\n" +
|
||||
"①制度存在性审查:根据关键字,检索被审计单位所有制度,是否有重大对外投资决策的制度规定\n" +
|
||||
"②纵向合规性比对:将被审计单位的决策制度与国家、自治区、上级单位比较\n" +
|
||||
"③横向一致性检查:与本单位其他制度比较,检查决策额度、表决比例、否决机制等多个维度的协同性\n");
|
||||
|
||||
AUDIT_INSTRUCTIONS.put("DECISION_PROCEDURE_CHECK",
|
||||
"2、\"是否履行相应的决策程序\"指令:\n" +
|
||||
"①决策程序完备性审查:根据被审计单位制度确定该项目是否属于重大投资\n" +
|
||||
"②议事程序符合性审查:权限降级决策、参会人员范围、表决比例、材料替代违规、特别事项处理\n" +
|
||||
"③民主决策真实性分析:发言均衡性检查、反对意见留存、表态顺序异常、决策逆转追踪\n" +
|
||||
"④时序异常检查:立项时间、首次决策会日期、正式批准日、资金支付时间\n");
|
||||
}
|
||||
|
||||
// 审计内容模板(从审计内容7.txt提取的具体审计点)
|
||||
public static final Map<String, List<String>> AUDIT_CONTENT_TEMPLATES = new HashMap<>();
|
||||
static {
|
||||
// 重大对外投资审计内容
|
||||
AUDIT_CONTENT_TEMPLATES.put(CATEGORY_MAJOR_INVESTMENT, Arrays.asList(
|
||||
"核查重大对外投资决策的合规性和民主性。企业是否履行相应的决策程序或相关决策制度是否建立健全,是否经过相应级别的领导班子集体讨论决策,有无简化决策程序或在多数人表示反对意见下仍强行通过决策,即领导个人说了算的情况。",
|
||||
"核查重大对外投资审批手续。核查被审计企业与履行出资人职责的机构是否有明确的授权范围,对照国资委的授权清单,查看对外投资事项是否属于国资监管部门核准或备案事项,对外投资事项是否属于国家禁止或控制的投资范围。",
|
||||
"核查重大对外投资可行性研究和尽职调查情况。是否经过可行性研究,相关论证是否充分,是否经过多方案的比较优选和科学论证,是否按规定开展尽职调查。",
|
||||
"核査对外投资项目的效益情况。梳理企业被审计年度对外投资项目的效益情况,与可行性研究的预期效益相比较,是否存在明显效益低下、严重亏损、计提大额减值等情况。",
|
||||
"查看长期投资、短期投资、银行存款等会计科目的明细账,确定重大对外投资项目的入账价值,审阅账面价值是否符合投资合同和决策所确定的投资额,重大差异是否有合理原因。审阅资金支付是否经过投资决策、合规审核后支付,是否存在超前支付等情况。",
|
||||
"查看相关费用类科目或长期投资、短期投资和银行存款等会计科目的明细账,分析有关中介费等费用支岀情况,核实是否存在大额的、可疑的、超合同支付的中间费用;关注溢价收购的交易价格是否合理,核查溢价收购产生的大额商誉,是否根据被收购企业未来业绩实际情况,制定相应的或有对价条款,从而调整交易对价、降低收购不确定性。",
|
||||
"审核\"长期投资\"等会计科目,分析投资事项的运营效益,是否存在重大亏损;调取被投资项目(或企业)的运营情况、会计报表等,分析企业账面是否如实反映项目盈亏。",
|
||||
"重大对外投资到期收回、出售或转让的,核实取得的对价是否及时入账;调取被投资企业投资分红账务资料,核实分红派息资金是否按时收回并入账。",
|
||||
"审核决策程序。详细查阅党委(组)会、股东会、董事会、监事会、总经理办公会和专题小组会等会议记录和会议纪要。查看相关决策程序是否合规,有无严格落实重大事项决策经过党组织前置研究的规定,是否经相应领导级别会议讨论研究;查看决策内容是否民主科学,仔细查阅参会人员的发言,有无存在主持会议的领导人员在多数人持不同意见甚至反对意见的情况下仍强行通过决议的情况,即领导人员\"说了算\"的情况。",
|
||||
"审核审批过程。按照深化国有企业改革精神和改革国有资本授权经营体制的要求,梳理履行出资人职责的机构对被审计企业的授权范围,核查关注的重大对外投资事项是否需要国资监管部门核准或备案,有无领导人员擅自决策、超权限决策的情况;对照企业投资负面清单,审核对外投资事项是否属于国家禁止或控制的投资范围,核查是否取得行业主管部门审批,相关审批手续是否完备。",
|
||||
"审核调查论证。查阅对外投资事项从立项到决策实施整个过程的论证材料,如可行性研究报告、财务咨询报告、法律意见书等。应关注以下三个方面:一是立项背景,重大对外投资项目是否符合国家经济结构调整方向,如是否符合供给侧结构性改革和产业发展方向;二是企业发展战略,重大对外投资事项是否符合企业主业经营范围,是否符合企业中长期发展规划;三是预期效益,对比可行性研究报告、财务咨询报告中关于项目预期的经营效益、投资规模、筹资与还款计划、预计资金回收期等内容,判断有无盲目投资、超偿还能力筹措资金等情况。",
|
||||
"审核操作过程。审查重大对外投资合同内容是否与企业集体决策内容相符,重大对外投资事项是否属于未公开的关联交易事项,相关交易价格是否经过专业机构评估,交易价格是否客观公允,会计师事务所、资产评估机构是否违反有关规定出具虚假报告,或领导人员违规指定交易方,先确定交易价格再进行资产评估,或领导人员擅自更改交易价格等。",
|
||||
"审核效益效果。核査重大对外投资企业是否正常经营,有无存在被投资企业效益持续低下,严重亏损甚至已经资不抵债,效益远低于预期;投资参股后是否积极行使股东权利,履行股东义务,有无因擅自扩大投资规模导致严重亏损,人为提高交易价格向特定关系人输送利益等违规问题。"
|
||||
));
|
||||
|
||||
// 重大工程建设审计内容(类似方式添加其他类别)
|
||||
AUDIT_CONTENT_TEMPLATES.put(CATEGORY_MAJOR_PROJECT, Arrays.asList(
|
||||
"工程建设项目是否经企业相应领导层级集体讨论研究,有无领导人员擅自决策,特别是领导班子多数人持不同意见的情况下仍强行通过决策的情况。",
|
||||
"相关立项审批手续是否完善,根据国资国企授权经营体制改革的有关要求,重大工程建设项目是否符合企业投资项目负面清单范围,有无应报未报、未批先建、违规建设楼堂馆所等。",
|
||||
"工程建设项目有无出现安全和质量事故,工程设备是否符合污染防治有关要求,相关工程废物、废渣、废水等是否得到有效收集和处理,工程建设是否造成环境污染,环保设施是否有效运营。",
|
||||
"工程建设项目竣工投产后的效益情况,是否存在竣工投入使用后长期闲置、计提大额减值、效益远低于预期产生巨额亏损等。",
|
||||
"审核决策程序。对选定的重大工程建设项目,应详细查看其会议纪要和会议记录,审阅管理制度、签报、审批文件等资料。查看相关决策事项是否履行相应决策程序,如是否经党组织前置研究和相应层级领导班子集体讨论研究,决策内容是否符合民主要求,有无被审计领导人员在多数人反对的情况下强行通过决策,即领导人员\"说了算\"的情况。",
|
||||
"审核审批过程。根据深化国有企业改革精神和改革国有资本授权经营体制的要求,核查重大工程建设项目是否属于企业自主决策事项,是否需要国资监管部门核准或者备案,若属于其他行业主管部门审批事项,企业还应获得如发展改革委、住建部门、环保部门等主管部门的相关审批手续,有无未批先建,化整为零规避审批。",
|
||||
"审核调查论证。查阅项目从立项到决策实施整个过程的论证材料,如可行性研究报告、财务咨询报告、法律意见书等。可行性研究报告的内容是否完整、真实;建设目标、建设规模是否符合企业发展需要,规划是否符合行业发展前景和产业政策。",
|
||||
"审核操作过程。重大工程建设项目是否严格按照集体决策的方案开展,工程的建设质量、环保标准是否符合要求,是否有定期的质量检查,有无发生重大安全质量事故、发生重大环保污染问题被有关部门处罚,或者工程建设进度严重滞后、无法按期竣工等问题。",
|
||||
"审核效益效果。重大工程建设项目的效益,主要是两个方面:一是效益是否达到预期。与可行性研究报告、财务咨询报告等比较,对比项目投产后是否达到预期效益;与市场上同类型项目效益对比,有无存在效益明显低于同类型项目的情况。二是工程建设项目的运营情况,是否存在项目竣工投产后运行未达预期、长期闲置,或因工程建设项目与市场需求严豆偏离计提重大减值,导致大额亏损等问题。"
|
||||
));
|
||||
|
||||
// 其他类别类似添加...
|
||||
}
|
||||
|
||||
// 关键词权重(用于知识检索排序)
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("重大投资", 10);
|
||||
KEYWORD_WEIGHTS.put("对外投资", 9);
|
||||
KEYWORD_WEIGHTS.put("工程建设", 9);
|
||||
KEYWORD_WEIGHTS.put("资本运作", 9);
|
||||
KEYWORD_WEIGHTS.put("资产处置", 9);
|
||||
KEYWORD_WEIGHTS.put("物资采购", 9);
|
||||
KEYWORD_WEIGHTS.put("担保借款", 9);
|
||||
KEYWORD_WEIGHTS.put("决策程序", 8);
|
||||
KEYWORD_WEIGHTS.put("审批手续", 8);
|
||||
KEYWORD_WEIGHTS.put("可行性研究", 8);
|
||||
KEYWORD_WEIGHTS.put("效益情况", 8);
|
||||
KEYWORD_WEIGHTS.put("会议纪要", 7);
|
||||
KEYWORD_WEIGHTS.put("会议记录", 7);
|
||||
KEYWORD_WEIGHTS.put("可行性报告", 7);
|
||||
KEYWORD_WEIGHTS.put("尽职调查", 7);
|
||||
KEYWORD_WEIGHTS.put("关联交易", 7);
|
||||
KEYWORD_WEIGHTS.put("价格公允", 7);
|
||||
}
|
||||
|
||||
// 文件类型关键词(用于工作底稿索引)
|
||||
public static final Map<String, List<String>> FILE_TYPE_KEYWORDS = new HashMap<>();
|
||||
static {
|
||||
FILE_TYPE_KEYWORDS.put("会议材料", Arrays.asList("会议通知", "签到表", "会议记录", "会议纪要", "会议决议", "会议录像"));
|
||||
FILE_TYPE_KEYWORDS.put("审批文件", Arrays.asList("立项批复", "审批文件", "核准文件", "备案文件", "红头文件"));
|
||||
FILE_TYPE_KEYWORDS.put("论证材料", Arrays.asList("可行性研究报告", "财务咨询报告", "法律意见书", "尽职调查报告", "专家论证意见"));
|
||||
FILE_TYPE_KEYWORDS.put("合同协议", Arrays.asList("投资合同", "合作协议", "担保合同", "借款合同", "采购合同", "转让协议"));
|
||||
FILE_TYPE_KEYWORDS.put("财务资料", Arrays.asList("资产负债表", "利润表", "现金流量表", "往来明细表", "会计凭证", "银行流水"));
|
||||
FILE_TYPE_KEYWORDS.put("评估报告", Arrays.asList("资产评估报告", "审计报告", "验资报告", "价值评估报告"));
|
||||
}
|
||||
|
||||
private AuditContent7Constants() {
|
||||
// 防止实例化
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有审计类别(按顺序)
|
||||
*/
|
||||
public static List<String> getAllCategories() {
|
||||
return Arrays.asList(
|
||||
CATEGORY_MAJOR_INVESTMENT,
|
||||
CATEGORY_MAJOR_PROJECT,
|
||||
CATEGORY_MAJOR_CAPITAL,
|
||||
CATEGORY_MAJOR_ASSET_DISPOSAL,
|
||||
CATEGORY_MAJOR_PROCUREMENT,
|
||||
CATEGORY_MAJOR_GUARANTEE
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容8 - 单位层面财务管理内部控制测试常量类
|
||||
*/
|
||||
public class AuditContent8InternalControlConstants {
|
||||
|
||||
// 16个控制环节
|
||||
public static final String[] CONTROL_LINKS = {
|
||||
"有关部门或岗位财务管理职能划分",
|
||||
"财务管理岗位设置及职责划分",
|
||||
"财务管理岗位人员配备",
|
||||
"财务管理关键岗位人员轮岗",
|
||||
"财务管理事项授权审批(核)",
|
||||
"财务管理重大事项决定",
|
||||
"会计核算与文档管理",
|
||||
"财务电子信息管理",
|
||||
"重要财务管理事项的信息沟通",
|
||||
"财务管理风险评估",
|
||||
"财务管理风险应对",
|
||||
"内部审计与监督检查",
|
||||
"反舞弊",
|
||||
"财务管理内部控制评价",
|
||||
"财务管理内部控制缺陷跟踪与改进",
|
||||
"财务管理内部控制实施情况纳入考核体系"
|
||||
};
|
||||
|
||||
// 控制要求
|
||||
public static final Map<String, String> CONTROL_REQUIREMENTS = new HashMap<>();
|
||||
static {
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[0], "财务管理决策、执行与监督职能相互分离");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[1], "财务管理不相容职务相互分离并相互制约");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[2], "财务管理岗位人员配备符合规定与岗位要求");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[3], "关键岗位实行定期轮岗,不具备轮岗条件的实施其他替代措施");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[4], "全部财务管理业务实施授权审批(核)");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[5], "财务管理重大事项均由单位领导层集体研究决定");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[6], "会计核算及其档案管理规范,会计信息准确");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[7], "信息系统开发、运行和维护以及用户管理与数据备份规范,信息安全");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[8], "对于重要财务管理事项均进行信息沟通");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[9], "对于财务管理风险能够进行识别、评估与预防");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[10], "对于出现的财务管理风险能够应对与控制");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[11], "对于发生的财务管理业务进行定期与不定期的审计与监督检查");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[12], "及时察觉与处置财务舞弊事件");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[13], "对于财务管理内部控制实施评价,并取得成效");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[14], "跟踪发现的财务管理内部控制缺陷,及时进行改进");
|
||||
CONTROL_REQUIREMENTS.put(CONTROL_LINKS[15], "在单位考核体系中包含财务管理内部控制实施情况内容");
|
||||
}
|
||||
|
||||
// 控制活动描述
|
||||
public static final Map<String, String> CONTROL_ACTIVITIES = new HashMap<>();
|
||||
static {
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[0], "按照决策、执行与监督职能相互分离的要求确定有关部门或岗位的财务管理职能,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[1], "按照不相容职务相互分离的要求设置财务管理岗位,所有岗位具有明确的职责,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[2], "按照有关规定与岗位要求配备财务管理人员,各岗位均有明确的任职要求,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[3], "对于财务管理部门负责人与其他关键岗位人员按照规定进行轮岗、相关人员实行回避,不具备轮岗条件的实施其他替代措施,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[4], "对于财务管理业务授权审批的范围、权限、程序与责任具有明确的规定,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[5], "对于单位部门预算、大额资金使用、大宗设备采购或重大服务购买、基本建设等重大财务事项均有明确的决定或会签制度规定,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[6], "对于会计凭证、会计账簿和会计报告处理程序以及会计档案管理具有明确的规定,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[7], "对于财务管理信息系统的开发、运行和维护以及用户管理与系统数据备份,信息系统安全保密和泄密责任追究具有明确的规定,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[8], "对于财务管理重要事项建立信息沟通制度,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[9], "对于财务管理风险具有明确工作内容与要求的评估预防体系与工作机制,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[10], "对于出现的财务管理风险具有应对机制与控制措施,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[11], "设有独立的内审部门或审计岗位并有明确的职责要求,对内部审计与财务管理监督检查具有明确的规定,由审计管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[12], "对于财务管理舞弊具有举报投诉制度和举报人保护制度以及全体员工被告知制度,对于举报投诉的财务管理舞弊事件与问题的处置具有明确的规定,由财务管理部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[13], "设立或指定财务管理内部控制评价的职能部门与岗位,对于财务管理内部控制评价工作的计划、要求具有明确的规定,由财务管理内部控制评价部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[14], "对于财务管理内部控制缺陷具有跟踪与改进制度,对于整改的实施与后续的检查具有明确的规定,由财务管理内部控制评价部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
CONTROL_ACTIVITIES.put(CONTROL_LINKS[15], "对于财务管理内部控体系建设与执行在单位的考核制度中具有明确的考核规定,由财务管理内部控制评价部门提出意见,报经分管领导审核,经单位领导层集体审批后实施");
|
||||
}
|
||||
|
||||
// 控制职责岗位
|
||||
public static final Map<String, String> CONTROL_POSITIONS = new HashMap<>();
|
||||
static {
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[0], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[1], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[2], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[3], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[4], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[5], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[6], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[7], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[8], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[9], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[10], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[11], "审计管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[12], "财务管理部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[13], "财务管理内部控制评价部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[14], "财务管理内部控制评价部门负责人、分管领导");
|
||||
CONTROL_POSITIONS.put(CONTROL_LINKS[15], "财务管理内部控制评价部门负责人、分管领导");
|
||||
}
|
||||
|
||||
// 测试步骤
|
||||
public static final Map<String, List<String>> TEST_STEPS = new HashMap<>();
|
||||
static {
|
||||
TEST_STEPS.put(CONTROL_LINKS[0], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)单位有关部门或岗位财务管理职能设置是否符合相互分离规定",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位财务管理组织体系中的决策、执行与监督职能是否实现了分离"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[1], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)单位财务管理岗位设置与职责划分是否符合不相容岗位相互分离规定",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查财务管理岗位不相容职务是否实现了分离"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[2], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)财务管理岗位配备的人员是否符合任职资质要求",
|
||||
"(3)重要财务管理岗位人员的专业背景、工作经验及有关执业资质是否能够胜任岗位工作需要"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[3], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查财务管理关键岗位是否进行了轮岗或采取了其他替代措施"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[4], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位财务管理业务流程中的各个审批(核)环节的操作是否符合授权审批(核)规定"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[5], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位财务管理重大事项是否由领导层集体研究决定或会签,且研究决定或会签记录内容完整"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[6], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位会计核算流程是否符合制度规定",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位是否有专职岗位负责会计档案保管,且档案文件保管情况良好"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[7], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位是否按规定进行了信息系统的开发、运行和维护以及用户管理与数据备份"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[8], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位财务管理有关重要事项是否通过会议、内部报告或会签等方式进行信息沟通"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[9], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位是否进行了财务管理风险的识别、评估与预防工作"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[10], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位是否对出现的财务风险进行了应对,并采取了控制措施"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[11], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)是否设置了独立的审计部门或审计岗位",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位内审部门是否定期或不定期对财务管理业务进行审计与监督检查",
|
||||
"(4)通过观察、询问以及查阅有关工作文档等方式检查单位内审部门能否及时发现财务管理中的问题,督促整改"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[12], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位员工是否知晓财务管理舞弊的举报投诉制度和举报人保护制度",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位对于举报投诉的财务管理舞弊事件与问题是否及时进行了处置"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[13], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)是否设立或指定有财务管理内部控制评价的职能部门与岗位",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位是否有财务管理内部控制评价工作计划与工作要求",
|
||||
"(4)通过观察、询问以及查阅有关工作文档等方式检查单位是否按计划开展了财务管理内部控制评价工作,促进了单位财务管理内部控制体系的建立健全"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[14], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位对于发现的内部控制缺陷是否及时通报与跟踪",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位对于发现的缺陷是否及时进行了整改"
|
||||
));
|
||||
TEST_STEPS.put(CONTROL_LINKS[15], Arrays.asList(
|
||||
"(1)是否有制度规定",
|
||||
"(2)通过观察、询问以及查阅有关工作文档等方式检查单位的考核制度中是否将财务管理内部控制实施情况列入了考核内容中",
|
||||
"(3)通过观察、询问以及查阅有关工作文档等方式检查单位在实际进行考核中对财务管理内部控制实施情况的考核内容"
|
||||
));
|
||||
}
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("内部控制", 10);
|
||||
KEYWORD_WEIGHTS.put("财务管理", 9);
|
||||
KEYWORD_WEIGHTS.put("不相容职务分离", 9);
|
||||
KEYWORD_WEIGHTS.put("授权审批", 8);
|
||||
KEYWORD_WEIGHTS.put("集体决策", 8);
|
||||
KEYWORD_WEIGHTS.put("会计档案", 7);
|
||||
KEYWORD_WEIGHTS.put("信息系统", 7);
|
||||
KEYWORD_WEIGHTS.put("风险识别", 8);
|
||||
KEYWORD_WEIGHTS.put("风险评估", 8);
|
||||
KEYWORD_WEIGHTS.put("内部审计", 9);
|
||||
KEYWORD_WEIGHTS.put("反舞弊", 9);
|
||||
KEYWORD_WEIGHTS.put("内部控制评价", 8);
|
||||
KEYWORD_WEIGHTS.put("岗位轮岗", 7);
|
||||
KEYWORD_WEIGHTS.put("考核体系", 7);
|
||||
}
|
||||
|
||||
private AuditContent8InternalControlConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 审计内容9 - 人员编制管理审计常量类
|
||||
*/
|
||||
public class AuditContent9PersonnelConstants {
|
||||
|
||||
// 7个审计内容
|
||||
public static final String[] AUDIT_CONTENTS = {
|
||||
"检查劳务派遣用工的合规性",
|
||||
"核查被审计单位是否通过'假外包,真派遣'形式规避用工责任及成本",
|
||||
"检查人员经费的使用是否规范",
|
||||
"检查借用人员管理规范性",
|
||||
"绩效管理体系健全性、合规性",
|
||||
"检查机构编制合规性",
|
||||
"预算编制与实际执行差异"
|
||||
};
|
||||
|
||||
// 审计子内容映射
|
||||
public static final Map<String, List<AuditSubContent>> AUDIT_SUB_CONTENTS = new LinkedHashMap<>();
|
||||
static {
|
||||
// 1. 检查劳务派遣用工的合规性
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[0], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.检查劳务派遣人数占企业用工总量比例是否≤10%",
|
||||
"年度、半年度或月度员工花名册(区分正式工与派遣工,标注入职时间)",
|
||||
"核查被审计单位审计期间年度(或半年度或月度)用工情况,计算派遣工占比,\n公式如下:派遣工比例=派遣工人数/(正式工人数+派遣工人数)\n合规标准:该比例不得超过10%。若计算结果>10%,则判定为用工比例不合规。",
|
||||
"合并生成一个审计取证单",
|
||||
"①劳务派遣暂行规定_人力资源和社会保障部_中国政府网——第四条;\n②《中华人民共和国劳动合同法》第六十六条"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.检查派遣岗位是否均符合'三性'标准(临时性≤6个月,辅助性,替代性)",
|
||||
"①劳务派遣合同及岗位说明书;涉及转正的,需补充提供劳动合同;\n②职代会决议文件,并附公示记录照片;\n③核心岗位清单;\n④如涉及替代性岗位,需提供原岗位员工的脱产、休假证明等。",
|
||||
"岗位标准:派遣岗位仅限于临时性(不超过6个月)、辅助性(需职代会通过并公示)、替代性(如产假顶岗)岗位。核心岗位(如技术、管理等)必须转为正式工;用工单位决定使用被派遣劳动者的辅助性岗位,应当经职工代表大会或者全体职工讨论,提出方案和意见,与工会或者职工代表平等协商确定,并在用工单位内公示。\n①核查临时性工作岗位存续时间,若超过6个月,则判定该岗位不符合劳务派遣的临时性规定;\n②核查派遣岗位名称是否与公示辅助性岗位清单一致,不一致则违反劳务派遣辅助性规定;\n③检查替代性岗位是否提供休假证明等材料,若材料无法证实其符合设立条件,则派遣岗位设立存在瑕疵,违反劳务派遣的替代性规定。",
|
||||
"",
|
||||
"①劳务派遣暂行规定_人力资源和社会保障部_中国政府网——第三条;\n②《中华人民共和国劳动合同法》第六十六条"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"3.检查派遣工与同类岗位的正式工是否同工同酬",
|
||||
"正式工与派遣工薪酬对比表(或工资表)、社保缴纳凭证、福利发放记录",
|
||||
"对同一(类)岗位的劳务派遣和正式工进行薪酬差额分析,并形成派遣工权益保障差异分析记录:\n①核查社保是否按用工单位所在地标准缴纳;\n②抽检加班费、绩效奖金及福利待遇等项目的核算差异。",
|
||||
"",
|
||||
"①劳务派遣暂行规定_人力资源和社会保障部_中国政府网——第七、第九条;\n②《中华人民共和国劳动合同法》第六十三条"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"4.检查工伤处理程序中用工单位的配合义务履行情况",
|
||||
"①工伤事故通报派遣单位的书面记录;\n②用工单位参与工伤调查的会议纪要/现场核查记录;\n③职业病诊断过程记录(委托书、交接单等);\n④提供的职业史证明、危害因素检测报告;\n⑤《劳务派遣协议》关于工伤保险责任条款及补偿办法;\n⑥用工单位支付协议约定补偿的财务凭证",
|
||||
"①工伤事故:检查事故发生后及时向派遣单位通报的证据;核实派员参与调查、提供现场材料的记录;\n②职业病诊断:确认用工单位是否主动处理诊断事宜(如对接机构);验证所提供职业史、检测报告的真实性(比对考勤、检测备案);\n③责任约定:审查协议是否包含'用工单位不承担工伤保险责任'等违法条款;核查补偿办法中用工单位义务的财务履行凭证;\n④询问:访谈近审计期间工伤派遣工,核实用工单位配合度。",
|
||||
"",
|
||||
"①劳务派遣暂行规定_人力资源和社会保障部_中国政府网——第十条;\n②《工伤保险条例》第十七条、第十九条;\n③《中华人民共和国职业病防治法》第四十七条;\n④企业内控制度"
|
||||
)
|
||||
));
|
||||
|
||||
// 2. 核查被审计单位是否通过"假外包,真派遣"形式规避用工责任及成本
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[1], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.确认'外包'合同约定的是'劳务派遣'还是'劳务外包'的法律关系",
|
||||
"外包合同及其补充协议",
|
||||
"检查合同条款性质认定的关键要点:\n①若合同约定发包单位享有人员'用工管理权',包括直接调配权及要求员工遵守发包方《员工手册》等管理规定,则构成'劳务派遣'法律关系;若合同主要约定'业务成果验收标准',且外包公司自主安排生产服务、负责人员考勤管理,则构成'劳务外包'法律关系。\n②费用结算条款约定'按项目工作量'还是'验收成果计费':如存在以'人员数量、岗位配置、服务时长或出勤天数(隐含'人头费'逻辑)'等指标结算费用的情形,则构成'劳务派遣'法律关系;如基于'基于项目成果结算',如验收合格报告数量、项目阶段交付清单等,则构成'劳务外包'法律关系。",
|
||||
"合并生成一个审计取证单。\n取证单主要内容包括:审计(调查)事项摘要、处理建议、附件(与问题相匹配的支撑资料,即工作底稿索引)等。\n其中'审计(调查)事项摘要'包含:标题、审计记录、审计发现、定性依据。\n1.标题:突出核心问题,采用观点性语句。一般为审计内容、审计目标的结论性描述。例如:\n在审计期间,XX单位存在'假外包,真派遣'行为。\n2.审计记录:仅客观记录审计核查的具体事实(时间、地点、主体、行为、数据等);不使用主观评价性语言(如'违规''不合理')或问题判断性表述;确保事实可交叉验证(引证合同条款、凭证编号等原始文件)。一般采用白描句式:'经核查[具体资料/凭证],……[事实描述]……'例如:\n① 核查2019年1月1日签订的《XX服务合同》(编号:XYZ-2019-001)第3条约定:'乙方(服务商)员工需遵守甲方考勤制度,甲方有权对乙方人员工作质量进行考核并决定留用'。\n② 调取2019年6月外包人员考勤表显示:实际出勤记录由甲方部门主管李某签字确认,绩效评分由甲方人力资源部核定。\n③ 查验2020年3月服务费结算凭证(凭证号:FV20200315):所附明细清单按外包人员当月计薪天数×日工资标准核算费用。\n3.审计发现:基于审计记录的事实,提炼违反规定的具体问题性质。需明确界定违规行为的实质特征。同一性质问题应合并表述,避免分段罗列。一般采用定性句式:'上述行为实质构成……[问题性质],/ 形成……[违规形态]'。例如:\n审计发现:该单位通过签订名义上的《劳务外包合同》,实际由发包单位直接管理外包人员工作过程并控制费用结算标准,形成事实上的劳务派遣用工关系,构成'假外包、真派遣'行为。\n4.定性依据:违反的法律法规、政策规定及被审计单位内部管理制度等。\n选择优先级:法律法规>部门规章>地方政府规范性文件>被审计单位内部制度。\n引用规范:标明文件全称、文号及具体条款;引述条款内容须与问题直接对应;同时违反多层级规定的,按效力层级降序排列。例如:\n定性依据:\n①《劳务派遣暂行规定》(人社部令第22号)第三条:'用工单位只能在临时性、辅助性或者替代性的工作岗位上使用被派遣劳动者'。\n②被审计单位《XX管理办法》(XX集团〔2018〕35号)第X条:'……'。",
|
||||
"①《中华人民共和国劳动合同法》及其实施条例;\n②《中华人民共和国民法典》"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.检查发包单位是否实质上直接管理外包人员及其工作过程",
|
||||
"①考勤记录(打卡截图、门禁刷卡数据)、OA系统工作安排(如能获取)、绩效目标确认文件、扣罚工资记录;\n②发包单位《员工手册》、奖惩记录;\n③工位证明、工卡(门禁卡或身份标识卡)发放或佩戴要求、设备领用记录。",
|
||||
"①核实发包单位是否直接安排、记录和处罚外包人员考勤:查看考勤记录(如钉钉打卡截图、门禁刷卡数据)、绩效目标确认文件、OA系统工作安排记录、工资扣罚凭证(如'早退扣款'记录),若上述安排、记录和处罚由发包单位直接进行(而非外包公司执行),则表明发包单位存在实际考勤管理权,构成'实质派遣'。\n②核实发包单位的《员工手册》等规章制度是否明确适用于外包人员并被执行:审阅发包单位《员工手册》、奖惩通知(如警告、调岗通知)、工资条或相关记录,若实际操作中发包单位可直接对外包人员进行警告、调岗、扣款或奖励等管理动作,强有力地证明发包单位的实质性管理权限已延伸至外包人员,构成'实质派遣';\n③核实外包人员的工作环境和工作工具由谁提供和控制:查看外包人员在发包单位的工位安排记录、工卡发放记录、工作设备领用登记。若外包人员日常在发包单位固定场所工作,使用发包单位提供的专属工位、标识(如工卡)、电脑设备等,表明其工作环境高度受控于发包单位,构成'实质派遣'。",
|
||||
"",
|
||||
"①《中华人民共和国劳动合同法》及其实施条例;\n②《中华人民共和国民法典》"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"3.核查劳务外包服务的费用结算依据是否符合外包法律特征",
|
||||
"①结算相关的凭证:付款审批单,结算单据(如项目验收单、承揽书、成果清单及对应金额),发票;\n②访谈记录(文档或音频)",
|
||||
"1.检查凭证,验证实际结算方式。\n检查付款审批流程中的结算依据,以及外包公司提供的结算材料,\n①如果结算材料表明该'外包'实际以'人员数量、岗位配置、服务时长或出勤天数(隐含'人头费'逻辑)'等指标结算费用,则构成'实质派遣'。\n②'劳务外包'结算需以项目成果为依据,形成合同→验收单→发票的完整凭证链。结算金额与成果量挂钩,结算单、请款函等文件需基于项目验收单、承揽书等成果凭证生成,以此构成'劳务外包'的合规流程。\n2.访谈财务及外包项目负责人,核实以下事项:\n①费用计算依据:若与外包人员数量及工时无关,则属于真实'劳务外包';反之,可能构成'劳务派遣';\n②结算调整机制:项目延期或增量时,真实外包应以成果变更调整结算,而非仅追加人员费用。",
|
||||
"",
|
||||
"①《中华人民共和国劳动合同法》及其实施条例;\n②《中华人民共和国民法典》"
|
||||
)
|
||||
));
|
||||
|
||||
// 3. 检查人员经费的使用是否规范
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[2], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.检查工资总额控制:工资性支出是否突破国资监管部门核定的年度总额上限,及超限额部分是否按规定完成审批报备",
|
||||
"① 年度工资总额批复文件;\n② 年度工资汇总统计表;\n③ 超预算调整审批记录",
|
||||
"核查实发工资总额与批复额度的一致性,确认超支部分是否履行相关决策程序(如职工代表大会审议、国资委备案等),并列出工资总额执行差异",
|
||||
"生成审计取证单",
|
||||
"①自治区国资委关于印发《自治区国资委履行出资人职责企业工资总额管理办法》的通知 - 政务公开 - 防城港市人民政府 -\n②企业内控制度\n③《中华人民共和国劳动合同法》第四条 职工代表大会"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.检查福利费列支范围:福利费支出的合规性,有无违规发放补贴、变相薪酬行为",
|
||||
"① 福利费明细账及原始凭证;\n② 职工福利制度文件;\n③ 补贴发放签收记录",
|
||||
"对福利费支出项目进行抽查,依据制度文件审核合规性,发现违规支出的,列出超范围支出明细清单。",
|
||||
"生成审计取证单",
|
||||
"①财政部关于企业加强职工福利费财务管理的通知\n②企业内控制度"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"3.检查劳务费真实性:是否存在虚构人员套取资金等虚假劳务支出行为",
|
||||
"① 劳务合同;\n② 服务成果交付证明(如报告、验收单);\n③ 支付凭证(包括收款方信息及银行流水)",
|
||||
"①通过天眼查或国家企业信用信息公示系统核查劳务提供方身份真实性;\n②对比服务成果与合同约定内容是否匹配;\n③对核查中发现的问题如实记录。",
|
||||
"生成审计取证单",
|
||||
"①《中华人民共和国会计法》第四十三条\n②《财政违法行为处罚处分条例》第七条"
|
||||
)
|
||||
));
|
||||
|
||||
// 4. 检查借用人员管理规范性
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[3], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.检查借用程序合规性",
|
||||
"①借调相关材料(含沟通记录及正式文件),三方协议(如有)\n②实际在岗证明文件(考勤记录);\n③续借审批文件",
|
||||
"①借用必要性审查:根据借调相关材料,核查借调事由是否合理,是否存在以工作专班、跟班学习或交流锻炼等名义变相借调的情况。\n②借用程序合规性审查:对照单位借用人员制度,核查借调审批手续是否齐全,以及是否经本单位党组(党委)审批并报同级党委组织部门备案。\n③借用期限审查:核查借调文件约定的首次借调期限是否超过6个月;结合实际在岗证明文件(考勤记录),若实际存在延期情形,是否已提前征得派出单位和本人同意。",
|
||||
"合并生成一个审计取证单",
|
||||
"①中共中央办公厅 国务院办公厅印发《整治形式主义为基层减负若干规定》————头条——中央纪委国家监委网站;\n②企业内控制度"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.检查经费列支规范性:借用人员费用报销等是否存在重复列支或违规转嫁费用行为",
|
||||
"①审计期间借用人员名单;\n②费用报销凭证及其明细账;\n③借用人员访谈记录",
|
||||
"根据借用人员名单,在费用报销明细账中核查相关报销记录。依据借调文件或三方协议中明确的福利待遇等承担主体,结合对借用人员的访谈记录,审查是否存在同一借用人员的费用同时在借出单位与借入单位列支的情况。",
|
||||
"",
|
||||
"①中共中央办公厅 国务院办公厅印发《整治形式主义为基层减负若干规定》————头条——中央纪委国家监委网站;\n②企业内控制度"
|
||||
)
|
||||
));
|
||||
|
||||
// 5. 绩效管理体系健全性、合规性
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[4], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.确认绩效管理体系健全、制度流程符合法规要求",
|
||||
"①所有内控制度\n②绩效考核制度发文记录、职工代表大会审议签字文件、制度修订记录等",
|
||||
"①制度存在性审查:根据关键字,检索被审计单位所有制度,是否有员工绩效考核的制度规定。如有派遣工的,需检查是否有管派遣工的考核管理,并输出《制度清单》(含制度名称、文号、生效日期、具体条文等)。\n②纵向合规性比对:将被审计单位的考核办法与国家、自治区、上级单位比较,检查是否存在与上级制度相悖的情况,并标记冲突点。\n③横向一致性检查:与本单位的薪酬分配、干部管理、廉洁从业等其他内部控制制度比较,检查绩效考核的协同性,是否存在单位制度'左右脑互博'的情况,并标记冲突点。\n④确认是否绩效考核体系制度的设立是否已履行民主程序(应当经职工代表大会或全体职工讨论,协商确定);\n⑤根据以上检测出的问题,生成《绩效管理体系健全性、合规性审查审计取证单》,含客观事实描述、违规性质(是否需要?)、制度依据、审计建议等内容。",
|
||||
"合并生成一个审计取证单",
|
||||
"①《中华人民共和国劳动合同法》第四条;\n②《中央企业负责人经营业绩考核办法》;\n③国务院国资委《企业绩效评价标准值》(每年更新)\n⑤国资委回复:国有企业考核分配、工资总额相关的25个问题 http://www.sasac.gov.cn/n2588040/n2590387/n9854182/index.html\n⑥自治区国资委关于印发《关于进一步深化自治区国资委履行出资人职责企业劳动用工和收入分配制度改革的指导意见(试行)》的通知;\n⑦企业内控制度等"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.绩效考核程序执行规范性",
|
||||
"①考核表确认记录;\n②民主评议、领导评价记录;\n③绩效考核相关会议纪要、记录;\n④申诉处理记录(如有)等",
|
||||
"①每个部门各抽查X份记录,检查考核表、民主评议、领导评价记录及其签字的完整性;\n②如有申述,检查申诉响应时效;\n③生成《绩效考核程序执行规范性审计取证单》",
|
||||
"",
|
||||
"企业内控制度"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"3.绩效考核结果合规性",
|
||||
"①工资计算表\n②职务任免文件",
|
||||
"①检查工资计算与绩效考核结果是否呈正相关;\n②审核晋升人员绩效排名情况,是否存在低绩效仍获晋升的现象。",
|
||||
"",
|
||||
"企业内控制度"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"4.验证系统数据准确性",
|
||||
"①HR系统考核记录\n②纸质存档文件\n③工资发放明细",
|
||||
"抽查样本,核验系统与纸质文件数据的一致性,并检查人员绩效等级是否存在差异",
|
||||
"",
|
||||
"企业内控制度"
|
||||
)
|
||||
));
|
||||
|
||||
// 6. 检查机构编制合规性
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[5], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.验证编制审批流程是否完整",
|
||||
"机构设立批文、编制批文('三定'方案)",
|
||||
"对比实际部门数量与编制文件;检查新增机构是否经上级编办审批",
|
||||
"合并生成一个审计取证单",
|
||||
"①《中国共产党机构编制工作条例》;\n②《'三定'规定制定和实施办法》559920f6ac788c5c8b2ee86842f36a96.pdf——行政事业单位适用;\n③《机构编制监督检查工作办法》;\n④机构编制违规违纪违法行为处理和问责规则(试行)"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.验证是否按批复编制设置部门",
|
||||
"被审计单位组织架构图、职能说明书",
|
||||
"对比实际部门设置与编制文件是否一致;检查新增机构是否经上级编办审批,识别并标注是否存在未经批复的新增、撤销的临时机构。",
|
||||
"",
|
||||
"①《中国共产党机构编制工作条例》;\n②《'三定'规定制定和实施办法》559920f6ac788c5c8b2ee86842f36a96.pdf——行政事业单位适用;\n③《机构编制监督检查工作办法》;\n④机构编制违规违纪违法行为处理和问责规则(试行)"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"3.被审计单位职数是否超标",
|
||||
"党委、董事会成员名单、高管任职文件、员工花名册(含职务、职级等)",
|
||||
"统计实际高管人数,并比对编制文件规定的领导职数阈值;",
|
||||
"",
|
||||
"①《中国共产党机构编制工作条例》;\n②《'三定'规定制定和实施办法》559920f6ac788c5c8b2ee86842f36a96.pdf——行政事业单位适用;\n③《机构编制监督检查工作办法》;\n④机构编制违规违纪违法行为处理和问责规则(试行)"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"4.编制总量控制:岗位编制是否超核定标准",
|
||||
"编制核定表、社保缴纳人数统计",
|
||||
"抓取编制批文中机构名称、编制数量,与被审计单位实际部门清单、人力资源部门岗位数量自动比对。",
|
||||
"",
|
||||
"①《中国共产党机构编制工作条例》;\n②《'三定'规定制定和实施办法》559920f6ac788c5c8b2ee86842f36a96.pdf——行政事业单位适用;\n③《机构编制监督检查工作办法》;\n④机构编制违规违纪违法行为处理和问责规则(试行)"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"5.编制调整是否履行审批",
|
||||
"编制调整审批文件(可能包含OA系统日志)",
|
||||
"需结合被审计单位、国资委或上级单位关于编制调整的审批流程判断。另检查编制调整流程是否在OA系统完整留痕(发起→审核→批复)。",
|
||||
"",
|
||||
"①《中国共产党机构编制工作条例》;\n②《'三定'规定制定和实施办法》559920f6ac788c5c8b2ee86842f36a96.pdf——行政事业单位适用;\n③《机构编制监督检查工作办法》;\n④机构编制违规违纪违法行为处理和问责规则(试行)"
|
||||
)
|
||||
));
|
||||
|
||||
// 7. 预算编制与实际执行差异
|
||||
AUDIT_SUB_CONTENTS.put(AUDIT_CONTENTS[6], Arrays.asList(
|
||||
new AuditSubContent(
|
||||
"1.验证人员经费真实性,预算申报是否与实有人数匹配",
|
||||
"工资预算表、工资发放明细表、考勤数据、每月社保缴纳明细等",
|
||||
"比对预算人数与社保实缴人数,抽查离职人员工资停发时效,检查是否存在虚报人数、'吃空饷'情况,并列出涉及金额。",
|
||||
"生成审计取证单",
|
||||
"①中华人民共和国预算法_中国人大网;\n②《中华人民共和国预算法实施条例》;\n③企业内控制度"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"2.检查职级成本是否合规",
|
||||
"工资预算表、员工花名册(含职务、职级等)、个税申报记录等",
|
||||
"识别'高职低编'薪酬倒挂人员,计算其薪酬超出编制标准部分",
|
||||
"生成审计取证单",
|
||||
"①中华人民共和国预算法_中国人大网;\n②《中华人民共和国预算法实施条例》;\n③企业内控制度"
|
||||
),
|
||||
new AuditSubContent(
|
||||
"3.检查项目经费合规性,是否违规使用项目经费支付超编人员成本",
|
||||
"项目预算明细、费用报销凭证、人员分工表",
|
||||
"分析项目支出中人工成本占比,核查超编人员参与项目合理性,并列出比例、金额。",
|
||||
"生成审计取证单",
|
||||
"①中华人民共和国预算法_中国人大网;\n②《中华人民共和国预算法实施条例》;\n③企业内控制度"
|
||||
)
|
||||
));
|
||||
}
|
||||
|
||||
// 审计子内容类
|
||||
public static class AuditSubContent {
|
||||
private String auditTarget;
|
||||
private String auditEvidence;
|
||||
private String aiTestContent;
|
||||
private String generationResult;
|
||||
private String regulationBasis;
|
||||
|
||||
public AuditSubContent(String auditTarget, String auditEvidence, String aiTestContent,
|
||||
String generationResult, String regulationBasis) {
|
||||
this.auditTarget = auditTarget;
|
||||
this.auditEvidence = auditEvidence;
|
||||
this.aiTestContent = aiTestContent;
|
||||
this.generationResult = generationResult;
|
||||
this.regulationBasis = regulationBasis;
|
||||
}
|
||||
|
||||
public String getAuditTarget() { return auditTarget; }
|
||||
public String getAuditEvidence() { return auditEvidence; }
|
||||
public String getAiTestContent() { return aiTestContent; }
|
||||
public String getGenerationResult() { return generationResult; }
|
||||
public String getRegulationBasis() { return regulationBasis; }
|
||||
}
|
||||
|
||||
// 关键词权重
|
||||
public static final Map<String, Integer> KEYWORD_WEIGHTS = new HashMap<>();
|
||||
static {
|
||||
KEYWORD_WEIGHTS.put("劳务派遣", 10);
|
||||
KEYWORD_WEIGHTS.put("人员编制", 9);
|
||||
KEYWORD_WEIGHTS.put("外包", 8);
|
||||
KEYWORD_WEIGHTS.put("同工同酬", 9);
|
||||
KEYWORD_WEIGHTS.put("三性标准", 8);
|
||||
KEYWORD_WEIGHTS.put("工资总额", 8);
|
||||
KEYWORD_WEIGHTS.put("福利费", 7);
|
||||
KEYWORD_WEIGHTS.put("绩效考核", 8);
|
||||
KEYWORD_WEIGHTS.put("机构编制", 9);
|
||||
KEYWORD_WEIGHTS.put("预算编制", 7);
|
||||
KEYWORD_WEIGHTS.put("假外包真派遣", 10);
|
||||
KEYWORD_WEIGHTS.put("借用人员", 7);
|
||||
KEYWORD_WEIGHTS.put("用工合规", 9);
|
||||
KEYWORD_WEIGHTS.put("人员经费", 8);
|
||||
}
|
||||
|
||||
// 审计方法
|
||||
public static final List<String> AUDIT_METHODS = Arrays.asList(
|
||||
"文档审查", "数据分析", "访谈调查", "现场观察", "抽样测试",
|
||||
"对比分析", "穿行测试", "合规性检查", "制度评价"
|
||||
);
|
||||
|
||||
private AuditContent9PersonnelConstants() {
|
||||
// 防止实例化
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.gxwebsoft.ai.constants;
|
||||
|
||||
public class KnowledgeBaseConstants {
|
||||
|
||||
public static final String[] KEY_WORDS = {
|
||||
"",
|
||||
"审计依据 法律法规 审计业务约定书 经济责任审计管理办法 中共中央办公厅 国务院办公厅 党政主要领导干部审计规定 国家法规 公司管理制度 年度工作目标 党政主要领导干部经济责任审计规定",
|
||||
"审计目标 经济责任审计目标 资产负债损益真实性 合法性 效益性 经济指标完成情况 重大决策执行 遵守财经法规 国有资产保值增值 经济责任评价 任职期间履职评价 责任界定 业绩评价",
|
||||
"审计对象 审计范围 被审计领导干部 [职务] [姓名] 任职期间 [开始日期]至[结束日期] 职务任期 重大问题追溯 重要事项延伸 审计时限 下属子公司 代管企业",
|
||||
"被审计单位基本情况 单位概况 组织机构 人员结构 财务会计政策 合并口径财务数据 资产总额 负债总额 营业收入 利润 内部控制制度 子公司 代管企业 职能部门设置 合并财务报表",
|
||||
"审计内容 审计重点 贯彻执行经济方针 重大决策执行 发展战略 年度目标完成 法人治理结构 内部控制 财务真实性 风险管控 党风廉政建设 以往审计整改 三重一大经济决策 资产管理 采购管理 债权债务",
|
||||
"审计风险 证据不充分 评价不客观 内部控制失效 法律法规变化 风险应对策略 审计证据充分性 评价客观性 内部控制审查 法规政策跟踪 重要性水平",
|
||||
"审计方法 穿行测试 趋势分析 比率分析 访谈法 数据分析 分析性程序 检查 监盘 观察 询问 函证 计算 重新执行",
|
||||
"审计步骤 时间安排 准备阶段 实施阶段 报告阶段 归档阶段 审计人员安排 资料收集 实质性程序 审计报告编写 交换意见 审计归档 进点会 进度表",
|
||||
"审计组织实施 审计组人员分工 职责分配 审计工作计划 前期调研 审前培训 实地审计 质量控制 内部培训 沟通协调 分级复核 集体讨论 重大事项汇报 里程碑事件清单 审计工作组 项目负责人 主审"
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.ai.service.AiCloudDocService;
|
||||
import com.gxwebsoft.ai.service.AiCloudFileService;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import com.gxwebsoft.ai.entity.AiCloudDoc;
|
||||
import com.gxwebsoft.ai.entity.AiCloudFile;
|
||||
import com.gxwebsoft.ai.param.AiCloudDocParam;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.core.web.PageParam;
|
||||
import com.gxwebsoft.common.core.web.BatchParam;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI云文档目录表控制器
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Tag(name = "AI云文档目录表管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/doc")
|
||||
public class AiCloudDocController extends BaseController {
|
||||
@Resource
|
||||
private AiCloudDocService aiCloudDocService;
|
||||
@Resource
|
||||
private AiCloudFileService aiCloudFileService;
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:list')")
|
||||
@Operation(summary = "分页查询AI云文档目录表")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<AiCloudDoc>> page(AiCloudDocParam param) {
|
||||
// 使用关联查询
|
||||
return success(aiCloudDocService.pageRel(param));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:list')")
|
||||
@Operation(summary = "查询全部AI云文档目录表")
|
||||
@GetMapping()
|
||||
public ApiResult<List<AiCloudDoc>> list(AiCloudDocParam param) {
|
||||
// 使用关联查询
|
||||
return success(aiCloudDocService.listRel(param));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:list')")
|
||||
@Operation(summary = "根据id查询AI云文档目录表")
|
||||
@GetMapping("/{id}")
|
||||
public ApiResult<AiCloudDoc> get(@PathVariable("id") Integer id) {
|
||||
// 使用关联查询
|
||||
return success(aiCloudDocService.getByIdRel(id));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:list')")
|
||||
@Operation(summary = "根据ids查询AI云文档目录表")
|
||||
@GetMapping("/byIds/{ids}")
|
||||
public ApiResult<List<AiCloudDoc>> getByIds(@PathVariable("ids") String ids) {
|
||||
List<String> idList = StrUtil.split(ids, ',');
|
||||
List<AiCloudDoc> ret = aiCloudDocService.list(new LambdaQueryWrapper<AiCloudDoc>().in(AiCloudDoc::getId, idList));
|
||||
return success(ret);
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:save')")
|
||||
@Operation(summary = "添加AI云文档目录表")
|
||||
@PostMapping()
|
||||
public ApiResult<?> save(@RequestBody AiCloudDoc aiCloudDoc) {
|
||||
// 记录当前登录用户id
|
||||
User loginUser = getLoginUser();
|
||||
if (loginUser != null) {
|
||||
aiCloudDoc.setUserId(loginUser.getUserId());
|
||||
}
|
||||
if(aiCloudDoc.getParentId()>0) {
|
||||
AiCloudDoc aiCloudDocParent = aiCloudDocService.getByIdRel(aiCloudDoc.getParentId());
|
||||
aiCloudDoc.setCategoryId(aiCloudDocParent.getCategoryId());
|
||||
aiCloudDoc.setCompanyId(aiCloudDocParent.getCompanyId());
|
||||
}
|
||||
if (aiCloudDocService.save(aiCloudDoc)) {
|
||||
return success("添加成功");
|
||||
}
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:update')")
|
||||
@Operation(summary = "修改AI云文档目录表")
|
||||
@PutMapping()
|
||||
public ApiResult<?> update(@RequestBody AiCloudDoc aiCloudDoc) {
|
||||
if (aiCloudDocService.updateById(aiCloudDoc)) {
|
||||
return success("修改成功");
|
||||
}
|
||||
return fail("修改失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:remove')")
|
||||
@Operation(summary = "删除AI云文档目录表")
|
||||
@DeleteMapping("/{id}")
|
||||
public ApiResult<?> remove(@PathVariable("id") Integer id) {
|
||||
if(aiCloudFileService.count(new LambdaQueryWrapper<AiCloudFile>().eq(AiCloudFile::getDocId, id))>0) {
|
||||
return fail("删除失败,当前目录下存在文件");
|
||||
}
|
||||
if (aiCloudDocService.removeById(id)) {
|
||||
return success("删除成功");
|
||||
}
|
||||
return fail("删除失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:save')")
|
||||
@Operation(summary = "批量添加AI云文档目录表")
|
||||
@PostMapping("/batch")
|
||||
public ApiResult<?> saveBatch(@RequestBody List<AiCloudDoc> list) {
|
||||
if (aiCloudDocService.saveBatch(list)) {
|
||||
return success("添加成功");
|
||||
}
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:update')")
|
||||
@Operation(summary = "批量修改AI云文档目录表")
|
||||
@PutMapping("/batch")
|
||||
public ApiResult<?> removeBatch(@RequestBody BatchParam<AiCloudDoc> batchParam) {
|
||||
if (batchParam.update(aiCloudDocService, "id")) {
|
||||
return success("修改成功");
|
||||
}
|
||||
return fail("修改失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudDoc:remove')")
|
||||
@Operation(summary = "批量删除AI云文档目录表")
|
||||
@DeleteMapping("/batch")
|
||||
public ApiResult<?> removeBatch(@RequestBody List<Integer> ids) {
|
||||
if (aiCloudDocService.removeByIds(ids)) {
|
||||
return success("删除成功");
|
||||
}
|
||||
return fail("删除失败");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.ai.service.AiCloudFileService;
|
||||
import com.gxwebsoft.ai.entity.AiCloudFile;
|
||||
import com.gxwebsoft.ai.param.AiCloudFileParam;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.core.web.BatchParam;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* AI云文件表控制器
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Tag(name = "AI云文件表管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/file")
|
||||
public class AiCloudFileController extends BaseController {
|
||||
|
||||
@Resource
|
||||
private AiCloudFileService aiCloudFileService;
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:list')")
|
||||
@Operation(summary = "分页查询AI云文件表")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<AiCloudFile>> page(AiCloudFileParam param) {
|
||||
return success(aiCloudFileService.pageRel(param));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:list')")
|
||||
@Operation(summary = "查询全部AI云文件表")
|
||||
@GetMapping()
|
||||
public ApiResult<List<AiCloudFile>> list(AiCloudFileParam param) {
|
||||
return success(aiCloudFileService.listRel(param));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:list')")
|
||||
@Operation(summary = "根据id查询AI云文件表")
|
||||
@GetMapping("/{id}")
|
||||
public ApiResult<AiCloudFile> get(@PathVariable("id") Integer id) {
|
||||
return success(aiCloudFileService.getByIdRel(id));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:list')")
|
||||
@Operation(summary = "根据ids查询AI云文件表")
|
||||
@GetMapping("/byIds/{ids}")
|
||||
public ApiResult<List<AiCloudFile>> getByIds(@PathVariable("ids") String ids) {
|
||||
List<String> idList = cn.hutool.core.util.StrUtil.split(ids, ',');
|
||||
List<AiCloudFile> ret = aiCloudFileService.list(new LambdaQueryWrapper<AiCloudFile>().in(AiCloudFile::getId, idList));
|
||||
return success(ret);
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:save')")
|
||||
@Operation(summary = "添加AI云文件表")
|
||||
@PostMapping()
|
||||
public ApiResult<?> save(@RequestBody AiCloudFile aiCloudFile) {
|
||||
User loginUser = getLoginUser();
|
||||
if (loginUser != null) {
|
||||
aiCloudFile.setUserId(loginUser.getUserId());
|
||||
}
|
||||
if (aiCloudFileService.save(aiCloudFile)) {
|
||||
return success("添加成功");
|
||||
}
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:update')")
|
||||
@Operation(summary = "修改AI云文件表")
|
||||
@PutMapping()
|
||||
public ApiResult<?> update(@RequestBody AiCloudFile aiCloudFile) {
|
||||
if (aiCloudFileService.updateById(aiCloudFile)) {
|
||||
return success("修改成功");
|
||||
}
|
||||
return fail("修改失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:remove')")
|
||||
@Operation(summary = "删除AI云文件表")
|
||||
@DeleteMapping("/{id}")
|
||||
public ApiResult<?> remove(@PathVariable("id") Integer id) {
|
||||
if (aiCloudFileService.removeFileWithCloudAndIndex(id)) {
|
||||
return success("删除成功");
|
||||
}
|
||||
return fail("删除失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:save')")
|
||||
@Operation(summary = "批量添加AI云文件表")
|
||||
@PostMapping("/batch")
|
||||
public ApiResult<?> saveBatch(@RequestBody List<AiCloudFile> list) {
|
||||
if (aiCloudFileService.saveBatch(list)) {
|
||||
return success("添加成功");
|
||||
}
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:update')")
|
||||
@Operation(summary = "批量修改AI云文件表")
|
||||
@PutMapping("/batch")
|
||||
public ApiResult<?> removeBatch(@RequestBody BatchParam<AiCloudFile> batchParam) {
|
||||
if (batchParam.update(aiCloudFileService, "id")) {
|
||||
return success("修改成功");
|
||||
}
|
||||
return fail("修改失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiCloudFile:remove')")
|
||||
@Operation(summary = "批量删除AI云文件表")
|
||||
@DeleteMapping("/batch")
|
||||
public ApiResult<?> removeBatch(@RequestBody List<Integer> ids) {
|
||||
if (aiCloudFileService.removeFilesWithCloudAndIndex(ids)) {
|
||||
return success("删除成功");
|
||||
}
|
||||
return fail("删除失败");
|
||||
}
|
||||
|
||||
@Operation(summary = "上传文档到云中心")
|
||||
@PostMapping("/uploadFiles")
|
||||
public ApiResult<?> uploadFiles(@RequestParam Integer docId, @RequestParam String categoryId, @RequestParam("files") MultipartFile[] files) {
|
||||
try {
|
||||
if (files == null || files.length == 0) {
|
||||
return fail("请选择要上传的文件");
|
||||
}
|
||||
|
||||
if (files.length > 10) {
|
||||
return fail("一次最多只能上传10个文件");
|
||||
}
|
||||
|
||||
User loginUser = getLoginUser();
|
||||
|
||||
List<CompletableFuture<String>> futures = new ArrayList<>();
|
||||
List<String> successFiles = new ArrayList<>();
|
||||
List<String> failedFiles = new ArrayList<>();
|
||||
|
||||
// 收集所有异步任务
|
||||
for (MultipartFile file : files) {
|
||||
if (file.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (file.getSize() > 100 * 1024 * 1024) {
|
||||
failedFiles.add(file.getOriginalFilename() + "(文件过大)");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 调用Service层的异步方法并收集Future
|
||||
CompletableFuture<String> future = aiCloudFileService.processFileAsync(categoryId, docId, file, loginUser);
|
||||
futures.add(future);
|
||||
}
|
||||
|
||||
// 等待所有异步任务完成
|
||||
CompletableFuture<Void> allFutures = CompletableFuture.allOf(
|
||||
futures.toArray(new CompletableFuture[0])
|
||||
);
|
||||
|
||||
// 获取所有任务结果
|
||||
CompletableFuture<List<String>> allResults = allFutures.thenApply(v ->
|
||||
futures.stream()
|
||||
.map(CompletableFuture::join)
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
|
||||
// 等待所有任务完成并处理结果
|
||||
List<String> results = allResults.get(10, TimeUnit.MINUTES); // 设置10分钟超时
|
||||
|
||||
List<String> fileIds = new ArrayList<>();
|
||||
// 统计成功和失败的文件
|
||||
for (int i = 0; i < futures.size(); i++) {
|
||||
CompletableFuture<String> future = futures.get(i);
|
||||
try {
|
||||
String fileId = future.get();
|
||||
fileIds.add(fileId);
|
||||
successFiles.add(files[i].getOriginalFilename());
|
||||
} catch (Exception e) {
|
||||
failedFiles.add(files[i].getOriginalFilename() + "(" + e.getCause().getMessage() + ")");
|
||||
}
|
||||
}
|
||||
|
||||
// 构建返回消息
|
||||
StringBuilder message = new StringBuilder("文件上传完成");
|
||||
if (!successFiles.isEmpty()) {
|
||||
message.append(",成功上传: ").append(successFiles.size()).append("个");
|
||||
}
|
||||
if (!failedFiles.isEmpty()) {
|
||||
message.append(",失败: ").append(String.join("、", failedFiles));
|
||||
}
|
||||
|
||||
// 返回前提交上传的文档到单位默认知识库
|
||||
aiCloudFileService.submitDocuments(docId, fileIds);
|
||||
|
||||
return success(message.toString());
|
||||
|
||||
} catch (Exception e) {
|
||||
return fail("上传失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.gxwebsoft.ai.entity.AiHistory;
|
||||
import com.gxwebsoft.ai.param.AiHistoryParam;
|
||||
import com.gxwebsoft.ai.service.AiHistoryService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.core.web.BatchParam;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI审计历史记录表控制器
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Tag(name = "AI审计历史记录表管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/history")
|
||||
public class AiHistoryController extends BaseController {
|
||||
@Resource
|
||||
private AiHistoryService aiHistoryService;
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:list')")
|
||||
@Operation(summary = "分页查询AI审计历史记录表")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<AiHistory>> page(AiHistoryParam param) {
|
||||
// 使用关联查询
|
||||
return success(aiHistoryService.pageRel(param));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:list')")
|
||||
@Operation(summary = "查询全部AI审计历史记录表")
|
||||
@GetMapping()
|
||||
public ApiResult<List<AiHistory>> list(AiHistoryParam param) {
|
||||
// 使用关联查询
|
||||
return success(aiHistoryService.listRel(param));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:list')")
|
||||
@Operation(summary = "根据id查询AI审计历史记录表")
|
||||
@GetMapping("/{id}")
|
||||
public ApiResult<AiHistory> get(@PathVariable("id") Long id) {
|
||||
// 使用关联查询
|
||||
return success(aiHistoryService.getByIdRel(id));
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:save')")
|
||||
@Operation(summary = "添加AI审计历史记录表")
|
||||
@PostMapping()
|
||||
public ApiResult<?> save(@RequestBody AiHistory aiHistory) {
|
||||
// 记录当前登录用户id
|
||||
User loginUser = getLoginUser();
|
||||
if (loginUser != null) {
|
||||
aiHistory.setUserId(loginUser.getUserId());
|
||||
aiHistory.setUsername(loginUser.getUsername());
|
||||
}
|
||||
if (aiHistoryService.save(aiHistory)) {
|
||||
return success("添加成功");
|
||||
}
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:update')")
|
||||
@Operation(summary = "修改AI审计历史记录表")
|
||||
@PutMapping()
|
||||
public ApiResult<?> update(@RequestBody AiHistory aiHistory) {
|
||||
if (aiHistoryService.updateById(aiHistory)) {
|
||||
return success("修改成功");
|
||||
}
|
||||
return fail("修改失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:remove')")
|
||||
@Operation(summary = "删除AI审计历史记录表")
|
||||
@DeleteMapping("/{id}")
|
||||
public ApiResult<?> remove(@PathVariable("id") Long id) {
|
||||
if (aiHistoryService.removeById(id)) {
|
||||
return success("删除成功");
|
||||
}
|
||||
return fail("删除失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:save')")
|
||||
@Operation(summary = "批量添加AI审计历史记录表")
|
||||
@PostMapping("/batch")
|
||||
public ApiResult<?> saveBatch(@RequestBody List<AiHistory> list) {
|
||||
User loginUser = getLoginUser();
|
||||
if (loginUser != null) {
|
||||
for (AiHistory history : list) {
|
||||
history.setUserId(loginUser.getUserId());
|
||||
history.setUsername(loginUser.getUsername());
|
||||
}
|
||||
}
|
||||
if (aiHistoryService.saveBatch(list)) {
|
||||
return success("添加成功");
|
||||
}
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:update')")
|
||||
@Operation(summary = "批量修改AI审计历史记录表")
|
||||
@PutMapping("/batch")
|
||||
public ApiResult<?> removeBatch(@RequestBody BatchParam<AiHistory> batchParam) {
|
||||
if (batchParam.update(aiHistoryService, "id")) {
|
||||
return success("修改成功");
|
||||
}
|
||||
return fail("修改失败");
|
||||
}
|
||||
|
||||
//@PreAuthorize("hasAuthority('ai:aiHistory:remove')")
|
||||
@Operation(summary = "批量删除AI审计历史记录表")
|
||||
@DeleteMapping("/batch")
|
||||
public ApiResult<?> removeBatch(@RequestBody List<Long> ids) {
|
||||
if (aiHistoryService.removeByIds(ids)) {
|
||||
return success("删除成功");
|
||||
}
|
||||
return fail("删除失败");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.PartyConductExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent10PartyConductService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容10控制器 - 党风廉政建设责任制审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容10-廉政情况")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent10")
|
||||
public class AuditContent10Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent10PartyConductService auditContent10PartyConductService;
|
||||
|
||||
/**
|
||||
* 生成党风廉政建设责任制审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成党风廉政建设责任制审计表")
|
||||
@PostMapping("/generatePartyConductTable")
|
||||
public ApiResult<?> generatePartyConductTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent10PartyConductService.generatePartyConductTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出党风廉政建设责任制审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出党风廉政建设责任制审计表到Excel")
|
||||
@PostMapping("/exportPartyConductTable")
|
||||
public void exportPartyConductTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "党风廉政建设责任制审计表",
|
||||
this::convertToPartyConductEntityList, PartyConductExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<PartyConductExportEntity> convertToPartyConductEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToPartyConductEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private PartyConductExportEntity convertToPartyConductEntity(Map<String, Object> item) {
|
||||
PartyConductExportEntity entity = new PartyConductExportEntity();
|
||||
entity.setCategory(getStringValue(item, "category"));
|
||||
entity.setSubCategory(getStringValue(item, "subCategory"));
|
||||
entity.setDetailCategory(getStringValue(item, "detailCategory"));
|
||||
entity.setContent(getStringValue(item, "content"));
|
||||
entity.setExecutionStatus(getStringValue(item, "executionStatus"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.HistoryTableExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent11HistoryService;
|
||||
import com.gxwebsoft.ai.utils.ExcelExportTool;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容11控制器 - 历史审计问题整改表
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容11-历史审计问题整改")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent11")
|
||||
public class AuditContent11Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent11HistoryService auditContent11HistoryService;
|
||||
|
||||
/**
|
||||
* 生成历史审计问题整改表数据
|
||||
*/
|
||||
@Operation(summary = "生成历史审计问题整改表")
|
||||
@PostMapping("/generateHistoryTable")
|
||||
public ApiResult<?> generateHistoryTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent11HistoryService.generateHistoryTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出历史审计问题整改表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出历史审计问题整改表到Excel")
|
||||
@PostMapping("/exportHistoryTable")
|
||||
public void exportHistoryTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.get("data");
|
||||
String companyName = (String) request.get("companyName");
|
||||
String auditTime = (String) request.get("auditTime");
|
||||
|
||||
List<HistoryTableExportEntity> exportData = convertToHistoryTableEntityList(dataList);
|
||||
|
||||
String fileName = "历史审计问题整改表_" + (companyName != null ? companyName : "未知公司");
|
||||
String sheetName = "历史审计问题整改表";
|
||||
String title = companyName != null ?
|
||||
companyName + " - 历史审计问题整改表" + (auditTime != null ? "(" + auditTime + ")" : "") :
|
||||
"历史审计问题整改表";
|
||||
|
||||
ExcelExportTool.exportExcel(exportData, HistoryTableExportEntity.class, fileName, sheetName, title, response);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<HistoryTableExportEntity> convertToHistoryTableEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream()
|
||||
.map(this::convertToHistoryTableEntity)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private HistoryTableExportEntity convertToHistoryTableEntity(Map<String, Object> item) {
|
||||
HistoryTableExportEntity entity = new HistoryTableExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setAuditYear(getStringValue(item, "auditYear"));
|
||||
entity.setAuditType(getStringValue(item, "auditType"));
|
||||
entity.setProblemFound(getStringValue(item, "problemFound"));
|
||||
entity.setRectificationRequirement(getStringValue(item, "rectificationRequirement"));
|
||||
entity.setRectificationMeasures(getStringValue(item, "rectificationMeasures"));
|
||||
entity.setRectificationStatus(getStringValue(item, "rectificationStatus"));
|
||||
entity.setCompletionDate(getStringValue(item, "completionDate"));
|
||||
entity.setResponsiblePerson(getStringValue(item, "responsiblePerson"));
|
||||
entity.setRemark(getStringValue(item, "remark"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.EightRegExportEntity;
|
||||
import com.gxwebsoft.ai.dto.export.ExpenseExportEntity;
|
||||
import com.gxwebsoft.ai.dto.export.LeaderListExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent1EightRegService;
|
||||
import com.gxwebsoft.ai.service.AuditContent1ExpenseService;
|
||||
import com.gxwebsoft.ai.service.AuditContent1LeaderListService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容1控制器 - 八项规定对比分析
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容1-八项规定")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent1")
|
||||
public class AuditContent1Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent1LeaderListService auditContent1LeaderListService;
|
||||
|
||||
@Autowired
|
||||
private AuditContent1ExpenseService auditContent1ExpenseService;
|
||||
|
||||
@Autowired
|
||||
private AuditContent1EightRegService auditContent1EightRegService;
|
||||
|
||||
/**
|
||||
* 生成领导班子名单数据
|
||||
*/
|
||||
@Operation(summary = "生成领导班子名单")
|
||||
@PostMapping("/generateLeaderListTable")
|
||||
public ApiResult<?> generateLeaderListTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent1LeaderListService.generateLeaderListTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成支出情况表数据
|
||||
*/
|
||||
@Operation(summary = "生成支出情况表")
|
||||
@PostMapping("/generateExpenseTable")
|
||||
public ApiResult<?> generateExpenseTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent1ExpenseService.generateExpenseTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成八项规定对比分析表数据
|
||||
*/
|
||||
@Operation(summary = "生成八项规定对比分析表")
|
||||
@PostMapping("/generateEightRegTable")
|
||||
public ApiResult<?> generateEightRegTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent1EightRegService.generateEightRegTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出八项规定对比分析表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出八项规定对比分析表到Excel")
|
||||
@PostMapping("/exportEightRegTable")
|
||||
public void exportEightRegTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "八项规定对比分析表",
|
||||
this::convertToEightRegEntityList, EightRegExportEntity.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出领导班子名单到Excel
|
||||
*/
|
||||
@Operation(summary = "导出领导班子名单到Excel")
|
||||
@PostMapping("/exportLeaderListTable")
|
||||
public void exportLeaderListTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "领导班子名单",
|
||||
this::convertToLeaderListEntityList, LeaderListExportEntity.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出支出情况表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出支出情况表到Excel")
|
||||
@PostMapping("/exportExpenseTable")
|
||||
public void exportExpenseTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "支出情况表",
|
||||
this::convertToExpenseEntityList, ExpenseExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<EightRegExportEntity> convertToEightRegEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToEightRegEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private EightRegExportEntity convertToEightRegEntity(Map<String, Object> item) {
|
||||
EightRegExportEntity entity = new EightRegExportEntity();
|
||||
entity.setTitle(getStringValue(item, "title"));
|
||||
entity.setContent(getStringValue(item, "content"));
|
||||
entity.setTestContent(getStringValue(item, "testContent"));
|
||||
entity.setResult(getStringValue(item, "result"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
|
||||
private List<LeaderListExportEntity> convertToLeaderListEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToLeaderListEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private LeaderListExportEntity convertToLeaderListEntity(Map<String, Object> item) {
|
||||
LeaderListExportEntity entity = new LeaderListExportEntity();
|
||||
entity.setUnit(getStringValue(item, "unit"));
|
||||
entity.setName(getStringValue(item, "name"));
|
||||
entity.setDepartment(getStringValue(item, "department"));
|
||||
entity.setPartyPosition(getStringValue(item, "partyPosition"));
|
||||
entity.setAdminPosition(getStringValue(item, "adminPosition"));
|
||||
entity.setTenurePeriod(getStringValue(item, "tenurePeriod"));
|
||||
entity.setMainResponsibilities(getStringValue(item, "mainResponsibilities"));
|
||||
entity.setRemark(getStringValue(item, "remark"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
|
||||
private List<ExpenseExportEntity> convertToExpenseEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToExpenseEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private ExpenseExportEntity convertToExpenseEntity(Map<String, Object> item) {
|
||||
ExpenseExportEntity entity = new ExpenseExportEntity();
|
||||
entity.setExpenseType(getStringValue(item, "expenseType"));
|
||||
entity.setYear(getStringValue(item, "year"));
|
||||
entity.setFinalStatementAmount(getStringValue(item, "finalStatementAmount"));
|
||||
entity.setInitialBudgetAmount(getStringValue(item, "initialBudgetAmount"));
|
||||
entity.setChangePercentage(getStringValue(item, "changePercentage"));
|
||||
entity.setBudgetRatio(getStringValue(item, "budgetRatio"));
|
||||
entity.setRemark(getStringValue(item, "remark"));
|
||||
entity.setDataSource(getStringValue(item, "dataSource"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.StrategyAuditExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent2StrategyService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容2控制器 - 单位发展战略执行审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容2-单位发展战略执行")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent2")
|
||||
public class AuditContent2Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent2StrategyService auditContent2StrategyService;
|
||||
|
||||
/**
|
||||
* 生成单位发展战略执行审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成单位发展战略执行审计表")
|
||||
@PostMapping("/generateStrategyAuditTable")
|
||||
public ApiResult<?> generateStrategyAuditTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent2StrategyService.generateStrategyAuditTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出单位发展战略执行审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出单位发展战略执行审计表到Excel")
|
||||
@PostMapping("/exportStrategyAuditTable")
|
||||
public void exportStrategyAuditTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "单位发展战略执行审计表",
|
||||
this::convertToExportEntityList, StrategyAuditExportEntity.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据转换
|
||||
*/
|
||||
private List<StrategyAuditExportEntity> convertToExportEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToExportEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private StrategyAuditExportEntity convertToExportEntity(Map<String, Object> item) {
|
||||
StrategyAuditExportEntity entity = new StrategyAuditExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setAuditContent(getStringValue(item, "auditContent"));
|
||||
entity.setCheckEvidence(getStringValue(item, "checkEvidence"));
|
||||
entity.setTestResult(getStringValue(item, "testResult"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.TripleOneExportEntity;
|
||||
import com.gxwebsoft.ai.dto.export.DecisionTableExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent3TripleService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.ai.service.AuditContent3DecisionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容3控制器 - 三重一大制度对比分析 & 重大经济决策调查表
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容3-三重一大制度")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent3")
|
||||
public class AuditContent3Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent3TripleService auditContent3TripleService;
|
||||
|
||||
@Autowired
|
||||
private AuditContent3DecisionService auditContent3DecisionService;
|
||||
|
||||
/**
|
||||
* 生成三重一大制度对比分析表数据
|
||||
*/
|
||||
@Operation(summary = "生成三重一大制度对比分析表")
|
||||
@PostMapping("/generateTripleOneTable")
|
||||
public ApiResult<?> generateTripleOneTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent3TripleService.generateTripleOneTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成重大经济决策调查表数据
|
||||
*/
|
||||
@Operation(summary = "生成重大经济决策调查表")
|
||||
@PostMapping("/generateDecisionTable")
|
||||
public ApiResult<?> generateDecisionTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent3DecisionService.generateDecisionTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion, request.getData()
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出三重一大制度对比分析表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出三重一大制度对比分析表到Excel")
|
||||
@PostMapping("/exportTripleOneTable")
|
||||
public void exportTripleOneTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "三重一大制度对比分析表",
|
||||
this::convertToTripleOneEntityList, TripleOneExportEntity.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出重大经济决策调查表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出重大经济决策调查表到Excel")
|
||||
@PostMapping("/exportDecisionTable")
|
||||
public void exportDecisionTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "重大经济决策调查表",
|
||||
this::convertToDecisionTableEntityList, DecisionTableExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<TripleOneExportEntity> convertToTripleOneEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToTripleOneEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<DecisionTableExportEntity> convertToDecisionTableEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToDecisionTableEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private TripleOneExportEntity convertToTripleOneEntity(Map<String, Object> item) {
|
||||
TripleOneExportEntity entity = new TripleOneExportEntity();
|
||||
entity.setCategory(getStringValue(item, "category"));
|
||||
entity.setPolicyContent(getStringValue(item, "policyContent"));
|
||||
entity.setGroupSystem(getStringValue(item, "groupSystem"));
|
||||
entity.setCompanyFormulation(getStringValue(item, "companyFormulation"));
|
||||
entity.setCheckEvidence(getStringValue(item, "checkEvidence"));
|
||||
entity.setTestResult(getStringValue(item, "testResult"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
|
||||
private DecisionTableExportEntity convertToDecisionTableEntity(Map<String, Object> item) {
|
||||
DecisionTableExportEntity entity = new DecisionTableExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setDecisionItem(getStringValue(item, "name"));
|
||||
entity.setMeetingTime(getStringValue(item, "meetingTime"));
|
||||
entity.setDecisionAmount(getStringValue(item, "decisionAmount"));
|
||||
entity.setProcedure(getStringValue(item, "procedure"));
|
||||
entity.setExecutionStatus(getStringValue(item, "executionStatus"));
|
||||
entity.setGood(getStringValue(item, "goods"));
|
||||
entity.setNormal(getStringValue(item, "normal"));
|
||||
entity.setBad(getStringValue(item, "bad"));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.TargetAuditExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent4TargetService;
|
||||
import com.gxwebsoft.ai.utils.ExcelExportTool;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容4控制器 - 目标责任制完成情况审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容4-目标责任制完成情况")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent4")
|
||||
public class AuditContent4Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent4TargetService auditContent4TargetService;
|
||||
|
||||
/**
|
||||
* 生成目标责任制完成情况审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成目标责任制完成情况审计表")
|
||||
@PostMapping("/generateTargetTable")
|
||||
public ApiResult<?> generateTargetTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent4TargetService.generateTargetAuditTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出目标责任制完成情况审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出目标责任制完成情况审计表到Excel")
|
||||
@PostMapping("/exportTargetTable")
|
||||
public void exportTargetTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.get("data");
|
||||
String companyName = (String) request.get("companyName");
|
||||
|
||||
List<TargetAuditExportEntity> exportData = convertToExportEntityList(dataList);
|
||||
|
||||
String fileName = "目标责任制完成情况审计表_" + (companyName != null ? companyName : "未知公司");
|
||||
String title = companyName != null ? companyName + " - 目标责任制完成情况审计表" : "目标责任制完成情况审计表";
|
||||
String sheetName = "目标责任审计";
|
||||
|
||||
ExcelExportTool.exportExcel(exportData, TargetAuditExportEntity.class, fileName, sheetName, title, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据转换
|
||||
*/
|
||||
private List<TargetAuditExportEntity> convertToExportEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToExportEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private TargetAuditExportEntity convertToExportEntity(Map<String, Object> item) {
|
||||
TargetAuditExportEntity entity = new TargetAuditExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setYear(getStringValue(item, "year"));
|
||||
entity.setSuperiorFile(getStringValue(item, "superiorFile"));
|
||||
entity.setSuperiorCompletion(getStringValue(item, "superiorCompletion"));
|
||||
entity.setSuperiorReason(getStringValue(item, "superiorReason"));
|
||||
entity.setSelfPlan(getStringValue(item, "selfPlan"));
|
||||
entity.setSelfCompletion(getStringValue(item, "selfCompletion"));
|
||||
entity.setSelfReason(getStringValue(item, "selfReason"));
|
||||
entity.setRemark(getStringValue(item, "remark"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.BudgetManageExportEntity;
|
||||
import com.gxwebsoft.ai.dto.export.BudgetExecutionExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent5BudgetManageService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.ai.service.AuditContent5BudgetExecutionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容5控制器 - 预算管理审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容5-预算管理审计")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent5")
|
||||
public class AuditContent5Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent5BudgetManageService auditContent5BudgetManageService;
|
||||
|
||||
@Autowired
|
||||
private AuditContent5BudgetExecutionService auditContent5BudgetExecutionService;
|
||||
|
||||
/**
|
||||
* 生成预算管理审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成预算管理审计表")
|
||||
@PostMapping("/generateBudgetManageTable")
|
||||
public ApiResult<?> generateBudgetManageTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent5BudgetManageService.generateBudgetManageTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion, request.getData()
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成预算执行情况审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成预算执行情况审计表")
|
||||
@PostMapping("/generateBudgetExecutionTable")
|
||||
public ApiResult<?> generateBudgetExecutionTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent5BudgetExecutionService.generateBudgetExecutionTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion, request.getData()
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出预算管理审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出预算管理审计表到Excel")
|
||||
@PostMapping("/exportBudgetManageTable")
|
||||
public void exportBudgetManageTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "预算管理审计表",
|
||||
this::convertToBudgetManageEntityList, BudgetManageExportEntity.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出预算执行情况审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出预算执行情况审计表到Excel")
|
||||
@PostMapping("/exportBudgetExecutionTable")
|
||||
public void exportBudgetExecutionTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "预算执行情况审计表",
|
||||
this::convertToBudgetExecutionEntityList, BudgetExecutionExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<BudgetManageExportEntity> convertToBudgetManageEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToBudgetManageEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<BudgetExecutionExportEntity> convertToBudgetExecutionEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToBudgetExecutionEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private BudgetManageExportEntity convertToBudgetManageEntity(Map<String, Object> item) {
|
||||
BudgetManageExportEntity entity = new BudgetManageExportEntity();
|
||||
entity.setBudgetSubject(getStringValue(item, "budgetSubject"));
|
||||
entity.setIndicatorSourceTotal(getStringValue(item, "indicatorSourceTotal"));
|
||||
entity.setIndicatorSourceLastYearBalance(getStringValue(item, "indicatorSourceLastYearBalance"));
|
||||
entity.setIndicatorSourceInitialBudget(getStringValue(item, "indicatorSourceInitialBudget"));
|
||||
entity.setIndicatorSourceAdditionalBudget(getStringValue(item, "indicatorSourceAdditionalBudget"));
|
||||
entity.setIndicatorUseTotal(getStringValue(item, "indicatorUseTotal"));
|
||||
entity.setIndicatorUseAppropriationSubtotal(getStringValue(item, "indicatorUseAppropriationSubtotal"));
|
||||
entity.setIndicatorUseAppropriation(getStringValue(item, "indicatorUseAppropriation"));
|
||||
entity.setIndicatorUseSalaryPayment(getStringValue(item, "indicatorUseSalaryPayment"));
|
||||
entity.setIndicatorUseGovProcurement(getStringValue(item, "indicatorUseGovProcurement"));
|
||||
entity.setFinanceManagementAccount(getStringValue(item, "financeManagementAccount"));
|
||||
entity.setBudgetUsedForOther(getStringValue(item, "budgetUsedForOther"));
|
||||
entity.setIndicatorBalance(getStringValue(item, "indicatorBalance"));
|
||||
entity.setGovernmentProcurement(getStringValue(item, "governmentProcurement"));
|
||||
entity.setPayableToUnit(getStringValue(item, "payableToUnit"));
|
||||
entity.setOther(getStringValue(item, "other"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
|
||||
private BudgetExecutionExportEntity convertToBudgetExecutionEntity(Map<String, Object> item) {
|
||||
BudgetExecutionExportEntity entity = new BudgetExecutionExportEntity();
|
||||
entity.setProject(getStringValue(item, "project"));
|
||||
entity.setLastYearCarryOver(getStringValue(item, "lastYearCarryOver"));
|
||||
entity.setCurrentYearBudgetTotal(getStringValue(item, "currentYearBudgetTotal"));
|
||||
entity.setInitialApprovedBudget(getStringValue(item, "initialApprovedBudget"));
|
||||
entity.setAdditionalBudgetAmount(getStringValue(item, "additionalBudgetAmount"));
|
||||
entity.setActualAppropriation(getStringValue(item, "actualAppropriation"));
|
||||
entity.setIndicatorBalance(getStringValue(item, "indicatorBalance"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.StateAssetsAuditExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent6StateAssetsService;
|
||||
import com.gxwebsoft.ai.utils.ExcelExportTool;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容6控制器 - 国资管理情况审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容6-国资管理情况")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent6")
|
||||
public class AuditContent6Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent6StateAssetsService auditContent6StateAssetsService;
|
||||
|
||||
/**
|
||||
* 生成国有资产管理审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成国有资产管理审计表")
|
||||
@PostMapping("/generateAssetsTable")
|
||||
public ApiResult<?> generateAssetsTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent6StateAssetsService.generateStateAssetsAuditTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出国有资产管理审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出国有资产管理审计表到Excel")
|
||||
@PostMapping("/exportAssetsTable")
|
||||
public void exportAssetsTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.get("data");
|
||||
String companyName = (String) request.get("companyName");
|
||||
|
||||
List<StateAssetsAuditExportEntity> exportData = convertToExportEntityList(dataList);
|
||||
|
||||
String fileName = "国有资产管理审计表_" + (companyName != null ? companyName : "未知公司");
|
||||
String title = companyName != null ? companyName + " - 国有资产管理审计表" : "国有资产管理审计表";
|
||||
String sheetName = "国资管理审计";
|
||||
|
||||
ExcelExportTool.exportExcel(exportData, StateAssetsAuditExportEntity.class, fileName, sheetName, title, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据转换
|
||||
*/
|
||||
private List<StateAssetsAuditExportEntity> convertToExportEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToExportEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private StateAssetsAuditExportEntity convertToExportEntity(Map<String, Object> item) {
|
||||
StateAssetsAuditExportEntity entity = new StateAssetsAuditExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setAssetName(getStringValue(item, "assetName"));
|
||||
entity.setAcquisitionMethod(getStringValue(item, "acquisitionMethod"));
|
||||
entity.setAssetValue(getStringValue(item, "assetValue"));
|
||||
entity.setAssetAddress(getStringValue(item, "assetAddress"));
|
||||
entity.setArea(getStringValue(item, "area"));
|
||||
entity.setTenant(getStringValue(item, "tenant"));
|
||||
entity.setContractAmount(getStringValue(item, "contractAmount"));
|
||||
entity.setLeasePeriod(getStringValue(item, "leasePeriod"));
|
||||
entity.setRentPaymentTime(getStringValue(item, "rentPaymentTime"));
|
||||
entity.setPlatformLease(getStringValue(item, "platformLease"));
|
||||
entity.setApprovalDoc(getStringValue(item, "approvalDoc"));
|
||||
entity.setInBudget(getStringValue(item, "inBudget"));
|
||||
entity.setRemark(getStringValue(item, "remark"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.InvestmentSituationExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent7InvestmentService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容7控制器 - 重大投资情况审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容7-重大投资情况")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent7")
|
||||
public class AuditContent7Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent7InvestmentService auditContent7InvestmentService;
|
||||
|
||||
/**
|
||||
* 生成重大投资情况审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成重大投资情况审计表")
|
||||
@PostMapping("/generateInvestmentSituationTable")
|
||||
public ApiResult<?> generateInvestmentSituationTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent7InvestmentService.generateInvestmentSituationTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出重大投资情况审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出重大投资情况审计表到Excel")
|
||||
@PostMapping("/exportInvestmentSituationTable")
|
||||
public void exportInvestmentSituationTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcelWithAuditTime(request, response, "重大投资情况审计表",
|
||||
this::convertToInvestmentSituationEntityList, InvestmentSituationExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<InvestmentSituationExportEntity> convertToInvestmentSituationEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToInvestmentSituationEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private InvestmentSituationExportEntity convertToInvestmentSituationEntity(Map<String, Object> item) {
|
||||
InvestmentSituationExportEntity entity = new InvestmentSituationExportEntity();
|
||||
entity.setCategory(getStringValue(item, "category"));
|
||||
entity.setAuditContent(getStringValue(item, "auditContent"));
|
||||
entity.setCheckEvidence(getStringValue(item, "checkEvidence"));
|
||||
entity.setTestResult(getStringValue(item, "testResult"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
entity.setFileIndex(formatWorkPaperIndex(item.get("fileIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.InternalControlExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent8InternalControlService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容8控制器 - 单位层面财务管理内部控制测试表
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容8-内部控制测试")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent8")
|
||||
public class AuditContent8Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent8InternalControlService auditContent8InternalControlService;
|
||||
|
||||
/**
|
||||
* 生成单位层面财务管理内部控制测试表数据
|
||||
*/
|
||||
@Operation(summary = "生成单位层面财务管理内部控制测试表")
|
||||
@PostMapping("/generateInternalControlTable")
|
||||
public ApiResult<?> generateInternalControlTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent8InternalControlService.generateInternalControlTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出单位层面财务管理内部控制测试表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出单位层面财务管理内部控制测试表到Excel")
|
||||
@PostMapping("/exportInternalControlTable")
|
||||
public void exportInternalControlTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "单位层面财务管理内部控制测试表",
|
||||
this::convertToInternalControlEntityList, InternalControlExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<InternalControlExportEntity> convertToInternalControlEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToInternalControlEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private InternalControlExportEntity convertToInternalControlEntity(Map<String, Object> item) {
|
||||
InternalControlExportEntity entity = new InternalControlExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setControlLink(getStringValue(item, "controlLink"));
|
||||
entity.setControlRequirement(getStringValue(item, "controlRequirement"));
|
||||
entity.setControlActivity(getStringValue(item, "controlActivity"));
|
||||
entity.setControlPosition(getStringValue(item, "controlPosition"));
|
||||
entity.setTestSteps(getStringValue(item, "testSteps"));
|
||||
entity.setCheckEvidence(getStringValue(item, "checkEvidence"));
|
||||
entity.setTestResult(getStringValue(item, "testResult"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.dto.export.PersonnelExportEntity;
|
||||
import com.gxwebsoft.ai.service.AuditContent9PersonnelService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容9控制器 - 人员编制管理审计
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计内容9-人员编制管理审计")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditContent9")
|
||||
public class AuditContent9Controller extends BaseAuditContentController {
|
||||
|
||||
@Autowired
|
||||
private AuditContent9PersonnelService auditContent9PersonnelService;
|
||||
|
||||
/**
|
||||
* 生成人员编制管理审计表数据
|
||||
*/
|
||||
@Operation(summary = "生成人员编制管理审计表")
|
||||
@PostMapping("/generatePersonnelTable")
|
||||
public ApiResult<?> generatePersonnelTable(@RequestBody AuditContentRequest request, HttpServletRequest servletRequest) {
|
||||
return generateTableData(request, servletRequest.getRequestURI(),
|
||||
(params) -> auditContent9PersonnelService.generatePersonnelTableData(
|
||||
params.knowledgeBaseId, params.libraryKbIds, params.projectLibrary,
|
||||
params.username, params.history, params.suggestion
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出人员编制管理审计表到Excel
|
||||
*/
|
||||
@Operation(summary = "导出人员编制管理审计表到Excel")
|
||||
@PostMapping("/exportPersonnelTable")
|
||||
public void exportPersonnelTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||
exportToExcel(request, response, "人员编制管理审计表",
|
||||
this::convertToPersonnelEntityList, PersonnelExportEntity.class);
|
||||
}
|
||||
|
||||
// ========== 数据转换方法 ==========
|
||||
|
||||
private List<PersonnelExportEntity> convertToPersonnelEntityList(List<Map<String, Object>> originalData) {
|
||||
return originalData.stream().map(this::convertToPersonnelEntity).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private PersonnelExportEntity convertToPersonnelEntity(Map<String, Object> item) {
|
||||
PersonnelExportEntity entity = new PersonnelExportEntity();
|
||||
entity.setIndex(getStringValue(item, "index"));
|
||||
entity.setAuditContent(getStringValue(item, "auditContent"));
|
||||
entity.setAuditTarget(getStringValue(item, "auditTarget"));
|
||||
entity.setAuditEvidence(getStringValue(item, "auditEvidence"));
|
||||
entity.setGenerationResult(getStringValue(item, "generationResult"));
|
||||
entity.setWorkPaperIndex(formatWorkPaperIndex(item.get("workPaperIndex")));
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditEvidenceRequest;
|
||||
import com.gxwebsoft.ai.service.AuditEvidenceService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.OutputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFTable;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.gxwebsoft.ai.config.TemplateConfig;
|
||||
import cn.afterturn.easypoi.word.WordExportUtil;
|
||||
|
||||
/**
|
||||
* 审计取证单控制器
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "审计取证单")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditEvidence")
|
||||
public class AuditEvidenceController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private AuditEvidenceService auditEvidenceService;
|
||||
|
||||
@Autowired
|
||||
private TemplateConfig templateConfig;
|
||||
|
||||
/**
|
||||
* 生成审计取证单
|
||||
*/
|
||||
@Operation(summary = "生成审计取证单")
|
||||
@PostMapping("/generate")
|
||||
public ApiResult<?> generateAuditEvidence(@RequestBody AuditEvidenceRequest request) {
|
||||
try {
|
||||
final User loginUser = getLoginUser();
|
||||
request.setUserName(loginUser.getUsername());
|
||||
|
||||
log.info("接收到审计取证单生成请求 - 用户: {}, 项目: {}", request.getUserName(), request.getProjectName());
|
||||
JSONObject result = auditEvidenceService.generateAuditEvidence(request);
|
||||
if (Boolean.TRUE.equals(result.getBoolean("success"))) {
|
||||
return success(result);
|
||||
} else {
|
||||
return fail(result.getString("error") != null ? result.getString("error") : "生成审计取证单失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("生成审计取证单异常", e);
|
||||
return fail("生成审计取证单异常: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 下载审计取证单Word文档
|
||||
*/
|
||||
@Operation(summary = "下载审计取证单Word文档")
|
||||
@PostMapping("/download")
|
||||
public void downloadAuditEvidence(@RequestBody AuditEvidenceRequest request, HttpServletResponse response) {
|
||||
double originalMinInflateRatio = ZipSecureFile.getMinInflateRatio();
|
||||
|
||||
try {
|
||||
ZipSecureFile.setMinInflateRatio(0.001);
|
||||
|
||||
// 准备模板数据 - 将取证单字段映射到Word模板
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
// map.put("caseIndex", request.getCaseIndex() != null ? request.getCaseIndex() : "");
|
||||
map.put("caseIndex", request.getCaseIndex() != null ? String.format("%-50s", request.getCaseIndex()) : String.format("%-50s", ""));
|
||||
map.put("pageIndex", request.getPageIndex() != null ? request.getPageIndex() : "1");
|
||||
map.put("pageTotal", request.getPageTotal() != null ? request.getPageTotal() : "1");
|
||||
map.put("projectName", request.getProjectName() != null ? request.getProjectName() : "");
|
||||
map.put("auditedTarget", request.getAuditedTarget() != null ? request.getAuditedTarget() : "");
|
||||
map.put("auditMatter", request.getAuditMatter() != null ? request.getAuditMatter() : "");
|
||||
map.put("summaryTitle", request.getSummaryTitle() != null ? request.getSummaryTitle() : "");
|
||||
map.put("auditRecord", request.getAuditRecord() != null ? request.getAuditRecord() : "");
|
||||
map.put("auditFinding", request.getAuditFinding() != null ? request.getAuditFinding() : "");
|
||||
map.put("evidenceBasis", request.getEvidenceBasis() != null ? request.getEvidenceBasis() : "");
|
||||
map.put("handling", request.getHandling() != null ? request.getHandling() : "");
|
||||
map.put("attachment", request.getAttachment() != null ? request.getAttachment() : "");
|
||||
map.put("auditors", request.getAuditors() != null ? request.getAuditors() : "");
|
||||
map.put("compileDate", request.getCompileDate() != null ? request.getCompileDate() : "");
|
||||
map.put("providerOpinion", request.getProviderOpinion() != null ? request.getProviderOpinion() : "");
|
||||
map.put("providerDate", request.getProviderDate() != null ? request.getProviderDate() : "");
|
||||
map.put("attachmentPages", request.getAttachmentPages() != null ? request.getAttachmentPages() : "");
|
||||
map.put("feedbackDeadline", request.getFeedbackDeadline() != null ? request.getFeedbackDeadline() : "");
|
||||
|
||||
// 获取登录用户信息
|
||||
final User loginUser = getLoginUser();
|
||||
if (request.getAuditors() == null || request.getAuditors().isEmpty()) {
|
||||
map.put("auditors", loginUser.getUsername());
|
||||
}
|
||||
|
||||
// 使用 Easypoi 的 Word 模板功能生成取证单
|
||||
XWPFDocument document = WordExportUtil.exportWord07(
|
||||
templateConfig.getEvidenceTemplatePath(), // 需要配置取证单模板路径
|
||||
map
|
||||
);
|
||||
|
||||
// 处理换行,确保 \n 转为硬回车(新段落)
|
||||
processParagraphs(document);
|
||||
|
||||
// 设置响应头
|
||||
String fileName = "审计取证单_" + (request.getProjectName() != null ? request.getProjectName() : "取证单") + ".docx";
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
|
||||
|
||||
// 输出文档
|
||||
try (OutputStream out = response.getOutputStream()) {
|
||||
document.write(out);
|
||||
out.flush();
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("生成审计取证单Word文档失败", e);
|
||||
throw new RuntimeException("生成审计取证单失败", e);
|
||||
} finally {
|
||||
ZipSecureFile.setMinInflateRatio(originalMinInflateRatio);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理段落换行(增强版,同时处理表格单元格)
|
||||
*/
|
||||
private void processParagraphs(XWPFDocument document) {
|
||||
// 1. 处理普通段落
|
||||
List<XWPFParagraph> originalParas = new ArrayList<>(document.getParagraphs());
|
||||
|
||||
for (XWPFParagraph para : originalParas) {
|
||||
String text = para.getText();
|
||||
if (text == null || !text.contains("\n")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] parts = text.replace("\r\n", "\n").replace("\r", "\n").split("\n");
|
||||
|
||||
// 在原段落位置之前插入新段落
|
||||
int pos = document.getPosOfParagraph(para);
|
||||
|
||||
// 修正:按正序插入(从前往后)
|
||||
for (int i = 0; i < parts.length; i++) {
|
||||
// 创建新段落
|
||||
XWPFParagraph newPara = document.insertNewParagraph(para.getCTP().newCursor());
|
||||
|
||||
// 复制样式
|
||||
newPara.getCTP().setPPr(para.getCTP().getPPr());
|
||||
|
||||
XWPFRun newRun = newPara.createRun();
|
||||
newRun.setText(parts[i].trim());
|
||||
|
||||
if (!para.getRuns().isEmpty()) {
|
||||
newRun.getCTR().setRPr(para.getRuns().get(0).getCTR().getRPr());
|
||||
}
|
||||
}
|
||||
|
||||
// 删除原段落
|
||||
document.removeBodyElement(pos + parts.length);
|
||||
}
|
||||
|
||||
// 2. 处理表格单元格中的段落
|
||||
List<XWPFTable> tables = document.getTables();
|
||||
for (XWPFTable table : tables) {
|
||||
for (XWPFTableRow row : table.getRows()) {
|
||||
for (XWPFTableCell cell : row.getTableCells()) {
|
||||
List<XWPFParagraph> cellParagraphs = cell.getParagraphs();
|
||||
for (XWPFParagraph para : cellParagraphs) {
|
||||
String text = para.getText();
|
||||
if (text == null || !text.contains("\n")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 清空原段落内容
|
||||
for (int i = para.getRuns().size() - 1; i >= 0; i--) {
|
||||
para.removeRun(i);
|
||||
}
|
||||
|
||||
// 分割文本并按行添加
|
||||
String[] lines = text.replace("\r\n", "\n").replace("\r", "\n").split("\n");
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
XWPFRun run = para.createRun();
|
||||
run.setText(lines[i].trim());
|
||||
|
||||
// 如果不是最后一行,添加换行
|
||||
if (i < lines.length - 1) {
|
||||
run.addBreak();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.config.TemplateConfig;
|
||||
import com.gxwebsoft.ai.dto.AuditReportRequest;
|
||||
import com.gxwebsoft.ai.dto.KnowledgeBaseRequest;
|
||||
import com.gxwebsoft.ai.enums.AuditReportEnum;
|
||||
import com.gxwebsoft.ai.service.KnowledgeBaseService;
|
||||
import com.gxwebsoft.ai.util.AuditReportUtil;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
|
||||
import cn.afterturn.easypoi.word.WordExportUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
/**
|
||||
* 审计报告控制器
|
||||
* @author GIIT-YC
|
||||
*
|
||||
*/
|
||||
@Tag(name = "审计报告")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditReport")
|
||||
public class AuditReportController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private TemplateConfig templateConfig;
|
||||
|
||||
@Autowired
|
||||
private KnowledgeBaseService knowledgeBaseService;
|
||||
|
||||
private String invok(String query, String knowledge, String history, String suggestion, String title, String userName) {
|
||||
// 构建请求体
|
||||
JSONObject requestBody = new JSONObject();
|
||||
JSONObject inputs = new JSONObject();
|
||||
inputs.put("query", query);
|
||||
inputs.put("knowledge", knowledge);
|
||||
inputs.put("history", history);
|
||||
inputs.put("suggestion", suggestion);
|
||||
inputs.put("title", title);
|
||||
|
||||
requestBody.put("inputs", inputs);
|
||||
requestBody.put("response_mode", "blocking");
|
||||
requestBody.put("user", userName);
|
||||
|
||||
// 发送 POST 请求
|
||||
String result = HttpUtil.createPost("http://1.14.159.185:8180/v1/workflows/run")
|
||||
.header("Authorization", "Bearer app-d7Ok9FECVZG2Ybw9wpg7tGu9")
|
||||
.header("Content-Type", "application/json")
|
||||
.body(requestBody.toString())
|
||||
.timeout(600000)
|
||||
.execute()
|
||||
.body();
|
||||
// 解析返回的JSON字符串
|
||||
JSONObject jsonResponse = JSONObject.parseObject(result);
|
||||
// 获取data字段
|
||||
JSONObject data = jsonResponse.getJSONObject("data");
|
||||
// 获取outputs字段
|
||||
JSONObject outputs = data.getJSONObject("outputs");
|
||||
// 获取outputs中的result字符串
|
||||
String resultStr = outputs.getString("result");
|
||||
return resultStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成审计报告-单一模块
|
||||
*/
|
||||
@Operation(summary = "生成审计报告-单一模块")
|
||||
@PostMapping("/generate")
|
||||
public ApiResult<?> generateAuditReport(@RequestBody AuditReportRequest req) {
|
||||
final User loginUser = getLoginUser();
|
||||
|
||||
Set<String> kbIdSet = new HashSet<>();
|
||||
List<String> kbIdList = StrUtil.split(req.getKbIds(), ',');
|
||||
for(String kbId : kbIdList) {
|
||||
KnowledgeBaseRequest knowledgeBaseRequest = new KnowledgeBaseRequest();
|
||||
knowledgeBaseRequest.setKbId(kbId);
|
||||
//召回切片数上限
|
||||
knowledgeBaseRequest.setTopK(100);
|
||||
knowledgeBaseRequest.setFormCommit((req.getFormCommit() >= 10) ? req.getFormCommit() / 10 : req.getFormCommit());
|
||||
kbIdSet.addAll(knowledgeBaseService.queryKnowledgeBase(knowledgeBaseRequest));
|
||||
}
|
||||
String knowledge = kbIdSet.toString();
|
||||
|
||||
String query = AuditReportEnum.getByCode(req.getFormCommit()).getDesc();
|
||||
// String ret = this.invok(query, knowledge, AuditReportUtil.generateReportContent(req), req.getSuggestion(), loginUser.getUsername());
|
||||
String ret = this.invok(query, knowledge, AuditReportUtil.generateReportContentByFormCommit(req), req.getSuggestion(), req.getFrom00(), loginUser.getUsername());
|
||||
|
||||
return success(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成并下载审计报告
|
||||
*/
|
||||
@Operation(summary = "生成并下载审计报告")
|
||||
@PostMapping("/download")
|
||||
public void downloadAuditReport(@RequestBody AuditReportRequest req, HttpServletResponse response) {
|
||||
double originalMinInflateRatio = ZipSecureFile.getMinInflateRatio();
|
||||
|
||||
try {
|
||||
ZipSecureFile.setMinInflateRatio(0.001);
|
||||
|
||||
// 准备模板数据
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put(AuditReportEnum.TITLE.getCodeStr(), req.getFrom00());
|
||||
map.put(AuditReportEnum.BASIS.getCodeStr(), req.getFrom10());
|
||||
map.put(AuditReportEnum.OBJECTIVE.getCodeStr(), req.getFrom20());
|
||||
map.put(AuditReportEnum.SCOPE.getCodeStr(), req.getFrom30());
|
||||
map.put(AuditReportEnum.UNIT_OVERVIEW.getCodeStr(), req.getFrom41());
|
||||
map.put(AuditReportEnum.ORG_PERSONNEL.getCodeStr(), req.getFrom42());
|
||||
map.put(AuditReportEnum.FINANCIAL_ACCOUNTING.getCodeStr(), req.getFrom43());
|
||||
map.put(AuditReportEnum.ANNUAL_BUSINESS.getCodeStr(), req.getFrom44());
|
||||
map.put(AuditReportEnum.INTERNAL_CONTROL.getCodeStr(), req.getFrom45());
|
||||
map.put(AuditReportEnum.ECONOMIC_POLICIES.getCodeStr(), req.getFrom51());
|
||||
map.put(AuditReportEnum.DEV_STRATEGY.getCodeStr(), req.getFrom52());
|
||||
map.put(AuditReportEnum.MAJOR_ECONOMIC.getCodeStr(), req.getFrom53());
|
||||
map.put(AuditReportEnum.CORP_GOVERNANCE.getCodeStr(), req.getFrom54());
|
||||
map.put(AuditReportEnum.FINANCIAL_LEGAL.getCodeStr(), req.getFrom55());
|
||||
map.put(AuditReportEnum.INTEGRITY_COMPLIANCE.getCodeStr(), req.getFrom56());
|
||||
map.put(AuditReportEnum.PREV_AUDIT_ISSUES.getCodeStr(), req.getFrom57());
|
||||
map.put(AuditReportEnum.OTHER_MATTERS.getCodeStr(), req.getFrom58());
|
||||
map.put(AuditReportEnum.RISK_IDENTIFY.getCodeStr(), req.getFrom61());
|
||||
map.put(AuditReportEnum.RISK_RESPONSE.getCodeStr(), req.getFrom62());
|
||||
map.put(AuditReportEnum.TECHNIQUES.getCodeStr(), req.getFrom70());
|
||||
map.put(AuditReportEnum.SCHEDULE.getCodeStr(), req.getFrom80());
|
||||
map.put(AuditReportEnum.ORGANIZATION.getCodeStr(), req.getFrom90());
|
||||
|
||||
// 使用 Easypoi 的 Word 模板功能
|
||||
XWPFDocument document = WordExportUtil.exportWord07(templateConfig.getWordTemplatePath(), map);
|
||||
|
||||
// 处理换行,确保 \n 转为硬回车(新段落)
|
||||
processParagraphs(document);
|
||||
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=audit_report.docx");
|
||||
|
||||
try (OutputStream out = response.getOutputStream()) {
|
||||
document.write(out);
|
||||
out.flush();
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("生成审计报告失败", e);
|
||||
} finally {
|
||||
ZipSecureFile.setMinInflateRatio(originalMinInflateRatio);
|
||||
}
|
||||
}
|
||||
|
||||
private void processParagraphs(XWPFDocument document) {
|
||||
List<XWPFParagraph> originalParas = new ArrayList<>(document.getParagraphs());
|
||||
|
||||
for (XWPFParagraph para : originalParas) {
|
||||
String text = para.getText();
|
||||
if (text == null || !text.contains("\n")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] parts = text.replace("\r\n", "\n").replace("\r", "\n").split("\n");
|
||||
|
||||
// 在原段落位置之前插入新段落
|
||||
int pos = document.getPosOfParagraph(para);
|
||||
|
||||
// 修正:按正序插入(从前往后)
|
||||
for (int i = 0; i < parts.length; i++) {
|
||||
// 创建新段落
|
||||
XWPFParagraph newPara = document.insertNewParagraph(para.getCTP().newCursor());
|
||||
|
||||
// 复制样式
|
||||
newPara.getCTP().setPPr(para.getCTP().getPPr());
|
||||
|
||||
XWPFRun newRun = newPara.createRun();
|
||||
newRun.setText(parts[i].trim());
|
||||
|
||||
if (!para.getRuns().isEmpty()) {
|
||||
newRun.getCTR().setRPr(para.getRuns().get(0).getCTR().getRPr());
|
||||
}
|
||||
}
|
||||
|
||||
// 删除原段落
|
||||
document.removeBodyElement(pos + parts.length);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.service.AuditReportService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
/**
|
||||
* 审计报告控制器 - 重构版
|
||||
*/
|
||||
@Tag(name = "审计报告")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/auditReport2")
|
||||
public class AuditReportController2 extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private AuditReportService auditReportService;
|
||||
|
||||
/**
|
||||
* 生成审计核查报告 - 重构版
|
||||
*/
|
||||
@Operation(summary = "生成审计核查报告")
|
||||
@PostMapping("/generate")
|
||||
public ApiResult<?> generateAuditReport(
|
||||
@RequestPart("file") MultipartFile file,
|
||||
@RequestPart(value = "kbId", required = false) String kbId,
|
||||
@RequestPart(value = "libraryIds", required = false) String libraryIds,
|
||||
@RequestPart(value = "analysisLibrary", required = false) String analysisLibrary,
|
||||
@RequestPart(value = "projectLibrary", required = false) String projectLibrary) {
|
||||
|
||||
final User loginUser = getLoginUser();
|
||||
try {
|
||||
// 1. 解析文件五、六点内容
|
||||
String auditContent = extractAuditContent(file);
|
||||
if (StrUtil.isBlank(auditContent)) {
|
||||
return fail("未能提取到审计内容");
|
||||
}
|
||||
|
||||
// 2. 生成完整审计报告
|
||||
JSONObject auditReport = auditReportService.generateCompleteAuditReport(
|
||||
auditContent, file.getOriginalFilename(), kbId, libraryIds,
|
||||
analysisLibrary, projectLibrary, loginUser.getUsername()
|
||||
);
|
||||
|
||||
return success(auditReport);
|
||||
|
||||
} catch (Exception e) {
|
||||
return fail("生成审计报告失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取审计内容(五、六点)
|
||||
*/
|
||||
private String extractAuditContent(MultipartFile file) throws IOException {
|
||||
StringBuilder content = new StringBuilder();
|
||||
|
||||
// 保存原来的最小解压比率
|
||||
double originalMinInflateRatio = ZipSecureFile.getMinInflateRatio();
|
||||
// 设置新的最小解压比率
|
||||
ZipSecureFile.setMinInflateRatio(0.001);
|
||||
|
||||
try (InputStream is = file.getInputStream();
|
||||
XWPFDocument doc = new XWPFDocument(is)) {
|
||||
|
||||
boolean inSection5 = false;
|
||||
boolean inSection6 = false;
|
||||
|
||||
for (XWPFParagraph para : doc.getParagraphs()) {
|
||||
String text = para.getText();
|
||||
if (StrUtil.isBlank(text)) continue;
|
||||
|
||||
// 检测第五部分
|
||||
if (text.contains("五、") || text.contains("5、")) {
|
||||
inSection5 = true;
|
||||
inSection6 = false;
|
||||
content.append("【第五部分】\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检测第六部分
|
||||
if (text.contains("六、") || text.contains("6、")) {
|
||||
inSection5 = false;
|
||||
inSection6 = true;
|
||||
content.append("【第六部分】\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检测结束
|
||||
if ((text.contains("七、") || text.contains("7、")) && inSection6) {
|
||||
break;
|
||||
}
|
||||
|
||||
// 收集内容
|
||||
if (inSection5 || inSection6) {
|
||||
content.append(text).append("\n");
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
// 恢复原来的最小解压比率
|
||||
ZipSecureFile.setMinInflateRatio(originalMinInflateRatio);
|
||||
}
|
||||
|
||||
return content.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,352 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.gxwebsoft.ai.dto.AuditContentRequest;
|
||||
import com.gxwebsoft.ai.entity.AiCloudDoc;
|
||||
import com.gxwebsoft.ai.entity.AiCloudFile;
|
||||
import com.gxwebsoft.ai.service.AiHistoryService;
|
||||
import com.gxwebsoft.ai.utils.ExcelExportTool;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import com.gxwebsoft.pwl.entity.PwlProjectLibrary;
|
||||
import com.gxwebsoft.pwl.service.PwlProjectLibraryService;
|
||||
import com.gxwebsoft.ai.service.AiCloudDocService;
|
||||
import com.gxwebsoft.ai.service.AiCloudFileService;
|
||||
import com.gxwebsoft.ai.service.KnowledgeBaseService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.digest.DigestUtil;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 审计内容基础控制器
|
||||
*/
|
||||
@Slf4j
|
||||
public abstract class BaseAuditContentController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
protected AiCloudDocService aiCloudDocService;
|
||||
|
||||
@Autowired
|
||||
protected AiCloudFileService aiCloudFileService;
|
||||
|
||||
@Autowired
|
||||
protected KnowledgeBaseService knowledgeBaseService;
|
||||
|
||||
@Autowired
|
||||
protected PwlProjectLibraryService pwlProjectLibraryService;
|
||||
|
||||
@Autowired
|
||||
protected AiHistoryService aiHistoryService;
|
||||
|
||||
// 历史记录有效期(分钟)
|
||||
protected static final int HISTORY_EXPIRE_MINUTES = 10;
|
||||
|
||||
/**
|
||||
* 通用的表格数据生成方法
|
||||
*/
|
||||
protected ApiResult<?> generateTableData(AuditContentRequest request, String interfaceName, Function<GenerateParams, JSONObject> generateFunction) {
|
||||
final User loginUser = getLoginUser();
|
||||
String requestHistory = request.getHistory();
|
||||
request.setHistory("");
|
||||
|
||||
// 检查历史记录
|
||||
String requestHash = generateRequestHash(request, interfaceName);
|
||||
var history = aiHistoryService.getValidHistory(requestHash, interfaceName, HISTORY_EXPIRE_MINUTES);
|
||||
if (history != null) {
|
||||
log.info("返回历史数据,请求哈希: {}", requestHash);
|
||||
return success(JSONObject.parseObject(history.getResponseData()));
|
||||
}
|
||||
request.setHistory(requestHistory);
|
||||
|
||||
String kbIdTmp = "";
|
||||
String libraryKbIds = "";
|
||||
|
||||
try {
|
||||
// 创建临时知识库(如果需要)
|
||||
if (hasUploadedFiles(request)) {
|
||||
kbIdTmp = createTempKnowledgeBase(request);
|
||||
}
|
||||
|
||||
// 查询项目库信息
|
||||
libraryKbIds = getLibraryKbIds(request.getLibraryIds());
|
||||
|
||||
// 生成数据
|
||||
String knowledgeBaseId = getKnowledgeBaseId(kbIdTmp, request.getKbIds());
|
||||
GenerateParams params = new GenerateParams(knowledgeBaseId, libraryKbIds, request.getProjectLibrary(), loginUser.getUsername(), request.getHistory(), request.getSuggestion());
|
||||
|
||||
JSONObject result = generateFunction.apply(params);
|
||||
|
||||
if(result.getBoolean("success")) {
|
||||
// 转换workPaperIndex,原数据:["文件名1"+"||"+"下载地址1","文件名2"+"||"+"下载地址2"],转换后:["文件ID1"+"||"+"文件名1"+"||"+"下载地址1","文件ID2"+"||"+"文件名2"+"||"+"下载地址2"]
|
||||
convertWorkPaperFileInfo(result);
|
||||
// 保存到历史记录
|
||||
saveToHistory(request, interfaceName, requestHash, result, loginUser);
|
||||
}
|
||||
|
||||
return success(result);
|
||||
} catch (Exception e) {
|
||||
log.error("生成表格数据失败,接口: {}", interfaceName, e);
|
||||
return fail("生成表格数据失败: " + e.getMessage());
|
||||
} finally {
|
||||
cleanupTempKnowledgeBase(kbIdTmp);
|
||||
}
|
||||
}
|
||||
|
||||
private void convertWorkPaperFileInfo(JSONObject result) {
|
||||
JSONArray data = result.getJSONArray("data");
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
JSONObject obj = data.getJSONObject(i);
|
||||
JSONArray workPaperIndexFiles = obj.getJSONArray("workPaperIndex");
|
||||
if (workPaperIndexFiles != null && !workPaperIndexFiles.isEmpty()) {
|
||||
for (int j = 0; j < workPaperIndexFiles.size(); j++) {
|
||||
String files = workPaperIndexFiles.getString(j);
|
||||
workPaperIndexFiles.set(j, "FileId||" + files);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void convertWorkPaperFileInfo2(JSONObject result) {
|
||||
JSONArray data = result.getJSONArray("data");
|
||||
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
JSONObject obj = data.getJSONObject(i);
|
||||
JSONArray workPaperIndexFileIds = obj.getJSONArray("workPaperIndex");
|
||||
|
||||
// 先获取并转换 workPaperIndex 字段
|
||||
if (workPaperIndexFileIds != null && !workPaperIndexFileIds.isEmpty()) {
|
||||
// 先查询所有文件
|
||||
List<AiCloudFile> aiCloudFiles = aiCloudFileService.list(new LambdaQueryWrapper<AiCloudFile>().in(AiCloudFile::getFileId, workPaperIndexFileIds));
|
||||
|
||||
// 创建文件ID到文件的映射,便于查找
|
||||
Map<String, AiCloudFile> fileMap = aiCloudFiles.stream().collect(Collectors.toMap(AiCloudFile::getFileId, file -> file));
|
||||
|
||||
// 创建转换后的数组(保持原顺序)
|
||||
JSONArray transformedArray = new JSONArray();
|
||||
for (Object fileIdObj : workPaperIndexFileIds) {
|
||||
String fileId = (String) fileIdObj;
|
||||
AiCloudFile file = fileMap.get(fileId);
|
||||
if (file != null) {
|
||||
String transformed = file.getFileId() + "||" + file.getFileName() + "||" + file.getFileUrl();
|
||||
transformedArray.add(transformed);
|
||||
} else {
|
||||
transformedArray.add(fileIdObj);
|
||||
}
|
||||
}
|
||||
|
||||
// 将转换后的数据塞回原字段
|
||||
obj.put("workPaperIndex", transformedArray);
|
||||
|
||||
// 使用 workPaperIndexFileIds 中的每个 fileId 替换其他字段中的四种格式
|
||||
for (String key : obj.keySet()) {
|
||||
if ("workPaperIndex".equals(key)) {
|
||||
continue; // 跳过 workPaperIndex 字段
|
||||
}
|
||||
Object value = obj.get(key);
|
||||
if (value instanceof String) {
|
||||
String text = (String) value;
|
||||
for (Object fileIdObj : workPaperIndexFileIds) {
|
||||
String fileId = (String) fileIdObj;
|
||||
text = text.replace("【FileId:" + fileId + "】", "")
|
||||
.replace("(FileId:" + fileId + ")", "")
|
||||
.replace("(FileId:" + fileId + ")", "")
|
||||
.replace("FileId:"+fileId, "")
|
||||
.replace("【" + fileId + "】", "")
|
||||
.replace("(" + fileId + ")", "")
|
||||
.replace("(" + fileId + ")", "")
|
||||
.replace(fileId, "");;
|
||||
}
|
||||
obj.put(key, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 生成请求哈希
|
||||
*/
|
||||
protected String generateRequestHash(AuditContentRequest request, String interfaceName) {
|
||||
String requestJson = JSONObject.toJSONString(request);
|
||||
return DigestUtil.md5Hex(interfaceName + ":" + requestJson);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存到历史记录
|
||||
*/
|
||||
protected void saveToHistory(AuditContentRequest request, String interfaceName, String requestHash, JSONObject result, User loginUser) {
|
||||
try {
|
||||
aiHistoryService.saveHistory(request.getProjectId(), requestHash, interfaceName, JSONObject.toJSONString(request), result.toJSONString(), loginUser.getUserId(), loginUser.getUsername(), loginUser.getTenantId());
|
||||
} catch (Exception e) {
|
||||
log.warn("保存历史记录失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否有上传的文件
|
||||
*/
|
||||
protected boolean hasUploadedFiles(AuditContentRequest request) {
|
||||
return !request.getDocList().isEmpty() || !request.getFileList().isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取知识库ID
|
||||
*/
|
||||
protected String getKnowledgeBaseId(String tempKbId, String requestKbIds) {
|
||||
return StrUtil.isNotBlank(tempKbId) ? tempKbId : requestKbIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目库KB IDs
|
||||
*/
|
||||
protected String getLibraryKbIds(String libraryIds) {
|
||||
if (StrUtil.isBlank(libraryIds)) {
|
||||
return "";
|
||||
}
|
||||
List<String> idList = StrUtil.split(libraryIds, ',');
|
||||
List<PwlProjectLibrary> ret = pwlProjectLibraryService.list(new LambdaQueryWrapper<PwlProjectLibrary>().in(PwlProjectLibrary::getId, idList));
|
||||
return ret.stream().map(PwlProjectLibrary::getKbId).filter(StrUtil::isNotBlank).collect(Collectors.joining(","));
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建临时知识库并提交文档
|
||||
*/
|
||||
protected String createTempKnowledgeBase(AuditContentRequest request) {
|
||||
String kbIdTmp = knowledgeBaseService.createKnowledgeBaseTemp();
|
||||
// 收集文档ID
|
||||
Set<Integer> docIds = request.getDocList().stream().flatMap(docId -> aiCloudDocService.getSelfAndChildren(docId).stream()).map(AiCloudDoc::getId).collect(Collectors.toSet());
|
||||
// 查询相关文件
|
||||
List<AiCloudFile> fileList = getRelatedFiles(docIds, request.getFileList());
|
||||
// 提取文件ID并提交到知识库
|
||||
Set<String> kbFileIds = fileList.stream().map(AiCloudFile::getFileId).collect(Collectors.toSet());
|
||||
if (!kbFileIds.isEmpty()) {
|
||||
knowledgeBaseService.submitDocuments(kbIdTmp, new ArrayList<>(kbFileIds));
|
||||
}
|
||||
return kbIdTmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取相关文件列表
|
||||
*/
|
||||
protected List<AiCloudFile> getRelatedFiles(Set<Integer> docIds, List<Integer> fileList) {
|
||||
LambdaQueryWrapper<AiCloudFile> queryWrapper = new LambdaQueryWrapper<AiCloudFile>()
|
||||
.in(!docIds.isEmpty(), AiCloudFile::getDocId, docIds)
|
||||
.or(!fileList.isEmpty())
|
||||
.in(!fileList.isEmpty(), AiCloudFile::getId, fileList);
|
||||
return aiCloudFileService.list(queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理临时知识库
|
||||
*/
|
||||
protected void cleanupTempKnowledgeBase(String kbId) {
|
||||
if (StrUtil.isNotBlank(kbId)) {
|
||||
try {
|
||||
knowledgeBaseService.deleteIndex(kbId);
|
||||
} catch (Exception e) {
|
||||
log.warn("删除临时知识库失败: {}", kbId, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用的Excel导出方法
|
||||
*/
|
||||
protected <T> void exportToExcel(Map<String, Object> request, HttpServletResponse response,
|
||||
String sheetName, Function<List<Map<String, Object>>, List<T>> converter,
|
||||
Class<T> entityClass) {
|
||||
List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.get("data");
|
||||
String companyName = (String) request.get("companyName");
|
||||
|
||||
List<T> exportData = converter.apply(dataList);
|
||||
|
||||
String fileName = sheetName + "_" + (companyName != null ? companyName : "未知公司");
|
||||
String title = companyName != null ? companyName + " - " + sheetName : sheetName;
|
||||
|
||||
ExcelExportTool.exportExcel(exportData, entityClass, fileName, sheetName, title, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 带审计时间的Excel导出方法
|
||||
*/
|
||||
protected <T> void exportToExcelWithAuditTime(Map<String, Object> request, HttpServletResponse response,
|
||||
String sheetName, Function<List<Map<String, Object>>, List<T>> converter,
|
||||
Class<T> entityClass) {
|
||||
List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.get("data");
|
||||
String companyName = (String) request.get("companyName");
|
||||
String auditTime = (String) request.get("auditTime");
|
||||
|
||||
List<T> exportData = converter.apply(dataList);
|
||||
|
||||
String fileName = sheetName + "_" + (companyName != null ? companyName : "未知公司");
|
||||
String title = companyName != null ? companyName + " - " + sheetName : sheetName;
|
||||
|
||||
if (auditTime != null) {
|
||||
title += "(审计时间:" + auditTime + ")";
|
||||
}
|
||||
|
||||
ExcelExportTool.exportExcel(exportData, entityClass, fileName, sheetName, title, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 参数包装类
|
||||
*/
|
||||
protected static class GenerateParams {
|
||||
public final String knowledgeBaseId;
|
||||
public final String libraryKbIds;
|
||||
public final String projectLibrary;
|
||||
public final String username;
|
||||
public final String history;
|
||||
public final String suggestion;
|
||||
|
||||
public GenerateParams(String knowledgeBaseId, String libraryKbIds, String projectLibrary, String username, String history, String suggestion) {
|
||||
this.knowledgeBaseId = knowledgeBaseId;
|
||||
this.libraryKbIds = libraryKbIds;
|
||||
this.projectLibrary = projectLibrary;
|
||||
this.username = username;
|
||||
this.history = history;
|
||||
this.suggestion = suggestion;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 通用的工具方法 ==========
|
||||
|
||||
/**
|
||||
* 获取字符串值
|
||||
*/
|
||||
protected String getStringValue(Map<String, Object> map, String key) {
|
||||
Object value = map.get(key);
|
||||
return value != null ? value.toString() : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化底稿索引
|
||||
*/
|
||||
protected String formatWorkPaperIndex(Object workPaperIndex) {
|
||||
if (workPaperIndex == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (workPaperIndex instanceof List) {
|
||||
List<?> list = (List<?>) workPaperIndex;
|
||||
return String.join(", ", list.stream()
|
||||
.map(Object::toString)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
return workPaperIndex.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package com.gxwebsoft.ai.controller;
|
||||
|
||||
import com.gxwebsoft.ai.dto.KnowledgeBaseRequest;
|
||||
import com.gxwebsoft.ai.service.KnowledgeBaseService;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.enterprise.entity.Enterprise;
|
||||
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@Tag(name = "知识库")
|
||||
@RestController
|
||||
@RequestMapping("/api/ai/knowledgeBase")
|
||||
public class KnowledgeBaseController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private KnowledgeBaseService knowledgeBaseService;
|
||||
|
||||
@Operation(summary = "查询知识库")
|
||||
@GetMapping("/query")
|
||||
public ApiResult<?> query(KnowledgeBaseRequest req) {
|
||||
try {
|
||||
return success(knowledgeBaseService.queryKnowledgeBase(req));
|
||||
} catch (Exception e) {
|
||||
return fail("查询失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Operation(summary = "创建知识库")
|
||||
@PostMapping("/create")
|
||||
public ApiResult<?> create(@RequestParam String companyName, @RequestParam String companyCode) {
|
||||
try {
|
||||
String indexId = knowledgeBaseService.createKnowledgeBase(companyName, companyCode);
|
||||
return success(indexId);
|
||||
} catch (Exception e) {
|
||||
return fail("创建失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Operation(summary = "查询知识库下的文档列表")
|
||||
@GetMapping("/documents")
|
||||
public ApiResult<?> listDocuments(String kbId, Integer pageSize, Integer pageNumber) {
|
||||
try {
|
||||
Map<String,Object> map = knowledgeBaseService.listDocuments(kbId, pageSize, pageNumber);
|
||||
List<Object> data = Convert.toList(Object.class, map.get("data"));
|
||||
Long total = MapUtil.getLong(map, "total");
|
||||
return success(new PageResult<Object>(data, total));
|
||||
} catch (Exception e) {
|
||||
return fail("查询文档列表失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Operation(summary = "删除知识库下的文档")
|
||||
@DeleteMapping("/document")
|
||||
public ApiResult<?> deleteDocument(String kbId, String fileIds) {
|
||||
try {
|
||||
boolean result = knowledgeBaseService.deleteIndexDocument(kbId, fileIds);
|
||||
if (result) {
|
||||
return success("删除成功");
|
||||
} else {
|
||||
return fail("删除失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return fail("删除文档失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Operation(summary = "上传文档到知识库")
|
||||
@PostMapping("/upload")
|
||||
public ApiResult<?> uploadDocuments(@RequestParam String kbId, @RequestParam("files") MultipartFile[] files) {
|
||||
try {
|
||||
if (files == null || files.length == 0) {
|
||||
return fail("请选择要上传的文件");
|
||||
}
|
||||
|
||||
for (MultipartFile file : files) {
|
||||
if (file.isEmpty()) {
|
||||
return fail("文件不能为空: " + file.getOriginalFilename());
|
||||
}
|
||||
if (file.getSize() > 100 * 1024 * 1024) {
|
||||
return fail("文件大小不能超过100MB: " + file.getOriginalFilename());
|
||||
}
|
||||
}
|
||||
|
||||
List<String> fileIds = knowledgeBaseService.uploadDocuments(kbId, files);
|
||||
boolean result = knowledgeBaseService.submitDocuments(kbId, fileIds);
|
||||
|
||||
if (result) {
|
||||
return success("成功上传 " + files.length + " 个文件");
|
||||
} else {
|
||||
return success("部分文件上传成功");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return fail("上传失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
62
src/main/java/com/gxwebsoft/ai/dto/AuditContentRequest.java
Normal file
62
src/main/java/com/gxwebsoft/ai/dto/AuditContentRequest.java
Normal file
@@ -0,0 +1,62 @@
|
||||
package com.gxwebsoft.ai.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 审计内容请求参数
|
||||
*/
|
||||
@Data
|
||||
public class AuditContentRequest {
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 企业库
|
||||
*/
|
||||
private String kbIds;
|
||||
|
||||
/**
|
||||
* 公共库
|
||||
*/
|
||||
private String libraryIds;
|
||||
|
||||
/**
|
||||
* 案例库
|
||||
*/
|
||||
private String projectLibrary;
|
||||
|
||||
/**
|
||||
* 历史数据
|
||||
*/
|
||||
private String history;
|
||||
|
||||
/**
|
||||
* 知识库关键词
|
||||
*/
|
||||
private String keywords;
|
||||
|
||||
/**
|
||||
* 优化建议
|
||||
*/
|
||||
private String suggestion;
|
||||
|
||||
/**
|
||||
* 目录列表
|
||||
*/
|
||||
private List<Integer> docList;
|
||||
|
||||
/**
|
||||
* 文件列表
|
||||
*/
|
||||
private List<Integer> fileList;
|
||||
|
||||
/**
|
||||
* 相关数据
|
||||
*/
|
||||
private Object data;
|
||||
}
|
||||
35
src/main/java/com/gxwebsoft/ai/dto/AuditEvidenceRequest.java
Normal file
35
src/main/java/com/gxwebsoft/ai/dto/AuditEvidenceRequest.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package com.gxwebsoft.ai.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AuditEvidenceRequest {
|
||||
// 基础信息
|
||||
private String caseIndex; // 案引号
|
||||
private String projectName; // 项目名称
|
||||
private String auditedTarget; // 被审计单位或个人
|
||||
private String auditMatter; // 审计事项
|
||||
private String summaryTitle; // 标题
|
||||
private String auditRecord; // 审计记录
|
||||
private String auditFinding; // 审计发现
|
||||
private String evidenceBasis; // 定性依据
|
||||
private String handling; // 处理
|
||||
private String suggestion; // 建议
|
||||
private String attachment; // 附件
|
||||
private String auditors; // 审计人员
|
||||
private String compileDate; // 编制日期
|
||||
private String providerOpinion; // 证据提供单位意见
|
||||
private String providerDate; // 证据提供日期
|
||||
private String attachmentPages; // 附件页数
|
||||
private String feedbackDeadline; // 反馈期限
|
||||
|
||||
// 导出取证单使用
|
||||
private String pageIndex;
|
||||
private String pageTotal;
|
||||
|
||||
// 历史内容(用于工作流生成)
|
||||
private String history;
|
||||
|
||||
// 用户信息
|
||||
private String userName;
|
||||
}
|
||||
89
src/main/java/com/gxwebsoft/ai/dto/AuditReportRequest.java
Normal file
89
src/main/java/com/gxwebsoft/ai/dto/AuditReportRequest.java
Normal file
@@ -0,0 +1,89 @@
|
||||
package com.gxwebsoft.ai.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AuditReportRequest{
|
||||
|
||||
@Schema(description = "审计标题")
|
||||
private String from00;
|
||||
|
||||
@Schema(description = "审计依据")
|
||||
private String from10;
|
||||
|
||||
@Schema(description = "审计目标")
|
||||
private String from20;
|
||||
|
||||
@Schema(description = "审计对象和范围")
|
||||
private String from30;
|
||||
|
||||
@Schema(description = "被审计单位基本情况-单位概况")
|
||||
private String from41;
|
||||
|
||||
@Schema(description = "被审计单位基本情况-机构和人员相关情况")
|
||||
private String from42;
|
||||
|
||||
@Schema(description = "被审计单位基本情况-财务会计、重大会计政策选用及变动情况")
|
||||
private String from43;
|
||||
|
||||
@Schema(description = "审计期间合并口径年度资产负债及各项业务总体情况")
|
||||
private List<String> from44;
|
||||
|
||||
@Schema(description = "被审计单位基本情况-相关内部控制")
|
||||
private String from45;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-贯彻执行党和国家有关经济方针和上级决策部署情况")
|
||||
private String from51;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-公司发展战略规划的制定、执行和效果情况以及年度责任目标完成情况")
|
||||
private String from52;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-重大经济事项的决策、执行和效果情况")
|
||||
private String from53;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-公司法人治理结构的建立、健全和运行情况,内部控制制度的制定和执行情况")
|
||||
private String from54;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-公司财务的真实合法效益情况,风险管控情况,境外资产管理情况")
|
||||
private String from55;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-在经济活动中落实有关党风廉政建设责任和遵守廉洁从业规定情况")
|
||||
private String from56;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-对以往审计中发现问题的整改情况")
|
||||
private String from57;
|
||||
|
||||
@Schema(description = "审计内容和重点及审计方法-其他需要审计的事项")
|
||||
private String from58;
|
||||
|
||||
@Schema(description = "重要风险的识别及应对-重要风险的识别")
|
||||
private String from61;
|
||||
|
||||
@Schema(description = "重要风险的识别及应对-风险的应对策略")
|
||||
private String from62;
|
||||
|
||||
@Schema(description = "审计技术方法")
|
||||
private String from70;
|
||||
|
||||
@Schema(description = "工作步骤与时间安排")
|
||||
private String from80;
|
||||
|
||||
@Schema(description = "审计工作的组织实施")
|
||||
private String from90;
|
||||
|
||||
@Schema(description = "知识库ID")
|
||||
private String kbIds;//英文逗号分割
|
||||
|
||||
@Schema(description = "生成模块:AuditReportEnum.code")
|
||||
private Integer formCommit;
|
||||
|
||||
@Schema(description = "历史内容")
|
||||
private String history;
|
||||
|
||||
@Schema(description = "修改建议")
|
||||
private String suggestion;
|
||||
|
||||
}
|
||||
20
src/main/java/com/gxwebsoft/ai/dto/KnowledgeBaseRequest.java
Normal file
20
src/main/java/com/gxwebsoft/ai/dto/KnowledgeBaseRequest.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package com.gxwebsoft.ai.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class KnowledgeBaseRequest {
|
||||
|
||||
@Schema(description = "知识库ID")
|
||||
private String kbId;
|
||||
|
||||
@Schema(description = "召回内容")
|
||||
private String query;
|
||||
|
||||
@Schema(description = "召回模块(1~9)")
|
||||
private Integer formCommit;
|
||||
|
||||
@Schema(description = "返回TOP切片数量")
|
||||
private Integer topK;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 预算执行情况审计表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("BudgetExecutionExportEntity")
|
||||
public class BudgetExecutionExportEntity {
|
||||
|
||||
@Excel(name = "项目", orderNum = "1", width = 30)
|
||||
private String project;
|
||||
|
||||
@Excel(name = "上年结转", orderNum = "2", width = 15)
|
||||
private String lastYearCarryOver;
|
||||
|
||||
@Excel(name = "本年预算小计", orderNum = "3", width = 15)
|
||||
private String currentYearBudgetTotal;
|
||||
|
||||
@Excel(name = "年初批复预算数", orderNum = "4", width = 15)
|
||||
private String initialApprovedBudget;
|
||||
|
||||
@Excel(name = "追加预算数", orderNum = "5", width = 15)
|
||||
private String additionalBudgetAmount;
|
||||
|
||||
@Excel(name = "实际拨款数", orderNum = "6", width = 15)
|
||||
private String actualAppropriation;
|
||||
|
||||
@Excel(name = "指标结余", orderNum = "7", width = 15)
|
||||
private String indicatorBalance;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "8", width = 20)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 预算管理审计表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("BudgetManageExportEntity")
|
||||
public class BudgetManageExportEntity {
|
||||
|
||||
@Excel(name = "预算科目名称", orderNum = "1", width = 25)
|
||||
private String budgetSubject;
|
||||
|
||||
@Excel(name = "指标来源-合计", orderNum = "2", width = 15)
|
||||
private String indicatorSourceTotal;
|
||||
|
||||
@Excel(name = "指标来源-上年结余", orderNum = "3", width = 15)
|
||||
private String indicatorSourceLastYearBalance;
|
||||
|
||||
@Excel(name = "指标来源-年初部门预算", orderNum = "4", width = 15)
|
||||
private String indicatorSourceInitialBudget;
|
||||
|
||||
@Excel(name = "指标来源-追加(减)预算", orderNum = "5", width = 15)
|
||||
private String indicatorSourceAdditionalBudget;
|
||||
|
||||
@Excel(name = "指标运用-合计", orderNum = "6", width = 15)
|
||||
private String indicatorUseTotal;
|
||||
|
||||
@Excel(name = "指标运用-拨款小计", orderNum = "7", width = 15)
|
||||
private String indicatorUseAppropriationSubtotal;
|
||||
|
||||
@Excel(name = "指标运用-拨款", orderNum = "8", width = 15)
|
||||
private String indicatorUseAppropriation;
|
||||
|
||||
@Excel(name = "指标运用-工资统发", orderNum = "9", width = 15)
|
||||
private String indicatorUseSalaryPayment;
|
||||
|
||||
@Excel(name = "指标运用-政府采购", orderNum = "10", width = 15)
|
||||
private String indicatorUseGovProcurement;
|
||||
|
||||
@Excel(name = "财政管理专户", orderNum = "11", width = 15)
|
||||
private String financeManagementAccount;
|
||||
|
||||
@Excel(name = "部门预算用于其他", orderNum = "12", width = 15)
|
||||
private String budgetUsedForOther;
|
||||
|
||||
@Excel(name = "指标结余", orderNum = "13", width = 15)
|
||||
private String indicatorBalance;
|
||||
|
||||
@Excel(name = "政府采购", orderNum = "14", width = 15)
|
||||
private String governmentProcurement;
|
||||
|
||||
@Excel(name = "应拨单位款", orderNum = "15", width = 15)
|
||||
private String payableToUnit;
|
||||
|
||||
@Excel(name = "其他", orderNum = "16", width = 15)
|
||||
private String other;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "17", width = 20)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 重大经济决策调查表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("DecisionTableExportEntity")
|
||||
public class DecisionTableExportEntity {
|
||||
|
||||
@Excel(name = "序号", orderNum = "1", width = 8)
|
||||
private String index;
|
||||
|
||||
@Excel(name = "重大经济决策事项", orderNum = "2", width = 30)
|
||||
private String decisionItem;
|
||||
|
||||
@Excel(name = "会议时间", orderNum = "3", width = 15)
|
||||
private String meetingTime;
|
||||
|
||||
@Excel(name = "决策事项金额", orderNum = "4", width = 15)
|
||||
private String decisionAmount;
|
||||
|
||||
@Excel(name = "程序", orderNum = "5", width = 20)
|
||||
private String procedure;
|
||||
|
||||
@Excel(name = "执行情况(是/否)", orderNum = "6", width = 15)
|
||||
private String executionStatus;
|
||||
|
||||
@Excel(name = "好", orderNum = "7", width = 8)
|
||||
private String good;
|
||||
|
||||
@Excel(name = "一般", orderNum = "8", width = 8)
|
||||
private String normal;
|
||||
|
||||
@Excel(name = "差", orderNum = "9", width = 8)
|
||||
private String bad;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 八项规定导出实体
|
||||
*/
|
||||
@Data
|
||||
public class EightRegExportEntity {
|
||||
|
||||
@Excel(name = "审计标题", orderNum = "1", width = 8)
|
||||
private String title;
|
||||
|
||||
@Excel(name = "审计内容", orderNum = "1", width = 8)
|
||||
private String content;
|
||||
|
||||
@Excel(name = "审计检查证据", orderNum = "1", width = 8)
|
||||
private String testContent;
|
||||
|
||||
@Excel(name = "测试结果", orderNum = "1", width = 8)
|
||||
private String result;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "1", width = 8)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 支出情况表导出实体类
|
||||
*/
|
||||
@Data
|
||||
public class ExpenseExportEntity {
|
||||
|
||||
@Excel(name = "支出类型", orderNum = "0", width = 12)
|
||||
private String expenseType;
|
||||
|
||||
@Excel(name = "年份", orderNum = "1", width = 8)
|
||||
private String year;
|
||||
|
||||
@Excel(name = "决算报表数(元)", orderNum = "2", width = 15)
|
||||
private String finalStatementAmount;
|
||||
|
||||
@Excel(name = "年初预算数(元)", orderNum = "3", width = 15)
|
||||
private String initialBudgetAmount;
|
||||
|
||||
@Excel(name = "增减情况(%)", orderNum = "4", width = 12)
|
||||
private String changePercentage;
|
||||
|
||||
@Excel(name = "占年初预算比例(%)", orderNum = "5", width = 12)
|
||||
private String budgetRatio;
|
||||
|
||||
@Excel(name = "备注", orderNum = "6", width = 20)
|
||||
private String remark;
|
||||
|
||||
@Excel(name = "数据来源", orderNum = "7", width = 20)
|
||||
private String dataSource;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "8", width = 25)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 历史审计问题整改表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("HistoryTableExportEntity")
|
||||
public class HistoryTableExportEntity {
|
||||
|
||||
@Excel(name = "序号", orderNum = "1", width = 8)
|
||||
private String index;
|
||||
|
||||
@Excel(name = "审计年度", orderNum = "2", width = 12)
|
||||
private String auditYear;
|
||||
|
||||
@Excel(name = "审计类型", orderNum = "3", width = 15)
|
||||
private String auditType;
|
||||
|
||||
@Excel(name = "审计发现的问题", orderNum = "4", width = 40, needMerge = true)
|
||||
private String problemFound;
|
||||
|
||||
@Excel(name = "整改要求", orderNum = "5", width = 30, needMerge = true)
|
||||
private String rectificationRequirement;
|
||||
|
||||
@Excel(name = "整改措施", orderNum = "6", width = 30, needMerge = true)
|
||||
private String rectificationMeasures;
|
||||
|
||||
@Excel(name = "整改完成情况", orderNum = "7", width = 15)
|
||||
private String rectificationStatus;
|
||||
|
||||
@Excel(name = "整改完成时间", orderNum = "8", width = 15)
|
||||
private String completionDate;
|
||||
|
||||
@Excel(name = "整改责任人", orderNum = "9", width = 15)
|
||||
private String responsiblePerson;
|
||||
|
||||
@Excel(name = "备注", orderNum = "10", width = 20, needMerge = true)
|
||||
private String remark;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "11", width = 25, needMerge = true)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 单位层面财务管理内部控制测试表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("InternalControlExportEntity")
|
||||
public class InternalControlExportEntity {
|
||||
|
||||
@Excel(name = "序号", orderNum = "1", width = 8)
|
||||
private String index;
|
||||
|
||||
@Excel(name = "控制环节", orderNum = "2", width = 25)
|
||||
private String controlLink;
|
||||
|
||||
@Excel(name = "控制要求", orderNum = "3", width = 25)
|
||||
private String controlRequirement;
|
||||
|
||||
@Excel(name = "控制活动描述", orderNum = "4", width = 30)
|
||||
private String controlActivity;
|
||||
|
||||
@Excel(name = "控制职责岗位", orderNum = "5", width = 20)
|
||||
private String controlPosition;
|
||||
|
||||
@Excel(name = "测试步骤", orderNum = "6", width = 30)
|
||||
private String testSteps;
|
||||
|
||||
@Excel(name = "检查的证据及测试内容", orderNum = "7", width = 40)
|
||||
private String checkEvidence;
|
||||
|
||||
@Excel(name = "测试结果", orderNum = "8", width = 12)
|
||||
private String testResult;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "9", width = 25)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 重大投资情况审计表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("InvestmentSituationExportEntity")
|
||||
public class InvestmentSituationExportEntity {
|
||||
|
||||
@Excel(name = "审计类别", orderNum = "1", width = 20)
|
||||
private String category;
|
||||
|
||||
@Excel(name = "审计内容", orderNum = "2", width = 60)
|
||||
private String auditContent;
|
||||
|
||||
@Excel(name = "检查的证据及测试内容", orderNum = "3", width = 80)
|
||||
private String checkEvidence;
|
||||
|
||||
@Excel(name = "测试结果", orderNum = "4", width = 15)
|
||||
private String testResult;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "5", width = 40)
|
||||
private String workPaperIndex;
|
||||
|
||||
@Excel(name = "文件索引", orderNum = "6", width = 40)
|
||||
private String fileIndex;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 领导班子名单导出实体
|
||||
*/
|
||||
@Data
|
||||
public class LeaderListExportEntity {
|
||||
|
||||
@Excel(name = "单位", orderNum = "1", width = 8)
|
||||
private String unit;
|
||||
|
||||
@Excel(name = "姓名", orderNum = "1", width = 8)
|
||||
private String name;
|
||||
|
||||
@Excel(name = "部门", orderNum = "1", width = 8)
|
||||
private String department;
|
||||
|
||||
@Excel(name = "党内职务", orderNum = "1", width = 8)
|
||||
private String partyPosition;
|
||||
|
||||
@Excel(name = "行政职务", orderNum = "1", width = 8)
|
||||
private String adminPosition;
|
||||
|
||||
@Excel(name = "任职期间", orderNum = "1", width = 8)
|
||||
private String tenurePeriod;
|
||||
|
||||
@Excel(name = "主要工作责任", orderNum = "1", width = 8)
|
||||
private String mainResponsibilities;
|
||||
|
||||
@Excel(name = "备注", orderNum = "1", width = 8)
|
||||
private String remark;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "1", width = 8)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 党风廉政建设责任制审计表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("PartyConductExportEntity")
|
||||
public class PartyConductExportEntity {
|
||||
|
||||
@Excel(name = "大类", orderNum = "1", width = 20, isWrap = true)
|
||||
private String category;
|
||||
|
||||
@Excel(name = "子类", orderNum = "2", width = 25, isWrap = true)
|
||||
private String subCategory;
|
||||
|
||||
@Excel(name = "小类", orderNum = "3", width = 15, isWrap = true)
|
||||
private String detailCategory;
|
||||
|
||||
@Excel(name = "内容", orderNum = "4", width = 40, isWrap = true)
|
||||
private String content;
|
||||
|
||||
@Excel(name = "执行情况", orderNum = "5", width = 12)
|
||||
private String executionStatus;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "6", width = 30, isWrap = true)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
// PersonnelExportEntity.java
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 人员编制管理审计导出实体
|
||||
*/
|
||||
@Data
|
||||
public class PersonnelExportEntity {
|
||||
/**
|
||||
* 序号
|
||||
*/
|
||||
private String index;
|
||||
|
||||
/**
|
||||
* 审计内容
|
||||
*/
|
||||
private String auditContent;
|
||||
|
||||
/**
|
||||
* 审计目标
|
||||
*/
|
||||
private String auditTarget;
|
||||
|
||||
/**
|
||||
* 审计证据
|
||||
*/
|
||||
private String auditEvidence;
|
||||
|
||||
/**
|
||||
* 生成结果
|
||||
*/
|
||||
private String generationResult;
|
||||
|
||||
/**
|
||||
* 工作底稿索引
|
||||
*/
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 国有资产管理审计导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("StateAssetsAuditExportEntity")
|
||||
public class StateAssetsAuditExportEntity {
|
||||
|
||||
@Excel(name = "序号", orderNum = "0", width = 8)
|
||||
private String index;
|
||||
|
||||
@Excel(name = "国有资产名称", orderNum = "1", width = 30)
|
||||
private String assetName;
|
||||
|
||||
@Excel(name = "国有资产取得方式", orderNum = "2", width = 25)
|
||||
private String acquisitionMethod;
|
||||
|
||||
@Excel(name = "国有资产价值", orderNum = "3", width = 20)
|
||||
private String assetValue;
|
||||
|
||||
@Excel(name = "国有资产地址", orderNum = "4", width = 30)
|
||||
private String assetAddress;
|
||||
|
||||
@Excel(name = "面积", orderNum = "5", width = 15)
|
||||
private String area;
|
||||
|
||||
@Excel(name = "承租方", orderNum = "6", width = 25)
|
||||
private String tenant;
|
||||
|
||||
@Excel(name = "合同金额", orderNum = "7", width = 20)
|
||||
private String contractAmount;
|
||||
|
||||
@Excel(name = "租赁合同起止时间", orderNum = "8", width = 25)
|
||||
private String leasePeriod;
|
||||
|
||||
@Excel(name = "国有资产租金缴纳时间", orderNum = "9", width = 25)
|
||||
private String rentPaymentTime;
|
||||
|
||||
@Excel(name = "国有资产出租是否上平台", orderNum = "10", width = 25)
|
||||
private String platformLease;
|
||||
|
||||
@Excel(name = "国有资产出租的审批文件", orderNum = "11", width = 35)
|
||||
private String approvalDoc;
|
||||
|
||||
@Excel(name = "是否纳入预算", orderNum = "12", width = 15)
|
||||
private String inBudget;
|
||||
|
||||
@Excel(name = "备注", orderNum = "13", width = 30)
|
||||
private String remark;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "14", width = 40)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 单位发展战略执行审计导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("StrategyAuditExportEntity")
|
||||
public class StrategyAuditExportEntity {
|
||||
|
||||
@Excel(name = "序号", orderNum = "0", width = 10)
|
||||
private String index;
|
||||
|
||||
// @Excel(name = "审计分类", orderNum = "1", width = 15)
|
||||
// private String category;
|
||||
|
||||
@Excel(name = "审计内容", orderNum = "2", width = 50)
|
||||
private String auditContent;
|
||||
|
||||
// @Excel(name = "政策法规要求", orderNum = "3", width = 40)
|
||||
// private String policyRequirement;
|
||||
|
||||
// @Excel(name = "审计标准", orderNum = "4", width = 30)
|
||||
// private String auditStandard;
|
||||
|
||||
@Excel(name = "检查的证据及测试内容", orderNum = "5", width = 40)
|
||||
private String checkEvidence;
|
||||
|
||||
@Excel(name = "测试结果", orderNum = "6", width = 10)
|
||||
private String testResult;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "7", width = 20)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 目标责任制完成情况审计导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("TargetAuditExportEntity")
|
||||
public class TargetAuditExportEntity {
|
||||
|
||||
@Excel(name = "序号", orderNum = "0", width = 8)
|
||||
private String index;
|
||||
|
||||
@Excel(name = "年度", orderNum = "1", width = 12)
|
||||
private String year;
|
||||
|
||||
@Excel(name = "上级主管部门下达目标责任制-下达文件", orderNum = "2", width = 40)
|
||||
private String superiorFile;
|
||||
|
||||
@Excel(name = "上级主管部门下达目标责任制-完成情况", orderNum = "3", width = 15)
|
||||
private String superiorCompletion;
|
||||
|
||||
@Excel(name = "上级主管部门下达目标责任制-未完成原因", orderNum = "4", width = 30)
|
||||
private String superiorReason;
|
||||
|
||||
@Excel(name = "单位自定下达目标责任制-计划文件", orderNum = "5", width = 40)
|
||||
private String selfPlan;
|
||||
|
||||
@Excel(name = "单位自定下达目标责任制-完成情况", orderNum = "6", width = 15)
|
||||
private String selfCompletion;
|
||||
|
||||
@Excel(name = "单位自定下达目标责任制-未完成原因", orderNum = "7", width = 30)
|
||||
private String selfReason;
|
||||
|
||||
@Excel(name = "备注", orderNum = "8", width = 30)
|
||||
private String remark;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "9", width = 40)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.gxwebsoft.ai.dto.export;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 三重一大制度对比分析表导出实体
|
||||
*/
|
||||
@Data
|
||||
@ExcelTarget("TripleOneExportEntity")
|
||||
public class TripleOneExportEntity {
|
||||
|
||||
@Excel(name = "类别", orderNum = "1", width = 15)
|
||||
private String category;
|
||||
|
||||
@Excel(name = "政策内容", orderNum = "2", width = 40)
|
||||
private String policyContent;
|
||||
|
||||
@Excel(name = "集团制度", orderNum = "3", width = 30)
|
||||
private String groupSystem;
|
||||
|
||||
@Excel(name = "公司制度", orderNum = "4", width = 30)
|
||||
private String companyFormulation;
|
||||
|
||||
@Excel(name = "检查的证据及测试内容", orderNum = "5", width = 25)
|
||||
private String checkEvidence;
|
||||
|
||||
@Excel(name = "测试结果", orderNum = "6", width = 10)
|
||||
private String testResult;
|
||||
|
||||
@Excel(name = "工作底稿索引", orderNum = "7", width = 20)
|
||||
private String workPaperIndex;
|
||||
}
|
||||
61
src/main/java/com/gxwebsoft/ai/entity/AiCloudDoc.java
Normal file
61
src/main/java/com/gxwebsoft/ai/entity/AiCloudDoc.java
Normal file
@@ -0,0 +1,61 @@
|
||||
package com.gxwebsoft.ai.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import java.time.LocalDateTime;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import java.io.Serializable;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* AI云文档目录表
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@Schema(name = "AiCloudDoc对象", description = "AI云文档目录表")
|
||||
public class AiCloudDoc implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "ID")
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Schema(description = "云目录ID")
|
||||
private String categoryId;
|
||||
|
||||
@Schema(description = "单位ID")
|
||||
private Integer companyId;
|
||||
|
||||
@Schema(description = "上级目录ID")
|
||||
private Integer parentId;
|
||||
|
||||
@Schema(description = "目录名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "排序(数字越小越靠前)")
|
||||
private Integer sortNumber;
|
||||
|
||||
@Schema(description = "状态, 0正常, 1冻结")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否删除, 0否, 1是")
|
||||
@TableLogic
|
||||
private Integer deleted;
|
||||
|
||||
@Schema(description = "创建用户ID")
|
||||
private Integer userId;
|
||||
|
||||
@Schema(description = "租户id")
|
||||
private Integer tenantId;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "修改时间")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
||||
76
src/main/java/com/gxwebsoft/ai/entity/AiCloudFile.java
Normal file
76
src/main/java/com/gxwebsoft/ai/entity/AiCloudFile.java
Normal file
@@ -0,0 +1,76 @@
|
||||
package com.gxwebsoft.ai.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import java.time.LocalDateTime;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import java.io.Serializable;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* AI云文件表
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@Schema(name = "AiCloudFile对象", description = "AI云文件表")
|
||||
public class AiCloudFile implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "ID")
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Schema(description = "文档目录ID")
|
||||
private Integer docId;
|
||||
|
||||
@Schema(description = "文件名")
|
||||
private String fileName;
|
||||
|
||||
@Schema(description = "文件大小(字节)")
|
||||
private Long fileSize;
|
||||
|
||||
@Schema(description = "文件类型")
|
||||
private String fileType;
|
||||
|
||||
@Schema(description = "工作空间ID")
|
||||
private String workspaceId;
|
||||
|
||||
@Schema(description = "云文件ID")
|
||||
private String fileId;
|
||||
|
||||
@Schema(description = "文件地址URL")
|
||||
private String fileUrl;
|
||||
|
||||
@Schema(description = "文件扩展名")
|
||||
private String fileExt;
|
||||
|
||||
@Schema(description = "上传时间")
|
||||
private LocalDateTime uploadTime;
|
||||
|
||||
@Schema(description = "排序(数字越小越靠前)")
|
||||
private Integer sortNumber;
|
||||
|
||||
@Schema(description = "状态, 0正常, 1冻结")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否删除, 0否, 1是")
|
||||
@TableLogic
|
||||
private Integer deleted;
|
||||
|
||||
@Schema(description = "上传用户ID")
|
||||
private Integer userId;
|
||||
|
||||
@Schema(description = "租户id")
|
||||
private Integer tenantId;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "修改时间")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
||||
63
src/main/java/com/gxwebsoft/ai/entity/AiHistory.java
Normal file
63
src/main/java/com/gxwebsoft/ai/entity/AiHistory.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package com.gxwebsoft.ai.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* AI审计历史记录表
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@Schema(name = "AiHistory对象", description = "AI审计历史记录表")
|
||||
@TableName("ai_history")
|
||||
public class AiHistory implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "主键ID")
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "项目ID")
|
||||
private Long projectId;
|
||||
|
||||
@Schema(description = "请求哈希值")
|
||||
private String requestHash;
|
||||
|
||||
@Schema(description = "接口名称")
|
||||
private String interfaceName;
|
||||
|
||||
@Schema(description = "请求参数序列化数据")
|
||||
private String requestData;
|
||||
|
||||
@Schema(description = "响应结果序列化数据")
|
||||
private String responseData;
|
||||
|
||||
@Schema(description = "用户ID")
|
||||
private Integer userId;
|
||||
|
||||
@Schema(description = "用户名")
|
||||
private String username;
|
||||
|
||||
@Schema(description = "状态, 0正常, 1冻结")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否删除, 0否, 1是")
|
||||
@TableLogic
|
||||
private Integer deleted;
|
||||
|
||||
@Schema(description = "租户id")
|
||||
private Integer tenantId;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "修改时间")
|
||||
private LocalDateTime updateTime;
|
||||
}
|
||||
104
src/main/java/com/gxwebsoft/ai/enums/AuditReportEnum.java
Normal file
104
src/main/java/com/gxwebsoft/ai/enums/AuditReportEnum.java
Normal file
@@ -0,0 +1,104 @@
|
||||
package com.gxwebsoft.ai.enums;
|
||||
|
||||
public enum AuditReportEnum {
|
||||
|
||||
// 基础信息
|
||||
TITLE(00, "审计标题"),
|
||||
BASIS(10, "一、审计依据"),
|
||||
OBJECTIVE(20, "二、审计目标"),
|
||||
SCOPE(30, "三、审计对象和范围"),
|
||||
|
||||
// 被审计单位基本情况
|
||||
UNIT_OVERVIEW(41, "四、被审计单位基本情况-(一)单位概况"),
|
||||
ORG_PERSONNEL(42, "四、被审计单位基本情况-(二)机构和人员相关情况"),
|
||||
FINANCIAL_ACCOUNTING(43, "四、被审计单位基本情况-(三)财务会计、重大会计政策选用及变动情况"),
|
||||
ANNUAL_BUSINESS(44, "四、被审计单位基本情况-(四)审计期间合并口径年度资产负债及各项业务总体情况"),
|
||||
INTERNAL_CONTROL(45, "四、被审计单位基本情况-(五)相关内部控制"),
|
||||
|
||||
// 审计内容和重点及审计方法
|
||||
ECONOMIC_POLICIES(51, "五、审计内容和重点及审计方法-(一)贯彻执行党和国家有关经济方针和上级决策部署情况"),
|
||||
DEV_STRATEGY(52, "五、审计内容和重点及审计方法-(二)公司发展战略规划的制定、执行和效果情况以及年度责任目标完成情况"),
|
||||
MAJOR_ECONOMIC(53, "五、审计内容和重点及审计方法-(三)重大经济事项的决策、执行和效果情况"),
|
||||
CORP_GOVERNANCE(54, "五、审计内容和重点及审计方法-(四)公司法人治理结构的建立、健全和运行情况,内部控制制度的制定和执行情况"),
|
||||
FINANCIAL_LEGAL(55, "五、审计内容和重点及审计方法-(五)公司财务的真实合法效益情况,风险管控情况,境外资产管理情况"),
|
||||
INTEGRITY_COMPLIANCE(56, "五、审计内容和重点及审计方法-(六)在经济活动中落实有关党风廉政建设责任和遵守廉洁从业规定情况"),
|
||||
PREV_AUDIT_ISSUES(57, "五、审计内容和重点及审计方法-(七)对以往审计中发现问题的整改情况"),
|
||||
OTHER_MATTERS(58, "五、审计内容和重点及审计方法-(八)其他需要审计的事项"),
|
||||
|
||||
// 重要风险的识别及应对
|
||||
RISK_IDENTIFY(61, "六、重要风险的识别及应对-(一)重要风险的识别"),
|
||||
RISK_RESPONSE(62, "六、重要风险的识别及应对-(二)风险的应对策略"),
|
||||
|
||||
// 其他部分
|
||||
TECHNIQUES(70, "七、审计技术方法"),
|
||||
SCHEDULE(80, "八、工作步骤与时间安排"),
|
||||
ORGANIZATION(90, "九、审计工作的组织实施");
|
||||
|
||||
private final Integer code;
|
||||
private final String desc;
|
||||
|
||||
AuditReportEnum(Integer code, String desc) {
|
||||
this.code = code;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public String getCodeStr() {
|
||||
return String.format("%02d", code);
|
||||
}
|
||||
|
||||
public static AuditReportEnum getByCode(Integer code) {
|
||||
for (AuditReportEnum value : values()) {
|
||||
if (value.code.equals(code)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据代码获取描述信息
|
||||
*/
|
||||
public static String getDescByCode(Integer code) {
|
||||
AuditReportEnum enumValue = getByCode(code);
|
||||
return enumValue != null ? enumValue.getDesc() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据代码获取枚举名称
|
||||
*/
|
||||
public static String getNameByCode(Integer code) {
|
||||
AuditReportEnum enumValue = getByCode(code);
|
||||
return enumValue != null ? enumValue.name() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据代码获取标题部分(不带序号)
|
||||
*/
|
||||
public static String getTitleByCode(Integer code) {
|
||||
AuditReportEnum enumValue = getByCode(code);
|
||||
if (enumValue == null) return null;
|
||||
|
||||
String desc = enumValue.getDesc();
|
||||
int lastDashIndex = desc.lastIndexOf("-");
|
||||
if (lastDashIndex > 0) {
|
||||
return desc.substring(lastDashIndex + 1);
|
||||
}
|
||||
return desc;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据代码获取完整路径(带序号)
|
||||
*/
|
||||
public static String getFullPathByCode(Integer code) {
|
||||
AuditReportEnum enumValue = getByCode(code);
|
||||
return enumValue != null ? enumValue.getDesc() : null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.gxwebsoft.ai.factory;
|
||||
|
||||
import com.aliyun.bailian20231229.Client;
|
||||
import com.aliyun.teaopenapi.models.Config;
|
||||
import com.gxwebsoft.ai.config.KnowledgeBaseConfig;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class KnowledgeBaseClientFactory {
|
||||
|
||||
@Autowired
|
||||
private KnowledgeBaseConfig config;
|
||||
|
||||
private Client client;
|
||||
|
||||
public Client createClient() throws Exception {
|
||||
if(client == null) {
|
||||
com.aliyun.teaopenapi.models.Config authConfig = new com.aliyun.teaopenapi.models.Config()
|
||||
.setAccessKeyId(config.getAccessKeyId())
|
||||
.setAccessKeySecret(config.getAccessKeySecret());
|
||||
// 下方接入地址以公有云的公网接入地址为例,可按需更换接入地址。
|
||||
authConfig.endpoint = "bailian.cn-beijing.aliyuncs.com";
|
||||
client = new com.aliyun.bailian20231229.Client(authConfig);
|
||||
}
|
||||
|
||||
return client;
|
||||
}
|
||||
}
|
||||
37
src/main/java/com/gxwebsoft/ai/mapper/AiCloudDocMapper.java
Normal file
37
src/main/java/com/gxwebsoft/ai/mapper/AiCloudDocMapper.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package com.gxwebsoft.ai.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.gxwebsoft.ai.entity.AiCloudDoc;
|
||||
import com.gxwebsoft.ai.param.AiCloudDocParam;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI云文档目录表Mapper
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
public interface AiCloudDocMapper extends BaseMapper<AiCloudDoc> {
|
||||
|
||||
/**
|
||||
* 分页查询
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param param 查询参数
|
||||
* @return List<AiCloudDoc>
|
||||
*/
|
||||
List<AiCloudDoc> selectPageRel(@Param("page") IPage<AiCloudDoc> page,
|
||||
@Param("param") AiCloudDocParam param);
|
||||
|
||||
/**
|
||||
* 查询全部
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return List<AiCloudDoc>
|
||||
*/
|
||||
List<AiCloudDoc> selectListRel(@Param("param") AiCloudDocParam param);
|
||||
|
||||
}
|
||||
37
src/main/java/com/gxwebsoft/ai/mapper/AiCloudFileMapper.java
Normal file
37
src/main/java/com/gxwebsoft/ai/mapper/AiCloudFileMapper.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package com.gxwebsoft.ai.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.gxwebsoft.ai.entity.AiCloudFile;
|
||||
import com.gxwebsoft.ai.param.AiCloudFileParam;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI云文件表Mapper
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
public interface AiCloudFileMapper extends BaseMapper<AiCloudFile> {
|
||||
|
||||
/**
|
||||
* 分页查询
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param param 查询参数
|
||||
* @return List<AiCloudFile>
|
||||
*/
|
||||
List<AiCloudFile> selectPageRel(@Param("page") IPage<AiCloudFile> page,
|
||||
@Param("param") AiCloudFileParam param);
|
||||
|
||||
/**
|
||||
* 查询全部
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return List<AiCloudFile>
|
||||
*/
|
||||
List<AiCloudFile> selectListRel(@Param("param") AiCloudFileParam param);
|
||||
|
||||
}
|
||||
35
src/main/java/com/gxwebsoft/ai/mapper/AiHistoryMapper.java
Normal file
35
src/main/java/com/gxwebsoft/ai/mapper/AiHistoryMapper.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package com.gxwebsoft.ai.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.gxwebsoft.ai.entity.AiHistory;
|
||||
import com.gxwebsoft.ai.param.AiHistoryParam;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI审计历史记录表Mapper
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
public interface AiHistoryMapper extends BaseMapper<AiHistory> {
|
||||
|
||||
/**
|
||||
* 分页查询
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param param 查询参数
|
||||
* @return List<AiHistory>
|
||||
*/
|
||||
List<AiHistory> selectPageRel(@Param("page") IPage<AiHistory> page,
|
||||
@Param("param") AiHistoryParam param);
|
||||
|
||||
/**
|
||||
* 查询全部
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return List<AiHistory>
|
||||
*/
|
||||
List<AiHistory> selectListRel(@Param("param") AiHistoryParam param);
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.gxwebsoft.ai.mapper.AiCloudDocMapper">
|
||||
|
||||
<!-- 关联查询sql -->
|
||||
<sql id="selectSql">
|
||||
SELECT a.*
|
||||
FROM ai_cloud_doc a
|
||||
<where>
|
||||
<if test="param.id != null">
|
||||
AND a.id = #{param.id}
|
||||
</if>
|
||||
<if test="param.categoryId != null">
|
||||
AND a.category_id = #{param.categoryId}
|
||||
</if>
|
||||
<if test="param.companyId != null">
|
||||
AND a.company_id = #{param.companyId}
|
||||
</if>
|
||||
<if test="param.parentId != null">
|
||||
AND a.parent_id = #{param.parentId}
|
||||
</if>
|
||||
<if test="param.name != null">
|
||||
AND a.name LIKE CONCAT('%', #{param.name}, '%')
|
||||
</if>
|
||||
<if test="param.sortNumber != null">
|
||||
AND a.sort_number = #{param.sortNumber}
|
||||
</if>
|
||||
<if test="param.status != null">
|
||||
AND a.status = #{param.status}
|
||||
</if>
|
||||
<if test="param.deleted != null">
|
||||
AND a.deleted = #{param.deleted}
|
||||
</if>
|
||||
<if test="param.deleted == null">
|
||||
AND a.deleted = 0
|
||||
</if>
|
||||
<if test="param.userId != null">
|
||||
AND a.user_id = #{param.userId}
|
||||
</if>
|
||||
<if test="param.createTimeStart != null">
|
||||
AND a.create_time >= #{param.createTimeStart}
|
||||
</if>
|
||||
<if test="param.createTimeEnd != null">
|
||||
AND a.create_time <= #{param.createTimeEnd}
|
||||
</if>
|
||||
<if test="param.keywords != null">
|
||||
AND (a.name LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.comments LIKE CONCAT('%', #{param.keywords}, '%'))
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
|
||||
<!-- 分页查询 -->
|
||||
<select id="selectPageRel" resultType="com.gxwebsoft.ai.entity.AiCloudDoc">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
<select id="selectListRel" resultType="com.gxwebsoft.ai.entity.AiCloudDoc">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.gxwebsoft.ai.mapper.AiCloudFileMapper">
|
||||
|
||||
<!-- 关联查询sql -->
|
||||
<sql id="selectSql">
|
||||
SELECT a.*
|
||||
FROM ai_cloud_file a
|
||||
<where>
|
||||
<if test="param.id != null">
|
||||
AND a.id = #{param.id}
|
||||
</if>
|
||||
<if test="param.docId != null">
|
||||
AND a.doc_id = #{param.docId}
|
||||
</if>
|
||||
<if test="param.fileName != null and param.fileName != ''">
|
||||
AND a.file_name LIKE CONCAT('%', #{param.fileName}, '%')
|
||||
</if>
|
||||
<if test="param.fileSize != null">
|
||||
AND a.file_size = #{param.fileSize}
|
||||
</if>
|
||||
<if test="param.fileType != null and param.fileType != ''">
|
||||
AND a.file_type = #{param.fileType}
|
||||
</if>
|
||||
<if test="param.workspaceId != null">
|
||||
AND a.workspace_id = #{param.workspaceId}
|
||||
</if>
|
||||
<if test="param.fileId != null and param.fileId != ''">
|
||||
AND a.file_id = #{param.fileId}
|
||||
</if>
|
||||
<if test="param.fileExt != null and param.fileExt != ''">
|
||||
AND a.file_ext = #{param.fileExt}
|
||||
</if>
|
||||
<if test="param.uploadTimeStart != null">
|
||||
AND a.upload_time >= #{param.uploadTimeStart}
|
||||
</if>
|
||||
<if test="param.uploadTimeEnd != null">
|
||||
AND a.upload_time <= #{param.uploadTimeEnd}
|
||||
</if>
|
||||
<if test="param.sortNumber != null">
|
||||
AND a.sort_number = #{param.sortNumber}
|
||||
</if>
|
||||
<if test="param.status != null">
|
||||
AND a.status = #{param.status}
|
||||
</if>
|
||||
<if test="param.deleted != null">
|
||||
AND a.deleted = #{param.deleted}
|
||||
</if>
|
||||
<if test="param.deleted == null">
|
||||
AND a.deleted = 0
|
||||
</if>
|
||||
<if test="param.userId != null">
|
||||
AND a.user_id = #{param.userId}
|
||||
</if>
|
||||
<if test="param.keywords != null and param.keywords != ''">
|
||||
AND (a.file_name LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.file_type LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.file_ext LIKE CONCAT('%', #{param.keywords}, '%'))
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
|
||||
<!-- 分页查询 -->
|
||||
<select id="selectPageRel" resultType="com.gxwebsoft.ai.entity.AiCloudFile">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
<select id="selectListRel" resultType="com.gxwebsoft.ai.entity.AiCloudFile">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.gxwebsoft.ai.mapper.AiHistoryMapper">
|
||||
|
||||
<!-- 关联查询sql -->
|
||||
<sql id="selectSql">
|
||||
SELECT a.*
|
||||
FROM ai_history a
|
||||
<where>
|
||||
<if test="param.id != null">
|
||||
AND a.id = #{param.id}
|
||||
</if>
|
||||
<if test="param.projectId != null">
|
||||
AND a.project_id = #{param.projectId}
|
||||
</if>
|
||||
<if test="param.requestHash != null">
|
||||
AND a.request_hash = #{param.requestHash}
|
||||
</if>
|
||||
<if test="param.interfaceName != null">
|
||||
AND a.interface_name = #{param.interfaceName}
|
||||
</if>
|
||||
<if test="param.userId != null">
|
||||
AND a.user_id = #{param.userId}
|
||||
</if>
|
||||
<if test="param.username != null">
|
||||
AND a.username LIKE CONCAT('%', #{param.username}, '%')
|
||||
</if>
|
||||
<if test="param.status != null">
|
||||
AND a.status = #{param.status}
|
||||
</if>
|
||||
<if test="param.deleted != null">
|
||||
AND a.deleted = #{param.deleted}
|
||||
</if>
|
||||
<if test="param.deleted == null">
|
||||
AND a.deleted = 0
|
||||
</if>
|
||||
<if test="param.tenantId != null">
|
||||
AND a.tenant_id = #{param.tenantId}
|
||||
</if>
|
||||
<if test="param.createTimeStart != null">
|
||||
AND a.create_time >= #{param.createTimeStart}
|
||||
</if>
|
||||
<if test="param.createTimeEnd != null">
|
||||
AND a.create_time <= #{param.createTimeEnd}
|
||||
</if>
|
||||
<if test="param.keywords != null">
|
||||
AND (a.request_hash LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.interface_name LIKE CONCAT('%', #{param.keywords}, '%')
|
||||
OR a.username LIKE CONCAT('%', #{param.keywords}, '%'))
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
|
||||
<!-- 分页查询 -->
|
||||
<select id="selectPageRel" resultType="com.gxwebsoft.ai.entity.AiHistory">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
<select id="selectListRel" resultType="com.gxwebsoft.ai.entity.AiHistory">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
57
src/main/java/com/gxwebsoft/ai/param/AiCloudDocParam.java
Normal file
57
src/main/java/com/gxwebsoft/ai/param/AiCloudDocParam.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package com.gxwebsoft.ai.param;
|
||||
|
||||
import com.gxwebsoft.common.core.annotation.QueryField;
|
||||
import com.gxwebsoft.common.core.annotation.QueryType;
|
||||
import com.gxwebsoft.common.core.web.BaseParam;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* AI云文档目录表查询参数
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@Schema(name = "AiCloudDocParam对象", description = "AI云文档目录表查询参数")
|
||||
public class AiCloudDocParam extends BaseParam {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer id;
|
||||
|
||||
@Schema(description = "云目录ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private String categoryId;
|
||||
|
||||
@Schema(description = "单位ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer companyId;
|
||||
|
||||
@Schema(description = "上级目录ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer parentId;
|
||||
|
||||
@Schema(description = "目录名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "排序(数字越小越靠前)")
|
||||
private Integer sortNumber;
|
||||
|
||||
@Schema(description = "状态, 0正常, 1冻结")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否删除, 0否, 1是")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer deleted;
|
||||
|
||||
@Schema(description = "创建用户ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer userId;
|
||||
|
||||
}
|
||||
74
src/main/java/com/gxwebsoft/ai/param/AiCloudFileParam.java
Normal file
74
src/main/java/com/gxwebsoft/ai/param/AiCloudFileParam.java
Normal file
@@ -0,0 +1,74 @@
|
||||
package com.gxwebsoft.ai.param;
|
||||
|
||||
import com.gxwebsoft.common.core.annotation.QueryField;
|
||||
import com.gxwebsoft.common.core.annotation.QueryType;
|
||||
import com.gxwebsoft.common.core.web.BaseParam;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* AI云文件表查询参数
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@Schema(name = "AiCloudFileParam对象", description = "AI云文件表查询参数")
|
||||
public class AiCloudFileParam extends BaseParam {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer id;
|
||||
|
||||
@Schema(description = "文档目录ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer docId;
|
||||
|
||||
@Schema(description = "文件名")
|
||||
private String fileName;
|
||||
|
||||
@Schema(description = "文件大小(字节)")
|
||||
private Long fileSize;
|
||||
|
||||
@Schema(description = "文件类型")
|
||||
private String fileType;
|
||||
|
||||
@Schema(description = "工作空间ID")
|
||||
private String workspaceId;
|
||||
|
||||
@Schema(description = "云文件ID")
|
||||
private String fileId;
|
||||
|
||||
@Schema(description = "文件扩展名")
|
||||
private String fileExt;
|
||||
|
||||
@Schema(description = "上传时间开始")
|
||||
private LocalDateTime uploadTimeStart;
|
||||
|
||||
@Schema(description = "上传时间结束")
|
||||
private LocalDateTime uploadTimeEnd;
|
||||
|
||||
@Schema(description = "排序(数字越小越靠前)")
|
||||
private Integer sortNumber;
|
||||
|
||||
@Schema(description = "状态, 0正常, 1冻结")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否删除, 0否, 1是")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer deleted;
|
||||
|
||||
@Schema(description = "上传用户ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer userId;
|
||||
|
||||
@Schema(description = "关键词搜索")
|
||||
private String keywords;
|
||||
}
|
||||
57
src/main/java/com/gxwebsoft/ai/param/AiHistoryParam.java
Normal file
57
src/main/java/com/gxwebsoft/ai/param/AiHistoryParam.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package com.gxwebsoft.ai.param;
|
||||
|
||||
import com.gxwebsoft.common.core.annotation.QueryField;
|
||||
import com.gxwebsoft.common.core.annotation.QueryType;
|
||||
import com.gxwebsoft.common.core.web.BaseParam;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* AI审计历史记录表查询参数
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@Schema(name = "AiHistoryParam对象", description = "AI审计历史记录表查询参数")
|
||||
public class AiHistoryParam extends BaseParam {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "主键ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "项目ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Long projectId;
|
||||
|
||||
@Schema(description = "请求哈希值")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private String requestHash;
|
||||
|
||||
@Schema(description = "接口名称")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private String interfaceName;
|
||||
|
||||
@Schema(description = "用户ID")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer userId;
|
||||
|
||||
@Schema(description = "用户名")
|
||||
private String username;
|
||||
|
||||
@Schema(description = "状态, 0正常, 1冻结")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否删除, 0否, 1是")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer deleted;
|
||||
|
||||
@Schema(description = "租户id")
|
||||
@QueryField(type = QueryType.EQ)
|
||||
private Integer tenantId;
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.gxwebsoft.ai.entity.AiCloudDoc;
|
||||
import com.gxwebsoft.ai.param.AiCloudDocParam;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI云文档目录表Service
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
public interface AiCloudDocService extends IService<AiCloudDoc> {
|
||||
|
||||
/**
|
||||
* 分页关联查询
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return PageResult<AiCloudDoc>
|
||||
*/
|
||||
PageResult<AiCloudDoc> pageRel(AiCloudDocParam param);
|
||||
|
||||
/**
|
||||
* 关联查询全部
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return List<AiCloudDoc>
|
||||
*/
|
||||
List<AiCloudDoc> listRel(AiCloudDocParam param);
|
||||
|
||||
/**
|
||||
* 根据id查询
|
||||
*
|
||||
* @param id ID
|
||||
* @return AiCloudDoc
|
||||
*/
|
||||
AiCloudDoc getByIdRel(Integer id);
|
||||
|
||||
/**
|
||||
* 根据目录ID获取本身及所有子孙目录
|
||||
*
|
||||
* @param docId 目录ID
|
||||
* @return List<AiCloudDoc> 目录列表
|
||||
*/
|
||||
List<AiCloudDoc> getSelfAndChildren(Integer docId);
|
||||
|
||||
}
|
||||
113
src/main/java/com/gxwebsoft/ai/service/AiCloudFileService.java
Normal file
113
src/main/java/com/gxwebsoft/ai/service/AiCloudFileService.java
Normal file
@@ -0,0 +1,113 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.gxwebsoft.ai.entity.AiCloudFile;
|
||||
import com.gxwebsoft.ai.param.AiCloudFileParam;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* AI云文件表Service
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
public interface AiCloudFileService extends IService<AiCloudFile> {
|
||||
|
||||
/**
|
||||
* 分页关联查询
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return PageResult<AiCloudFile>
|
||||
*/
|
||||
PageResult<AiCloudFile> pageRel(AiCloudFileParam param);
|
||||
|
||||
/**
|
||||
* 关联查询全部
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return List<AiCloudFile>
|
||||
*/
|
||||
List<AiCloudFile> listRel(AiCloudFileParam param);
|
||||
|
||||
/**
|
||||
* 根据id查询
|
||||
*
|
||||
* @param id ID
|
||||
* @return AiCloudFile
|
||||
*/
|
||||
AiCloudFile getByIdRel(Integer id);
|
||||
|
||||
/**
|
||||
* 异步处理文件上传
|
||||
*
|
||||
* @param client 阿里云客户端
|
||||
* @param workspaceId 工作空间ID
|
||||
* @param categoryId 分类ID
|
||||
* @param docId 文档ID
|
||||
* @param file 文件
|
||||
* @param loginUser 登录用户
|
||||
* @return CompletableFuture<String> 返回包含文件ID的Future
|
||||
*/
|
||||
CompletableFuture<String> processFileAsync(String categoryId, Integer docId, MultipartFile file, User loginUser);
|
||||
|
||||
/**
|
||||
* 删除文件(包括云存储和数据库记录)
|
||||
*
|
||||
* @param id 文件ID
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
boolean removeFileWithCloud(Integer id);
|
||||
|
||||
/**
|
||||
* 批量删除文件(包括云存储和数据库记录)
|
||||
*
|
||||
* @param ids 文件ID列表
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
boolean removeFilesWithCloud(List<Integer> ids);
|
||||
|
||||
/**
|
||||
* 获取文件扩展名
|
||||
*
|
||||
* @param filename 文件名
|
||||
* @return 文件扩展名
|
||||
*/
|
||||
String getFileExtension(String filename);
|
||||
|
||||
/**
|
||||
* 获取公司知识库ID
|
||||
*
|
||||
* @param docId 文档ID
|
||||
* @return 知识库ID
|
||||
*/
|
||||
String getCompanyKbId(Integer docId);
|
||||
|
||||
/**
|
||||
* 提交文档到知识库
|
||||
*
|
||||
* @param docId 文档ID
|
||||
* @param fileIds 文件ID列表
|
||||
*/
|
||||
void submitDocuments(Integer docId, List<String> fileIds);
|
||||
|
||||
/**
|
||||
* 删除文件(包括云存储、数据库记录和知识库索引)
|
||||
*
|
||||
* @param id 文件ID
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
boolean removeFileWithCloudAndIndex(Integer id);
|
||||
|
||||
/**
|
||||
* 批量删除文件(包括云存储、数据库记录和知识库索引)
|
||||
*
|
||||
* @param ids 文件ID列表
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
boolean removeFilesWithCloudAndIndex(List<Integer> ids);
|
||||
}
|
||||
63
src/main/java/com/gxwebsoft/ai/service/AiHistoryService.java
Normal file
63
src/main/java/com/gxwebsoft/ai/service/AiHistoryService.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.gxwebsoft.ai.entity.AiHistory;
|
||||
import com.gxwebsoft.ai.param.AiHistoryParam;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AI审计历史记录表Service
|
||||
*
|
||||
* @author yc
|
||||
*/
|
||||
public interface AiHistoryService extends IService<AiHistory> {
|
||||
|
||||
/**
|
||||
* 分页关联查询
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return PageResult<AiHistory>
|
||||
*/
|
||||
PageResult<AiHistory> pageRel(AiHistoryParam param);
|
||||
|
||||
/**
|
||||
* 关联查询全部
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @return List<AiHistory>
|
||||
*/
|
||||
List<AiHistory> listRel(AiHistoryParam param);
|
||||
|
||||
/**
|
||||
* 根据id查询
|
||||
*
|
||||
* @param id ID
|
||||
* @return AiHistory
|
||||
*/
|
||||
AiHistory getByIdRel(Long id);
|
||||
|
||||
/**
|
||||
* 获取有效的历史记录
|
||||
*
|
||||
* @param requestHash 请求哈希值
|
||||
* @param interfaceName 接口名称
|
||||
* @param minutes 有效时间(分钟)
|
||||
* @return AiHistory
|
||||
*/
|
||||
AiHistory getValidHistory(String requestHash, String interfaceName, int minutes);
|
||||
|
||||
/**
|
||||
* 保存历史记录
|
||||
*
|
||||
* @param projectId 项目ID
|
||||
* @param requestHash 请求哈希值
|
||||
* @param interfaceName 接口名称
|
||||
* @param requestData 请求数据
|
||||
* @param responseData 响应数据
|
||||
* @param userId 用户ID
|
||||
* @param username 用户名
|
||||
*/
|
||||
void saveHistory(Long projectId, String requestHash, String interfaceName, String requestData, String responseData, Integer userId, String username, Integer tenantId);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容10服务接口 - 党风廉政建设责任制审计
|
||||
*/
|
||||
public interface AuditContent10PartyConductService {
|
||||
|
||||
/**
|
||||
* 生成党风廉政建设责任制审计表数据
|
||||
*/
|
||||
JSONObject generatePartyConductTableData(String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容11-历史审计问题整改服务接口
|
||||
*/
|
||||
public interface AuditContent11HistoryService {
|
||||
|
||||
/**
|
||||
* 生成历史审计问题整改表数据
|
||||
*
|
||||
* @param kbIds 知识库ID
|
||||
* @param libraryKbIds 项目库知识库ID
|
||||
* @param projectLibrary 项目库
|
||||
* @param userName 用户名
|
||||
* @param history 历史内容
|
||||
* @param suggestion 用户建议
|
||||
* @return JSON结果
|
||||
*/
|
||||
JSONObject generateHistoryTableData(String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
public interface AuditContent1EightRegService {
|
||||
|
||||
/**
|
||||
* 生成八项规定对比分析表数据
|
||||
*/
|
||||
JSONObject generateEightRegTableData(String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 支出情况表服务接口
|
||||
*/
|
||||
public interface AuditContent1ExpenseService {
|
||||
|
||||
/**
|
||||
* 生成支出情况表数据
|
||||
* @param kbIds 知识库ID
|
||||
* @param libraryKbIds 项目库KB IDs
|
||||
* @param projectLibrary 项目库ID
|
||||
* @param userName 用户名
|
||||
* @param history 历史记录
|
||||
* @param suggestion 建议
|
||||
* @return JSON格式的结果
|
||||
*/
|
||||
JSONObject generateExpenseTableData(String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 领导班子名单服务接口
|
||||
*/
|
||||
public interface AuditContent1LeaderListService {
|
||||
|
||||
/**
|
||||
* 生成领导班子名单数据
|
||||
*/
|
||||
JSONObject generateLeaderListTableData(String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 单位发展战略执行审计服务接口
|
||||
*/
|
||||
public interface AuditContent2StrategyService {
|
||||
|
||||
/**
|
||||
* 生成单位发展战略执行审计表数据
|
||||
*
|
||||
* @param kbIds 企业知识库ID(多个用逗号分隔)
|
||||
* @param libraryKbIds 公共法律法规库ID(多个用逗号分隔)
|
||||
* @param projectLibrary 审计案例库ID
|
||||
* @param userName 用户名
|
||||
* @param history 历史记录
|
||||
* @param suggestion 用户建议
|
||||
* @return JSON格式的审计表数据
|
||||
*/
|
||||
JSONObject generateStrategyAuditTableData(String kbIds, String libraryKbIds,
|
||||
String projectLibrary, String userName,
|
||||
String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容3 - 重大经济决策调查表
|
||||
*/
|
||||
public interface AuditContent3DecisionService {
|
||||
|
||||
/**
|
||||
* 生成重大经济决策调查表数据
|
||||
*/
|
||||
JSONObject generateDecisionTableData(String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion, Object tripleOneData);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容3 - 三重一大
|
||||
*/
|
||||
public interface AuditContent3TripleService {
|
||||
|
||||
/**
|
||||
* 生成三重一大制度对比分析表数据
|
||||
*/
|
||||
JSONObject generateTripleOneTableData(String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容4-目标责任制完成情况服务接口
|
||||
*/
|
||||
public interface AuditContent4TargetService {
|
||||
|
||||
/**
|
||||
* 生成目标责任制完成情况审计表数据
|
||||
*/
|
||||
JSONObject generateTargetAuditTableData(String kbIds, String libraryKbIds,
|
||||
String projectLibrary, String userName,
|
||||
String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容5-预算执行情况审计服务接口
|
||||
*/
|
||||
public interface AuditContent5BudgetExecutionService {
|
||||
|
||||
/**
|
||||
* 生成预算执行情况审计表数据
|
||||
* @param kbIds 知识库ID
|
||||
* @param libraryKbIds 项目库知识库ID
|
||||
* @param projectLibrary 项目库
|
||||
* @param userName 用户名
|
||||
* @param history 历史记录
|
||||
* @param suggestion 用户建议
|
||||
* @param data 前端传入的预算管理审计数据(可选)
|
||||
* @return JSON格式的审计表数据
|
||||
*/
|
||||
JSONObject generateBudgetExecutionTableData(String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion, Object data);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容5-预算管理审计服务接口
|
||||
*/
|
||||
public interface AuditContent5BudgetManageService {
|
||||
|
||||
/**
|
||||
* 生成预算管理审计表数据
|
||||
* @param kbIds 知识库ID
|
||||
* @param libraryKbIds 项目库知识库ID
|
||||
* @param projectLibrary 项目库
|
||||
* @param userName 用户名
|
||||
* @param history 历史记录
|
||||
* @param suggestion 用户建议
|
||||
* @return JSON格式的审计表数据
|
||||
*/
|
||||
JSONObject generateBudgetManageTableData(String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion, Object data);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容6-国资管理情况服务接口
|
||||
*/
|
||||
public interface AuditContent6StateAssetsService {
|
||||
|
||||
/**
|
||||
* 生成国有资产管理审计表数据
|
||||
*/
|
||||
JSONObject generateStateAssetsAuditTableData(String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* 审计内容7-重大投资情况服务接口
|
||||
*/
|
||||
public interface AuditContent7InvestmentService {
|
||||
|
||||
/**
|
||||
* 生成重大投资情况审计表数据
|
||||
* @param kbIds 知识库ID
|
||||
* @param libraryKbIds 项目库知识库ID
|
||||
* @param projectLibrary 审计案例库ID
|
||||
* @param userName 用户名
|
||||
* @param history 历史记录
|
||||
* @param suggestion 用户建议
|
||||
* @return 生成的表格数据
|
||||
*/
|
||||
JSONObject generateInvestmentSituationTableData(String kbIds, String libraryKbIds,
|
||||
String projectLibrary, String userName,
|
||||
String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
public interface AuditContent8InternalControlService {
|
||||
|
||||
/**
|
||||
* 生成单位层面财务管理内部控制测试表数据
|
||||
*/
|
||||
JSONObject generateInternalControlTableData(
|
||||
String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
public interface AuditContent9PersonnelService {
|
||||
|
||||
/**
|
||||
* 生成人员编制管理审计表数据
|
||||
*/
|
||||
JSONObject generatePersonnelTableData(
|
||||
String kbIds, String libraryKbIds, String projectLibrary,
|
||||
String userName, String history, String suggestion);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.dto.AuditEvidenceRequest;
|
||||
|
||||
public interface AuditEvidenceService {
|
||||
/**
|
||||
* 生成审计取证单
|
||||
*/
|
||||
JSONObject generateAuditEvidence(AuditEvidenceRequest request);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
public interface AuditReportService {
|
||||
|
||||
/**
|
||||
* 生成完整审计报告
|
||||
*/
|
||||
JSONObject generateCompleteAuditReport(String auditContent, String fileName,
|
||||
String kbId, String libraryIds,
|
||||
String analysisLibrary, String projectLibrary,
|
||||
String userName);
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.gxwebsoft.ai.service;
|
||||
|
||||
import com.gxwebsoft.ai.dto.KnowledgeBaseRequest;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
public interface KnowledgeBaseService {
|
||||
|
||||
/**
|
||||
* 查询知识库
|
||||
*/
|
||||
Set<String> queryKnowledgeBase(KnowledgeBaseRequest req);
|
||||
|
||||
/**
|
||||
* 查询知识库(带参数)
|
||||
*/
|
||||
Set<String> queryKnowledgeBase(String kbId, String query, Integer topK, Integer formCommit);
|
||||
|
||||
/**
|
||||
* 创建知识库
|
||||
*/
|
||||
String createKnowledgeBase(String companyName, String companyCode);
|
||||
|
||||
/**
|
||||
* 创建临时知识库
|
||||
*/
|
||||
String createKnowledgeBaseTemp();
|
||||
|
||||
/**
|
||||
* 检查知识库是否存
|
||||
*/
|
||||
boolean existsKnowledgeBase(String companyCode);
|
||||
|
||||
/**
|
||||
* 通过知识库名称查询知识库ID
|
||||
*/
|
||||
String getKnowledgeBaseIdByName(String companyCode);
|
||||
|
||||
/**
|
||||
* 查询知识库下的文档列表
|
||||
*/
|
||||
Map<String,Object> listDocuments(String kbId, Integer pageSize, Integer pageNumber);
|
||||
|
||||
/**
|
||||
* 删除知识库
|
||||
*/
|
||||
boolean deleteIndex(String kbId);
|
||||
|
||||
/**
|
||||
* 删除知识库下的文档
|
||||
*/
|
||||
boolean deleteIndexDocument(String kbId, String fileIds);
|
||||
|
||||
/**
|
||||
* 上传知识库文档
|
||||
*/
|
||||
List<String> uploadDocuments(String kbId, MultipartFile[] files);
|
||||
|
||||
/**
|
||||
* 知识库追加导入已解析的文档
|
||||
*/
|
||||
boolean submitDocuments(String kbId, String fileId);
|
||||
|
||||
/**
|
||||
* 知识库追加导入已解析的文档
|
||||
*/
|
||||
boolean submitDocuments(String kbId, List<String> fileIds);
|
||||
}
|
||||
@@ -0,0 +1,450 @@
|
||||
package com.gxwebsoft.ai.service.impl;
|
||||
|
||||
import com.aliyun.bailian20231229.Client;
|
||||
import com.aliyun.bailian20231229.models.RetrieveResponse;
|
||||
import com.aliyun.bailian20231229.models.RetrieveResponseBody;
|
||||
import com.aliyun.bailian20231229.models.RetrieveResponseBody.RetrieveResponseBodyData;
|
||||
import com.aliyun.bailian20231229.models.RetrieveResponseBody.RetrieveResponseBodyDataNodes;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gxwebsoft.ai.config.KnowledgeBaseConfig;
|
||||
import com.gxwebsoft.ai.entity.AiCloudFile;
|
||||
import com.gxwebsoft.ai.factory.KnowledgeBaseClientFactory;
|
||||
import com.gxwebsoft.ai.service.AiCloudFileService;
|
||||
import com.gxwebsoft.ai.util.AiCloudKnowledgeBaseUtil;
|
||||
import com.gxwebsoft.common.core.context.TenantContext;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
public abstract class AbstractAuditContentService {
|
||||
|
||||
@Autowired
|
||||
protected KnowledgeBaseClientFactory clientFactory;
|
||||
|
||||
@Autowired
|
||||
protected KnowledgeBaseConfig config;
|
||||
|
||||
@Autowired
|
||||
protected AiCloudFileService aiCloudFileService;
|
||||
|
||||
protected static final String DIFY_WORKFLOW_URL = "http://1.14.159.185:8180/v1/workflows/run";
|
||||
|
||||
// 用于同步的锁对象池
|
||||
private static final Map<String, Object> kbLocks = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 调用工作流通用方法
|
||||
*/
|
||||
protected JSONArray callWorkflow(String url, String token, JSONObject requestBody, String workflowName) {
|
||||
try {
|
||||
log.info("调用{}工作流,请求体长度: {}", workflowName, requestBody.toString().length());
|
||||
|
||||
String result = HttpUtil.createPost(url)
|
||||
.header("Authorization", token)
|
||||
.header("Content-Type", "application/json")
|
||||
.body(requestBody.toString())
|
||||
.timeout(10 * 60 * 1000)
|
||||
.execute()
|
||||
.body();
|
||||
|
||||
log.info("{}工作流返回结果长度: {}", workflowName, result.length());
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
JsonNode rootNode = objectMapper.readTree(result);
|
||||
|
||||
String outputText = rootNode.path("data")
|
||||
.path("outputs")
|
||||
.path("result")
|
||||
.asText();
|
||||
|
||||
if (StrUtil.isBlank(outputText)) {
|
||||
log.warn("{}工作流返回 result 为空", workflowName);
|
||||
return new JSONArray();
|
||||
}
|
||||
|
||||
// ★ NEW:先从 ```json``` 中提取
|
||||
String jsonText = extractJsonFromMarkdown(outputText);
|
||||
|
||||
// ★ NEW:兜底提取
|
||||
if (StrUtil.isBlank(jsonText)) {
|
||||
jsonText = extractFirstJson(outputText);
|
||||
}
|
||||
|
||||
if (StrUtil.isBlank(jsonText)) {
|
||||
log.error("{} 工作流返回内容无法解析为 JSON,原始内容:{}", workflowName, outputText);
|
||||
throw new RuntimeException("Dify 返回内容中未找到有效 JSON");
|
||||
}
|
||||
|
||||
JSONArray jsonArray = JSONArray.parseArray(jsonText);
|
||||
|
||||
log.info("成功解析{}工作流返回数据,记录数: {}", workflowName, jsonArray.size());
|
||||
return jsonArray;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("调用{}工作流失败", workflowName, e);
|
||||
throw new RuntimeException("调用" + workflowName + "工作流失败: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 ```json 代码块中提取 JSON
|
||||
*/
|
||||
private static String extractJsonFromMarkdown(String text) {
|
||||
if (StrUtil.isBlank(text)) {
|
||||
return null;
|
||||
}
|
||||
Pattern pattern = Pattern.compile("```json\\s*(.*?)\\s*```", Pattern.DOTALL);
|
||||
Matcher matcher = pattern.matcher(text);
|
||||
if (matcher.find()) {
|
||||
return matcher.group(1).trim();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 兜底:从混合文本中提取第一个完整 JSON({} 或 [])
|
||||
*/
|
||||
private static String extractFirstJson(String text) {
|
||||
if (StrUtil.isBlank(text)) return null;
|
||||
|
||||
int start = -1;
|
||||
char open = 0, close = 0;
|
||||
|
||||
for (int i = 0; i < text.length(); i++) {
|
||||
char c = text.charAt(i);
|
||||
if (c == '{' || c == '[') {
|
||||
start = i;
|
||||
open = c;
|
||||
close = (c == '{') ? '}' : ']';
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (start == -1) return null;
|
||||
|
||||
int count = 0;
|
||||
for (int i = start; i < text.length(); i++) {
|
||||
char c = text.charAt(i);
|
||||
if (c == open) count++;
|
||||
if (c == close) count--;
|
||||
if (count == 0) {
|
||||
return text.substring(start, i + 1);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 构建工作流请求通用方法
|
||||
*/
|
||||
protected JSONObject buildWorkflowRequest(String knowledge, String userName) {
|
||||
return buildWorkflowRequest(knowledge, userName, null);
|
||||
}
|
||||
|
||||
protected JSONObject buildWorkflowRequest(String knowledge, String userName, Integer timeout) {
|
||||
JSONObject requestBody = new JSONObject();
|
||||
JSONObject inputs = new JSONObject();
|
||||
|
||||
inputs.put("knowledge", knowledge);
|
||||
|
||||
requestBody.put("inputs", inputs);
|
||||
requestBody.put("response_mode", "blocking");
|
||||
requestBody.put("user", userName);
|
||||
if (timeout != null) {
|
||||
requestBody.put("timeout", timeout);
|
||||
}
|
||||
|
||||
return requestBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询知识库通用方法
|
||||
*/
|
||||
protected List<String> queryKnowledgeBase(String kbId, List<String> queries, int topK) {
|
||||
Object lock = kbLocks.computeIfAbsent(kbId, k -> new Object());
|
||||
|
||||
synchronized (lock) {
|
||||
try {
|
||||
// 1. 收集所有节点和文档ID
|
||||
List<RetrieveResponseBodyDataNodes> allNodes = collectKnowledgeNodes(kbId, queries, topK);
|
||||
if (allNodes.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
// 2. 批量查询文件URL
|
||||
Map<String, String> fileUrlMap = TenantContext.callIgnoreTenant(() -> batchQueryFileUrls(allNodes));
|
||||
|
||||
// 3. 处理节点生成结果
|
||||
return processNodesToResults(allNodes, fileUrlMap);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("查询知识库失败 - kbId: {}", kbId, e);
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 收集知识库节点
|
||||
*/
|
||||
private List<RetrieveResponseBodyDataNodes> collectKnowledgeNodes(String kbId, List<String> queries, int topK) {
|
||||
List<RetrieveResponseBodyDataNodes> allNodes = new ArrayList<>();
|
||||
String workspaceId = config.getWorkspaceId();
|
||||
try {
|
||||
Client client = clientFactory.createClient();
|
||||
for (String query : queries) {
|
||||
try {
|
||||
RetrieveResponse resp = AiCloudKnowledgeBaseUtil.retrieveIndex(client, workspaceId, kbId, query);
|
||||
List<RetrieveResponseBodyDataNodes> nodes = Optional.ofNullable(resp)
|
||||
.map(RetrieveResponse::getBody)
|
||||
.map(RetrieveResponseBody::getData)
|
||||
.map(RetrieveResponseBodyData::getNodes)
|
||||
.orElse(Collections.emptyList())
|
||||
.stream()
|
||||
.limit(topK)
|
||||
.collect(Collectors.toList());
|
||||
allNodes.addAll(nodes);
|
||||
} catch (Exception e) {
|
||||
log.warn("查询知识库失败 - kbId: {}, query: {}", kbId, query, e);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("创建知识库客户端失败", e);
|
||||
}
|
||||
return allNodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量查询文件URL
|
||||
*/
|
||||
protected Map<String, String> batchQueryFileUrls(List<RetrieveResponseBodyDataNodes> nodes) {
|
||||
// 收集所有文档ID
|
||||
Set<String> docIds = nodes.stream().map(this::extractDocumentId).filter(StrUtil::isNotBlank).collect(Collectors.toSet());
|
||||
if (docIds.isEmpty()) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
try {
|
||||
// 批量查询
|
||||
List<AiCloudFile> files = aiCloudFileService.list(new LambdaQueryWrapper<AiCloudFile>().in(AiCloudFile::getFileId, docIds));
|
||||
// 构建映射表
|
||||
return files.stream()
|
||||
.filter(file -> file.getFileUrl() != null)
|
||||
.collect(Collectors.toMap(
|
||||
AiCloudFile::getFileId,
|
||||
AiCloudFile::getFileUrl
|
||||
));
|
||||
} catch (Exception e) {
|
||||
log.error("批量查询文件信息失败", e);
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理节点生成结果
|
||||
*/
|
||||
private List<String> processNodesToResults(List<RetrieveResponseBodyDataNodes> nodes, Map<String, String> fileUrlMap) {
|
||||
Set<String> results = new LinkedHashSet<>();
|
||||
|
||||
// 构建可用文件列表
|
||||
StringBuilder fileListBuilder = new StringBuilder();
|
||||
fileListBuilder.append("\n\n**可用真实文件列表(仅限以下文件,不得虚构其他文件名):**\n");
|
||||
|
||||
Set<String> processedFiles = new HashSet<>(); // 避免重复
|
||||
|
||||
for (RetrieveResponseBodyDataNodes node : nodes) {
|
||||
try {
|
||||
// 检查文本有效性
|
||||
String text = node.getText();
|
||||
if (StrUtil.isBlank(text) || text.length() < 10) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取文档信息
|
||||
String docName = extractDocumentName(node);
|
||||
String docId = extractDocumentId(node);
|
||||
String fileUrl = fileUrlMap.get(docId);
|
||||
if (StrUtil.isBlank(fileUrl)) {
|
||||
fileUrl = extractDocumentUrl(node);
|
||||
}
|
||||
if (StrUtil.isBlank(fileUrl)) {
|
||||
fileUrl = "无链接";
|
||||
}
|
||||
|
||||
// 添加文件名到列表(去重)
|
||||
if (StrUtil.isNotBlank(docName) && !processedFiles.contains(docName)) {
|
||||
processedFiles.add(docName);
|
||||
fileListBuilder.append("- 《").append(docName).append("》");
|
||||
if (!"无链接".equals(fileUrl)) {
|
||||
fileListBuilder.append(" || ").append(fileUrl);
|
||||
}
|
||||
fileListBuilder.append("\n");
|
||||
}
|
||||
|
||||
// 格式化为知识库内容
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("document_name", docName);
|
||||
json.put("file_url", fileUrl);
|
||||
json.put("content", text);
|
||||
String formattedText = json.toJSONString();
|
||||
results.add(formattedText);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.warn("处理知识库节点失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加文件列表到结果
|
||||
fileListBuilder.append("\n**重要约束:**\n");
|
||||
fileListBuilder.append("1. 只能使用上述列表中的文件,不得虚构其他文件名\n");
|
||||
fileListBuilder.append("2. 如果某项检查未涉及上述文件,则 workPaperIndex 填写\"[]\"\n");
|
||||
fileListBuilder.append("3. 所有文件必须来自提供的知识库内容\n");
|
||||
|
||||
results.add(fileListBuilder.toString());
|
||||
|
||||
return new ArrayList<>(results);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取文档名称通用方法
|
||||
*/
|
||||
protected String extractDocumentName(RetrieveResponseBodyDataNodes node) {
|
||||
try {
|
||||
Object metadataObj = node.getMetadata();
|
||||
if (metadataObj instanceof Map) {
|
||||
Map<?, ?> metadata = (Map<?, ?>) metadataObj;
|
||||
Object docNameObj = metadata.get("doc_name");
|
||||
if (docNameObj != null) {
|
||||
return docNameObj.toString();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.debug("提取文档名称失败", e);
|
||||
}
|
||||
return "相关文档";
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取文档Id通用方法
|
||||
*/
|
||||
protected String extractDocumentId(RetrieveResponseBodyDataNodes node) {
|
||||
try {
|
||||
Object metadataObj = node.getMetadata();
|
||||
if (metadataObj instanceof Map) {
|
||||
Map<?, ?> metadata = (Map<?, ?>) metadataObj;
|
||||
Object docIdObj = metadata.get("doc_id");
|
||||
if (docIdObj != null) {
|
||||
return docIdObj.toString();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.debug("提取文档名称失败", e);
|
||||
}
|
||||
return "相关文档";
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取文档url通用方法
|
||||
*/
|
||||
protected String extractDocumentUrl(RetrieveResponseBodyDataNodes node) {
|
||||
try {
|
||||
Object metadataObj = node.getMetadata();
|
||||
if (metadataObj instanceof Map) {
|
||||
Map<?, ?> metadata = (Map<?, ?>) metadataObj;
|
||||
Object docIdObj = metadata.get("doc_url");
|
||||
if (docIdObj != null) {
|
||||
return docIdObj.toString();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.debug("提取文档名称失败", e);
|
||||
}
|
||||
return "相关文档";
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建成功响应通用方法
|
||||
*/
|
||||
protected JSONObject buildSuccessResponse(JSONArray data, long startTime) {
|
||||
return buildSuccessResponse(data, startTime, null);
|
||||
}
|
||||
|
||||
protected JSONObject buildSuccessResponse(JSONArray data, long startTime, String dataSource) {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("success", true);
|
||||
result.put("data", data);
|
||||
result.put("total_records", data.size());
|
||||
result.put("generated_time", new Date().toString());
|
||||
result.put("processing_time", (System.currentTimeMillis() - startTime) + "ms");
|
||||
if (dataSource != null) {
|
||||
result.put("data_source", dataSource);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建失败响应通用方法
|
||||
*/
|
||||
protected JSONObject buildErrorResponse(String errorMessage) {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("success", false);
|
||||
result.put("error", errorMessage);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 异步处理分类数据通用方法
|
||||
*/
|
||||
protected Map<String, CompletableFuture<JSONArray>> processCategoriesAsync(
|
||||
List<String> categories,
|
||||
CategoryProcessor processor) {
|
||||
|
||||
Map<String, CompletableFuture<JSONArray>> futures = new LinkedHashMap<>();
|
||||
for (String category : categories) {
|
||||
CompletableFuture<JSONArray> future = processor.processCategory(category);
|
||||
futures.put(category, future);
|
||||
}
|
||||
return futures;
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并分类结果通用方法
|
||||
*/
|
||||
protected JSONArray mergeCategoryResults(List<String> categoryOrder,
|
||||
Map<String, CompletableFuture<JSONArray>> futures) {
|
||||
JSONArray allData = new JSONArray();
|
||||
for (String category : categoryOrder) {
|
||||
try {
|
||||
JSONArray categoryData = futures.get(category).get();
|
||||
if (categoryData != null && !categoryData.isEmpty()) {
|
||||
allData.addAll(categoryData);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取分类 {} 数据失败", category, e);
|
||||
}
|
||||
}
|
||||
return allData;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分类处理器函数式接口
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface CategoryProcessor {
|
||||
CompletableFuture<JSONArray> processCategory(String category);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user