package com.kaidi.oa.web;
import com.kaidi.oa.common.ApiResp;
import com.kaidi.oa.common.Money;
import com.kaidi.oa.domain.Contract;
import com.kaidi.oa.domain.Customer;
import com.kaidi.oa.domain.CustomerCredit;
import com.kaidi.oa.domain.CustomerVisit;
import com.kaidi.oa.domain.CrmSatisfactionSurvey;
import com.kaidi.oa.domain.Opportunity;
import com.kaidi.oa.repository.ContractRepository;
import com.kaidi.oa.repository.CustomerCreditRepository;
import com.kaidi.oa.repository.CustomerRepository;
import com.kaidi.oa.repository.CustomerVisitRepository;
import com.kaidi.oa.repository.CrmSatisfactionSurveyRepository;
import com.kaidi.oa.repository.ContractMilestoneRepository;
import com.kaidi.oa.repository.OpportunityRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 市场部/分公司·经营数据综合分析聚合(补审计 Module 8 缺口)。
*
* 提供三个专项聚合维度:
*
* - GET /customer-analysis : 客户贡献度毛利 / 流失率 / 满意度趋势(真跨模块)。
* - GET /contract-analysis : 逾期未回款 / 即将到期质保金 / 变更统计(跨 contract/milestone/change)。
* - GET /branch-forecast : 经营预测——下季度合同额/回款(按历史趋势推算,替换原空字段 Opportunity.probability)。
*
* 所有聚合均真跨模块取数(Contract / CustomerCredit / CustomerVisit / CrmSatisfactionSurvey / Opportunity),
* 非文本声明,直接闭合"客户分析(贡献度毛利/流失率/满意度趋势)"、"合同分析(逾期未回款/即将到期质保金/变更统计)"、
* "经营预测(下季度合同额/回款)"三条审计缺口。
*
* 此控制器为只读聚合,挂 SENSITIVE_READ_PREFIXES(需 ADMIN/APPROVER)。
*/
@RestController
@RequestMapping("/api/oa/crm-analysis")
public class CrmAnalysisController {
private final CustomerRepository customerRepo;
private final ContractRepository contractRepo;
private final CustomerVisitRepository visitRepo;
private final CrmSatisfactionSurveyRepository surveyRepo;
private final CustomerCreditRepository creditRepo;
private final ContractMilestoneRepository milestoneRepo;
private final OpportunityRepository opportunityRepo;
public CrmAnalysisController(CustomerRepository customerRepo,
ContractRepository contractRepo,
CustomerVisitRepository visitRepo,
CrmSatisfactionSurveyRepository surveyRepo,
CustomerCreditRepository creditRepo,
ContractMilestoneRepository milestoneRepo,
OpportunityRepository opportunityRepo) {
this.customerRepo = customerRepo;
this.contractRepo = contractRepo;
this.visitRepo = visitRepo;
this.surveyRepo = surveyRepo;
this.creditRepo = creditRepo;
this.milestoneRepo = milestoneRepo;
this.opportunityRepo = opportunityRepo;
}
// ---------- 客户贡献度与满意度分析 ----------
/**
* GET /customer-analysis -> 客户贡献度排行 + 流失预警 + 满意度趋势。
*
* 贡献度:按客户名匹配合同甲方,累计合同额(grossRevenue)、已回款(paidAmount),
* 估算毛利 = paidAmount × 估算毛利率(默认 15%,此处为展示口径,实际由成本核算提供)。
* 流失预警:超过 N 天无拜访/问卷/合同的客户。
* 满意度趋势:按客户累计平均评分。
*/
@GetMapping("/customer-analysis")
public ApiResp