package com.kaidi.oa.seed; import com.kaidi.oa.common.Money; import com.kaidi.oa.domain.ArApItem; import com.kaidi.oa.domain.OrgBranch; import com.kaidi.oa.repository.ArApItemRepository; import com.kaidi.oa.repository.OrgBranchRepository; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import java.time.Instant; import java.util.ArrayList; import java.util.List; /** * 分公司财务报表演示数据种子(经营数据分析 §8 缺口补完)。 * * 审计缺口: * 1. OrgBranch 无种子数据 → /api/oa/branch-fin-statements/branches 返回空列表, * 整个分公司独立财务报表功能无法演示。 * 2. ArApItem 无种子数据 + companySubject 未设 → 现金流量表直接法用 Payment.subject * 模糊匹配作过渡;资产负债表 AR/AP 科目为零。 * * 本种子补全: * - 5 条 OrgBranch(总部 1 + 分公司 3 + 办事处 1),覆盖岳阳分公司/华东分公司/华南分公司。 * - 20 条 ArApItem(应收 12 + 应付 8),按 companySubject 与 OrgBranch.name 一致, * 使分公司维度的应收/应付/已核销/未核销在报表中实际显示。 * * 幂等:OrgBranch 存在则跳过(guard on count > 0)。 * * @Order(15) 在 DataSeeder(@Order 1) 之后独立运行。 */ @DemoSeed @Order(15) public class BranchFinDemoSeeder implements ApplicationRunner { private final OrgBranchRepository orgBranchRepo; private final ArApItemRepository arApRepo; public BranchFinDemoSeeder(OrgBranchRepository orgBranchRepo, ArApItemRepository arApRepo) { this.orgBranchRepo = orgBranchRepo; this.arApRepo = arApRepo; } @Override public void run(ApplicationArguments args) { seedOrgBranches(); seedArApItems(); } // ============================================================ // 1. OrgBranch 机构目录 // ============================================================ private void seedOrgBranches() { if (orgBranchRepo.count() > 0) { return; } List seeds = new ArrayList<>(); seeds.add(branch("HQ001", "湖南凯迪工程科技有限公司", "总部", null, "湖南长沙", "张伟", "0731-88889999", "长沙市岳麓区科技中路88号", "运营中", "凯迪集团总部,负责全国市场统筹与管理")); seeds.add(branch("YY001", "湖南凯迪工程科技有限公司岳阳分公司", "分公司", "HQ001", "湖南岳阳", "陈静", "0730-22223333", "岳阳市云溪区长炼路66号", "运营中", "负责岳阳及周边区域工程项目承接与实施")); seeds.add(branch("HD001", "凯迪(华东)工程技术有限公司", "分公司", "HQ001", "华东地区", "李明", "021-66668888", "上海市浦东新区世纪大道1368号", "运营中", "负责华东区(沪苏浙皖闽赣)市场开拓与项目执行")); seeds.add(branch("HN001", "凯迪(华南)工程服务有限公司", "分公司", "HQ001", "华南地区", "赵云", "020-33337777", "广州市天河区珠江新城华夏路1号", "运营中", "负责华南区(粤桂琼)市场开拓与EPC工程管理")); seeds.add(branch("CS001", "凯迪长沙办公室", "办事处", "HQ001", "湖南长沙", "王芳", "0731-55556666", "长沙市雨花区劳动中路158号", "运营中", "长沙本地业务联络与客户服务办事处")); orgBranchRepo.saveAll(seeds); } private OrgBranch branch(String code, String name, String type, String parentCode, String region, String manager, String phone, String address, String status, String remark) { OrgBranch b = new OrgBranch(); b.setCode(code); b.setName(name); b.setType(type); b.setParentCode(parentCode); b.setRegion(region); b.setManager(manager); b.setPhone(phone); b.setAddress(address); b.setStatus(status); b.setRemark(remark); b.setCreatedAt(Instant.now()); return b; } // ============================================================ // 2. ArApItem 应收/应付 演示数据(含 companySubject 精准关联分公司) // ============================================================ private void seedArApItems() { if (arApRepo.count() > 0) { return; } List seeds = new ArrayList<>(); // --- 岳阳分公司 应收账款 --- seeds.add(arApItem("AR-YY-2026-001", "应收", "岳阳市政工程集团有限公司", "HT-YY-2026-001", "湖南凯迪工程科技有限公司岳阳分公司", "3800000.00", "2280000.00", "1520000.00", "部分核销", "2026-09-30")); seeds.add(arApItem("AR-YY-2026-002", "应收", "岳阳县水务局", "HT-YY-2026-002", "湖南凯迪工程科技有限公司岳阳分公司", "1650000.00", "990000.00", "660000.00", "部分核销", "2026-08-31")); seeds.add(arApItem("AR-YY-2026-003", "应收", "湖南云溪工业园管委会", "HT-YY-2026-003", "湖南凯迪工程科技有限公司岳阳分公司", "920000.00", "0.00", "920000.00", "未核销", "2026-12-31")); seeds.add(arApItem("AR-YY-2026-004", "应收", "岳阳华能电厂", "HT-YY-2026-004", "湖南凯迪工程科技有限公司岳阳分公司", "560000.00", "560000.00", "0.00", "已结清", "2026-06-30")); // --- 岳阳分公司 应付账款 --- seeds.add(arApItem("AP-YY-2026-001", "应付", "岳阳通达设备租赁有限公司", "HT-YY-2026-AP01", "湖南凯迪工程科技有限公司岳阳分公司", "386000.00", "193000.00", "193000.00", "部分核销", "2026-07-31")); seeds.add(arApItem("AP-YY-2026-002", "应付", "长沙华信网络科技有限公司", "HT-YY-2026-AP02", "湖南凯迪工程科技有限公司岳阳分公司", "128000.00", "0.00", "128000.00", "未核销", "2026-09-30")); // --- 华东分公司 应收账款 --- seeds.add(arApItem("AR-HD-2026-001", "应收", "上海浦东建设集团有限公司", "HT-HD-2026-001", "凯迪(华东)工程技术有限公司", "5200000.00", "3120000.00", "2080000.00", "部分核销", "2026-10-31")); seeds.add(arApItem("AR-HD-2026-002", "应收", "江苏南京城市基建有限公司", "HT-HD-2026-002", "凯迪(华东)工程技术有限公司", "3100000.00", "1860000.00", "1240000.00", "部分核销", "2026-09-30")); seeds.add(arApItem("AR-HD-2026-003", "应收", "浙江绍兴市污水处理有限公司", "HT-HD-2026-003", "凯迪(华东)工程技术有限公司", "1880000.00", "1128000.00", "752000.00", "部分核销", "2026-11-30")); seeds.add(arApItem("AR-HD-2026-004", "应收", "安徽合肥市水务集团", "HT-HD-2026-004", "凯迪(华东)工程技术有限公司", "2650000.00", "0.00", "2650000.00", "未核销", "2026-12-31")); // --- 华东分公司 应付账款 --- seeds.add(arApItem("AP-HD-2026-001", "应付", "上海华申建材有限公司", "HT-HD-2026-AP01", "凯迪(华东)工程技术有限公司", "680000.00", "340000.00", "340000.00", "部分核销", "2026-08-31")); seeds.add(arApItem("AP-HD-2026-002", "应付", "南京精工机械设备有限公司", "HT-HD-2026-AP02", "凯迪(华东)工程技术有限公司", "420000.00", "0.00", "420000.00", "未核销", "2026-10-31")); seeds.add(arApItem("AP-HD-2026-003", "应付", "苏州翔宇临时用工服务有限公司", "HT-HD-2026-AP03", "凯迪(华东)工程技术有限公司", "185000.00", "92500.00", "92500.00", "部分核销", "2026-09-15")); // --- 华南分公司 应收账款 --- seeds.add(arApItem("AR-HN-2026-001", "应收", "广州市城市建设开发有限公司", "HT-HN-2026-001", "凯迪(华南)工程服务有限公司", "4800000.00", "2400000.00", "2400000.00", "部分核销", "2026-11-30")); seeds.add(arApItem("AR-HN-2026-002", "应收", "深圳市水务集团有限公司", "HT-HN-2026-002", "凯迪(华南)工程服务有限公司", "3200000.00", "3200000.00", "0.00", "已结清", "2026-06-30")); seeds.add(arApItem("AR-HN-2026-003", "应收", "广西南宁城投集团有限公司", "HT-HN-2026-003", "凯迪(华南)工程服务有限公司", "1960000.00", "980000.00", "980000.00", "部分核销", "2026-10-31")); seeds.add(arApItem("AR-HN-2026-004", "应收", "海南省生态环境工程有限公司", "HT-HN-2026-004", "凯迪(华南)工程服务有限公司", "1100000.00", "0.00", "1100000.00", "未核销", "2027-03-31")); // --- 华南分公司 应付账款 --- seeds.add(arApItem("AP-HN-2026-001", "应付", "广州宏基建材有限公司", "HT-HN-2026-AP01", "凯迪(华南)工程服务有限公司", "540000.00", "270000.00", "270000.00", "部分核销", "2026-09-30")); seeds.add(arApItem("AP-HN-2026-002", "应付", "深圳福田劳务派遣有限公司", "HT-HN-2026-AP02", "凯迪(华南)工程服务有限公司", "168000.00", "84000.00", "84000.00", "部分核销", "2026-08-31")); // --- 总部 应收账款 --- seeds.add(arApItem("AR-HQ-2026-001", "应收", "靖州供水项目业主方", "HT-HQ-2026-001", "湖南凯迪工程科技有限公司", "8600000.00", "5160000.00", "3440000.00", "部分核销", "2026-12-31")); arApRepo.saveAll(seeds); } private ArApItem arApItem(String code, String arApType, String partyName, String relatedRef, String companySubject, String amount, String writtenOff, String unwrittenOff, String status, String dueDate) { ArApItem a = new ArApItem(); a.setCode(code); a.setArApType(arApType); a.setPartyName(partyName); a.setRelatedRef(relatedRef); a.setCompanySubject(companySubject); a.setAmount(Money.of(Double.parseDouble(amount))); a.setWrittenOff(Money.of(Double.parseDouble(writtenOff))); a.setUnwrittenOff(Money.of(Double.parseDouble(unwrittenOff))); a.setStatus(status); a.setDueDate(dueDate); a.setCreatedAt(Instant.now()); return a; } }