Files
ERP/oa-backend/src/main/java/com/kaidi/oa/seed/CslDemoSeeder.java
T
QiufengandClaude Opus 4.8 5e51dc3f56 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>
2026-06-15 19:19:15 +08:00

181 lines
9.0 KiB
Java

package com.kaidi.oa.seed;
import com.kaidi.oa.common.Money;
import com.kaidi.oa.domain.CslProject;
import com.kaidi.oa.domain.CslTimesheet;
import com.kaidi.oa.repository.CslProjectRepository;
import com.kaidi.oa.repository.CslTimesheetRepository;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.Instant;
/**
* 咨询可研院演示种子数据:
* 播种 3 个 CslProject + 每个项目若干 CslTimesheet(含草稿和已确认状态),
* 让"咨询人员工时录入台账"页面活体可见。
*
* 幂等:按 code 查重后跳过,重启不重复插入。
*/
@Component
@Order(7)
public class CslDemoSeeder implements ApplicationRunner {
private final CslProjectRepository projectRepo;
private final CslTimesheetRepository timesheetRepo;
public CslDemoSeeder(CslProjectRepository projectRepo,
CslTimesheetRepository timesheetRepo) {
this.projectRepo = projectRepo;
this.timesheetRepo = timesheetRepo;
}
@Override
@Transactional
public void run(ApplicationArguments args) {
seedProjects();
}
private void seedProjects() {
// 项目1:可行性研究 - 执行阶段
if (projectRepo.findAll().stream().noneMatch(p -> "CSL-2025-001".equals(p.getCode()))) {
CslProject p1 = new CslProject();
p1.setCode("CSL-2025-001");
p1.setName("某市地铁5号线可行性研究");
p1.setClient("某市城市轨道交通有限公司");
p1.setProjectType("可行性研究");
p1.setField("交通");
p1.setManager("刘建国");
p1.setContractAmount(Money.of(new BigDecimal("1280000.00")));
p1.setBudgetAmount(Money.of(new BigDecimal("980000.00")));
p1.setUrgency(4);
p1.setPriorityScore(88);
p1.setStage("执行");
p1.setApprovalStatus("已立项");
p1.setApprovalFlow("可行性研究立项审批流程");
p1.setProgress(62);
p1.setPlanStart("2025-03-01");
p1.setPlanEnd("2025-09-30");
p1.setCreatedDate("2025-02-15");
p1.setCreatedAt(Instant.now());
p1.setUpdatedAt(Instant.now());
CslProject saved1 = projectRepo.save(p1);
seedTimesheets(saved1.getId(), "CSL-2025-001");
}
// 项目2:项目评估 - 结项验收阶段
if (projectRepo.findAll().stream().noneMatch(p -> "CSL-2025-002".equals(p.getCode()))) {
CslProject p2 = new CslProject();
p2.setCode("CSL-2025-002");
p2.setName("凯迪新材料产业园项目评估");
p2.setClient("凯迪科技集团");
p2.setProjectType("项目评估");
p2.setField("建筑");
p2.setManager("王志远");
p2.setContractAmount(Money.of(new BigDecimal("560000.00")));
p2.setBudgetAmount(Money.of(new BigDecimal("430000.00")));
p2.setUrgency(5);
p2.setPriorityScore(92);
p2.setStage("结项验收");
p2.setApprovalStatus("已立项");
p2.setApprovalFlow("项目评估立项审批流程");
p2.setProgress(95);
p2.setPlanStart("2025-01-10");
p2.setPlanEnd("2025-06-30");
p2.setCreatedDate("2025-01-05");
p2.setCreatedAt(Instant.now());
p2.setUpdatedAt(Instant.now());
CslProject saved2 = projectRepo.save(p2);
seedTimesheets(saved2.getId(), "CSL-2025-002");
}
// 项目3:规划咨询 - 执行阶段
if (projectRepo.findAll().stream().noneMatch(p -> "CSL-2026-001".equals(p.getCode()))) {
CslProject p3 = new CslProject();
p3.setCode("CSL-2026-001");
p3.setName("某区城乡融合发展规划咨询");
p3.setClient("某区人民政府发展改革局");
p3.setProjectType("规划咨询");
p3.setField("综合");
p3.setManager("陈美华");
p3.setContractAmount(Money.of(new BigDecimal("320000.00")));
p3.setBudgetAmount(Money.of(new BigDecimal("240000.00")));
p3.setUrgency(3);
p3.setPriorityScore(75);
p3.setStage("执行");
p3.setApprovalStatus("已立项");
p3.setApprovalFlow("规划咨询立项审批流程");
p3.setProgress(35);
p3.setPlanStart("2026-01-15");
p3.setPlanEnd("2026-08-31");
p3.setCreatedDate("2026-01-10");
p3.setCreatedAt(Instant.now());
p3.setUpdatedAt(Instant.now());
CslProject saved3 = projectRepo.save(p3);
seedTimesheets(saved3.getId(), "CSL-2026-001");
}
}
private void seedTimesheets(Long projectId, String projectCode) {
// 只在该项目下没有工时时才插入
if (!timesheetRepo.findByProjectId(projectId).isEmpty()) {
return;
}
if ("CSL-2025-001".equals(projectCode)) {
// 已确认工时记录
save(projectId, "刘建国", "项目经理", "2025-04-01", 8.0, 150.0, "项目启动会及工作方案编制", "已确认");
save(projectId, "张明轩", "专业负责人", "2025-04-02", 8.0, 120.0, "交通流量调研数据收集与分析", "已确认");
save(projectId, "李晓玲", "主创", "2025-04-03", 8.0, 90.0, "线路走向初步比选方案编制", "已确认");
save(projectId, "王宇", "校审", "2025-04-10", 6.0, 110.0, "第一阶段报告校审与批注", "已确认");
save(projectId, "张明轩", "专业负责人", "2025-05-06", 8.0, 120.0, "客流预测模型建立与测算", "已确认");
save(projectId, "李晓玲", "主创", "2025-05-08", 8.0, 90.0, "投资估算初稿编制", "已确认");
// 草稿工时(近期)
save(projectId, "刘建国", "项目经理", "2025-06-10", 4.0, 150.0, "中期汇报材料准备与客户对接", "草稿");
save(projectId, "赵晨阳", "一般成员", "2025-06-11", 8.0, 70.0, "社会稳定风险评估调研", "草稿");
save(projectId, "李晓玲", "主创", "2025-06-12", 8.0, 90.0, "财务分析与经济效益测算", "草稿");
} else if ("CSL-2025-002".equals(projectCode)) {
save(projectId, "王志远", "项目经理", "2025-02-01", 8.0, 140.0, "需求调研与项目目标确认", "已确认");
save(projectId, "孙丽萍", "专业负责人", "2025-02-05", 8.0, 110.0, "市场调研与竞争态势分析", "已确认");
save(projectId, "陈刚", "主创", "2025-02-10", 8.0, 85.0, "项目技术可行性分析报告", "已确认");
save(projectId, "王志远", "项目经理", "2025-03-15", 6.0, 140.0, "中期评审协调与问题整改", "已确认");
save(projectId, "孙丽萍", "专业负责人", "2025-05-20", 8.0, 110.0, "最终报告修改与定稿", "已确认");
save(projectId, "陈刚", "主创", "2025-05-22", 8.0, 85.0, "投资估算复核与数据勘误", "已确认");
// 草稿:等待验收阶段
save(projectId, "王志远", "项目经理", "2025-06-08", 4.0, 140.0, "验收材料整理与提交", "草稿");
save(projectId, "孙丽萍", "专业负责人", "2025-06-09", 4.0, 110.0, "专家评审意见回复", "草稿");
} else if ("CSL-2026-001".equals(projectCode)) {
save(projectId, "陈美华", "项目经理", "2026-02-01", 8.0, 130.0, "现场踏勘与基础数据收集", "已确认");
save(projectId, "林海涛", "专业负责人", "2026-02-03", 8.0, 100.0, "城镇化现状分析与问题梳理", "已确认");
save(projectId, "赵雪", "主创", "2026-02-08", 8.0, 80.0, "政策法规梳理与规划依据整理", "已确认");
// 草稿
save(projectId, "陈美华", "项目经理", "2026-03-10", 6.0, 130.0, "阶段成果汇报与方向调整讨论", "草稿");
save(projectId, "林海涛", "专业负责人", "2026-03-12", 8.0, 100.0, "产业发展策略专题研究", "草稿");
}
}
private void save(Long projectId, String person, String role,
String workDate, double hours, double rate,
String workContent, String status) {
CslTimesheet t = new CslTimesheet();
t.setProjectId(projectId);
t.setPerson(person);
t.setRole(role);
t.setWorkDate(workDate);
t.setHours(hours);
BigDecimal rateBd = Money.of(rate);
t.setRate(rateBd);
t.setLaborCost(Money.of(rateBd.multiply(BigDecimal.valueOf(hours))));
t.setWorkContent(workContent);
t.setStatus(status);
t.setCreatedAt(Instant.now());
timesheetRepo.save(t);
}
}