package com.webmanage.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.webmanage.common.BusinessException; import com.webmanage.common.PageResult; import com.webmanage.dto.ApprovalActionDTO; import com.webmanage.dto.ApprovalQueryDTO; import com.webmanage.entity.ApprovalRecord; import com.webmanage.entity.OrderInfo; import com.webmanage.mapper.ApprovalRecordMapper; import com.webmanage.mapper.OrderInfoMapper; import com.webmanage.service.ApprovalRecordService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; /** * 审批记录Service实现类 */ @Slf4j @Service public class ApprovalRecordServiceImpl extends ServiceImpl implements ApprovalRecordService { @Resource private OrderInfoMapper orderInfoMapper; @Override public PageResult getApprovalRecordPage(ApprovalQueryDTO queryDTO) { Page page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize()); IPage result = baseMapper.selectApprovalRecordPage( page, queryDTO.getOrderId(), queryDTO.getProductName(), queryDTO.getProviderName(), queryDTO.getApproverId(), queryDTO.getApprovalResult(), queryDTO.getApprovalStep(), queryDTO.getNeedAuthorization(), queryDTO.getApplyTimeStart() != null ? queryDTO.getApplyTimeStart().toString() : null, queryDTO.getApplyTimeEnd() != null ? queryDTO.getApplyTimeEnd().toString() : null, queryDTO.getApprovalTimeStart() != null ? queryDTO.getApprovalTimeStart().toString() : null, queryDTO.getApprovalTimeEnd() != null ? queryDTO.getApprovalTimeEnd().toString() : null, queryDTO.getOrderBy(), queryDTO.getOrderDirection() ); return new PageResult( result.getRecords(), result.getTotal(), queryDTO.getPageNum().longValue(), queryDTO.getPageSize().longValue(), result.getPages() ); } @Override public PageResult getPendingApprovalPage(ApprovalQueryDTO queryDTO) { Page page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize()); IPage result = baseMapper.selectPendingApprovalPage( page, queryDTO.getOrderId(), queryDTO.getProductName(), queryDTO.getProviderName(), queryDTO.getApprovalStep(), queryDTO.getOrderBy(), queryDTO.getOrderDirection() ); return new PageResult( result.getRecords(), result.getTotal(), queryDTO.getPageNum().longValue(), queryDTO.getPageSize().longValue(), result.getPages() ); } @Override public List getApprovalRecordsByOrderId(String orderId) { if (!StringUtils.hasText(orderId)) { throw new BusinessException("订单ID不能为空"); } return baseMapper.selectByOrderId(orderId); } @Override @Transactional(rollbackFor = Exception.class) public boolean approveOrder(ApprovalActionDTO actionDTO) { // 验证订单是否存在 OrderInfo orderInfo = orderInfoMapper.selectById(actionDTO.getOrderId()); if (orderInfo == null) { throw new BusinessException("订单不存在"); } // 创建审批记录 ApprovalRecord approvalRecord = new ApprovalRecord(); approvalRecord.setOrderId(actionDTO.getOrderId()); approvalRecord.setApproverId(actionDTO.getApproverId()); approvalRecord.setApproverName(actionDTO.getApproverName()); approvalRecord.setApproverRole(actionDTO.getApproverRole()); approvalRecord.setApprovalStep(actionDTO.getApprovalStep()); approvalRecord.setApprovalResult(actionDTO.getApprovalResult()); approvalRecord.setApprovalOpinion(actionDTO.getApprovalOpinion()); approvalRecord.setApprovalTime(LocalDateTime.now()); approvalRecord.setNeedAuthorization(actionDTO.getNeedAuthorization()); // 如果需要授权,设置授权人信息 if (Boolean.TRUE.equals(actionDTO.getNeedAuthorization()) && actionDTO.getAuthorizerId() != null) { approvalRecord.setAuthorizerId(actionDTO.getAuthorizerId()); approvalRecord.setAuthorizerName(actionDTO.getAuthorizerName()); approvalRecord.setAuthorizationOpinion(actionDTO.getAuthorizationOpinion()); approvalRecord.setAuthorizationTime(LocalDateTime.now()); } // 保存审批记录 boolean saved = save(approvalRecord); if (!saved) { throw new BusinessException("保存审批记录失败"); } // 更新订单状态 if ("通过".equals(actionDTO.getApprovalResult())) { orderInfo.setOrderStatus("已审批"); orderInfo.setCurrentStep(actionDTO.getApprovalStep()); } else if ("驳回".equals(actionDTO.getApprovalResult())) { orderInfo.setOrderStatus("已驳回"); } int updated = orderInfoMapper.updateById(orderInfo); if (updated <= 0) { throw new BusinessException("更新订单状态失败"); } return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean authorizeApproval(Long approvalId, Long authorizerId, String authorizerName, String authorizationOpinion) { ApprovalRecord approvalRecord = getById(approvalId); if (approvalRecord == null) { throw new BusinessException("审批记录不存在"); } if (!Boolean.TRUE.equals(approvalRecord.getNeedAuthorization())) { throw new BusinessException("该审批记录不需要授权"); } approvalRecord.setAuthorizerId(authorizerId); approvalRecord.setAuthorizerName(authorizerName); approvalRecord.setAuthorizationOpinion(authorizationOpinion); approvalRecord.setAuthorizationTime(LocalDateTime.now()); return updateById(approvalRecord); } @Override public String getOrderCurrentApprovalStatus(String orderId) { if (!StringUtils.hasText(orderId)) { return "未知"; } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("order_id", orderId) .orderByDesc("created_at") .last("LIMIT 1"); ApprovalRecord latestRecord = getOne(wrapper); if (latestRecord == null) { return "待审批"; } return latestRecord.getApprovalResult(); } }