package com.kaidi.oa.web;
import com.kaidi.oa.common.ApiException;
import com.kaidi.oa.common.ApiResp;
import com.kaidi.oa.common.NotFoundException;
import com.kaidi.oa.domain.AutomationLog;
import com.kaidi.oa.domain.Contract;
import com.kaidi.oa.domain.CrmContractApprovalStep;
import com.kaidi.oa.domain.ContractMilestone;
import com.kaidi.oa.common.Money;
import com.kaidi.oa.repository.AutomationLogRepository;
import com.kaidi.oa.repository.ContractRepository;
import com.kaidi.oa.repository.CrmContractApprovalStepRepository;
import com.kaidi.oa.repository.ContractMilestoneRepository;
import org.springframework.transaction.annotation.Transactional;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 经营合同多节点审批链(市场部·经营合同管理)。
*
* 直接闭合审计缺口:「经营合同原生挂WorkflowService多节点审批链
* (经营部→法务→财务→分管→总经理);里程碑按应付款/应开票日自动提醒;
* 合同签订自动推送资料室归档联动」。
*
* 审批链节点:
* 0: 经营部确认(businessDept)
* 1: 法务审核(legal)
* 2: 财务审核(finance)
* 3: 分管领导审批(deputyGM)
* 4: 总经理审批(CEO)
*
* 全部节点审批通过 → Contract.status 自动变「履约中」并推动资料室归档联动。
* 任一节点退回 → Contract.status 变「已退回」(草稿重新编辑后可重新发起)。
*/
@RestController
@RequestMapping("/api/oa/crm-contract-approvals")
public class CrmContractApprovalController {
/** 标准审批链节点定义(顺序严格执行)。 */
private static final List APPROVAL_CHAIN = List.of(
new String[]{"经营部确认", "经营部"},
new String[]{"法务审核", "法务部"},
new String[]{"财务审核", "财务部"},
new String[]{"分管领导审批", "分管领导"},
new String[]{"总经理审批", "总经理"});
private final ContractRepository contractRepo;
private final CrmContractApprovalStepRepository stepRepo;
private final ContractMilestoneRepository milestoneRepo;
private final AutomationLogRepository automationLogRepo;
public CrmContractApprovalController(ContractRepository contractRepo,
CrmContractApprovalStepRepository stepRepo,
ContractMilestoneRepository milestoneRepo,
AutomationLogRepository automationLogRepo) {
this.contractRepo = contractRepo;
this.stepRepo = stepRepo;
this.milestoneRepo = milestoneRepo;
this.automationLogRepo = automationLogRepo;
}
/** GET / -> 查所有审批流记录(含已完成、退回),按合同 id 过滤。 */
@GetMapping
public ApiResp> list(@RequestParam(required = false) Long contractId) {
if (contractId != null) return ApiResp.ok(stepRepo.findByContractIdOrderByStepIndex(contractId));
return ApiResp.ok(stepRepo.findAll());
}
/** GET /status/{contractId} -> 查某合同当前审批进度(当前节点 + 链全景)。 */
@GetMapping("/status/{contractId}")
public ApiResp