| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- package org.dromara.crm.service.impl;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.toolkit.Wrappers;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.dromara.common.core.exception.ServiceException;
- import org.dromara.crm.domain.CrmQuote;
- import org.dromara.crm.domain.CrmQuoteApproval;
- import org.dromara.crm.domain.vo.CrmQuoteApprovalVo;
- import org.dromara.crm.mapper.CrmQuoteApprovalMapper;
- import org.dromara.crm.mapper.CrmQuoteMapper;
- import org.dromara.crm.service.ICrmQuoteApprovalService;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import java.time.LocalDateTime;
- import java.util.List;
- /**
- * 报价单审批Service实现
- *
- * @author 系统管理员
- * @date 2025-01-03
- */
- @Slf4j
- @RequiredArgsConstructor
- @Service
- public class CrmQuoteApprovalServiceImpl implements ICrmQuoteApprovalService {
- private final CrmQuoteApprovalMapper baseMapper;
- private final CrmQuoteMapper quoteMapper;
- @Override
- public List<CrmQuoteApprovalVo> queryListByQuoteId(Long quoteId) {
- // 使用关联查询获取用户昵称
- return baseMapper.selectVoListWithUserInfo(quoteId);
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public Boolean approveQuote(Long id, String approvalResult, String approvalOpinion, String remark) {
- CrmQuoteApproval entity = baseMapper.selectById(id);
- if (entity == null) {
- throw new ServiceException("审批记录不存在");
- }
- if (!"pending".equals(entity.getApprovalResult())) {
- throw new ServiceException("该审批已处理");
- }
- // 更新审批记录
- entity.setApprovalResult(approvalResult);
- entity.setApprovalOpinion(approvalOpinion);
- entity.setApprovalTime(LocalDateTime.now());
- entity.setRemark(remark);
- baseMapper.updateById(entity);
- // 更新报价单状态
- CrmQuote quote = quoteMapper.selectById(entity.getQuoteId());
- if (quote != null) {
- if ("approved".equals(approvalResult)) {
- // 检查是否所有审批都通过
- LambdaQueryWrapper<CrmQuoteApproval> lqw = Wrappers.lambdaQuery();
- lqw.eq(CrmQuoteApproval::getQuoteId, entity.getQuoteId());
- lqw.eq(CrmQuoteApproval::getApprovalResult, "pending");
- long pendingCount = baseMapper.selectCount(lqw);
- if (pendingCount == 0) {
- // 所有审批都通过,报价单状态变更为已接受
- quote.setStatus("accepted");
- quoteMapper.updateById(quote);
- }
- } else if ("rejected".equals(approvalResult)) {
- // 任一审批拒绝,报价单状态变更为已拒绝
- quote.setStatus("rejected");
- quote.setRejectReason("审批拒绝: " + approvalOpinion);
- quoteMapper.updateById(quote);
- }
- }
- return true;
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public Boolean withdrawApproval(Long quoteId, String remark) {
- CrmQuote quote = quoteMapper.selectById(quoteId);
- if (quote == null) {
- throw new ServiceException("报价单不存在");
- }
- if (!"submitted".equals(quote.getStatus())) {
- throw new ServiceException("只能撤回已提交的报价单");
- }
- // 删除所有待审批的记录
- LambdaQueryWrapper<CrmQuoteApproval> lqw = Wrappers.lambdaQuery();
- lqw.eq(CrmQuoteApproval::getQuoteId, quoteId);
- lqw.eq(CrmQuoteApproval::getApprovalResult, "pending");
- baseMapper.delete(lqw);
- // 报价单状态改为草稿
- quote.setStatus("draft");
- quote.setRemark(remark);
- quoteMapper.updateById(quote);
- return true;
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public Boolean createApprovalRecords(Long quoteId, List<Long> approverIds) {
- CrmQuote quote = quoteMapper.selectById(quoteId);
- if (quote == null) {
- throw new ServiceException("报价单不存在");
- }
- int step = 1;
- for (Long approverId : approverIds) {
- CrmQuoteApproval approval = new CrmQuoteApproval();
- approval.setQuoteId(quoteId);
- approval.setQuoteNo(quote.getQuoteNo());
- approval.setStep(step++);
- approval.setApproverId(approverId);
- // 查询审批人昵称
- String nickName = baseMapper.selectNickNameByUserId(approverId);
- if (nickName != null) {
- approval.setApproverName(nickName);
- } else {
- // 如果查询不到用户,使用默认格式
- approval.setApproverName("用户" + approverId);
- log.warn("未找到用户昵称, userId: {}", approverId);
- }
- approval.setApprovalResult("pending");
- baseMapper.insert(approval);
- }
- return true;
- }
- @Override
- public Boolean deletePendingApprovals(Long quoteId) {
- LambdaQueryWrapper<CrmQuoteApproval> lqw = Wrappers.lambdaQuery();
- lqw.eq(CrmQuoteApproval::getQuoteId, quoteId);
- lqw.eq(CrmQuoteApproval::getApprovalResult, "pending");
- int count = baseMapper.delete(lqw);
- log.info("删除待审批记录: quoteId={}, count={}", quoteId, count);
- return count >= 0;
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public Integer refreshApproverNames(Long quoteId) {
- // 构建查询条件
- LambdaQueryWrapper<CrmQuoteApproval> lqw = Wrappers.lambdaQuery();
- if (quoteId != null) {
- lqw.eq(CrmQuoteApproval::getQuoteId, quoteId);
- }
- // 只更新"审批人xxx"或"用户xxx"格式的记录
- lqw.and(wrapper -> wrapper
- .likeRight(CrmQuoteApproval::getApproverName, "审批人")
- .or()
- .likeRight(CrmQuoteApproval::getApproverName, "用户"));
- // 查询需要更新的记录
- List<CrmQuoteApproval> approvalList = baseMapper.selectList(lqw);
- if (approvalList.isEmpty()) {
- log.info("没有需要刷新的审批记录");
- return 0;
- }
- int updateCount = 0;
- for (CrmQuoteApproval approval : approvalList) {
- // 查询用户昵称
- String nickName = baseMapper.selectNickNameByUserId(approval.getApproverId());
- if (nickName != null && !nickName.equals(approval.getApproverName())) {
- approval.setApproverName(nickName);
- baseMapper.updateById(approval);
- updateCount++;
- log.info("刷新审批人姓名成功: id={}, approverId={}, newName={}",
- approval.getId(), approval.getApproverId(), nickName);
- } else {
- log.warn("未找到用户昵称或姓名相同: approvalId={}, approverId={}",
- approval.getId(), approval.getApproverId());
- }
- }
- log.info("刷新审批人姓名完成: quoteId={}, 总数={}, 成功={}", quoteId, approvalList.size(), updateCount);
- return updateCount;
- }
- @Override
- public Boolean canUserApprove(Long quoteId, Long userId) {
- if (quoteId == null || userId == null) {
- return false;
- }
- // 查询该报价单的所有审批记录(按步骤升序)
- LambdaQueryWrapper<CrmQuoteApproval> lqw = Wrappers.lambdaQuery();
- lqw.eq(CrmQuoteApproval::getQuoteId, quoteId);
- lqw.orderByAsc(CrmQuoteApproval::getStep);
- List<CrmQuoteApproval> approvalList = baseMapper.selectList(lqw);
- if (approvalList.isEmpty()) {
- return false;
- }
- // 查找当前用户的审批记录
- CrmQuoteApproval userApproval = null;
- for (CrmQuoteApproval approval : approvalList) {
- if (userId.equals(approval.getApproverId())) {
- userApproval = approval;
- break;
- }
- }
- // 如果用户不是审批人
- if (userApproval == null) {
- return false;
- }
- // 如果用户的审批记录不是待审批状态
- if (!"pending".equals(userApproval.getApprovalResult())) {
- return false;
- }
- // 关键:检查所有前置步骤是否都已完成
- for (CrmQuoteApproval approval : approvalList) {
- // 如果是用户自己的步骤,跳过
- if (approval.getStep().equals(userApproval.getStep())) {
- break;
- }
- // 如果前置步骤不是已通过状态,则不能审批
- if (!"approved".equals(approval.getApprovalResult())) {
- return false;
- }
- }
- return true;
- }
- }
|