新增审计内容10-廉政情况接口
This commit is contained in:
@@ -0,0 +1,431 @@
|
|||||||
|
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\", \"实际存在的完整文件名2\", \"...\"]");
|
||||||
|
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,296 @@
|
|||||||
|
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.PartyConductExportEntity;
|
||||||
|
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.AuditContent10PartyConductService;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审计内容10控制器 - 党风廉政建设责任制审计
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "审计内容10-廉政情况")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/ai/auditContent10")
|
||||||
|
public class AuditContent10Controller extends BaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AuditContent10PartyConductService auditContent10PartyConductService;
|
||||||
|
|
||||||
|
@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("/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
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用的表格数据生成方法
|
||||||
|
*/
|
||||||
|
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("/exportPartyConductTable")
|
||||||
|
public void exportPartyConductTable(@RequestBody Map<String, Object> request, HttpServletResponse response) {
|
||||||
|
exportToExcel(request, response, "党风廉政建设责任制审计表",
|
||||||
|
this::convertToPartyConductEntityList, PartyConductExportEntity.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<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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,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,307 @@
|
|||||||
|
package com.gxwebsoft.ai.service.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.gxwebsoft.ai.constants.AuditContent10PartyConductConstants;
|
||||||
|
import com.gxwebsoft.ai.service.AuditContent10PartyConductService;
|
||||||
|
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 AuditContent10PartyConductServiceImpl extends AbstractAuditContentService implements AuditContent10PartyConductService {
|
||||||
|
|
||||||
|
// 工作流配置
|
||||||
|
private static final String DIFY_WORKFLOW_TOKEN = "Bearer app-NpWFaPdBAl3LH7HqRXenlnVD";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject generatePartyConductTableData(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 {
|
||||||
|
// 获取所有子类(基于常量类中的映射关系)
|
||||||
|
List<String> allSubCategories = AuditContent10PartyConductConstants.getAllSubCategories();
|
||||||
|
log.info("共发现 {} 个子类需要处理", allSubCategories.size());
|
||||||
|
|
||||||
|
// 异步并行处理每个子类
|
||||||
|
Map<String, CompletableFuture<JSONArray>> futures = processCategoriesAsync(
|
||||||
|
allSubCategories,
|
||||||
|
subCategory -> generateSubCategoryDataAsync(subCategory, kbIds, libraryKbIds, projectLibrary, userName, history, suggestion)
|
||||||
|
);
|
||||||
|
|
||||||
|
// 等待所有异步任务完成
|
||||||
|
CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0])).join();
|
||||||
|
|
||||||
|
// 合并所有子类的结果
|
||||||
|
JSONArray allData = mergeCategoryResults(allSubCategories, futures);
|
||||||
|
|
||||||
|
// 对结果进行排序(直接调用常量类的排序方法)
|
||||||
|
AuditContent10PartyConductConstants.sortPartyConductData(allData);
|
||||||
|
|
||||||
|
log.info("党风廉政建设责任制审计表生成成功 - 记录数: {}, 处理时间: {}ms", allData.size(), (System.currentTimeMillis() - startTime));
|
||||||
|
|
||||||
|
return buildSuccessResponse(allData, startTime, "party_conduct_audit");
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成党风廉政建设责任制审计表失败", e);
|
||||||
|
return buildErrorResponse("生成党风廉政建设责任制审计表失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步生成单个子类的数据
|
||||||
|
*/
|
||||||
|
@Async
|
||||||
|
public CompletableFuture<JSONArray> generateSubCategoryDataAsync(String subCategory, String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion) {
|
||||||
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
|
try {
|
||||||
|
log.info("开始生成子类 {} 的数据", subCategory);
|
||||||
|
|
||||||
|
// 1. 为当前子类召回相关知识
|
||||||
|
Map<String, List<String>> knowledgeSources = retrieveKnowledgeForSubCategory(
|
||||||
|
subCategory, kbIds, libraryKbIds, projectLibrary
|
||||||
|
);
|
||||||
|
|
||||||
|
// 2. 构建完整的知识上下文(包含固定内容和动态内容)
|
||||||
|
String knowledgeContext = buildCompleteKnowledgeContext(
|
||||||
|
subCategory, knowledgeSources, history, suggestion
|
||||||
|
);
|
||||||
|
|
||||||
|
// 3. 调用工作流生成数据
|
||||||
|
JSONObject requestBody = buildWorkflowRequest(knowledgeContext, userName);
|
||||||
|
JSONArray subCategoryData = callWorkflow(DIFY_WORKFLOW_URL, DIFY_WORKFLOW_TOKEN, requestBody, "廉政情况-" + subCategory);
|
||||||
|
|
||||||
|
log.info("子类 {} 数据生成完成,生成 {} 条记录", subCategory, subCategoryData.size());
|
||||||
|
return subCategoryData;
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成子类 {} 数据失败", subCategory, e);
|
||||||
|
return new JSONArray();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 为单个子类检索相关知识
|
||||||
|
*/
|
||||||
|
private Map<String, List<String>> retrieveKnowledgeForSubCategory(String subCategory, 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> subCategoryQueries = buildSubCategoryQueries(subCategory);
|
||||||
|
|
||||||
|
// 企业单位库检索
|
||||||
|
if (StrUtil.isNotBlank(kbIds)) {
|
||||||
|
Arrays.stream(kbIds.split(","))
|
||||||
|
.map(String::trim)
|
||||||
|
.filter(StrUtil::isNotBlank)
|
||||||
|
.forEach(kbId -> knowledgeSources.get("enterprise")
|
||||||
|
.addAll(queryKnowledgeBase(kbId, subCategoryQueries, 100)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公共法律法规库检索
|
||||||
|
if (StrUtil.isNotBlank(libraryKbIds)) {
|
||||||
|
Arrays.stream(libraryKbIds.split(","))
|
||||||
|
.map(String::trim)
|
||||||
|
.filter(StrUtil::isNotBlank)
|
||||||
|
.forEach(libId -> knowledgeSources.get("regulation")
|
||||||
|
.addAll(queryKnowledgeBase(libId, subCategoryQueries, 80)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 审计案例库检索
|
||||||
|
if (StrUtil.isNotBlank(projectLibrary)) {
|
||||||
|
knowledgeSources.get("auditCase").addAll(
|
||||||
|
queryKnowledgeBase(projectLibrary, subCategoryQueries, 60));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 智能去重和排序
|
||||||
|
knowledgeSources.forEach((key, list) -> {
|
||||||
|
List<String> processed = list.stream()
|
||||||
|
.distinct()
|
||||||
|
.sorted(this::partyConductComparator)
|
||||||
|
.limit(getLimitBySourceType(key))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
knowledgeSources.put(key, processed);
|
||||||
|
});
|
||||||
|
|
||||||
|
log.debug("子类 {} 知识检索完成 - 企业: {}条, 法规: {}条, 案例: {}条",
|
||||||
|
subCategory,
|
||||||
|
knowledgeSources.get("enterprise").size(),
|
||||||
|
knowledgeSources.get("regulation").size(),
|
||||||
|
knowledgeSources.get("auditCase").size());
|
||||||
|
|
||||||
|
return knowledgeSources;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建子类特定的查询词
|
||||||
|
*/
|
||||||
|
private List<String> buildSubCategoryQueries(String subCategory) {
|
||||||
|
List<String> queries = new ArrayList<>();
|
||||||
|
|
||||||
|
// 基础查询词
|
||||||
|
queries.add(subCategory);
|
||||||
|
queries.add(subCategory + " 制度规定");
|
||||||
|
queries.add(subCategory + " 执行情况");
|
||||||
|
|
||||||
|
// 根据子类类型添加特定查询词
|
||||||
|
if (subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_MAIN_RESPONSIBILITY)) {
|
||||||
|
queries.add("主体责任 监督责任 责任清单");
|
||||||
|
queries.add("党风廉政建设责任制 党组责任 纪检责任");
|
||||||
|
} else if (subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_EIGHT_REGULATIONS)) {
|
||||||
|
queries.add("中央八项规定 监督检查 问题线索");
|
||||||
|
queries.add("八项规定精神 违规问题 通报曝光");
|
||||||
|
} else if (subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_ANTI_CORRUPTION)) {
|
||||||
|
queries.add("群众身边腐败 四风问题 案件查处");
|
||||||
|
queries.add("基层腐败 专项治理 长效机制");
|
||||||
|
} else if (subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_DISCIPLINE_ENFORCEMENT)) {
|
||||||
|
queries.add("政治纪律 组织纪律 政令畅通");
|
||||||
|
queries.add("纪律执行 重大决策 转办督办");
|
||||||
|
} else if (subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_MONTHLY_REPORT) ||
|
||||||
|
subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_RECTIFICATION_TASK) ||
|
||||||
|
subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_RECTIFICATION_ACCOUNTABILITY)) {
|
||||||
|
queries.add("巡视整改 整改报告 整改措施");
|
||||||
|
queries.add("巡视反馈 整改方案 整改完成");
|
||||||
|
} else if (subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_THREE_TURNS) ||
|
||||||
|
subCategory.equals(AuditContent10PartyConductConstants.SUBCATEGORY_SYSTEM_CONSTRUCTION)) {
|
||||||
|
queries.add("纪律检查体制改革 三转工作 纪检体制改革");
|
||||||
|
queries.add("纪检制度建设 监督执纪问责");
|
||||||
|
}
|
||||||
|
|
||||||
|
return queries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建完整的知识上下文 - 包含完整的子类示例数据
|
||||||
|
*/
|
||||||
|
private String buildCompleteKnowledgeContext(String subCategory, Map<String, List<String>> knowledgeSources, String history, String suggestion) {
|
||||||
|
StringBuilder context = new StringBuilder();
|
||||||
|
|
||||||
|
// 1. 获取当前子类的大类
|
||||||
|
String category = findCategoryBySubCategory(subCategory);
|
||||||
|
String categoryDesc = AuditContent10PartyConductConstants.CATEGORY_DESCRIPTIONS.getOrDefault(category, "");
|
||||||
|
String subCategoryDesc = AuditContent10PartyConductConstants.SUBCATEGORY_DESCRIPTIONS.getOrDefault(subCategory, "");
|
||||||
|
|
||||||
|
// 2. 党风廉政建设责任制审计要求
|
||||||
|
context.append("## 党风廉政建设责任制审计要求\n");
|
||||||
|
context.append("请基于以下知识生成").append(category).append("-").append(subCategory).append("相关的党风廉政建设责任制审计表数据:\n\n");
|
||||||
|
context.append("1. 严格按照廉政情况表的结构生成数据:大类、子类、小类、内容、执行情况、工作底稿索引\n");
|
||||||
|
context.append("2. **执行情况字段必须填写:详细情况内容说明,基于知识库证据判断,不能留空**\n");
|
||||||
|
context.append("3. 工作底稿索引必须填写实际存在的完整文件名,确保能在文件夹中搜索到\n");
|
||||||
|
context.append("4. 内容字段必须填写具体、可核查的检查点描述\n\n");
|
||||||
|
|
||||||
|
// 3. 数据结构说明
|
||||||
|
context.append("## 数据结构说明\n");
|
||||||
|
context.append("当前大类:").append(category).append(" - ").append(categoryDesc).append("\n");
|
||||||
|
context.append("当前子类:").append(subCategory).append(" - ").append(subCategoryDesc).append("\n");
|
||||||
|
|
||||||
|
// 获取当前子类的小类列表
|
||||||
|
List<String> detailCategories = AuditContent10PartyConductConstants.SUBCATEGORY_DETAIL_MAP.getOrDefault(subCategory, Collections.emptyList());
|
||||||
|
if (!detailCategories.isEmpty()) {
|
||||||
|
context.append("\n可用的子类包括:\n");
|
||||||
|
for (String detailCategory : detailCategories) {
|
||||||
|
context.append("- ").append(detailCategory).append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
context.append("\n可用的执行情况:详细情况内容说明\n\n");
|
||||||
|
|
||||||
|
// 4. 完整的示例数据
|
||||||
|
context.append("## 示例数据(参考结构)\n");
|
||||||
|
String exampleDataJson = AuditContent10PartyConductConstants.getExampleDataJsonString(subCategory);
|
||||||
|
context.append("以下是相关审计内容的").append(subCategory).append("的完整示例数据,请参考这些内容的结构生成:\n\n");
|
||||||
|
context.append(exampleDataJson).append("\n\n");
|
||||||
|
|
||||||
|
// 5. 历史内容
|
||||||
|
if (StrUtil.isNotBlank(history)) {
|
||||||
|
context.append("## 历史生成内容\n");
|
||||||
|
context.append("以下是之前生成的内容,请基于此进行优化:\n");
|
||||||
|
context.append(history).append("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 用户建议
|
||||||
|
if (StrUtil.isNotBlank(suggestion)) {
|
||||||
|
context.append("## 用户优化建议\n");
|
||||||
|
context.append("请根据以下建议对生成内容进行调整:\n");
|
||||||
|
context.append(suggestion).append("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 企业单位知识
|
||||||
|
if (!knowledgeSources.get("enterprise").isEmpty()) {
|
||||||
|
context.append("## 企业单位知识\n");
|
||||||
|
knowledgeSources.get("enterprise").forEach(knowledge ->
|
||||||
|
context.append(knowledge).append("\n"));
|
||||||
|
context.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. 法律法规知识
|
||||||
|
if (!knowledgeSources.get("regulation").isEmpty()) {
|
||||||
|
context.append("## 法律法规知识\n");
|
||||||
|
knowledgeSources.get("regulation").forEach(knowledge ->
|
||||||
|
context.append(knowledge).append("\n"));
|
||||||
|
context.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9. 审计案例知识
|
||||||
|
if (!knowledgeSources.get("auditCase").isEmpty()) {
|
||||||
|
context.append("## 审计案例知识\n");
|
||||||
|
knowledgeSources.get("auditCase").forEach(knowledge ->
|
||||||
|
context.append(knowledge).append("\n"));
|
||||||
|
context.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据子类查找对应的大类
|
||||||
|
*/
|
||||||
|
private String findCategoryBySubCategory(String subCategory) {
|
||||||
|
for (Map.Entry<String, List<String>> entry : AuditContent10PartyConductConstants.CATEGORY_SUBCATEGORY_MAP.entrySet()) {
|
||||||
|
if (entry.getValue().contains(subCategory)) {
|
||||||
|
return entry.getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AuditContent10PartyConductConstants.CATEGORY_TARGET_RESPONSIBILITY; // 默认返回第一个大类
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 廉政情况相关性比较器
|
||||||
|
*/
|
||||||
|
private int partyConductComparator(String reg1, String reg2) {
|
||||||
|
int score1 = calculatePartyConductRelevanceScore(reg1);
|
||||||
|
int score2 = calculatePartyConductRelevanceScore(reg2);
|
||||||
|
return Integer.compare(score2, score1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算廉政情况相关性分数
|
||||||
|
*/
|
||||||
|
private int calculatePartyConductRelevanceScore(String content) {
|
||||||
|
return AuditContent10PartyConductConstants.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