| | |
| | | import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; |
| | | import com.ruoyi.approve.bean.vo.ApprovalInstanceVo; |
| | | import com.ruoyi.approve.mapper.ApprovalInstanceMapper; |
| | | import com.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper; |
| | | import com.ruoyi.approve.mapper.FinReimbursementMapper; |
| | | import com.ruoyi.approve.pojo.*; |
| | | import com.ruoyi.approve.service.*; |
| | | import com.ruoyi.approve.utils.ApproveProcessConfigNodeUtils; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import com.ruoyi.collaborativeApproval.mapper.EnterpriseNewsMapper; |
| | | import com.ruoyi.collaborativeApproval.mapper.EnterpriseNewsScopeDeptMapper; |
| | | import com.ruoyi.collaborativeApproval.mapper.EnterpriseNewsScopeUserMapper; |
| | | import com.ruoyi.collaborativeApproval.pojo.EnterpriseNews; |
| | | import com.ruoyi.collaborativeApproval.pojo.EnterpriseNewsScopeDept; |
| | | import com.ruoyi.collaborativeApproval.pojo.EnterpriseNewsScopeUser; |
| | | import com.ruoyi.collaborativeApproval.service.EnterpriseNewsScopeDeptService; |
| | | import com.ruoyi.collaborativeApproval.service.EnterpriseNewsScopeUserService; |
| | | import com.ruoyi.collaborativeApproval.service.EnterpriseNewsService; |
| | | import com.ruoyi.common.enums.*; |
| | | import com.ruoyi.common.utils.OrderUtils; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.SalesQuotation; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.staff.mapper.HolidayApplicationMapper; |
| | | import com.ruoyi.staff.pojo.HolidayApplication; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | private final ApprovalTaskService approvalTaskService; |
| | | private final ApprovalRecordService approvalRecordService; |
| | | private final ApprovalTemplateNodeService approvalTemplateNodeService; |
| | | private final ApprovalTemplateNodeApproverService approvalTemplateNodeApproverService; |
| | | private final FinReimbursementMapper finReimbursementMapper; |
| | | private final FileUtil fileUtil; |
| | | private final ISysNoticeService sysNoticeService; |
| | | private final PurchaseLedgerMapper purchaseLedgerMapper; |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | |
| | | private final SalesQuotationMapper salesQuotationMapper; |
| | | private final ShippingInfoMapper shippingInfoMapper; |
| | | private final QualityInspectHelper qualityInspectHelper; |
| | | private final EnterpriseNewsService enterpriseNewsService; |
| | | private final EnterpriseNewsScopeDeptService enterpriseNewsScopeDeptService; |
| | | private final EnterpriseNewsScopeUserService enterpriseNewsScopeUserService; |
| | | private final EnterpriseNewsScopeUserMapper enterpriseNewsScopeUserMapper; |
| | | private final SysUserMapper sysUserMapper; |
| | | private final SysUserDeptMapper sysUserDeptMapper; |
| | | private final SysDeptMapper sysDeptMapper; |
| | | private final HolidayApplicationMapper holidayApplicationMapper; |
| | | private final EnterpriseNewsMapper enterpriseNewsMapper; |
| | | private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper; |
| | | private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper; |
| | | |
| | | @Override |
| | | public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) { |
| | |
| | | vo.setIsApprove(approveProcessConfigNodeUtils.isCurrentApprover(vo.getId(), currentUserId)); |
| | | vo.setRecords(recordMap.getOrDefault(vo.getId(), new ArrayList<>())); |
| | | vo.setTasks(taskMap.getOrDefault(vo.getId(), new ArrayList<>())); |
| | | vo.setStorageBlobVOList(fileUtil.getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum.APPROVAL_INSTANCE, vo.getId())); |
| | | } |
| | | |
| | | } |
| | |
| | | return false; |
| | | } |
| | | approveProcessConfigNodeUtils.createCurrentNodeAndTasks(approvalInstanceDto); |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_INSTANCE, approvalInstanceDto.getId(), approvalInstanceDto.getStorageBlobDTOs()); |
| | | sendApproveNotice(approvalInstanceDto, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId())); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean update(ApprovalInstanceDto approvalInstanceDto) { |
| | | if (approvalInstanceDto == null || approvalInstanceDto.getId() == null) { |
| | | return false; |
| | | } |
| | | boolean updated = this.updateById(approvalInstanceDto); |
| | | if (!updated) { |
| | | return false; |
| | | } |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_INSTANCE, approvalInstanceDto.getId(), approvalInstanceDto.getStorageBlobDTOs()); |
| | | return true; |
| | | } |
| | | |
| | |
| | | if (ids == null || ids.isEmpty()) { |
| | | return false; |
| | | } |
| | | fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_INSTANCE, ids); |
| | | |
| | | int instanceRows = approvalInstanceMapper.update( |
| | | null, |
| | |
| | | approveAction, |
| | | approvalInstanceDto.getApproveComment() |
| | | ); |
| | | |
| | | //审批拒绝的处理 |
| | | if ("REJECTED".equals(approveAction)) { |
| | | return rejectCurrentNode(instance, currentNode, now); |
| | | } |
| | | |
| | | if (!approveProcessConfigNodeUtils.canProceedToNextLevel(instance.getId(), currentNode.getApproveType())) { |
| | | return R.ok("审批成功,等待其他审批人处理"); |
| | | } |
| | |
| | | instance.setStatus("REJECTED"); |
| | | instance.setFinishTime(now); |
| | | this.updateById(instance); |
| | | // 驳回对应的企业新闻, 差旅报销 |
| | | if (instance.getBusinessType().equals(TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode())) { |
| | | enterpriseNewsMapper.update( |
| | | new LambdaUpdateWrapper<EnterpriseNews>() |
| | | .eq(EnterpriseNews::getId, instance.getBusinessId()) |
| | | .set(EnterpriseNews::getStatus, "REJECTED") |
| | | ); |
| | | }else if (instance.getBusinessType().equals(TypeEnums.TRAVEL_REIMBURSEMENT_APPROVAL.getCode())||instance.getBusinessType().equals(TypeEnums.EXPENSE_APPROVAL.getCode())) { |
| | | finReimbursementMapper.update( |
| | | new LambdaUpdateWrapper<FinReimbursement>() |
| | | .eq(FinReimbursement::getId, instance.getBusinessId()) |
| | | .set(FinReimbursement::getBillStatus, "REJECTED") |
| | | ); |
| | | } |
| | | return R.ok("审批已驳回"); |
| | | } |
| | | |
| | |
| | | closePendingTasks(instance.getId(), currentNode.getId()); |
| | | |
| | | int nextLevel = currentNode.getLevelNo() + 1; |
| | | ApprovalInstanceNode nextInstanceNode = approvalInstanceNodeService.getOne( |
| | | new LambdaQueryWrapper<ApprovalInstanceNode>() |
| | | .eq(ApprovalInstanceNode::getInstanceId, instance.getId()) |
| | | .eq(ApprovalInstanceNode::getLevelNo, nextLevel) |
| | | .eq(ApprovalInstanceNode::getDeleted, 0) |
| | | .orderByAsc(ApprovalInstanceNode::getId) |
| | | .last("LIMIT 1") |
| | | ); |
| | | |
| | | if (nextInstanceNode != null) { |
| | | if (!activateNextInstanceNode(nextInstanceNode.getId(), now)) { |
| | | return R.ok("下一审批节点已被激活,请刷新后重试"); |
| | | } |
| | | instance.setCurrentLevel(nextLevel); |
| | | instance.setStatus("PENDING"); |
| | | this.updateById(instance); |
| | | List<ApprovalTask> nextTasks = approvalTaskService.list( |
| | | Wrappers.<ApprovalTask>lambdaQuery() |
| | | .eq(ApprovalTask::getInstanceId, instance.getId()) |
| | | .eq(ApprovalTask::getNodeId, nextInstanceNode.getId()) |
| | | .eq(ApprovalTask::getTaskStatus, "PENDING") |
| | | .eq(ApprovalTask::getDeleted, 0) |
| | | ); |
| | | sendApproveNotice(instance, nextTasks); |
| | | return R.ok("审批成功,已流转到下一节点"); |
| | | } |
| | | |
| | | ApprovalTemplateNode nextTemplateNode = approvalTemplateNodeService.getOne( |
| | | new LambdaQueryWrapper<ApprovalTemplateNode>() |
| | | .eq(ApprovalTemplateNode::getTemplateId, instance.getTemplateId()) |
| | |
| | | approveProcessConfigNodeUtils.createCurrentNodeAndTasks(instance, false); |
| | | sendApproveNotice(instance, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId())); |
| | | return R.ok("审批成功,已流转到下一节点"); |
| | | } |
| | | |
| | | private boolean activateNextInstanceNode(Long nodeId, LocalDateTime now) { |
| | | return approvalInstanceNodeService.update( |
| | | Wrappers.<ApprovalInstanceNode>lambdaUpdate() |
| | | .eq(ApprovalInstanceNode::getId, nodeId) |
| | | .eq(ApprovalInstanceNode::getStatus, "WAITING") |
| | | .eq(ApprovalInstanceNode::getDeleted, 0) |
| | | .set(ApprovalInstanceNode::getStatus, "PENDING") |
| | | .set(ApprovalInstanceNode::getStartTime, now) |
| | | ); |
| | | } |
| | | |
| | | private boolean updateCurrentNodeStatus(Long nodeId, String targetStatus, LocalDateTime now) { |
| | |
| | | handleShippingApprovalFinished(instance, status); |
| | | return; |
| | | } |
| | | if (TypeEnums.TRAVEL_REIMBURSEMENT_APPROVAL.getCode().equals(businessType) |
| | | || TypeEnums.EXPENSE_APPROVAL.getCode().equals(businessType)) { |
| | | handleReimbursementApprovalFinished(instance, status); |
| | | return; |
| | | } |
| | | // 驳回对应的企业新闻、加班申请、请假申请可以重新再提交 |
| | | if (TypeEnums.LEAVE_APPROVAL.getCode().equals(businessType) |
| | | || TypeEnums.OVERTIME_APPROVAL.getCode().equals(businessType)) { |
| | | handleHolidayApplicationApprovalFinished(instance, status); |
| | | return; |
| | | } |
| | | if (TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode().equals(businessType)) { |
| | | handleNewsApprovalFinished(instance, status); |
| | | } |
| | | } |
| | | |
| | | private void handleReimbursementApprovalFinished(ApprovalInstance instance, String status) { |
| | | if (instance == null || instance.getBusinessId() == null) { |
| | | return; |
| | | } |
| | | |
| | | FinReimbursement reimbursement = new FinReimbursement(); |
| | | reimbursement.setId(instance.getBusinessId()); |
| | | if ("APPROVED".equals(status)) { |
| | | reimbursement.setBillStatus("APPROVED"); |
| | | reimbursement.setApprovedTime(instance.getFinishTime()); |
| | | } else if ("REJECTED".equals(status)) { |
| | | reimbursement.setBillStatus("REJECTED"); |
| | | } else if ("PENDING".equals(status)) { |
| | | reimbursement.setBillStatus("IN_APPROVAL"); |
| | | } else { |
| | | return; |
| | | } |
| | | finReimbursementMapper.updateById(reimbursement); |
| | | } |
| | | |
| | | private void handleNewsApprovalFinished(ApprovalInstance instance, String status) { |
| | |
| | | enterpriseNews.setId(instance.getBusinessId()); |
| | | if ("APPROVED".equals(status)) { |
| | | enterpriseNews.setStatus(ENTERPRISE_NEWS_STATUS_PUBLISHED); |
| | | enterpriseNewsService.updateById(enterpriseNews); |
| | | enterpriseNewsMapper.updateById(enterpriseNews); |
| | | sendEnterpriseNewsNotice(instance.getBusinessId()); |
| | | return; |
| | | } |
| | | if ("REJECTED".equals(status)) { |
| | | enterpriseNews.setStatus(ENTERPRISE_NEWS_STATUS_REJECTED); |
| | | enterpriseNewsService.updateById(enterpriseNews); |
| | | enterpriseNewsMapper.updateById(enterpriseNews); |
| | | } |
| | | } |
| | | |
| | | private void handleHolidayApplicationApprovalFinished(ApprovalInstance instance, String status) { |
| | | if (instance == null || instance.getBusinessId() == null) { |
| | | return; |
| | | } |
| | | HolidayApplication holidayApplication = new HolidayApplication(); |
| | | holidayApplication.setId(instance.getBusinessId()); |
| | | if ("APPROVED".equals(status)) { |
| | | holidayApplication.setStatus("APPROVED"); |
| | | } else if ("REJECTED".equals(status)) { |
| | | holidayApplication.setStatus("REJECTED"); |
| | | } else if ("PENDING".equals(status)) { |
| | | holidayApplication.setStatus("PENDING"); |
| | | } else { |
| | | return; |
| | | } |
| | | holidayApplicationMapper.updateById(holidayApplication); |
| | | } |
| | | |
| | | private void handlePurchaseApprovalFinished(ApprovalInstance instance, String status) { |
| | |
| | | } |
| | | |
| | | private List<ApprovalTask> createNodeAndTasks(ApprovalInstance instance, ApprovalTemplateNode templateNode) { |
| | | List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverService.list( |
| | | List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverMapper.selectList( |
| | | new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() |
| | | .eq(ApprovalTemplateNodeApprover::getTemplateId, instance.getTemplateId()) |
| | | .eq(ApprovalTemplateNodeApprover::getNodeId, templateNode.getId()) |
| | |
| | | } |
| | | |
| | | private void sendEnterpriseNewsNotice(Long newsId) { |
| | | EnterpriseNews enterpriseNews = enterpriseNewsService.getById(newsId); |
| | | EnterpriseNews enterpriseNews = enterpriseNewsMapper.selectById(newsId); |
| | | if (enterpriseNews == null) { |
| | | return; |
| | | } |
| | |
| | | .collect(Collectors.toList()); |
| | | } |
| | | if ("dept".equals(readScope)) { |
| | | List<Long> deptIds = enterpriseNewsScopeDeptService.list( |
| | | List<Long> deptIds = enterpriseNewsScopeDeptMapper.selectList( |
| | | new LambdaQueryWrapper<EnterpriseNewsScopeDept>() |
| | | .eq(EnterpriseNewsScopeDept::getNewsId, enterpriseNews.getId())) |
| | | .stream() |
| | |
| | | return sysUserDeptMapper.selectDistinctUserIdsByDeptIds(collectDeptIdsWithChildren(deptIds)); |
| | | } |
| | | if ("custom".equals(readScope)) { |
| | | return enterpriseNewsScopeUserService.list( |
| | | return enterpriseNewsScopeUserMapper.selectList( |
| | | new LambdaQueryWrapper<EnterpriseNewsScopeUser>() |
| | | .eq(EnterpriseNewsScopeUser::getNewsId, enterpriseNews.getId())) |
| | | .stream() |