package com.ruoyi.approve.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.mapper.ApproveNodeMapper; import com.ruoyi.approve.mapper.ApproveProcessMapper; import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.IApproveNodeService; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.mapper.QualityTestStandardParamMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.SalesQuotationMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.SalesQuotation; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.List; @Service @RequiredArgsConstructor public class ApproveNodeServiceImpl extends ServiceImpl implements IApproveNodeService { private final ApproveNodeMapper approveNodeMapper; private final ApproveProcessMapper approveProcessMapper; private final SysUserMapper sysUserMapper; private final ISysNoticeService sysNoticeService; private final CommonFileMapper fileMapper; private final DeviceRepairMapper deviceRepairMapper; private final PurchaseLedgerMapper purchaseLedgerMapper; private final SalesQuotationMapper salesQuotationMapper; private final ShippingInfoMapper shippingInfoMapper; private final CommonFileServiceImpl commonFileService; private final StockUtils stockUtils; private final SalesLedgerProductMapper salesLedgerProductMapper; private final QualityInspectMapper qualityInspectMapper; private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityTestStandardParamMapper qualityTestStandardParamMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final FileUtil fileUtil; public ApproveProcess getApproveById(String id) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveProcess::getApproveId, id); queryWrapper.eq(ApproveProcess::getApproveDelete, 0); // queryWrapper.eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId()); queryWrapper.last("limit 1"); ApproveProcess one = approveProcessMapper.selectOne(queryWrapper); return one; } @Override public void initApproveNodes(String approveUserIds, String approveID, Long tenantId) { Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); String[] names = approveUserIds.split(","); for (int i = 0; i < names.length; i++) { SysUser sysUser = sysUserMapper.selectUserById(Long.parseLong(names[i])); if (sysUser == null) continue; ApproveNode approveNode = new ApproveNode(); approveNode.setApproveProcessId(approveID); approveNode.setApproveNodeOrder(i + 1); approveNode.setApproveNodeUser(sysUser.getNickName()); approveNode.setApproveNodeUserId(sysUser.getUserId()); approveNode.setApproveNodeTime(new Date()); approveNode.setApproveNodeStatus(0); approveNode.setTenantId(tenantId); approveNode.setDeleteFlag(0); approveNode.setCreateUser(userId); approveNode.setUpdateUser(userId); approveNode.setCreateTime(LocalDateTime.now()); approveNode.setUpdateTime(LocalDateTime.now()); approveNodeMapper.insert(approveNode); } } @Override public List details(String id) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveNode::getApproveProcessId, id); queryWrapper.eq(ApproveNode::getDeleteFlag, 0); // queryWrapper.eq(ApproveNode::getApproveNodeStatus, 0); List list = list(queryWrapper); // 按照 approveNodeOrder 字段升序排序 list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder)); LambdaQueryWrapper approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, id) .eq(ApproveProcess::getApproveDelete, 0) // .eq(ApproveProcess::getApproveStatus, 0) .last("limit 1"); ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); if (approveProcess != null && approveProcess.getApproveStatus() == 3) { return list; } for (ApproveNode approveNode : list) { List commonFiles = fileMapper.selectList(new LambdaQueryWrapper() .eq(CommonFile::getCommonId, approveNode.getId()) .eq(CommonFile::getType, FileNameType.ApproveNode.getValue())); if (!CollectionUtils.isEmpty(commonFiles)) { approveNode.setUrl(commonFiles.get(0).getUrl()); } if (approveNode.getApproveNodeStatus() == 1) { continue; } approveNode.setIsShen(true); break; } return list; } public void updateApproveProcessStatus(ApproveNode approveNode, Integer status) throws IOException { LambdaQueryWrapper approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId()) .eq(ApproveProcess::getApproveDelete, 0) .last("limit 1"); ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); if (approveProcess == null) throw new RuntimeException("审批不存在"); LambdaQueryWrapper approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approveNode.getApproveProcessId()) .eq(ApproveNode::getApproveNodeOrder, approveNode.getApproveNodeOrder() + 1) .eq(ApproveNode::getDeleteFlag, 0) .eq(ApproveNode::getApproveNodeStatus, 0) .last("limit 1"); ApproveNode approveNode1 = approveNodeMapper.selectOne(approveNodeLambdaQueryWrapper); approveProcess.setApproveStatus(status); if (approveNode1 != null) { approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId()); approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser()); } if (approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)) { approveProcess.setApproveOverTime(new Date()); } approveProcessMapper.updateById(approveProcess); //采购审核 if (approveProcess.getApproveType().equals(5)) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper() .eq(PurchaseLedger::getPurchaseContractNumber, approveProcess.getApproveReason()) .last("limit 1")); if (purchaseLedger != null) { if (status.equals(2)) { // 同意 purchaseLedger.setApprovalStatus(3); List salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper() .lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2)); for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { // 质检 if (salesLedgerProduct.getIsChecked()) { addQualityInspect(purchaseLedger, salesLedgerProduct); } else { //直接入库 stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId()); } } } else if (status.equals(3)) { // 拒绝 purchaseLedger.setApprovalStatus(4); } else if (status.equals(1)) { // 审核中 purchaseLedger.setApprovalStatus(2); } purchaseLedgerMapper.updateById(purchaseLedger); } } // 销售报价状态修改 if (approveProcess.getApproveType().equals(6)) { SalesQuotation salesQuote = salesQuotationMapper.selectOne(new LambdaQueryWrapper() .eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason()) .last("limit 1")); // 同意 if (status.equals(2) && salesQuote != null) { salesQuote.setStatus("通过"); } else if (status.equals(3) && salesQuote != null) { salesQuote.setStatus("拒绝"); } else if (status.equals(1) && salesQuote != null) { salesQuote.setStatus("审核中"); } salesQuotationMapper.updateById(salesQuote); } // 出库审批修改 if (approveProcess.getApproveType().equals(7)) { String[] split = approveProcess.getApproveReason().split(":"); ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper() .eq(ShippingInfo::getShippingNo, split[1]) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if (shippingInfo != null) { if (status.equals(2)) { shippingInfo.setStatus("审核通过"); } else if (status.equals(3)) { shippingInfo.setStatus("审核拒绝"); } else if (status.equals(1)) { shippingInfo.setStatus("审核中"); } shippingInfoMapper.updateById(shippingInfo); } } fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVE_NODE, approveNode.getId(), approveNode.getStorageBlobDTOS()); } @Override public void updateApproveNode(ApproveNode approveNode) throws IOException { // 审批节点状态:1同意,2拒绝,0尚未审核 switch (approveNode.getApproveNodeStatus()) { case 1: updateApproveProcessStatus(approveNode, Boolean.TRUE.equals(approveNode.getIsLast()) ? 2 : 1); /*消息通知*/ Integer nodeOrder = approveNode.getApproveNodeOrder(); ApproveProcess approveProcess = approveProcessMapper.selectList(Wrappers.lambdaQuery() .eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())).get(0); if (approveProcess.getApproveUserIds().split(",").length > nodeOrder) { String id = approveProcess.getApproveUserIds().split(",")[nodeOrder]; if (approveProcess.getApproveType() == 8) { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!", Arrays.asList(Long.valueOf(id)), "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); } else { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!", Arrays.asList(Long.valueOf(id)), "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); } } break; case 2: updateApproveProcessStatus(approveNode, 3); break; default: break; } approveNode.setApproveNodeTime(new Date()); approveNodeMapper.updateById(approveNode); } @Override public void delApproveNodeByApproveId(String id) { List approveNodes = approveNodeMapper.selectList(new LambdaQueryWrapper() .eq(ApproveNode::getApproveProcessId, id)); UpdateWrapper queryWrapper = new UpdateWrapper<>(); queryWrapper.lambda().set(ApproveNode::getDeleteFlag, 1) .eq(ApproveNode::getApproveProcessId, id); update(queryWrapper); // 删除附件 for (ApproveNode approveNode : approveNodes) { commonFileService.deleteByBusinessId(approveNode.getId(), FileNameType.ApproveNode.getValue()); } } //审批类型获取(与前端页面对应) private String approveProcessType(Integer approveType) { switch (approveType) { case 1: return "公出管理"; case 2: return "请假管理"; case 3: return "出差管理"; case 4: return "报销管理"; case 5: return "采购审批"; case 6: return "报价审批"; case 7: return "发货审批"; case 8: return "危险作业审批"; case 9: return "办公用品审批"; } return null; } private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) { QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setInspectType(0); qualityInspect.setSupplier(purchaseLedger.getSupplierName()); qualityInspect.setPurchaseLedgerId(purchaseLedger.getId()); qualityInspect.setProductId(saleProduct.getProductId()); qualityInspect.setProductName(saleProduct.getProductCategory()); qualityInspect.setModel(saleProduct.getSpecificationModel()); qualityInspect.setProductModelId(saleProduct.getProductModelId()); qualityInspect.setUnit(saleProduct.getUnit()); qualityInspect.setQuantity(saleProduct.getQuantity()); qualityInspectMapper.insert(qualityInspect); List qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null); if (qualityTestStandard.size() > 0) { qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); qualityInspectMapper.updateById(qualityInspect); qualityTestStandardParamMapper.selectList(Wrappers.lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId())) .forEach(qualityTestStandardParam -> { QualityInspectParam param = new QualityInspectParam(); com.ruoyi.common.utils.bean.BeanUtils.copyProperties(qualityTestStandardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); }); } } }