新增审计内容1-八项规定接口
This commit is contained in:
@@ -1,116 +0,0 @@
|
|||||||
package com.gxwebsoft.ai.constants;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class AuditConstants {
|
|
||||||
|
|
||||||
// 工作流配置
|
|
||||||
public static class Workflow {
|
|
||||||
// 三重一大工作流
|
|
||||||
public static final String TRIPLE_ONE_WORKFLOW_URL = "http://1.14.159.185:8180/v1/workflows/run";
|
|
||||||
public static final String TRIPLE_ONE_TOKEN = "Bearer app-tjXbmHDE6daMbYOT4O13ev2X";
|
|
||||||
|
|
||||||
// 重大经济决策调查表工作流
|
|
||||||
public static final String DECISION_TABLE_WORKFLOW_URL = "http://1.14.159.185:8180/v1/workflows/run";
|
|
||||||
public static final String DECISION_TABLE_TOKEN = "Bearer app-yN7Q8GEN9E7SCMkhI6HaAagW";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 三重一大分类定义
|
|
||||||
public static final List<String> TRIPLE_ONE_CATEGORY_ORDER = Arrays.asList(
|
|
||||||
"重大决策", "重要人事任免", "重大项目安排", "大额度资金运作", "决策权力主体和程序"
|
|
||||||
);
|
|
||||||
|
|
||||||
public static final Map<String, String> TRIPLE_ONE_CATEGORIES = new LinkedHashMap<>();
|
|
||||||
static {
|
|
||||||
TRIPLE_ONE_CATEGORIES.put("重大决策", "重大决策事项的定义和范围");
|
|
||||||
TRIPLE_ONE_CATEGORIES.put("重要人事任免", "重要人事任免事项的定义和范围");
|
|
||||||
TRIPLE_ONE_CATEGORIES.put("重大项目安排", "重大项目安排事项的定义和范围");
|
|
||||||
TRIPLE_ONE_CATEGORIES.put("大额度资金运作", "大额度资金运作事项的定义和范围");
|
|
||||||
TRIPLE_ONE_CATEGORIES.put("决策权力主体和程序", "决策权力主体和程序的规定");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 三重一大Excel数据映射
|
|
||||||
public static final Map<String, String[]> TRIPLE_ONE_EXCEL_DATA_MAP = new HashMap<>();
|
|
||||||
static {
|
|
||||||
// 重大决策
|
|
||||||
TRIPLE_ONE_EXCEL_DATA_MAP.put("重大决策", new String[]{
|
|
||||||
"1.重大决策事项:是指依照《中华人民共和国公司法》、《中华人民共和国全民所有制工业企业法》、《中华人民共和国企业国有资产法》、《中华人民共和国商业银行法》、《中华人民共和国证券法》、《中华人民共和国保险法》以及其他有关法律法规和党内法规规定的应当由股东大会(股东会)、董事会、未设董事会的经理班子、职工代表大会和党委(党组)决定的事项。主要包括企业贯彻执行党和国家的路线方针政策、法律法规和上级重要决定的重大措施,企业发展战略、破产、改制、兼并重组、资产调整、产权转让、对外投资、利益调配、机构调整等方面的重大决策,企业党的建设和安全稳定的重大决策,以及其他重大决策事项。",
|
|
||||||
"第四条重大决策的范围(一)集团公司贯彻执行国家法律法规,自治区战略部署及重要决策,以及上级主管部门重要决定等的重大举措;(二)集团公司章程制订和重要修订;集团公司重大基本管理制度,包括\"三重一大\"决策、投资、担保、资产交易、收入分配、人事、财务理,授权管理以及责任追究等重大管理制度的制订和重大修订;(三)集团公司生产经营方针、发展战略和中长期发展规划,以及重大投融资规划;(四)集团公司及重要子企业主业确定及变更;集团公司投资设立各类二级企业方案;集团公司及二级子公司发生分立、合并、重组,破产、解散及产权变更、增减资本方案;集团公司及所属子公司改制、股份制改造、混合所有制改革等方案;(五)集团公司重大财务管理事项,包括年度财务预算、年度财务决算、利润分配方案、亏损弥补方案;(六)集团公司内部收入分配事项,包括年度工资总额方案、职工工资、奖金、分流安置、劳动保护和劳动保险等事关职工切身利益的重大事项;集团公司所属部门、二级企业负责人年度考核结果及年度薪酬兑现方案;(七)集团公司制订或实施股权激励和员工持股计划;(八)集团公司及所属企业国有股权比例由控股变为非控股或国有股权由参股变为控股的事项;(九)集团公司及所属企业单笔金额为300万元及以上对外重大担保事项,集团公司及所属企业重大关联交易事项、内部借款单笔金额为2000万元及以上事项;(十)集团公司及所属企业产权(资产)对外非公开协议转让、无偿划转及公开进场转让单笔金额为300万元及以上的事项;集团公司内部重组整合进行的产权(资产)非公开协议转让、无偿划转单笔金额为300万元及以上的事项;(十一)集团公司及所属企业重大资产损失、大额不良资产、核销单笔金额为20万元及以上的事项;集团公司及所属企业单笔放弃金额为30万元及以上的重大权益事项;(十二)集团公司内部机构改革方案,内部管理机构设立和调整方案,内部定岗、定编,定员、定责方案;(十三)集团公司党建群团工作的重大事项、方案;(十四)集团公司董事会年度工作报告、经理层年度工作报告、年度依法治企工作报告,年度内部控制体系工作报告等重要报告;(十五)集团公司应对重大法律纠纷、安全稳定,重大突发事件的重大措施及方案;(十六)法律法规和企业章程规定的事项,以及集团公司认为需要集体决策的关系到企业全局性、方向性、战略性的其他重大事项。",
|
|
||||||
"(一)贯彻执行国家法律法规、自治区战略部署及集团公司的重要决策,以及上级主管部门重要决定等的重大举措;(二)章程制订和重要修订;重大基本管理制度,包括\"三重一大\"决策、投资、担保、资产交易、收入分配、人事、财务管理、授权管理以及责任追究等重大管理制度的制订和重大修订;(三)生产经营方针、发展战略和中长期发展规划,以及重大投融资规划;(四)公司主业确定及变更;投资设立各类企业方案;发生分立、合并、重组、破产、解散及产权变更、增减资本方案;公司及所属企业改制、股份制改造、混合所有制改革等方案;(五)重大财务管理事项,包括年度财务预算、年度财务决算、利润分配方案、亏损弥补方案;(六)内部收入分配事项,包括年度工资总额方案、职工工资、奖金、分流安置、劳动保护和劳动保险等事关职工切身利益的重大事项;所属部门年度考核结果及年度薪酬兑现方案;(七)制订或实施股权激励和员工持股计划;(八)公司国有股权比例由控股变为非控股或国有股权由参股变为控股的事项;(九)公司对外担保事项,公司重大关联交易事项和内部借款单笔100万元及以上的事项;(十)公司产权(资产)对外非公开协议转让、无偿划转及公开进场转让;公司内部重组整合进行的产权(资产)非公开协议转让、无偿划转的事项;(十一)公司重大资产损失、大额不良资产核销单笔金额为1万元及以上的事项;公司单笔放弃1万元及以上的重大权益事项;(十二)公司内部机构改革方案,内部管理机构设立和调整方案,内部定岗、定编、定员、定责方案;(十三)公司党建群团工作的重大事项、方案;(十四)公司年度工作报告、经理层年度工作报告、年度依法治企工作报告、年度内部控制体系工作报告等重要报告;(十五)公司应对重大法律纠纷、安全稳定、重大突发事件的措施及方案;(十六)法律法规和企业章程规定的事项,以及公司认为需要集体决策的关系到企业全局性、方向性、战略性的其他重大事项。"
|
|
||||||
});
|
|
||||||
|
|
||||||
// 重要人事任免
|
|
||||||
TRIPLE_ONE_EXCEL_DATA_MAP.put("重要人事任免", new String[]{
|
|
||||||
"2.重要人事任免事项:是指企业直接管理的领导人员以及其他经营管理人员的职务调整事项。主要包括企业中层以上经营管理人员和下属企业、单位领导班子成员的任免、聘用、解除聘用和后备人选的确定,向控股和参股企业委派股东代表,推荐董事会、监事会成员和经理、财务负责人,以及其他重要人事任免事项。",
|
|
||||||
"第五条重要人事任免的范围(一)对集团公司中层管理人员、二级子公司领导班子成员的任免或聘用、解聘;相当于集团公司中层副职及以上的职业经理人的选聘、解聘;(二)按照企业章程约定,委派、提名、推荐集团公司非全资二级企业董事会、监事会成员和高级经营管理人员;(三)提名或委派集团公司三级企业董事长或执行董事、总经理人选;(四)集团公司中层管理人员后备人选;(五)涉及集团公司总部中层管理人员以及二级子公司班子成员的重要奖惩,对违犯党纪政纪干部职工的处理;(六)重大人事变动及其他人事管理的重要事项。",
|
|
||||||
"(一)对公司中层管理人员(包括重大项目负责人)的任免或聘用、解除聘用和后备人选的推荐、确定;(二)委派、提名、推荐董事、监事和经理层、财务负责人;(三)干部员工的奖惩;(四)重大人事变动及其他人事管理的重要事项。"
|
|
||||||
});
|
|
||||||
|
|
||||||
// 重大项目安排
|
|
||||||
TRIPLE_ONE_EXCEL_DATA_MAP.put("重大项目安排", new String[]{
|
|
||||||
"3、重大项目安排事项:是指对企业资产规模、资本结构、盈利能力以及生产装备、技术状况等产生重要影响的项目的设立和安排。主要包括年度投资计划,融资、担保项目,期权、期货等金融衍生业务,重要设备和技术引进,采购大宗物资和购买服务,重大工程建设项目,以及其他重大项目安排事项。",
|
|
||||||
"(一)集团公司年度投资计划方案;(二)集团公司年度融资计划方案;(三)集团公司及所属企业总投资额为3000万元及以上的投资项目(投资项目范围按集团公司投资管理办法明确的投资项目范围) ;(四)应当向自治区国资委报告的重大投资管理事项;(五)其他需要集体研究决定的重要项目安排事项。",
|
|
||||||
"(一)企业年度投资计划和投资方案;(二)企业年度融资计划和融资方案,包括银行借贷、上市、发行债券等;(三)企业50万元及以上的投资项目以及非主业投资项目;(四)企业的重大技术改造方案、重要技术设备引进项目;(五)重大、关键性的设备引进和重要物资设备购置等重大招投标管理项目;(六)应当向自治区国资委或广西旅游发展集团有限公司(以下简称\"集团公司\")报告的重大投资管理事项;(七)其他需要集体研究决定的重要项目安排事项。"
|
|
||||||
});
|
|
||||||
|
|
||||||
// 大额度资金运作
|
|
||||||
TRIPLE_ONE_EXCEL_DATA_MAP.put("大额度资金运作", new String[]{
|
|
||||||
"4.大额度资金运作事项:是指超过由企业或者履行国有资产出资人职责的机构所规定的企业领导人员有权调动、使用的资金限额的资金调动和使用。主要包括年度预算内大额度资金调动和使用,超预算的资金调动和使用,对外大额捐赠、赞助,以及其他大额度资金运作事项。",
|
|
||||||
"(一)除重大决策事项、重大项目安排事项外,涉及单笔7000万元及以上的年度预算内大额度资金使用事项;(二)除重大决策事项、重大项目安排事项外,涉及单笔5000万元及以上的预算外大额度经营性资金的使用事项;(三)预算外非经营性单笔100万元及以上、广西美术馆艺术品收藏单件或单次收藏一批100万元及以上的大额资金使用事项;(四)集团公司及所属企业10万元及以上的对外捐赠、财务资助、公益慈善及用于脱贫攻坚(乡村振兴)等涉及企业政治责任和社会责任方面的重要事项;(五)公司单份工程签证涉及工程造价变更金额为500万元及以上的项目资金支出和其他大额度资金运作事项。",
|
|
||||||
"(一)除重大决策事项、重大项目安排事项外,涉及单笔500万元及以上的年度预算内大额度资金调动和使用;(二)除重大决策事项、重大项目安排事项外,涉及单笔50万元及以上的预算外大额度资金调动和使用;(三)除重大决策事项、重大项目安排事项外,涉及单笔10万元及以上的非生产性支出;(四)单份工程签证及造价变更额度为10万元及以上的;(五)企业对外捐赠、赞助在1万元及以上的事项;(六)其他大额度资金运作事项。"
|
|
||||||
});
|
|
||||||
|
|
||||||
// 决策权力主体和程序
|
|
||||||
TRIPLE_ONE_EXCEL_DATA_MAP.put("决策权力主体和程序", new String[]{
|
|
||||||
"",
|
|
||||||
"第十一条 凡属\"三重一大\"事项,应按规定程序决策,除遇重大突发事件和紧急情况外,应由领导班子以党委会、董事会或经理层会议形式集体讨论决定,不得以传阅会签或个别征求意见等方式代替集体决策。第十二条 集团公司决策主体权力运行必须坚持落实党组织的法定地位,规范党组织参与\"三重一大\"决策程序,确保党组织的领导核心和政治核心作用有效发挥。要坚持把党委研究讨论作为董事会、经理层决策重大问题的前置程序,在集团公司董事会决策前,对涉及企业改革发展稳定,重大经营管理和职工切身利益的\"三重一大\"事项决策事项,集团公司党委应当组织有关人员对决策事项进行调研和论证,提出意见建议,充分体现党组织对决策的定向把关作用,确保决策的合法性科学性、准确性。在董事会决策中,进入董事会的党委班子成员要按照党委的决定在董事会上充分发表意见,保证党委的意图在决策中得到体现。在董事会决策后,党委要建立\"三重一大\"决策事项跟踪问效制度、定期汇报制度、事后考核制度等,确保党的决策部署在企业贯彻好、执行好、落实好。第十三条 集团公司党委会、董事会,经理层对\"三重一大\"事项进行决策的具体程序和议题准备、表决、记录等事项严格按照集团公司党委会议事规则、董事会议事规则、总经理办公会议事规则规定的程序和要求执行。第十四条 集团公司研究决定企业改制及经营管理方面的重大问题、涉及职工切身利益的重大事项、制定重要的规章制度,应当听取企业工会的意见,并通过职工代表大会或者其他形式听取职工群众的意见和建议。按照国家有关规定须经职工代表大会或者职工大会审议通过的事项,履行相关程序后董事会或经理层方可批准或者作出决议。涉及重大决策、重大项目、大额度资金的使用,有合同意向的,应将合同的主要条款提交会议讨论。第十五条 \"三重一大\"事项经集体决策后,企业领导人员应当按照分工和职责组织实施。遇有分工和职责交叉的,应明确牵头落实人员。个人对集体决策有不同意见的,可以保留,但在作出新的决策前,应无条件执行。同时,可按组织程序向上级组织反映意见。第十六条 企业\"三重一大\"事项经集体决策后,应及时向自治区国资委报告有关决策情况。特别是属于重大报告事项的应按要求及时上报自治区国资委备案。自治区人民政府、自治区国资委另有规定需要报审、报批和备案的,按规定程序办理。",
|
|
||||||
"第十一条 凡属\"三重一大\"事项,党支部委员会成员应参加党支部委员会议对议题进行前置研究审议,保证党组织的意图在决策中得到体现。不得以传阅会签或个别征求意见等方式代替集体决策。第十二条 公司决策主体权力运行必须坚持落实党组织的法定地位,规范党组织参与\"三重一大\"决策程序,确保党组织的领导核心和政治核心作用有效发挥。要坚持把党支部研究讨论作为总经理办公会决策重大问题的前置程序。在总经理办公会会议决策前,对涉及企业改革发展稳定、重大经营管理和职工切身利益的\"三重一大\"事项决策事项,党支部应当组织有关人员对决策事项进行调研和论证,提出意见建议,充分体现党支部对决策的定向把关作用,确保决策的合法性、科学性、准确性。在总经理办公会的决策中,担任执行董事的党支部领导班子成员要按照党支部的决定在总经理办公会上充分发表意见,保证党支部的意图在决策中得到体现。在总经理办公会决策后,党支部要建立\"三重一大\"决策事项跟踪问效制度、定期汇报制度、事后考核制度等,确保党的决策部署在企业贯彻好、执行好、落实好。第十三条 公司党支部、经理层对\"三重一大\"事项进行决策的具体程序和议题准备、表决、记录等事项严格按照公司相关议事规则规定的程序和要求执行。第十四条 公司研究决定企业改制及经营管理方面的重大问题、涉及职工切身利益的重大事项、制定重要的规章制度,应当听取企业工会的意见,并通过职工代表大会或者其他形式听取职工群众的意见和建议。按照国家有关规定须经职工代表大会或者职工大会审议通过的事项,履行相关程序后经理层方可批准或者作出决议。涉及重大决策、重大项目、大额度资金的使用,有合同意向的,应将合同的主要条款提交会议讨论。第十五条 \"三重一大\"事项经集体决策后,企业领导人员应当按照分工和职责组织实施。遇有分工和职责交叉的,应明确牵头落实人员。个人对集体决策有不同意见的,可以保留,但在作出新的决策前,应无条件执行。同时,可按组织程序向上级组织反映意见。"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 重大经济决策调查表 - Excel Sheet1 中的条件信息
|
|
||||||
public static final String DECISION_TABLE_EXCEL_SHEET1_CONDITIONS =
|
|
||||||
"## 重大经济决策调查表审计重点\n" +
|
|
||||||
"重大经济事项的决策、执行和效果情况,具体包括重大预算管理、重大项目实施、重大采购项目、重大投资项目、重大外包业务、重大资产处置、大额资金使用的决策和执行情况等。\n\n" +
|
|
||||||
"## 重点关注\n" +
|
|
||||||
"\"三重一大\"集体决策制度是否建立健全。重大经济、经营活动必须进行集体决策的标准和必须参加决策的人员是否制定有规定,规定的集体决策的程序(签到表、决策纪要、最终形成的决策、决策人员的签字确认意见等)是否完整,是否有应集体决策而未集体决策的问题,是否有应参加集体决策的人因不合理理由不得参加集体决策的问题,形成的集体决策意见是否符合国家、自治区规定。\n\n" +
|
|
||||||
"## 审计方法及步骤\n" +
|
|
||||||
"1. 查阅单位制度,检查议事制度是否建立,查看重大事项进行集体决策的规定,查阅相关会议记录资料,检查会议签到表、会议纪要、会议决定内容及决策参与人员签字确认意见,以确认会议集体决策程序的完整性;对照重大决策内容,检查相关对应资料,确认集体决策内容是否符合国家、自治区规定。\n" +
|
|
||||||
"2. 抽查一些重大经济决策事项,比如重大建设项目、维修、大宗物资采购、企业投资运营等,审查其决策的背景、决策的过程、决策的执行和落实情况,决策的效果情况,以此来确定是否符合国家、自治区相关规定,执行是否有效。";
|
|
||||||
|
|
||||||
// 关键词权重
|
|
||||||
public static final Map<String, Integer> TRIPLE_ONE_KEYWORD_WEIGHTS;
|
|
||||||
static {
|
|
||||||
Map<String, Integer> map = new HashMap<>();
|
|
||||||
map.put("三重一大", 10);
|
|
||||||
map.put("重大决策", 9);
|
|
||||||
map.put("重要人事任免", 9);
|
|
||||||
map.put("重大项目安排", 9);
|
|
||||||
map.put("大额度资金运作", 9);
|
|
||||||
map.put("决策程序", 8);
|
|
||||||
map.put("党委会", 7);
|
|
||||||
map.put("董事会", 7);
|
|
||||||
map.put("总经理办公会", 7);
|
|
||||||
map.put("集体决策", 8);
|
|
||||||
map.put("会议纪要", 6);
|
|
||||||
map.put("金额标准", 6);
|
|
||||||
TRIPLE_ONE_KEYWORD_WEIGHTS = Collections.unmodifiableMap(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 知识库检索限制
|
|
||||||
public static class KnowledgeBaseLimit {
|
|
||||||
public static final int ENTERPRISE_PER_ITEM = 10;
|
|
||||||
public static final int ENTERPRISE_TOTAL = 200;
|
|
||||||
public static final int REGULATION_TOTAL = 100;
|
|
||||||
public static final int AUDIT_CASE_TOTAL = 50;
|
|
||||||
public static final int ENTERPRISE_DEFAULT = 100;
|
|
||||||
public static final int REGULATION_DEFAULT = 80;
|
|
||||||
public static final int AUDIT_CASE_DEFAULT = 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 审计内容类型
|
|
||||||
public static class AuditContentType {
|
|
||||||
public static final String TRIPLE_ONE = "TRIPLE_ONE";
|
|
||||||
public static final String DECISION_TABLE = "DECISION_TABLE";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
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, 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,295 @@
|
|||||||
|
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.EightRegExportEntity;
|
||||||
|
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.AuditContent1EightRegService;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审计内容1控制器 - 八项规定对比分析
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "审计内容1-八项规定")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/ai/auditContent1")
|
||||||
|
public class AuditContent1Controller extends BaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AuditContent1EightRegService auditContent1EightRegService;
|
||||||
|
|
||||||
|
@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("/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
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用的表格数据生成方法
|
||||||
|
*/
|
||||||
|
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("/exportEightRegTable")
|
||||||
|
public void exportEightRegTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||||
|
exportToExcel(request, response, "八项规定对比分析表",
|
||||||
|
this::convertToEightRegEntityList, EightRegExportEntity.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用的Excel导出方法
|
||||||
|
*/
|
||||||
|
private <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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数包装类
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== 数据转换方法 ==========
|
||||||
|
|
||||||
|
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 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -127,8 +127,10 @@ public class AuditContent3Controller extends BaseController {
|
|||||||
|
|
||||||
JSONObject result = generateFunction.apply(params);
|
JSONObject result = generateFunction.apply(params);
|
||||||
|
|
||||||
|
if(result.getBoolean("success")) {
|
||||||
// 保存到历史记录
|
// 保存到历史记录
|
||||||
saveToHistory(request, interfaceName, requestHash, result, loginUser);
|
saveToHistory(request, interfaceName, requestHash, result, loginUser);
|
||||||
|
}
|
||||||
|
|
||||||
return success(result);
|
return success(result);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -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,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,330 @@
|
|||||||
|
package com.gxwebsoft.ai.service.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.gxwebsoft.ai.constants.AuditContent1EightRegConstants;
|
||||||
|
import com.gxwebsoft.ai.service.AuditContent1EightRegService;
|
||||||
|
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 AuditContent1EightRegServiceImpl extends AbstractAuditContentService implements AuditContent1EightRegService {
|
||||||
|
|
||||||
|
// 八项规定工作流配置
|
||||||
|
private static final String DIFY_WORKFLOW_TOKEN = "Bearer app-hwUG7mEAZtN0jeZkebtIJYrU";
|
||||||
|
|
||||||
|
// 八项规定分类定义 - 按照要求的顺序
|
||||||
|
private static final List<String> CATEGORY_ORDER = Arrays.asList(
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_RESEARCH,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_MEETINGS,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_DOCUMENTS,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_VISITS,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_GUARD_WORK,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_NEWS_REPORT,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_PUBLICATIONS,
|
||||||
|
AuditContent1EightRegConstants.CATEGORY_ECONOMY
|
||||||
|
);
|
||||||
|
|
||||||
|
// 八项规定标题映射
|
||||||
|
private static final Map<String, String> POLICY_TITLE_MAP = new HashMap<>();
|
||||||
|
static {
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_RESEARCH, "一");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_MEETINGS, "二");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_DOCUMENTS, "三");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_VISITS, "四");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_GUARD_WORK, "五");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_NEWS_REPORT, "六");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_PUBLICATIONS, "七");
|
||||||
|
POLICY_TITLE_MAP.put(AuditContent1EightRegConstants.CATEGORY_ECONOMY, "八");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject generateEightRegTableData(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 = mergeAndSortCategoryResults(CATEGORY_ORDER, futures);
|
||||||
|
|
||||||
|
log.info("八项规定对比分析表生成成功 - 记录数: {}, 处理时间: {}ms", allData.size(), (System.currentTimeMillis() - startTime));
|
||||||
|
|
||||||
|
return buildSuccessResponse(allData, startTime, "eight_regulation_audit");
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成八项规定对比分析表失败", e);
|
||||||
|
return buildErrorResponse("生成八项规定对比分析表失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并并按照八项规定顺序排序分类结果
|
||||||
|
*/
|
||||||
|
private JSONArray mergeAndSortCategoryResults(List<String> categoryOrder, Map<String, CompletableFuture<JSONArray>> futures) {
|
||||||
|
JSONArray allData = new JSONArray();
|
||||||
|
|
||||||
|
// 按照八项规定顺序遍历每个分类
|
||||||
|
for (String category : categoryOrder) {
|
||||||
|
CompletableFuture<JSONArray> future = futures.get(category);
|
||||||
|
if (future != null) {
|
||||||
|
try {
|
||||||
|
JSONArray categoryData = future.get();
|
||||||
|
if (categoryData != null) {
|
||||||
|
// 为当前分类的数据设置排序标识
|
||||||
|
for (Object obj : categoryData) {
|
||||||
|
if (obj instanceof JSONObject) {
|
||||||
|
JSONObject item = (JSONObject) obj;
|
||||||
|
// 设置排序标识,用于前端展示
|
||||||
|
item.put("categoryOrder", POLICY_TITLE_MAP.get(category));
|
||||||
|
item.put("categoryName", category);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allData.addAll(categoryData);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("获取分类 {} 数据失败", category, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步生成单个分类的数据
|
||||||
|
*/
|
||||||
|
@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, 100)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公共法律法规库检索
|
||||||
|
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::eightRegComparator)
|
||||||
|
.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 AuditContent1EightRegConstants.CATEGORY_RESEARCH:
|
||||||
|
return Arrays.asList("调查研究 基层调研 调研陪同", "调研接待 调研规定");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_MEETINGS:
|
||||||
|
return Arrays.asList("会议活动 会议费 会议规模", "会议审批 会议时长");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_DOCUMENTS:
|
||||||
|
return Arrays.asList("文件简报 文件数量 文风", "简报精简 文件管理");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_VISITS:
|
||||||
|
return Arrays.asList("出访活动 因公出国 出访经费", "出访审批 出访陪同");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_GUARD_WORK:
|
||||||
|
return Arrays.asList("警卫工作 交通管制 封路", "安保工作 警卫规定");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_NEWS_REPORT:
|
||||||
|
return Arrays.asList("新闻报道 新闻稿 宣传报道", "媒体采访 新闻审批");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_PUBLICATIONS:
|
||||||
|
return Arrays.asList("文稿发表 出版著作 题词题字", "发表文章 出版审批");
|
||||||
|
case AuditContent1EightRegConstants.CATEGORY_ECONOMY:
|
||||||
|
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("## 八项规定对比分析要求 - ").append(category).append("\n");
|
||||||
|
context.append("请基于以下知识生成").append(category).append("相关的八项规定对比分析表数据:\n\n");
|
||||||
|
context.append("1. 仅关注与八项规定直接相关的制度内容,过滤不相关制度\n");
|
||||||
|
context.append("2. 对比分析中共中央八项规定与公司制度的差异\n");
|
||||||
|
context.append("3. 重点关注调查研究、会议活动、文件简报、出访活动、警卫工作、新闻报道、文稿发表、勤俭节约等八个方面\n");
|
||||||
|
context.append("4. 识别制度执行中的风险和问题\n");
|
||||||
|
context.append("5. 严格判断测试结果,只有证据充分才能判定为通过,证据不足或存在差异必须判定为不通过\n\n");
|
||||||
|
|
||||||
|
// 2. 数据格式要求
|
||||||
|
context.append("## 数据格式要求\n");
|
||||||
|
context.append("需要生成").append(category).append("分类的数据,尽可能生成多个实例、多条记录:\n");
|
||||||
|
context.append("- ").append(category).append(":").append(AuditContent1EightRegConstants.CATEGORY_DESCRIPTIONS.get(category)).append("\n");
|
||||||
|
context.append("\n");
|
||||||
|
|
||||||
|
context.append("每条记录应包含5个字段:\n");
|
||||||
|
context.append("- title:审计标题(必须按照八项规定顺序输出:一、二、三...八,对应八项规定的八个方面)\n");
|
||||||
|
context.append("- content:审计内容(具体中共中央八项规定/具体中央八项规定实施细则)\n");
|
||||||
|
context.append("- testContent:审计检查的证据,需详细描述查阅过程、查阅的具体文件和内容\n");
|
||||||
|
context.append("- result:审计测试的结果(通过/不通过),严格判断,从严掌握通过标准\n");
|
||||||
|
context.append("- workPaperIndex:相关《参考文件名》,必须是实际存在的完整文件名,不能使用附表标题,确保能在文件夹中搜索到\n");
|
||||||
|
context.append("\n注意:\n");
|
||||||
|
context.append("1. 请根据知识库内容尽可能全面地生成所有相关制度规定和检查点\n");
|
||||||
|
context.append("2. 工作底稿索引必须准确对应实际文件名称,避免使用附表或章节标题\n");
|
||||||
|
context.append("3. 测试结果判定需严格,对于制度不一致、执行不到位、证据不充分的情况必须判定为不通过\n");
|
||||||
|
context.append("4. title字段必须按照八项规定顺序输出:一、二、三...八\n\n");
|
||||||
|
|
||||||
|
// 3. 参考数据(从常量类中获取)
|
||||||
|
context.append("## 参考数据\n");
|
||||||
|
context.append("### 政策内容\n").append(AuditContent1EightRegConstants.POLICY_CONTENTS.get(category)).append("\n\n");
|
||||||
|
context.append("### 实施细则\n").append(AuditContent1EightRegConstants.IMPLEMENTATION_DETAILS.get(category)).append("\n\n");
|
||||||
|
|
||||||
|
// 4. 历史内容
|
||||||
|
if (StrUtil.isNotBlank(history)) {
|
||||||
|
context.append("## 历史生成内容\n");
|
||||||
|
context.append("以下是之前生成的内容,请基于此进行优化:\n");
|
||||||
|
context.append(history).append("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 用户建议
|
||||||
|
if (StrUtil.isNotBlank(suggestion)) {
|
||||||
|
context.append("## 用户优化建议\n");
|
||||||
|
context.append("请根据以下建议对生成内容进行调整:\n");
|
||||||
|
context.append(suggestion).append("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 企业单位知识
|
||||||
|
if (!knowledgeSources.get("enterprise").isEmpty()) {
|
||||||
|
context.append("## 企业单位知识\n");
|
||||||
|
knowledgeSources.get("enterprise").forEach(knowledge ->
|
||||||
|
context.append(knowledge).append("\n"));
|
||||||
|
context.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 法律法规知识
|
||||||
|
if (!knowledgeSources.get("regulation").isEmpty()) {
|
||||||
|
context.append("## 法律法规知识\n");
|
||||||
|
knowledgeSources.get("regulation").forEach(knowledge ->
|
||||||
|
context.append(knowledge).append("\n"));
|
||||||
|
context.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. 审计案例知识
|
||||||
|
if (!knowledgeSources.get("auditCase").isEmpty()) {
|
||||||
|
context.append("## 审计案例知识\n");
|
||||||
|
knowledgeSources.get("auditCase").forEach(knowledge ->
|
||||||
|
context.append(knowledge).append("\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 八项规定相关性比较器
|
||||||
|
*/
|
||||||
|
private int eightRegComparator(String reg1, String reg2) {
|
||||||
|
int score1 = calculateEightRegRelevanceScore(reg1);
|
||||||
|
int score2 = calculateEightRegRelevanceScore(reg2);
|
||||||
|
return Integer.compare(score2, score1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算八项规定相关性分数
|
||||||
|
*/
|
||||||
|
private int calculateEightRegRelevanceScore(String content) {
|
||||||
|
return AuditContent1EightRegConstants.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 100;
|
||||||
|
case "regulation": return 80;
|
||||||
|
case "auditCase": return 60;
|
||||||
|
default: return 50;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user