package com.sinata.appointment.service; import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.sinata.appointment.constants.ApprovalInstanceStatus; import com.sinata.appointment.constants.ApprovalTaskStatus; import com.sinata.appointment.constants.BizErrorCode; import com.sinata.appointment.dto.ApprovalActionRequest; import com.sinata.appointment.entity.AppointmentOrder; import com.sinata.appointment.entity.ApprovalInstance; import com.sinata.appointment.entity.ApprovalTask; import com.sinata.appointment.exception.BizException; import com.sinata.appointment.mapper.AppointmentOrderMapper; import com.sinata.appointment.mapper.ApprovalInstanceMapper; import com.sinata.appointment.mapper.ApprovalTaskMapper; import com.sinata.appointment.util.UuidAssert; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class ApprovalApplicationService { private final ApprovalTaskMapper approvalTaskMapper; private final ApprovalInstanceMapper approvalInstanceMapper; private final AppointmentOrderMapper appointmentOrderMapper; private final ApprovalEngineService approvalEngineService; private final PostApprovalOrchestrationService postApprovalOrchestrationService; public IPage pageMyTodo(long page, long size) { Long uid = StpUtil.getLoginIdAsLong(); return approvalTaskMapper.selectPage( new Page<>(page, size), new LambdaQueryWrapper() .eq(ApprovalTask::getAssigneeUserId, uid) .eq(ApprovalTask::getTaskStatus, ApprovalTaskStatus.PENDING) .orderByDesc(ApprovalTask::getCreateTime)); } @Transactional(rollbackFor = Exception.class) public void handleAction(ApprovalActionRequest req) { Long uid = StpUtil.getLoginIdAsLong(); ApprovalTask task = approvalTaskMapper.selectById(req.getTaskId()); if (task == null || task.getDelFlag() != null && task.getDelFlag() == 1) { throw new BizException(BizErrorCode.APPROVAL_TASK_NOT_FOUND, "审批任务不存在"); } UuidAssert.match(task, req.getTaskUuid()); if (!ApprovalTaskStatus.PENDING.equals(task.getTaskStatus())) { throw new BizException(BizErrorCode.APPROVAL_CONFLICT, "任务已处理"); } if (!uid.equals(task.getAssigneeUserId())) { throw new BizException(BizErrorCode.AUTH_FORBIDDEN, "无权处理该任务"); } ApprovalInstance inst = approvalInstanceMapper.selectById(task.getInstanceId()); AppointmentOrder order = appointmentOrderMapper.selectById(inst.getOrderId()); if (Boolean.FALSE.equals(req.getApprove())) { String reason = req.getComment() != null ? req.getComment() : "拒绝"; task.setTaskStatus(ApprovalTaskStatus.REJECTED); task.setComment(reason); approvalTaskMapper.updateById(task); approvalEngineService.rejectInstance(inst, reason); postApprovalOrchestrationService.onOrderRejected(order, reason); return; } task.setTaskStatus(ApprovalTaskStatus.APPROVED); task.setComment(req.getComment()); approvalTaskMapper.updateById(task); approvalEngineService.markGroupSkippedExcept(task); if (approvalEngineService.isCurrentNodeComplete(inst)) { approvalEngineService.advanceOrComplete(inst, order); ApprovalInstance latest = approvalInstanceMapper.selectById(inst.getId()); if (ApprovalInstanceStatus.APPROVED.equals(latest.getStatus())) { AppointmentOrder fresh = appointmentOrderMapper.selectById(order.getId()); postApprovalOrchestrationService.onOrderFullyApproved(fresh); } } } }