package com.kaidi.oa.seed; import com.kaidi.oa.common.Money; import com.kaidi.oa.domain.BidDocVersion; import com.kaidi.oa.domain.BidTenderDoc; import com.kaidi.oa.repository.BidDocVersionRepository; import com.kaidi.oa.repository.BidRepository; import com.kaidi.oa.repository.BidTenderDocRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import java.time.Instant; import java.time.LocalDate; /** * 招标文件台账 + 投标文件协同编制版本演示数据。 * * @Order(215) 在所有主数据 Seeder 之后运行;幂等(count > 0 则跳过)。 */ @DemoSeed @Order(215) public class BidTenderDocSeeder implements CommandLineRunner { private final BidTenderDocRepository tenderDocRepo; private final BidDocVersionRepository docVersionRepo; private final BidRepository bidRepo; public BidTenderDocSeeder(BidTenderDocRepository tenderDocRepo, BidDocVersionRepository docVersionRepo, BidRepository bidRepo) { this.tenderDocRepo = tenderDocRepo; this.docVersionRepo = docVersionRepo; this.bidRepo = bidRepo; } @Override public void run(String... args) { if (tenderDocRepo.count() > 0) return; // 幂等 // 取前两个投标 id(若存在) var bids = bidRepo.findAll(); long bid1 = bids.isEmpty() ? 1L : bids.get(0).getId(); long bid2 = bids.size() > 1 ? bids.get(1).getId() : bid1; Instant now = Instant.now(); LocalDate today = LocalDate.now(); // ====== 招标文件台账演示数据 ====== // bid1 — 招标文件(已下载,已付标书费) BidTenderDoc d1 = new BidTenderDoc(); d1.setBidId(bid1); d1.setDocType("招标文件"); d1.setDocTitle("长沙市污水处理厂扩容工程招标文件(第一册)"); d1.setFileRef("files/bid-tender/招标文件_污水厂扩容_v1.pdf"); d1.setDownloadDate(today.minusDays(20).toString()); d1.setPurchaseFee(Money.of(500.00)); d1.setFeePaidStatus("已付"); d1.setDeadlineDate(today.plusDays(5).toString()); d1.setStatus("已下载"); d1.setBondAmount(Money.of(50000.00)); d1.setBondPayMethod("银行转账"); d1.setBondStatus("已缴"); d1.setOwner("陈志远"); d1.setCreatedAt(now); tenderDocRepo.save(d1); // bid1 — 澄清文件 BidTenderDoc d2 = new BidTenderDoc(); d2.setBidId(bid1); d2.setDocType("澄清文件"); d2.setDocTitle("长沙市污水处理厂扩容工程招标澄清函(第1号)"); d2.setFileRef("files/bid-tender/澄清函_污水厂扩容_01.pdf"); d2.setDownloadDate(today.minusDays(10).toString()); d2.setPurchaseFee(Money.ZERO); d2.setFeePaidStatus("已付"); d2.setDeadlineDate(today.plusDays(5).toString()); d2.setStatus("已下载"); d2.setBondAmount(Money.ZERO); d2.setBondStatus("未缴"); d2.setOwner("陈志远"); d2.setCreatedAt(now); tenderDocRepo.save(d2); // bid1 — 答疑文件 BidTenderDoc d3 = new BidTenderDoc(); d3.setBidId(bid1); d3.setDocType("答疑文件"); d3.setDocTitle("长沙市污水处理厂扩容工程投标答疑(汇总版)"); d3.setFileRef("files/bid-tender/答疑_污水厂扩容_汇总.pdf"); d3.setDownloadDate(today.minusDays(7).toString()); d3.setPurchaseFee(Money.ZERO); d3.setFeePaidStatus("已付"); d3.setDeadlineDate(today.plusDays(5).toString()); d3.setStatus("已下载"); d3.setBondAmount(Money.ZERO); d3.setBondStatus("未缴"); d3.setRemark("答疑共 12 条,涉及工艺方案和报价清单调整"); d3.setOwner("陈志远"); d3.setCreatedAt(now); tenderDocRepo.save(d3); // bid2 — 招标文件(未付标书费,保证金逾期未退) BidTenderDoc d4 = new BidTenderDoc(); d4.setBidId(bid2); d4.setDocType("招标文件"); d4.setDocTitle("株洲市道路改造工程招标文件"); d4.setFileRef("files/bid-tender/招标文件_株洲道路_v1.pdf"); d4.setDownloadDate(today.minusDays(65).toString()); d4.setPurchaseFee(Money.of(300.00)); d4.setFeePaidStatus("未付"); d4.setDeadlineDate(today.minusDays(30).toString()); // 已过期 d4.setStatus("已下载"); d4.setBondAmount(Money.of(30000.00)); d4.setBondPayMethod("保险保函"); d4.setBondStatus("已缴"); // 逾期未退,催办 d4.setRemark("未中标,保证金应已退回但未确认,请催办"); d4.setOwner("刘伟"); d4.setCreatedAt(now.minusSeconds(3600 * 24 * 65)); tenderDocRepo.save(d4); // bid2 — 补充文件(截止日临近预警演示) BidTenderDoc d5 = new BidTenderDoc(); d5.setBidId(bid2); d5.setDocType("补充文件"); d5.setDocTitle("株洲市道路改造工程补充技术要求"); d5.setFileRef("files/bid-tender/补充要求_株洲道路.pdf"); d5.setDownloadDate(today.minusDays(3).toString()); d5.setPurchaseFee(Money.ZERO); d5.setFeePaidStatus("已付"); d5.setDeadlineDate(today.plusDays(2).toString()); // 紧急 — 2天内到期 d5.setStatus("待处理"); d5.setBondAmount(Money.ZERO); d5.setBondStatus("未缴"); d5.setOwner("刘伟"); d5.setCreatedAt(now); tenderDocRepo.save(d5); // ====== 投标文件版本协同演示数据 ====== if (docVersionRepo.count() > 0) return; // bid1 商务标 — v1 草稿 → v2 审核中 BidDocVersion v1 = new BidDocVersion(); v1.setBidId(bid1); v1.setDocPart("商务标"); v1.setVersion("v1"); v1.setDocTitle("污水厂扩容工程商务标(初稿)"); v1.setFileRef("files/bid-doc/商务标_污水厂_v1.docx"); v1.setCollaborators("陈志远,李明"); v1.setSubmitter("陈志远"); v1.setStatus("已驳回"); v1.setReviewComment("报价清单有误,需根据答疑调整综合单价"); v1.setAnnotations("[李明 @ " + today.minusDays(12) + "] 第3章综合单价表需重算\n[陈志远 @ " + today.minusDays(11) + "] 已核,修订后提交v2"); v1.setSubmittedAt(now.minusSeconds(3600 * 24 * 12)); v1.setCreatedAt(now.minusSeconds(3600 * 24 * 14)); docVersionRepo.save(v1); BidDocVersion v2 = new BidDocVersion(); v2.setBidId(bid1); v2.setDocPart("商务标"); v2.setVersion("v2"); v2.setDocTitle("污水厂扩容工程商务标(修订版)"); v2.setFileRef("files/bid-doc/商务标_污水厂_v2.docx"); v2.setCollaborators("陈志远,李明,张华"); v2.setSubmitter("陈志远"); v2.setStatus("审核中"); v2.setAnnotations("[张华 @ " + today.minusDays(5) + "] 综合单价已按答疑调整,请财务复核"); v2.setSubmittedAt(now.minusSeconds(3600 * 24 * 5)); v2.setCreatedAt(now.minusSeconds(3600 * 24 * 7)); docVersionRepo.save(v2); // bid1 技术标 — v1 已定稿 BidDocVersion v3 = new BidDocVersion(); v3.setBidId(bid1); v3.setDocPart("技术标"); v3.setVersion("v1"); v3.setDocTitle("污水厂扩容工程技术标(定稿)"); v3.setFileRef("files/bid-doc/技术标_污水厂_v1_final.docx"); v3.setCollaborators("王涛,赵雪"); v3.setSubmitter("王涛"); v3.setStatus("已定稿"); v3.setReviewComment("技术方案完整,已通过合规审核"); v3.setAnnotations("[赵雪 @ " + today.minusDays(8) + "] 施工方案第4节水处理工艺描述更新\n[王涛 @ " + today.minusDays(7) + "] 全文定稿确认"); v3.setSubmittedAt(now.minusSeconds(3600 * 24 * 8)); v3.setFinalizedAt(now.minusSeconds(3600 * 24 * 7)); v3.setCreatedAt(now.minusSeconds(3600 * 24 * 10)); docVersionRepo.save(v3); // bid1 报价单 — v1 草稿 BidDocVersion v4 = new BidDocVersion(); v4.setBidId(bid1); v4.setDocPart("报价单"); v4.setVersion("v1"); v4.setDocTitle("污水厂扩容工程报价单(草稿)"); v4.setFileRef("files/bid-doc/报价单_污水厂_v1.xlsx"); v4.setCollaborators("李明,周斌"); v4.setSubmitter("李明"); v4.setStatus("草稿"); v4.setAnnotations("[周斌 @ " + today.minusDays(3) + "] 材料单价已更新至2026年5月指导价"); v4.setSubmittedAt(now.minusSeconds(3600 * 24 * 3)); v4.setCreatedAt(now.minusSeconds(3600 * 24 * 4)); docVersionRepo.save(v4); } }