zhangwencui
2026-10-29 b2f8320707dc72b2429bfb4fe0b317c11b1e5b7f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.ruoyi.sales.service;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.enums.PlanStageEnum;
import com.ruoyi.common.enums.ReviewStatusEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.projectManagement.dto.PlanStageDto;
import com.ruoyi.projectManagement.mapper.InfoMapper;
import com.ruoyi.projectManagement.mapper.PlanMapper;
import com.ruoyi.projectManagement.mapper.PlanNodeMapper;
import com.ruoyi.projectManagement.pojo.Info;
import com.ruoyi.projectManagement.pojo.Plan;
import com.ruoyi.projectManagement.pojo.PlanNode;
import com.ruoyi.sales.dto.BusinessReviewDto;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
 
@Service
@RequiredArgsConstructor
public class BusinessApprovalService {
    private final SalesLedgerMapper salesLedgerMapper;
    private final InfoMapper infoMapper;
    private final PlanMapper planMapper;
    private final PlanNodeMapper planNodeMapper;
 
    @Transactional(rollbackFor = Exception.class)
    public void submit(Long id) {
        SalesLedger ledger = requireLedger(id);
        Integer status = ledger.getBusinessApprovalStatus();
        if (status != null && status == 2) {
            throw new ServiceException("该业务已经审批通过");
        }
        ledger.setBusinessApprovalStatus(1);
        ledger.setBusinessApprovalRemark(null);
        ledger.setBusinessSubmittedTime(LocalDateTime.now());
        salesLedgerMapper.updateById(ledger);
    }
 
    @Transactional(rollbackFor = Exception.class)
    public Long review(BusinessReviewDto dto) {
        if (dto.getSalesLedgerId() == null || dto.getApproved() == null) {
            throw new ServiceException("审批参数不完整");
        }
        SalesLedger ledger = requireLedger(dto.getSalesLedgerId());
        if (ledger.getBusinessApprovalStatus() == null || ledger.getBusinessApprovalStatus() != 1) {
            throw new ServiceException("只有待审批业务可以审核");
        }
        ledger.setBusinessApprovedBy(SecurityUtils.getUserId());
        ledger.setBusinessApprovedName(SecurityUtils.getLoginUser().getNickName());
        ledger.setBusinessApprovedTime(LocalDateTime.now());
        ledger.setBusinessApprovalRemark(dto.getRemark());
        if (!dto.getApproved()) {
            ledger.setBusinessApprovalStatus(3);
            salesLedgerMapper.updateById(ledger);
            return null;
        }
        Long projectId = ledger.getProjectManagementInfoId();
        if (projectId == null) {
            projectId = createProject(ledger, dto.getPlanId());
            ledger.setProjectManagementInfoId(projectId);
        }
        ledger.setBusinessApprovalStatus(2);
        salesLedgerMapper.updateById(ledger);
        return projectId;
    }
 
    private Long createProject(SalesLedger ledger, Long selectedPlanId) {
        Plan plan = selectedPlanId == null ? planMapper.selectOne(new LambdaQueryWrapper<Plan>()
                .eq(Plan::getName, "项目申报六阶段")
                .eq(Plan::getIsDelete, 0).last("limit 1")) : planMapper.selectById(selectedPlanId);
        if (plan == null) {
            throw new ServiceException("未找到“项目申报六阶段”计划,请先执行升级SQL");
        }
        List<PlanNode> nodes = planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
                .eq(PlanNode::getProjectManagementPlanId, plan.getId())
                .eq(PlanNode::getIsDelete, 0).orderByAsc(PlanNode::getSort));
        if (nodes.isEmpty()) {
            throw new ServiceException("项目六阶段尚未配置");
        }
        Info info = new Info();
        info.setNo("XM" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE)
                + String.format("%06d", ledger.getId()));
        info.setTitle(ledger.getProjectName() == null || ledger.getProjectName().isBlank()
                ? ledger.getCustomerName() + "申报项目" : ledger.getProjectName());
        info.setClientId(ledger.getCustomerId());
        info.setClientName(ledger.getCustomerName());
        info.setEstablishTime(LocalDate.now());
        info.setProjectManagementPlanId(plan.getId());
        info.setSource("业务审批");
        info.setManagerId(SecurityUtils.getUserId());
        info.setManagerName(SecurityUtils.getLoginUser().getNickName());
        info.setSalesmanName(ledger.getSalesman());
        info.setIsDelete(0);
        info.setPlanStartTime(LocalDate.now());
        info.setReviewStatus(ReviewStatusEnum.APPROVED.getCode());
        info.setStatus(PlanStageEnum.TO_BEGIN.getCode());
        info.setOrderDate(ledger.getExecutionDate());
        info.setOrderAmount(ledger.getContractAmount() == null ? null : ledger.getContractAmount().toPlainString());
        info.setRemark(ledger.getRemarks());
        info.setAttachment(ledger.getAttachmentMaterials());
        info.setDeptId(ledger.getDeptId());
        info.setPlanStage(nodes.stream().map(node -> new PlanStageDto(node.getId(), node.getName(),
                PlanStageEnum.TO_BEGIN, node.getSort(), node.getEstimatedDuration())).toList());
        infoMapper.insert(info);
        return info.getId();
    }
 
    private SalesLedger requireLedger(Long id) {
        SalesLedger ledger = salesLedgerMapper.selectById(id);
        if (ledger == null) {
            throw new ServiceException("业务记录不存在");
        }
        return ledger;
    }
}