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;
|
}
|
}
|