diff --git a/src/main/java/com/gxwebsoft/ai/constants/AuditContent10PartyConductConstants.java b/src/main/java/com/gxwebsoft/ai/constants/AuditContent10PartyConductConstants.java new file mode 100644 index 0000000..c0a82f8 --- /dev/null +++ b/src/main/java/com/gxwebsoft/ai/constants/AuditContent10PartyConductConstants.java @@ -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> 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> 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 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 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 getFixedOrderContentList() { + List contentList = new ArrayList<>(); + for (JSONObject example : FIXED_ORDER_EXAMPLE_DATA) { + contentList.add(example.getString("content")); + } + return contentList; + } + + /** + * 获取内容在固定顺序中的索引 + */ + public static int getContentFixedOrderIndex(String content) { + List fixedOrder = getFixedOrderContentList(); + int index = fixedOrder.indexOf(content); + return index != -1 ? index : Integer.MAX_VALUE; + } + + /** + * 获取所有子类列表(包括所有大类的子类) + */ + public static List getAllSubCategories() { + List allSubCategories = new ArrayList<>(); + for (List subCategories : CATEGORY_SUBCATEGORY_MAP.values()) { + allSubCategories.addAll(subCategories); + } + return allSubCategories; + } + + // 大类顺序 - 用于排序 + public static final List CATEGORY_ORDER = Arrays.asList( + CATEGORY_TARGET_RESPONSIBILITY, + CATEGORY_INSPECTION_RECTIFICATION, + CATEGORY_DISCIPLINE_REFORM + ); + + // 大类描述 + public static final Map 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 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 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 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 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 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 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() { + // 防止实例化 + } +} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/ai/controller/AuditContent10Controller.java b/src/main/java/com/gxwebsoft/ai/controller/AuditContent10Controller.java new file mode 100644 index 0000000..aca5567 --- /dev/null +++ b/src/main/java/com/gxwebsoft/ai/controller/AuditContent10Controller.java @@ -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 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 idList = StrUtil.split(libraryIds, ','); + List ret = pwlProjectLibraryService.list(new LambdaQueryWrapper().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 docIds = request.getDocList().stream().flatMap(docId -> aiCloudDocService.getSelfAndChildren(docId).stream()).map(AiCloudDoc::getId).collect(Collectors.toSet()); + // 查询相关文件 + List fileList = getRelatedFiles(docIds, request.getFileList()); + // 提取文件ID并提交到知识库 + Set kbFileIds = fileList.stream().map(AiCloudFile::getFileId).collect(Collectors.toSet()); + if (!kbFileIds.isEmpty()) { + knowledgeBaseService.submitDocuments(kbIdTmp, new ArrayList<>(kbFileIds)); + } + return kbIdTmp; + } + + /** + * 获取相关文件列表 + */ + private List getRelatedFiles(Set docIds, List fileList) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .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 request, HttpServletResponse response) { + exportToExcel(request, response, "党风廉政建设责任制审计表", + this::convertToPartyConductEntityList, PartyConductExportEntity.class); + } + + /** + * 通用的Excel导出方法 + */ + private void exportToExcel(Map request, HttpServletResponse response, + String sheetName, Function>, List> converter, + Class entityClass) { + List> dataList = (List>) request.get("data"); + String companyName = (String) request.get("companyName"); + + List 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 convertToPartyConductEntityList(List> originalData) { + return originalData.stream().map(this::convertToPartyConductEntity).collect(Collectors.toList()); + } + + private PartyConductExportEntity convertToPartyConductEntity(Map 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 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(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/ai/dto/export/PartyConductExportEntity.java b/src/main/java/com/gxwebsoft/ai/dto/export/PartyConductExportEntity.java new file mode 100644 index 0000000..103751a --- /dev/null +++ b/src/main/java/com/gxwebsoft/ai/dto/export/PartyConductExportEntity.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/ai/service/AuditContent10PartyConductService.java b/src/main/java/com/gxwebsoft/ai/service/AuditContent10PartyConductService.java new file mode 100644 index 0000000..ffee717 --- /dev/null +++ b/src/main/java/com/gxwebsoft/ai/service/AuditContent10PartyConductService.java @@ -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); +} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/ai/service/impl/AuditContent10PartyConductServiceImpl.java b/src/main/java/com/gxwebsoft/ai/service/impl/AuditContent10PartyConductServiceImpl.java new file mode 100644 index 0000000..d52ee28 --- /dev/null +++ b/src/main/java/com/gxwebsoft/ai/service/impl/AuditContent10PartyConductServiceImpl.java @@ -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 allSubCategories = AuditContent10PartyConductConstants.getAllSubCategories(); + log.info("共发现 {} 个子类需要处理", allSubCategories.size()); + + // 异步并行处理每个子类 + Map> 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 generateSubCategoryDataAsync(String subCategory, String kbIds, String libraryKbIds, String projectLibrary, String userName, String history, String suggestion) { + return CompletableFuture.supplyAsync(() -> { + try { + log.info("开始生成子类 {} 的数据", subCategory); + + // 1. 为当前子类召回相关知识 + Map> 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> retrieveKnowledgeForSubCategory(String subCategory, String kbIds, String libraryKbIds, String projectLibrary) { + Map> knowledgeSources = new HashMap<>(); + knowledgeSources.put("enterprise", new ArrayList<>()); + knowledgeSources.put("regulation", new ArrayList<>()); + knowledgeSources.put("auditCase", new ArrayList<>()); + + // 构建当前子类的查询词 + List 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 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 buildSubCategoryQueries(String subCategory) { + List 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> 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 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> 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; + } + } +} \ No newline at end of file