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); } }