SNAPSHOT W7 已部署稳定态 — 凯迪ERP+OA一体化平台 (MET 73.3%)

恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。

== 此快照内容 ==
- 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091)
- 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static)
- 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB)
- 交接文档 go.md + go-code-reference/endpoints/entities/database.md
- 多代理建设脚本 .claude/wf-*.js

== 状态 ==
- 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板)
- 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用
- W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成)
- 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456

== 排除(gitignore, 可再生) ==
node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui)
完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules)

时间戳: 20260615-191517

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Qiufeng
2026-06-15 19:19:15 +08:00
co-authored by Claude Opus 4.8
commit 5e51dc3f56
10584 changed files with 2501339 additions and 0 deletions
@@ -0,0 +1,436 @@
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 org.springframework.stereotype.Component;
import java.time.Instant;
/**
* 法务风险部演示数据播种器。
*
* 补完"活体返回 0 条/功能在但无数据演示"缺口:
* 1. LitigationCase — 诉讼/仲裁案件(跨 5 种阶段/3种结果)
* 2. HrNonCompete — 员工竞业限制(含离职补偿中/已违约/在职-未触发各状态)
* 3. ComplianceAlertRule — 合规预警规则库(覆盖采购/销售/合同/人事/财务触发场景)
* 4. LegalCreditInvest — 法务专项客户信用调查记录(含已结案驳回/进行中)
*
* @Order(20) 在 DataSeeder(@Order 1) 之后运行;幂等(count>0 则跳过)。
*/
@Order(20)
@Component
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);
}
}