新增接口审计内容2-单位发展战略执行审计

This commit is contained in:
2025-12-04 11:04:03 +08:00
parent 610e50ed54
commit 8e3750668e
5 changed files with 823 additions and 0 deletions

View File

@@ -0,0 +1,177 @@
package com.gxwebsoft.ai.constants;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 审计内容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, "创新");
}
// 完整的审计框架原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 {
// 法人治理与改革创新 - 对应框架的1-3点创新理念
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_GOVERNANCE_REFORM,
"审计内容框架(法人治理与改革创新相关):\n" +
"1. 公司法人治理结构建立健全情况。是否贯彻落实将党组织研究讨论作为董事会、经理层决策重大问题前置程序的要求;是否加强董事会建设、有效落实董事会职权;各治理主体是否职责明确、落实到位。\n" +
"2. 薪酬制度改革情况。薪酬分配差异化改革过程中是否存在进展不平衡、政策不配套、任务不协调等问题;有无超工资总额列支工资性支出;企业领导人员在核定的年度薪酬之外领取报酬,是否严格规范履职待遇、业务支出,有无将公款用于个人支出等问题。\n" +
"3. 完善国有资产管理体制方面。有关部门是否建立健全监管权力清单和责任清单,是否存在越位、缺位、不到位等问题;国有资本投资、运营公司改革试点工作的情况,有无要求方案部署不够明确、资本授权及经营资质受限、相关企业未制定时间表路线图、未与兼并重组等改革试点任务协同推进、资本运营偏离改革方向、战略性前瞻性产业投资不增反降、党政机关和事业单位所属企业的国有资本纳入经营性国有资产集中统一监管体系推进迟缓、国有资本经营预算管理不到位等问题。\n");
// 发展规划与协调推进 - 对应框架的4-6点协调理念
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_DEVELOPMENT_STRATEGY,
"审计内容框架(发展规划与协调推进相关):\n" +
"4. 发展混合所有制经济方面。是否存在\"混而不改\",改革流于形式、效果不佳的问题;清产核资、评估定价、转让交易、登记确权等相关政策、审批和实施程序是否合法合规,在国有资产和产权转让过程中是否存在国有资产流失等问题;员工持股试点推进过程中存在的政策性障碍。此外,还要从国有企业改革工作总休上关注,混合所有制改革作为国有企业改革的重要突破口的作用发挥情况。\n" +
"5. 剥离办社会职能和解决历史遗留问题方面。国有企业有无制定时间表路线图,是否按时限完成国有企业职工家属区\"三供一业\"分离移交,剥离国有企业办医疗、教育等公共服务机构,对国有企业退休人员实行社会化管理,推进厂办大集体改革等问题,遇到什么困难、需要什么政策和多少资金支持,等等;相关部门的配套政策是否建立健全。\n" +
"6. 国有企业改革措施是否制定?制定的措施是否符合党中央、国务院、省市的相关文件规定和精神。\n");
// 风险防控与绿色发展 - 对应框架的7-9点绿色理念
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_RISK_PREVENTION,
"审计内容框架(风险防控与绿色发展相关):\n" +
"7. 企业年度工作报告中关于改革措施的落实情况,进度是否符合预期,是否违反整体改革措施计划。规划执行情况材料是否合规、完整。企业境外资产、投资管理办法和内控制度,及企业向国资委等有关部门报送的境外资产产权登记情况和境外资产财务报表数据等,是否合规、完整、符合企业实际情况。企业制定的公司发展规划,包括总规划和专项规划(如主业、国际化、金融、财务、人力资源、建设、生产、营销、科技、信息化、安全应急、企业文化等),是否符合企业整体实际情况,是否符合党中央、国务院、省市的相关文件规定和精神。公司发展规划滚动调整情况是否符合实际情况,是否为了减轻企业目标故意调整。公司发展规划中提及的制定依据,是否符合国家有关部门制定的行业产业发展规划等。\n" +
"8. 金融业务风险。关注金融业务服务实体经济和主业发展情况,有无脱实向虚、通过金融产品将资金违规投向房地产、地方政府融资平台、产能过剩等限制或禁止领域的问题;关注企业开展境外金融衍生品情况,有无违规开展业务造成重大损失或损失风险等;关注银行、证券、保险、信托等金融子企业的资产管理规模及经营情况,风险管控机制是否健全,业务运营是否合规,有无信贷资金、金融资产造成重大损失的问题,有无金融产品逾期或违规展期、不良资产比率较高、风险与收益不匹配、本金偿付风险或违约风险大等问题;关注企业债券发行、委托理财、对外担保等金融业务开展中存在的突出问题,是否造成重大损失或损失风险等。\n" +
"9. 债务风险。关注企业落实降杠杆减负债政策情况,是否存在企业资产负债率居高不下、超过警戒线或管控线甚至资不抵债,有无建立健全企业债务风险防控机制,发挥资产负债约束机制作用,债务结构是否合理,有无违规对不符合国家产业政策的企业实施债转股,有无违规通过\"名股实债\"等方式变相举债或形成重大隐性债务,以及虚假去杠杆等问题。\n");
// 社会责任与开放共享 - 对应框架的10-11点开放共享理念
CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.put(CATEGORY_SOCIAL_ENVIRONMENTAL,
"审计内容框架(社会责任与开放共享相关):\n" +
"10. 精准扶贫政策落实情况。关注企业在精准扶贫相关政策落实、项目安排、资金使用等方面的推进情况,是否落实企业定点扶贫工作的任务要求,有无出台具体帮扶措施,履行帮扶责任定点扶贫的目标对象、工作举措、资金使用等是否精准;有无通过发展产业、对接市场、安置就业等多种方式开展精准扶贫行动;以中央企业贫困地区产业投资基金、贫困地区产业发展基金等为代表的央企产业扶贫基金出资额是否及时足额缴纳、有无大量资金闲置和项目运营效果不佳等问题。\n" +
"11. 污染防治工作推进情况。企业贯彻落实生态环境保护和环境污染防治相关政策措施情况,重点是打蹴蓝天保卫战、打好碧水保卫战和推进净土保卫战等相关措施的落实情况。是否存在非法占地、违规改变土地使用条件、倒卖土地、土地闲置的问题;企业是否完成国家节能减排任务目标,有无不顾生态环境盲目决策和建设项目,造成重大环境污染和资源损毁等问题;有无违规偷排、漏排、超排废渣废液废气,瞒报、漏报检测数据,有无违规堆放、未按规定处理工业危险废弃物、危险化学品等问题;对所属企业发生的破坏生态环境情况,是否存在追责问责不到位等问题。企业是否建立能源消耗及污染物排放统计台账;是否按时定期将本企业节能减排汇总报表和总结分析报告报送有关部门,有无漏报、迟报、不按要求报送;重点类、关注类企业是否在总结分析报告中开展与同行业节能减排技术指标的对标和分析。\n");
// 绩效考核与创新发展 - 对应框架的12-13点创新理念
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. 注重评估五大发展理念贯彻情况";
// 关键词权重 - 根据新分类优化
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);
}
}

