package com.kaidi.oa.seed; import com.kaidi.oa.common.Money; import com.kaidi.oa.domain.ComplianceAlertRule; import com.kaidi.oa.domain.HrNonCompete; import com.kaidi.oa.domain.LegalCreditInvest; import com.kaidi.oa.domain.LitigationCase; import com.kaidi.oa.repository.ComplianceAlertRuleRepository; import com.kaidi.oa.repository.HrNonCompeteRepository; import com.kaidi.oa.repository.LegalCreditInvestRepository; import com.kaidi.oa.repository.LitigationCaseRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import java.time.Instant; /** * 法务风险部演示数据播种器。 * * 补完"活体返回 0 条/功能在但无数据演示"缺口: * 1. LitigationCase — 诉讼/仲裁案件(跨 5 种阶段/3种结果) * 2. HrNonCompete — 员工竞业限制(含离职补偿中/已违约/在职-未触发各状态) * 3. ComplianceAlertRule — 合规预警规则库(覆盖采购/销售/合同/人事/财务触发场景) * 4. LegalCreditInvest — 法务专项客户信用调查记录(含已结案驳回/进行中) * * @Order(20) 在 DataSeeder(@Order 1) 之后运行;幂等(count>0 则跳过)。 */ @Order(20) @DemoSeed public class LegalDemoSeeder implements CommandLineRunner { private final LitigationCaseRepository caseRepo; private final HrNonCompeteRepository nonCompeteRepo; private final ComplianceAlertRuleRepository ruleRepo; private final LegalCreditInvestRepository investRepo; public LegalDemoSeeder(LitigationCaseRepository caseRepo, HrNonCompeteRepository nonCompeteRepo, ComplianceAlertRuleRepository ruleRepo, LegalCreditInvestRepository investRepo) { this.caseRepo = caseRepo; this.nonCompeteRepo = nonCompeteRepo; this.ruleRepo = ruleRepo; this.investRepo = investRepo; } @Override public void run(String... args) throws Exception { seedLitigationCases(); seedNonCompete(); seedComplianceAlertRules(); seedLegalCreditInvest(); } // ======================================================================== // 1. 诉讼/仲裁案件 // ======================================================================== private void seedLitigationCases() { if (caseRepo.count() > 0) return; LitigationCase c1 = new LitigationCase(); c1.setCaseNo("(2024)粤0305民初2241号"); c1.setCaseName("凯迪科技诉深圳博拓工程有限公司合同纠纷案"); c1.setCause("建设工程施工合同纠纷"); c1.setOpponent("深圳博拓工程有限公司"); c1.setOurRole("原告"); c1.setTribunal("广州市天河区人民法院"); c1.setAmount(Money.of(2850000.0)); c1.setStage("开庭"); c1.setLawyer("陈建国"); c1.setLawFirm("广东广信君达律师事务所"); c1.setFilingDate("2024-03-15"); c1.setKeyDate("2025-08-20"); c1.setResult("审理中"); c1.setStatus("进行中"); c1.setRemark("被告拖欠工程款285万元,已提交完整证据清单,等待开庭。"); c1.setCreatedAt(Instant.now()); LitigationCase c2 = new LitigationCase(); c2.setCaseNo("(2024)粤03民终8876号"); c2.setCaseName("广州恒辉材料公司诉凯迪科技货款纠纷案"); c2.setCause("买卖合同纠纷"); c2.setOpponent("广州恒辉材料有限公司"); c2.setOurRole("被告"); c2.setTribunal("广州市中级人民法院"); c2.setAmount(Money.of(680000.0)); c2.setStage("已结案"); c2.setLawyer("李晓燕"); c2.setLawFirm("广东广信君达律师事务所"); c2.setFilingDate("2023-11-08"); c2.setKeyDate("2024-05-30"); c2.setResult("调解结案"); c2.setStatus("已结案"); c2.setRemark("已达成调解协议,支付货款52万元,余款免除,2024年6月结案。"); c2.setCreatedAt(Instant.now()); LitigationCase c3 = new LitigationCase(); c3.setCaseNo("(2025)粤0305仲字0421号"); c3.setCaseName("凯迪科技与华南水务集团技术服务合同仲裁案"); c3.setCause("技术服务合同纠纷"); c3.setOpponent("华南水务集团股份有限公司"); c3.setOurRole("申请人"); c3.setTribunal("广州仲裁委员会"); c3.setAmount(Money.of(4200000.0)); c3.setStage("举证"); c3.setLawyer("王志远"); c3.setLawFirm("北京金杜律师事务所广州分所"); c3.setFilingDate("2025-01-20"); c3.setKeyDate("2025-09-10"); c3.setResult("审理中"); c3.setStatus("进行中"); c3.setRemark("涉及420万技术服务费,对方以验收未通过为由拒付,正在提交技术鉴定报告。"); c3.setCreatedAt(Instant.now()); LitigationCase c4 = new LitigationCase(); c4.setCaseNo("(2023)粤0305劳人仲字3304号"); c4.setCaseName("王某某申请劳动仲裁案(竞业违约)"); c4.setCause("劳动合同纠纷·竞业限制违约"); c4.setOpponent("王某某"); c4.setOurRole("被申请人"); c4.setTribunal("广州市天河区劳动人事争议仲裁委员会"); c4.setAmount(Money.of(45000.0)); c4.setStage("已结案"); c4.setLawyer("陈建国"); c4.setLawFirm("广东广信君达律师事务所"); c4.setFilingDate("2023-06-12"); c4.setKeyDate("2023-09-28"); c4.setResult("胜诉"); c4.setStatus("已结案"); c4.setRemark("仲裁委裁决申请人主张不成立,公司竞业补偿支付行为合规,无需额外赔偿。"); c4.setCreatedAt(Instant.now()); LitigationCase c5 = new LitigationCase(); c5.setCaseNo("(2025)粤0305民初5012号"); c5.setCaseName("凯迪科技诉珠海绿科环保公司知识产权侵权案"); c5.setCause("侵害发明专利权纠纷"); c5.setOpponent("珠海绿科环保技术有限公司"); c5.setOurRole("原告"); c5.setTribunal("广州知识产权法院"); c5.setAmount(Money.of(1500000.0)); c5.setStage("立案"); c5.setLawyer("李晓燕"); c5.setLawFirm("广东广信君达律师事务所"); c5.setFilingDate("2025-05-08"); c5.setKeyDate("2025-11-15"); c5.setResult("审理中"); c5.setStatus("进行中"); c5.setRemark("对方产品疑似侵犯ZL201910329876.4号发明专利权,已完成初步鉴定,立案受理。"); c5.setCreatedAt(Instant.now()); caseRepo.save(c1); caseRepo.save(c2); caseRepo.save(c3); caseRepo.save(c4); caseRepo.save(c5); } // ======================================================================== // 2. 员工竞业限制 // ======================================================================== private void seedNonCompete() { if (nonCompeteRepo.count() > 0) return; HrNonCompete nc1 = new HrNonCompete(); nc1.setEmployeeId("EMP-2019-0088"); nc1.setEmployeeName("张伟强"); nc1.setDept("技术研发部"); nc1.setPosition("高级研发工程师"); nc1.setRestrictionPeriod(24); nc1.setStartDate("2024-10-01"); nc1.setEndDate("2026-09-30"); nc1.setCompensationMonthly(Money.of(8500.0)); nc1.setRestrictedIndustries("同类环保设备制造/同类污水处理技术/竞争对手企业:华南水务集团、珠海绿科、深圳博瑞"); nc1.setStatus("离职-补偿中"); nc1.setSignedDate("2024-09-28"); nc1.setCreatedAt(Instant.now()); HrNonCompete nc2 = new HrNonCompete(); nc2.setEmployeeId("EMP-2021-0145"); nc2.setEmployeeName("刘雅婷"); nc2.setDept("销售部"); nc2.setPosition("高级销售经理"); nc2.setRestrictionPeriod(12); nc2.setStartDate("2025-02-01"); nc2.setEndDate("2026-01-31"); nc2.setCompensationMonthly(Money.of(6000.0)); nc2.setRestrictedIndustries("同类水处理设备销售、ERP系统集成销售;不得接触原公司客户资源"); nc2.setStatus("离职-补偿中"); nc2.setSignedDate("2025-01-28"); nc2.setCreatedAt(Instant.now()); HrNonCompete nc3 = new HrNonCompete(); nc3.setEmployeeId("EMP-2018-0033"); nc3.setEmployeeName("王某某"); nc3.setDept("技术研发部"); nc3.setPosition("研发主任"); nc3.setRestrictionPeriod(18); nc3.setStartDate("2023-05-01"); nc3.setEndDate("2024-10-31"); nc3.setCompensationMonthly(Money.of(12000.0)); nc3.setRestrictedIndustries("所有同类污水处理技术研发机构及制造企业"); nc3.setStatus("已违约"); nc3.setViolationNote("2023年9月发现当事人入职珠海绿科环保技术有限公司担任技术总监,已提起劳动仲裁并胜诉。"); nc3.setSignedDate("2023-04-25"); nc3.setCreatedAt(Instant.now()); HrNonCompete nc4 = new HrNonCompete(); nc4.setEmployeeId("EMP-2022-0201"); nc4.setEmployeeName("陈明慧"); nc4.setDept("财务部"); nc4.setPosition("财务经理"); nc4.setRestrictionPeriod(12); nc4.setStartDate(""); nc4.setEndDate(""); nc4.setCompensationMonthly(Money.of(5000.0)); nc4.setRestrictedIndustries("同行业财务管理/同类ERP系统服务商"); nc4.setStatus("在职-未触发"); nc4.setSignedDate("2022-07-01"); nc4.setCreatedAt(Instant.now()); HrNonCompete nc5 = new HrNonCompete(); nc5.setEmployeeId("EMP-2020-0112"); nc5.setEmployeeName("周晨光"); nc5.setDept("市场部"); nc5.setPosition("市场总监"); nc5.setRestrictionPeriod(18); nc5.setStartDate("2023-11-15"); nc5.setEndDate("2025-05-14"); nc5.setCompensationMonthly(Money.of(9500.0)); nc5.setRestrictedIndustries("水务行业市场推广,客户范围包括原有的50家签约客户"); nc5.setStatus("已到期"); nc5.setSignedDate("2023-11-10"); nc5.setCreatedAt(Instant.now()); nonCompeteRepo.save(nc1); nonCompeteRepo.save(nc2); nonCompeteRepo.save(nc3); nonCompeteRepo.save(nc4); nonCompeteRepo.save(nc5); } // ======================================================================== // 3. 合规预警规则库 // ======================================================================== private void seedComplianceAlertRules() { if (ruleRepo.count() > 0) return; ComplianceAlertRule r1 = new ComplianceAlertRule(); r1.setRuleCode("RULE-PROC-001"); r1.setRuleName("单笔采购超预算比例预警"); r1.setTriggerScene("采购"); r1.setCondition("单笔采购金额超过年度采购预算的30%"); r1.setThreshold("30"); r1.setAlertLevel("高"); r1.setEnabled(Boolean.TRUE); r1.setNotifyRoles("法务,合规专员,财务总监"); r1.setTriggerCount(3); r1.setLastTriggeredAt("2025-04-20"); r1.setCreatedAt(Instant.now()); ComplianceAlertRule r2 = new ComplianceAlertRule(); r2.setRuleCode("RULE-SALE-001"); r2.setRuleName("销售合同客户涉诉风险预警"); r2.setTriggerScene("销售"); r2.setCondition("新签销售合同甲方在法务诉讼台账中存在未结案的被告案件"); r2.setThreshold(""); r2.setAlertLevel("高"); r2.setEnabled(Boolean.TRUE); r2.setNotifyRoles("法务,销售总监,总经理"); r2.setTriggerCount(1); r2.setLastTriggeredAt("2025-03-12"); r2.setCreatedAt(Instant.now()); ComplianceAlertRule r3 = new ComplianceAlertRule(); r3.setRuleCode("RULE-CONTRACT-001"); r3.setRuleName("合同无授权审批预警"); r3.setTriggerScene("合同"); r3.setCondition("合同金额超出签署人授权限额,未经上级审批"); r3.setThreshold("500000"); r3.setAlertLevel("紧急"); r3.setEnabled(Boolean.TRUE); r3.setNotifyRoles("法务,总经理,董事会秘书"); r3.setTriggerCount(0); r3.setCreatedAt(Instant.now()); ComplianceAlertRule r4 = new ComplianceAlertRule(); r4.setRuleCode("RULE-HR-001"); r4.setRuleName("高岗位员工离职竞业限制触发预警"); r4.setTriggerScene("人事"); r4.setCondition("研发/销售/财务等关键岗位人员离职,竞业限制协议状态仍为「在职-未触发」"); r4.setThreshold(""); r4.setAlertLevel("高"); r4.setEnabled(Boolean.TRUE); r4.setNotifyRoles("法务,HR总监"); r4.setTriggerCount(2); r4.setLastTriggeredAt("2025-02-28"); r4.setCreatedAt(Instant.now()); ComplianceAlertRule r5 = new ComplianceAlertRule(); r5.setRuleCode("RULE-FIN-001"); r5.setRuleName("大额资金异常转账预警"); r5.setTriggerScene("财务"); r5.setCondition("单笔对外付款超过200万元且无合同关联"); r5.setThreshold("2000000"); r5.setAlertLevel("紧急"); r5.setEnabled(Boolean.TRUE); r5.setNotifyRoles("法务,财务总监,总经理"); r5.setTriggerCount(0); r5.setCreatedAt(Instant.now()); ComplianceAlertRule r6 = new ComplianceAlertRule(); r6.setRuleCode("RULE-IP-001"); r6.setRuleName("知识产权年费到期未缴预警"); r6.setTriggerScene("知识产权"); r6.setCondition("专利年费缴纳截止日前30天,费用状态仍为待缴"); r6.setThreshold("30"); r6.setAlertLevel("中"); r6.setEnabled(Boolean.TRUE); r6.setNotifyRoles("法务,知识产权专员"); r6.setTriggerCount(5); r6.setLastTriggeredAt("2025-05-31"); r6.setCreatedAt(Instant.now()); ComplianceAlertRule r7 = new ComplianceAlertRule(); r7.setRuleCode("RULE-PROC-002"); r7.setRuleName("制裁名单供应商交易预警"); r7.setTriggerScene("采购"); r7.setCondition("采购供应商名称出现在公司维护的制裁名单/黑名单中"); r7.setThreshold(""); r7.setAlertLevel("紧急"); r7.setEnabled(Boolean.TRUE); r7.setNotifyRoles("法务,合规专员,采购总监"); r7.setTriggerCount(0); r7.setCreatedAt(Instant.now()); ComplianceAlertRule r8 = new ComplianceAlertRule(); r8.setRuleCode("RULE-ENVI-001"); r8.setRuleName("环保违规风险预警"); r8.setTriggerScene("其他"); r8.setCondition("环保监测数据超标且无整改记录,可能产生行政处罚"); r8.setThreshold(""); r8.setAlertLevel("高"); r8.setEnabled(Boolean.TRUE); r8.setNotifyRoles("法务,安全环保部,总经理"); r8.setTriggerCount(1); r8.setLastTriggeredAt("2024-12-15"); r8.setCreatedAt(Instant.now()); ruleRepo.save(r1); ruleRepo.save(r2); ruleRepo.save(r3); ruleRepo.save(r4); ruleRepo.save(r5); ruleRepo.save(r6); ruleRepo.save(r7); ruleRepo.save(r8); } // ======================================================================== // 4. 法务专项客户信用调查记录 // ======================================================================== private void seedLegalCreditInvest() { if (investRepo.count() > 0) return; LegalCreditInvest inv1 = new LegalCreditInvest(); inv1.setCustomerName("华南水务集团股份有限公司"); inv1.setInvestigationType("综合调查"); inv1.setScope("工商信息、涉诉记录、行政处罚、失信被执行人"); inv1.setCourtRecord("存在3起历史诉讼,已全部结案,其中1起因工程款纠纷败诉"); inv1.setBlacklisted(false); inv1.setLitigationHistory("2022年(2022)粤03民终4421号-货款纠纷(结案胜诉);\n2021年(2021)粤0305民初1183号-建工合同(调解结案)"); inv1.setCreditScore("AA"); inv1.setInvestigator("陈建国"); inv1.setTargetCompletionDate("2025-02-28"); inv1.setStatus("已结案"); inv1.setConclusion("通过"); inv1.setConclusionOpinion("整体信用状况良好,历史诉讼均已结案,无失信记录,可建立长期合作关系,建议合同金额不超过2000万元。"); inv1.setConclusionDate("2025-02-26"); inv1.setRemark("该客户为粤港澳大湾区重点国有水务企业,授信风险可控。"); inv1.setCreatedAt(Instant.now()); LegalCreditInvest inv2 = new LegalCreditInvest(); inv2.setCustomerName("珠海绿科环保技术有限公司"); inv2.setInvestigationType("诉讼记录核查"); inv2.setScope("全量涉诉记录及行政处罚记录"); inv2.setCourtRecord("存在5起正在进行的诉讼,其中2起为知识产权侵权指控"); inv2.setBlacklisted(false); inv2.setLitigationHistory("(2025)粤0305民初5012号-专利侵权(进行中);\n(2024)粤03民终6601号-技术转让纠纷(进行中)"); inv2.setCreditScore("B"); inv2.setInvestigator("李晓燕"); inv2.setTargetCompletionDate("2025-06-15"); inv2.setStatus("已结案"); inv2.setConclusion("驳回"); inv2.setConclusionOpinion("该公司存在多起知识产权侵权诉讼记录,与我司涉及专利侵权案件,建议中止合作谈判,列入法务重点监控名单。"); inv2.setConclusionDate("2025-06-10"); inv2.setRemark("已通知销售部暂停与该公司的合作洽谈,销售合同系统已标记风险。"); inv2.setCreatedAt(Instant.now()); LegalCreditInvest inv3 = new LegalCreditInvest(); inv3.setCustomerName("深圳博拓工程有限公司"); inv3.setInvestigationType("失信被执行人核查"); inv3.setScope("最高人民法院失信被执行人名单、执行案件记录"); inv3.setCourtRecord("查询到2条失信被执行人记录,涉及2023年至今未履行的建工合同判决"); inv3.setBlacklisted(true); inv3.setLitigationHistory("(2024)粤0305民初2241号-合同纠纷(进行中/我司原告);\n2023年被列入失信被执行人名单"); inv3.setCreditScore("D"); inv3.setInvestigator("陈建国"); inv3.setTargetCompletionDate("2025-04-30"); inv3.setStatus("已结案"); inv3.setConclusion("驳回"); inv3.setConclusionOpinion("该企业已被列入失信被执行人名单,建议冻结合作、追缴应收款,已向财务部出具法律意见书。"); inv3.setConclusionDate("2025-04-25"); inv3.setRemark("已同步供应商黑名单,采购系统已拦截该供应商新增采购订单。"); inv3.setCreatedAt(Instant.now()); LegalCreditInvest inv4 = new LegalCreditInvest(); inv4.setCustomerName("广州恒盛科技投资有限公司"); inv4.setInvestigationType("工商信用核查"); inv4.setScope("工商注册信息、股权结构、企业年报、司法拍卖记录"); inv4.setCourtRecord("未发现涉诉记录"); inv4.setBlacklisted(false); inv4.setLitigationHistory("无历史诉讼记录"); inv4.setCreditScore("AAA"); inv4.setInvestigator("王志远"); inv4.setTargetCompletionDate("2025-07-31"); inv4.setStatus("调查中"); inv4.setRemark("新引入战略合作客户,正在开展全面尽职调查,预计下月出具调查报告。"); inv4.setCreatedAt(Instant.now()); investRepo.save(inv1); investRepo.save(inv2); investRepo.save(inv3); investRepo.save(inv4); } }