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<ApprovalTask> pageMyTodo(long page, long size) {
|
Long uid = StpUtil.getLoginIdAsLong();
|
return approvalTaskMapper.selectPage(
|
new Page<>(page, size),
|
new LambdaQueryWrapper<ApprovalTask>()
|
.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);
|
}
|
}
|
}
|
}
|