View File

@@ -0,0 +1,294 @@
package com.gxwebsoft.ai.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gxwebsoft.ai.dto.AuditContentRequest;
import com.gxwebsoft.ai.dto.export.StrategyAuditExportEntity;
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.AuditContent2StrategyService;
import com.gxwebsoft.ai.service.KnowledgeBaseService;
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 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;
/**
* 审计内容2控制器 - 单位发展战略执行审计
*/
@Slf4j
@Tag(name = "审计内容2-单位发展战略执行")
@RestController
@RequestMapping("/api/ai/auditContent2")
public class AuditContent2Controller extends BaseController {
@Autowired
private AuditContent2StrategyService auditContent2StrategyService;
@Autowired
private AiCloudDocService aiCloudDocService;
@Autowired
private AiCloudFileService aiCloudFileService;
@Autowired
private KnowledgeBaseService knowledgeBaseService;
@Autowired
private PwlProjectLibraryService pwlProjectLibraryService;
@Autowired
private AiHistoryService aiHistoryService;
// 历史记录有效期(分钟)
private static final int HISTORY_EXPIRE_MINUTES = 10;
/**
* 生成单位发展战略执行审计表数据
*/
@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
));
}
/**
* 通用的表格数据生成方法
*/
private 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")) {
// 保存到历史记录
saveToHistory(request, interfaceName, requestHash, result, loginUser);
}
return success(result);
} catch (Exception e) {
log.error("生成表格数据失败,接口: {}", interfaceName, e);
return fail("生成表格数据失败: " + e.getMessage());
} finally {
cleanupTempKnowledgeBase(kbIdTmp);
}
}
/**
* 生成请求哈希
*/
private String generateRequestHash(AuditContentRequest request, String interfaceName) {
String requestJson = JSONObject.toJSONString(request);
return DigestUtil.md5Hex(interfaceName + ":" + requestJson);
}
/**
* 保存到历史记录
*/
private void saveToHistory(AuditContentRequest request, String interfaceName, String requestHash, JSONObject result, User loginUser) {
try {
aiHistoryService.saveHistory(requestHash, interfaceName, JSONObject.toJSONString(request), result.toJSONString(), loginUser.getUserId(), loginUser.getUsername(), loginUser.getTenantId());
} catch (Exception e) {
log.warn("保存历史记录失败", e);
}
}
/**
* 检查是否有上传的文件
*/
private boolean hasUploadedFiles(AuditContentRequest request) {
return !request.getDocList().isEmpty() || !request.getFileList().isEmpty();
}
/**
* 获取知识库ID
*/
private String getKnowledgeBaseId(String tempKbId, String requestKbIds) {
return StrUtil.isNotBlank(tempKbId) ? tempKbId : requestKbIds;
}
/**
* 获取项目库KB IDs
*/
private 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(","));
}
/**
* 创建临时知识库并提交文档
*/
private 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;
}
/**
* 获取相关文件列表
*/
private 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);
}
/**
* 清理临时知识库
*/
private void cleanupTempKnowledgeBase(String kbId) {
if (StrUtil.isNotBlank(kbId)) {
try {
knowledgeBaseService.deleteIndex(kbId);
} catch (Exception e) {
log.warn("删除临时知识库失败: {}", kbId, e);
}
}
}
/**
* 导出单位发展战略执行审计表到Excel
*/
@Operation(summary = "导出单位发展战略执行审计表到Excel")
@PostMapping("/exportStrategyAuditTable")
public void exportStrategyAuditTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
exportToExcel(request, response);
}
/**
* Excel导出方法
*/
private void exportToExcel(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<StrategyAuditExportEntity> exportData = convertToExportEntityList(dataList);
String fileName = "单位发展战略执行审计表_" + (companyName != null ? companyName : "未知公司");
String title = companyName != null ? companyName + " - 单位发展战略执行审计表" : "单位发展战略执行审计表";
String sheetName = "发展战略执行审计";
ExcelExportTool.exportExcel(exportData, StrategyAuditExportEntity.class, fileName, sheetName, title, response);
}
/**
* 数据转换
*/
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;
}
private String getStringValue(Map<String, Object> map, String key) {
Object value = map.get(key);
return value != null ? value.toString() : "";
}
private 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();
}
/**
* 参数包装类
*/
private static class GenerateParams {
final String knowledgeBaseId;
final String libraryKbIds;
final String projectLibrary;
final String username;
final String history;
final String suggestion;
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;
}
}
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -0,0 +1,291 @@
package com.gxwebsoft.ai.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gxwebsoft.ai.constants.AuditContent2StrategyConstants;
import com.gxwebsoft.ai.service.AuditContent2StrategyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import cn.hutool.core.util.StrUtil;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@Slf4j
@Service
public class AuditContent2StrategyServiceImpl extends AbstractAuditContentService implements AuditContent2StrategyService {
// 工作流配置
private static final String DIFY_WORKFLOW_TOKEN = "Bearer app-3cPaXHIPFPS6lIfMGV67NOu0";
// 分类定义 - 调整为5个分类
private static final List<String> CATEGORY_ORDER = Arrays.asList(
AuditContent2StrategyConstants.CATEGORY_GOVERNANCE_REFORM,
AuditContent2StrategyConstants.CATEGORY_DEVELOPMENT_STRATEGY,
AuditContent2StrategyConstants.CATEGORY_RISK_PREVENTION,
AuditContent2StrategyConstants.CATEGORY_SOCIAL_ENVIRONMENTAL,
AuditContent2StrategyConstants.CATEGORY_PERFORMANCE_ASSESSMENT
);
@Override
public JSONObject generateStrategyAuditTableData(String kbIds, String libraryKbIds, String projectLibrary,
String userName, String history, String suggestion) {
log.info("开始生成单位发展战略执行审计表数据 - 用户: {}, kbIds: {}, libraryIds: {}, projectLibrary: {}",
userName, kbIds, libraryKbIds, projectLibrary);
long startTime = System.currentTimeMillis();
try {
// 异步并行处理每个分类
Map<String, CompletableFuture<JSONArray>> futures = processCategoriesAsync(
CATEGORY_ORDER,
category -> generateCategoryDataAsync(category, kbIds, libraryKbIds, projectLibrary, userName, history, suggestion)
);
// 等待所有异步任务完成
CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0])).join();
// 合并所有分类的结果
JSONArray allData = mergeCategoryResults(CATEGORY_ORDER, futures);
log.info("单位发展战略执行审计表生成成功 - 记录数: {}, 处理时间: {}ms", allData.size(), (System.currentTimeMillis() - startTime));
return buildSuccessResponse(allData, startTime, "strategy_audit");
} catch (Exception e) {
log.error("生成单位发展战略执行审计表失败", e);
return buildErrorResponse("生成单位发展战略执行审计表失败: " + e.getMessage());
}
}
/**
* 异步生成单个分类的数据
*/
@Async
public CompletableFuture<JSONArray> generateCategoryDataAsync(String category, String kbIds, String libraryKbIds,
String projectLibrary, String userName, String history, String suggestion) {
return CompletableFuture.supplyAsync(() -> {
try {
log.info("开始生成分类 {} 的数据", category);
// 1. 为当前分类召回相关知识
Map<String, List<String>> knowledgeSources = retrieveKnowledgeForCategory(
category, kbIds, libraryKbIds, projectLibrary
);
// 2. 构建完整的知识上下文
String knowledgeContext = buildCompleteKnowledgeContext(
category, knowledgeSources, history, suggestion
);
// 3. 调用工作流生成数据
JSONObject requestBody = buildWorkflowRequest(knowledgeContext, userName);
JSONArray categoryData = callWorkflow(DIFY_WORKFLOW_URL, DIFY_WORKFLOW_TOKEN, requestBody, "发展战略-" + category);
log.info("分类 {} 数据生成完成,生成 {} 条记录", category, categoryData.size());
return categoryData;
} catch (Exception e) {
log.error("生成分类 {} 数据失败", category, e);
return new JSONArray();
}
});
}
/**
* 为单个分类检索相关知识
*/
private Map<String, List<String>> retrieveKnowledgeForCategory(String category, String kbIds, String libraryKbIds, String projectLibrary) {
Map<String, List<String>> knowledgeSources = new HashMap<>();
knowledgeSources.put("enterprise", new ArrayList<>());
knowledgeSources.put("regulation", new ArrayList<>());
knowledgeSources.put("auditCase", new ArrayList<>());
// 构建当前分类的查询词
List<String> categoryQueries = buildCategoryQueries(category);
// 企业单位库检索 - 这是主要考察内容
if (StrUtil.isNotBlank(kbIds)) {
Arrays.stream(kbIds.split(","))
.map(String::trim)
.filter(StrUtil::isNotBlank)
.forEach(kbId -> knowledgeSources.get("enterprise")
.addAll(queryKnowledgeBase(kbId, categoryQueries, 150))); // 增加检索数量
}
// 公共法律法规库检索
if (StrUtil.isNotBlank(libraryKbIds)) {
Arrays.stream(libraryKbIds.split(","))
.map(String::trim)
.filter(StrUtil::isNotBlank)
.forEach(libId -> knowledgeSources.get("regulation")
.addAll(queryKnowledgeBase(libId, categoryQueries, 80)));
}
// 审计案例库检索
if (StrUtil.isNotBlank(projectLibrary)) {
knowledgeSources.get("auditCase").addAll(
queryKnowledgeBase(projectLibrary, categoryQueries, 60));
}
// 智能去重和排序
knowledgeSources.forEach((key, list) -> {
List<String> processed = list.stream()
.distinct()
.sorted(this::strategyAuditComparator)
.limit(getLimitBySourceType(key))
.collect(Collectors.toList());
knowledgeSources.put(key, processed);
});
log.debug("分类 {} 知识检索完成 - 企业: {}条, 法规: {}条, 案例: {}条",
category,
knowledgeSources.get("enterprise").size(),
knowledgeSources.get("regulation").size(),
knowledgeSources.get("auditCase").size());
return knowledgeSources;
}
/**
* 构建分类特定的查询词
*/
private List<String> buildCategoryQueries(String category) {
switch (category) {
case AuditContent2StrategyConstants.CATEGORY_GOVERNANCE_REFORM:
return Arrays.asList("法人治理 薪酬改革 国有资产管理", "改革创新 治理结构 董事会");
case AuditContent2StrategyConstants.CATEGORY_DEVELOPMENT_STRATEGY:
return Arrays.asList("混合所有制 剥离办社会职能 改革措施", "协调发展 改革方案 政策落实");
case AuditContent2StrategyConstants.CATEGORY_RISK_PREVENTION:
return Arrays.asList("发展规划 金融风险 债务风险", "绿色发展 风险防控 资产负债率");
case AuditContent2StrategyConstants.CATEGORY_SOCIAL_ENVIRONMENTAL:
return Arrays.asList("精准扶贫 污染防治 环境保护", "开放共享 社会责任 定点扶贫");
case AuditContent2StrategyConstants.CATEGORY_PERFORMANCE_ASSESSMENT:
return Arrays.asList("考核指标 经营业绩 目标责任", "创新发展 数据核实 完成情况");
default:
return Arrays.asList(category + " 审计 检查");
}
}
/**
* 构建完整的知识上下文
*/
private String buildCompleteKnowledgeContext(String category, Map<String, List<String>> knowledgeSources,
String history, String suggestion) {
StringBuilder context = new StringBuilder();
// 1. 核心审计任务
context.append("## 核心审计任务\n");
context.append("为以下审计分类生成具体的审计表内容:\n");
context.append("分类:").append(category).append("\n");
context.append("描述:").append(AuditContent2StrategyConstants.CATEGORY_DESCRIPTIONS.get(category)).append("\n");
context.append("审计重点:").append(AuditContent2StrategyConstants.getBriefAuditFrameworkForCategory(category)).append("\n\n");
// 2. 审计框架(只传入当前分类相关的部分)
context.append("## 审计框架(审计规则)\n");
context.append("以下审计框架定义了审计范围和要点,请基于此框架开展工作:\n");
// 获取当前分类相关的审计框架片段
String categoryFramework = AuditContent2StrategyConstants.CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.get(category);
if (categoryFramework != null) {
context.append(categoryFramework).append("\n");
} else {
// 如果找不到对应分类,则使用完整的框架(保底)
log.warn("未找到分类 {} 对应的审计框架片段,使用完整框架", category);
context.append(AuditContent2StrategyConstants.AUDIT_FRAMEWORK).append("\n");
}
// 3. 企业单位知识(主要考察内容)
if (!knowledgeSources.get("enterprise").isEmpty()) {
context.append("## 企业单位知识(具体考察内容)\n");
context.append("以下是企业单位的实际资料,请基于审计框架,结合这些具体内容生成审计记录:\n\n");
knowledgeSources.get("enterprise").forEach(knowledge ->
context.append("").append(knowledge).append("\n"));
context.append("\n");
}
// 4. 审计工作原则
context.append("## 审计工作原则\n");
context.append(AuditContent2StrategyConstants.AUDIT_PRINCIPLES).append("\n\n");
// 5. 数据格式要求(精简版)
context.append("## 数据格式要求\n");
context.append("生成JSON数组每个元素包含4个字段\n");
context.append("1. auditContent: 具体审计内容(基于框架,结合企业实际)\n");
context.append("2. checkEvidence: 检查证据(引用企业具体文件)\n");
context.append("3. testResult: 测试结果(通过/不通过)(基于充分证据严格判断)\n");
context.append("4. workPaperIndex: 工作底稿索引(具体文件名)\n\n");
// 6. 法规和案例参考
if (!knowledgeSources.get("regulation").isEmpty()) {
context.append("## 法律法规参考\n");
knowledgeSources.get("regulation").forEach(knowledge ->
context.append("").append(knowledge).append("\n"));
context.append("\n");
}
if (!knowledgeSources.get("auditCase").isEmpty()) {
context.append("## 审计案例参考\n");
knowledgeSources.get("auditCase").forEach(knowledge ->
context.append("").append(knowledge).append("\n"));
context.append("\n");
}
// 7. 历史内容(如果有)
if (StrUtil.isNotBlank(history)) {
context.append("## 历史生成内容\n");
context.append(history).append("\n\n");
}
// 8. 用户建议(如果有)
if (StrUtil.isNotBlank(suggestion)) {
context.append("## 用户建议\n");
context.append(suggestion).append("\n");
}
// 记录上下文长度用于监控
log.debug("分类 {} 构建的知识上下文长度: {} 字符", category, context.length());
return context.toString();
}
/**
* 发展战略审计相关性比较器
*/
private int strategyAuditComparator(String reg1, String reg2) {
int score1 = calculateStrategyAuditRelevanceScore(reg1);
int score2 = calculateStrategyAuditRelevanceScore(reg2);
return Integer.compare(score2, score1);
}
/**
* 计算发展战略审计相关性分数
*/
private int calculateStrategyAuditRelevanceScore(String content) {
return AuditContent2StrategyConstants.KEYWORD_WEIGHTS.entrySet().stream()
.filter(entry -> content.contains(entry.getKey()))
.mapToInt(Map.Entry::getValue)
.sum();
}
private int getLimitBySourceType(String sourceType) {
switch (sourceType) {
case "enterprise": return 120; // 增加企业知识数量
case "regulation": return 60; // 减少法规数量
case "auditCase": return 40; // 减少案例数量
default: return 50;
}
}
/**
* 获取当前分类相关的审计框架内容
* 这是一个辅助方法,方便其他地方调用
*/
private String getAuditFrameworkForCategory(String category) {
String framework = AuditContent2StrategyConstants.CATEGORY_AUDIT_FRAMEWORK_FRAGMENTS.get(category);
return framework != null ? framework : AuditContent2StrategyConstants.AUDIT_FRAMEWORK;
}
}