package com.kaidi.oa.web;
import com.kaidi.oa.common.ApiException;
import com.kaidi.oa.common.ApiResp;
import com.kaidi.oa.common.Money;
import com.kaidi.oa.common.NotFoundException;
import com.kaidi.oa.domain.Bid;
import com.kaidi.oa.domain.CrmBidQuoteDetail;
import com.kaidi.oa.repository.BidRepository;
import com.kaidi.oa.repository.CrmBidQuoteDetailRepository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 投标报价明细(Module 3 缺口:bidAmount 单字段→拆线报价明细表)。
*
* 每笔投标(Bid)可维护多条报价明细(直接费/间接费/利润/税金),
* 支持多报价策略(低价/合理价/高价),并聚合汇总端点。
* 同时新建「投标文件-CollabDoc 联动」聚合端点(bidId外键联查)。
*
* GET /crm-bid-quote-details/by-bid/{bidId} -> 某投标的报价明细列表
* GET /crm-bid-quote-details/summary/{bidId} -> 报价汇总
* POST /crm-bid-quote-details -> 新建报价明细行
* PUT /crm-bid-quote-details/{id} -> 更新报价明细行
* DELETE /crm-bid-quote-details/{id} -> 删除报价明细行
*/
@RestController
@RequestMapping("/api/oa/crm-bid-quote-details")
public class CrmBidQuoteDetailController {
private static final List VALID_CATEGORIES = List.of("直接费", "间接费", "利润", "税金", "其他");
private static final List VALID_STRATEGIES = List.of("低价策略", "合理价策略", "高价策略");
private final CrmBidQuoteDetailRepository quoteRepo;
private final BidRepository bidRepo;
public CrmBidQuoteDetailController(CrmBidQuoteDetailRepository quoteRepo,
BidRepository bidRepo) {
this.quoteRepo = quoteRepo;
this.bidRepo = bidRepo;
}
@GetMapping("/by-bid/{bidId}")
public ApiResp> listByBid(@PathVariable Long bidId) {
bidRepo.findById(bidId).orElseThrow(() -> new NotFoundException("投标项目不存在:" + bidId));
return ApiResp.ok(quoteRepo.findByBidId(bidId));
}
/**
* GET /summary/{bidId} -> 按类别汇总报价金额 + 占比 + 合计。
*/
@GetMapping("/summary/{bidId}")
public ApiResp