package com.kaidi.oa.seed; import com.kaidi.oa.domain.ComplianceAnonReport; import com.kaidi.oa.domain.LegalPolicyRevision; import com.kaidi.oa.repository.ComplianceAnonReportRepository; import com.kaidi.oa.repository.LegalPolicyRevisionRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import java.time.Instant; /** * 制度修订审批 + 匿名合规举报演示数据播种器(法务风险部)。 * * 补齐缺口 2(匿名举报)和缺口 8(制度修订 OA 引擎接入)的活体演示数据。 * @Order(21),在 LegalDemoSeeder(@Order 20) 之后;幂等。 */ @Order(21) @DemoSeed public class LegalPolicyAnonSeeder implements CommandLineRunner { private final LegalPolicyRevisionRepository revisionRepo; private final ComplianceAnonReportRepository anonReportRepo; public LegalPolicyAnonSeeder(LegalPolicyRevisionRepository revisionRepo, ComplianceAnonReportRepository anonReportRepo) { this.revisionRepo = revisionRepo; this.anonReportRepo = anonReportRepo; } @Override public void run(String... args) throws Exception { seedPolicyRevisions(); seedAnonReports(); } // ====================================================================== // 1. 制度修订申请(跨状态:草稿/审批中/已生效/已废止) // ====================================================================== private void seedPolicyRevisions() { if (revisionRepo.count() > 0) return; LegalPolicyRevision r1 = new LegalPolicyRevision(); r1.setRevisionNo("PR-2025-001"); r1.setPolicyNo("ZD-HR-015"); r1.setTitle("员工竞业限制与保密协议管理制度"); r1.setRevisionType("修订"); r1.setCategory("管理制度"); r1.setContent("根据2024年《劳动合同法》司法解释新规,修订竞业限制补偿标准为月薪30%,并扩展限制范围至供应商合作关系,增加违约金双倍赔偿条款。"); r1.setReason("最高法院2024年发布关于竞业限制纠纷案件审理的新司法解释,原制度与新规不符,存在合规风险。"); r1.setChangePoints("1. 补偿标准:≥月薪25% → 月薪30%; 2. 新增:禁止入职供应商; 3. 违约赔偿:1倍 → 2倍月薪×限制月数"); r1.setApplicantDept("法务部"); r1.setApplicant("陈建国"); r1.setEffectiveDate("2025-07-01"); r1.setStatus("已生效"); r1.setCreatedAt(Instant.now()); r1.setUpdatedAt(Instant.now()); LegalPolicyRevision r2 = new LegalPolicyRevision(); r2.setRevisionNo("PR-2025-002"); r2.setPolicyNo("ZD-PROC-008"); r2.setTitle("采购合同授权审批管理办法"); r2.setRevisionType("修订"); r2.setCategory("授权规则"); r2.setContent("调整各级授权金额上限:部门经理 50万→80万、总经理 200万→300万,新增电子合同签署授权,明确超授权行为追责机制。"); r2.setReason("原授权标准制定于2022年,随公司业务规模扩大,现有金额上限已不匹配实际需求,导致大量合同需要越级审批,影响效率。"); r2.setChangePoints("1. 部门经理授权额度上调至80万; 2. 总经理上调至300万; 3. 新增电子签章授权流程; 4. 超授权追责条款细化"); r2.setApplicantDept("法务部"); r2.setApplicant("李晓燕"); r2.setEffectiveDate("2025-09-01"); r2.setStatus("审批中"); r2.setCreatedAt(Instant.now()); r2.setUpdatedAt(Instant.now()); LegalPolicyRevision r3 = new LegalPolicyRevision(); r3.setRevisionNo("PR-2025-003"); r3.setPolicyNo("ZD-DATA-003"); r3.setTitle("数据安全与个人信息保护管理制度"); r3.setRevisionType("新建"); r3.setCategory("管理制度"); r3.setContent("根据《数据安全法》《个人信息保护法》制度要求,新建数据安全管理制度,覆盖数据分级保护、访问控制、泄露应急响应、删除和销毁规程。"); r3.setReason("我司目前尚无专项数据安全管理制度,监管机构检查时被要求整改。《个保法》实施已近4年,该项制度为合规基础要求。"); r3.setChangePoints("全新制度,主要内容:数据分级(公开/内部/机密/绝密)、敏感数据访问须双人核准、个人信息去标识化要求、数据出境审查流程"); r3.setApplicantDept("法务部"); r3.setApplicant("王志远"); r3.setEffectiveDate("2025-10-01"); r3.setStatus("草稿"); r3.setCreatedAt(Instant.now()); r3.setUpdatedAt(Instant.now()); LegalPolicyRevision r4 = new LegalPolicyRevision(); r4.setRevisionNo("PR-2024-006"); r4.setPolicyNo("ZD-PROC-003"); r4.setTitle("物资采购管理流程(2020版)"); r4.setRevisionType("废止"); r4.setCategory("业务流程"); r4.setContent("原2020年版物资采购流程已由2024年新版本取代,正式废止旧版本,防止双版本并行导致执行混乱。"); r4.setReason("2024年采购管理流程完成修订并发布,原版本已过时,需正式废止以避免混用。"); r4.setChangePoints("无变更,仅为废止旧版本。"); r4.setApplicantDept("采购部"); r4.setApplicant("赵明华"); r4.setDeprecationDate("2025-01-01"); r4.setStatus("已废止"); r4.setCreatedAt(Instant.now()); r4.setUpdatedAt(Instant.now()); LegalPolicyRevision r5 = new LegalPolicyRevision(); r5.setRevisionNo("PR-2025-004"); r5.setPolicyNo("ZD-HR-022"); r5.setTitle("高管绩效激励与股权激励管理办法"); r5.setRevisionType("修订"); r5.setCategory("管理制度"); r5.setContent("引入限制性股票激励计划,调整高管年度绩效考核权重(短期绩效40%+长期价值60%),与公司战略转型目标挂钩。"); r5.setReason("公司战略转型需要更长期的激励机制,现有以年为周期的绩效考核已不足以激励高管关注长期价值创造。"); r5.setChangePoints("1. 新增限制性股票激励计划(3年期); 2. 绩效权重调整; 3. 退出机制完善(反稀释条款)"); r5.setApplicantDept("战略发展部"); r5.setApplicant("张勇"); r5.setEffectiveDate("2025-12-01"); r5.setStatus("已驳回"); r5.setRemark("董事会审议认为当前不宜引入股权激励,建议待上市计划明确后重新评估,本次申请驳回。"); r5.setCreatedAt(Instant.now()); r5.setUpdatedAt(Instant.now()); revisionRepo.save(r1); revisionRepo.save(r2); revisionRepo.save(r3); revisionRepo.save(r4); revisionRepo.save(r5); } // ====================================================================== // 2. 匿名合规举报(跨状态:待受理/调查中/已处理/已关闭) // ====================================================================== private void seedAnonReports() { if (anonReportRepo.count() > 0) return; ComplianceAnonReport a1 = new ComplianceAnonReport(); a1.setReportNo("AR-2025-001"); a1.setReportType("财务异常"); a1.setSuspectDept("采购部"); a1.setSuspectPerson("某采购经理"); a1.setReportContent("发现某采购经理与特定供应商存在利益输送:该供应商报价始终明显高于市场价15-20%,但每次仍中标,且该采购经理与供应商负责人有私下宴请记录。建议调查该供应商的实际控制人与采购部人员的关联关系。"); a1.setReporterInfo("(匿名举报,不留联系方式)"); a1.setSeverity("严重"); a1.setStatus("调查中"); a1.setHandler("陈建国"); a1.setHandleResult("已启动内部调查,正在核查采购台账及供应商关系,预计2025年8月底完成初步报告。"); a1.setQueryToken("a1b2c3d4e5f6g7h8"); a1.setCreatedAt(Instant.now()); a1.setUpdatedAt(Instant.now()); ComplianceAnonReport a2 = new ComplianceAnonReport(); a2.setReportNo("AR-2025-002"); a2.setReportType("安全隐患"); a2.setSuspectDept("生产车间"); a2.setSuspectPerson("(部门整体)"); a2.setReportContent("生产车间B区消防通道长期被货架占用,消防设施存在遮挡,安全出口标识灯不亮。已发现超过3个月,多次口头提醒但无人处理,担心发生事故时无法及时疏散。"); a2.setReporterInfo("可以通过内网邮件联系:anon@kaidi.internal"); a2.setSeverity("紧急"); a2.setStatus("已处理"); a2.setHandler("王志远"); a2.setHandleResult("已通知安全生产部现场整改。2025年6月15日复查确认:消防通道已清空,消防设施遮挡已移除,安全出口标识灯全部更换完毕。记录为安全隐患整改案例,纳入月度安全检查。"); a2.setQueryToken("h8g7f6e5d4c3b2a1"); a2.setCreatedAt(Instant.now()); a2.setUpdatedAt(Instant.now()); ComplianceAnonReport a3 = new ComplianceAnonReport(); a3.setReportNo("AR-2025-003"); a3.setReportType("劳动违规"); a3.setSuspectDept("研发部"); a3.setSuspectPerson("(不便透露)"); a3.setReportContent("研发部存在长期强制加班未支付加班费的情况,员工打卡记录被删除,绩效考核与加班时长挂钩形成隐性强制。希望公司核查过去12个月的加班记录和薪酬发放情况。"); a3.setReporterInfo(""); a3.setSeverity("严重"); a3.setStatus("待受理"); a3.setQueryToken("z9y8x7w6v5u4t3s2"); a3.setCreatedAt(Instant.now()); a3.setUpdatedAt(Instant.now()); ComplianceAnonReport a4 = new ComplianceAnonReport(); a4.setReportNo("AR-2024-009"); a4.setReportType("合规违规"); a4.setSuspectDept("市场部"); a4.setSuspectPerson("(团队行为)"); a4.setReportContent("市场部在政府项目投标中存在提前获取标底信息的行为,怀疑有内线。已有2次投标中标价格与标底极为接近,偏差在0.3%以内,统计上不太可能出现。"); a4.setReporterInfo(""); a4.setSeverity("严重"); a4.setStatus("已关闭"); a4.setHandler("李晓燕"); a4.setHandleResult("经调查,未发现实质性证据表明存在非法获取标底行为。2次中标均有合理解释(市场调研能力强+竞争对手报价较保守)。将加强投标廉洁合规培训,本案关闭。"); a4.setQueryToken("r2q1p0o9n8m7l6k5"); a4.setCreatedAt(Instant.now()); a4.setUpdatedAt(Instant.now()); anonReportRepo.save(a1); anonReportRepo.save(a2); anonReportRepo.save(a3); anonReportRepo.save(a4); } }