| | |
| | | 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.ObjectUtils; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.approve.bean.vo.ApproveProcessConfigNodeVo; |
| | | 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.approve.service.IApproveProcessService; |
| | | import com.ruoyi.collaborativeApproval.mapper.SealApplicationManagementMapper; |
| | | import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement; |
| | | import com.ruoyi.common.enums.FileNameType; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.device.mapper.DeviceRepairMapper; |
| | | import com.ruoyi.device.pojo.DeviceRepair; |
| | | import com.ruoyi.other.service.impl.TempFileServiceImpl; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.project.system.mapper.SysUserMapper; |
| | | import lombok.AllArgsConstructor; |
| | | 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.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.io.IOException; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Comparator; |
| | | import java.util.Date; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class ApproveNodeServiceImpl extends ServiceImpl<ApproveNodeMapper, ApproveNode> implements IApproveNodeService { |
| | | |
| | | @Autowired |
| | | private ApproveNodeMapper approveNodeMapper; |
| | | @Autowired |
| | | private IApproveProcessService approveProcessService; |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | private final ApproveNodeMapper approveNodeMapper; |
| | | private final ApproveProcessMapper approveProcessMapper; |
| | | private final SysUserMapper sysUserMapper; |
| | | private final TempFileServiceImpl tempFileService; |
| | | 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 SealApplicationManagementMapper sealApplicationManagementMapper; |
| | | |
| | | |
| | | public ApproveProcess getApproveById(String id) { |
| | | LambdaQueryWrapper<ApproveProcess> 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) { |
| | | public void initApproveNodes(String approveUserIds, String approveID, Long tenantId) { |
| | | if (approveUserIds == null || approveUserIds.isEmpty()) { |
| | | return; |
| | | } |
| | | List<ApproveProcessConfigNodeVo> config = new ArrayList<>(); |
| | | String[] ids = approveUserIds.split(","); |
| | | for (int i = 0; i < ids.length; i++) { |
| | | if (ids[i] == null || ids[i].trim().isEmpty()) { |
| | | continue; |
| | | } |
| | | ApproveProcessConfigNodeVo vo = new ApproveProcessConfigNodeVo(); |
| | | vo.setNodeOrder(i + 1); |
| | | vo.setApproverId(Long.parseLong(ids[i].trim())); |
| | | vo.setApproveMode("or"); |
| | | config.add(vo); |
| | | } |
| | | initApproveNodes(config, approveID, tenantId); |
| | | } |
| | | |
| | | @Override |
| | | public void initApproveNodes(List<ApproveProcessConfigNodeVo> config, String approveID, Long tenantId) { |
| | | Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); |
| | | ApproveProcess approve = approveProcessService.getApproveById(approveID); |
| | | String[] names = approveUserIds.split(","); |
| | | String approveId = approve.getApproveId(); |
| | | 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); |
| | | // 按节点顺序分组,保证同一节点的多审批人写入相同 approveNodeOrder |
| | | Map<Integer, List<ApproveProcessConfigNodeVo>> groups = new LinkedHashMap<>(); |
| | | for (ApproveProcessConfigNodeVo vo : config) { |
| | | if (vo.getApproverId() == null) { |
| | | continue; |
| | | } |
| | | int order = vo.getNodeOrder() == null ? groups.size() + 1 : vo.getNodeOrder(); |
| | | groups.computeIfAbsent(order, k -> new ArrayList<>()).add(vo); |
| | | } |
| | | for (Map.Entry<Integer, List<ApproveProcessConfigNodeVo>> entry : groups.entrySet()) { |
| | | Integer order = entry.getKey(); |
| | | String mode = entry.getValue().get(0).getApproveMode(); |
| | | if (mode == null || mode.isEmpty()) { |
| | | mode = "or"; |
| | | } |
| | | List<Long> seenIds = new ArrayList<>(); |
| | | for (ApproveProcessConfigNodeVo vo : entry.getValue()) { |
| | | Long approverId = vo.getApproverId(); |
| | | if (seenIds.contains(approverId)) { |
| | | continue; |
| | | } |
| | | seenIds.add(approverId); |
| | | SysUser sysUser = sysUserMapper.selectUserById(approverId); |
| | | if (sysUser == null) { |
| | | continue; |
| | | } |
| | | ApproveNode approveNode = new ApproveNode(); |
| | | approveNode.setApproveProcessId(approveID); |
| | | approveNode.setApproveNodeOrder(order); |
| | | approveNode.setApproveMode(mode); |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | public List<ApproveNode> details(String id) { |
| | | LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(ApproveNode::getApproveProcessId, id); |
| | | queryWrapper.eq(ApproveNode::getDeleteFlag, 0); |
| | | List<ApproveNode> list = list(queryWrapper); |
| | | // 按照 approveNodeOrder 字段升序排序 |
| | | list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder)); |
| | | // 按 approveNodeOrder 升序、同节点按 id 升序,保证同节点多审批人顺序稳定 |
| | | list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder).thenComparingLong(ApproveNode::getId)); |
| | | bindNodeUrl(list); |
| | | ApproveProcess approveProcess = getApproveById(id); |
| | | if (approveProcess == null || approveProcess.getApproveStatus() == 2 |
| | | || approveProcess.getApproveStatus() == 3 || approveProcess.getApproveStatus() == 4) { |
| | | // 流程已完成/驳回/重新提交,全部只读 |
| | | return list; |
| | | } |
| | | Integer currentOrder = pendingOrder(id); |
| | | Long loginUserId = SecurityUtils.getLoginUser().getUser().getUserId(); |
| | | boolean admin = SecurityUtils.isAdmin(loginUserId); |
| | | boolean ishenSet = false; |
| | | for (ApproveNode approveNode : list) { |
| | | // 管理员不受审批人限制:代审当前节点首个待审记录(整节点代审由 updateApproveNode 完成) |
| | | if (approveNode.getApproveNodeOrder().equals(currentOrder) |
| | | && approveNode.getApproveNodeStatus() == 0 |
| | | && (admin || approveNode.getApproveNodeUserId().equals(loginUserId)) |
| | | && !ishenSet) { |
| | | approveNode.setIsShen(true); |
| | | ishenSet = true; |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | | public void updateApproveNode(ApproveNode approveNode) { |
| | | approveProcessService.updateApproveProcessStatus(approveNode); |
| | | /** |
| | | * 业务回调:按审批类型更新对应业务单据状态 |
| | | * status: 1=审核中(会签部分通过), 2=审核完成(同意), 3=审核未通过(拒绝) |
| | | */ |
| | | private void applyBusinessStatus(ApproveProcess approveProcess, Integer status) { |
| | | // 采购审批 |
| | | if (approveProcess.getApproveType().equals(5)) { |
| | | PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() |
| | | .eq(PurchaseLedger::getPurchaseContractNumber, approveProcess.getApproveReason()) |
| | | .last("limit 1")); |
| | | if (purchaseLedger != null) { |
| | | if (status.equals(2)) { |
| | | // 同意:生成质检/入库 |
| | | purchaseLedger.setApprovalStatus(3); |
| | | List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>() |
| | | .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<SalesQuotation>() |
| | | .eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason()) |
| | | .last("limit 1")); |
| | | if (salesQuote != null) { |
| | | if (status.equals(2)) { |
| | | salesQuote.setStatus("通过"); |
| | | } else if (status.equals(3)) { |
| | | salesQuote.setStatus("拒绝"); |
| | | } else if (status.equals(1)) { |
| | | salesQuote.setStatus("审核中"); |
| | | } |
| | | salesQuotationMapper.updateById(salesQuote); |
| | | } |
| | | } |
| | | // 出库审批状态修改 |
| | | if (approveProcess.getApproveType().equals(7)) { |
| | | String[] split = approveProcess.getApproveReason().split(":"); |
| | | if (split.length > 1) { |
| | | ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() |
| | | .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); |
| | | } |
| | | } |
| | | } |
| | | // 用印审批状态修改 |
| | | if (approveProcess.getApproveType().equals(9)) { |
| | | SealApplicationManagement seal = sealApplicationManagementMapper.selectOne(new LambdaQueryWrapper<SealApplicationManagement>() |
| | | .eq(SealApplicationManagement::getApproveProcessId, approveProcess.getId()) |
| | | .last("limit 1")); |
| | | if (seal != null) { |
| | | if (status.equals(2)) { |
| | | seal.setStatus("approved"); |
| | | } else if (status.equals(3)) { |
| | | seal.setStatus("rejected"); |
| | | } else if (status.equals(1)) { |
| | | seal.setStatus("pending"); |
| | | } |
| | | sealApplicationManagementMapper.updateById(seal); |
| | | } |
| | | } |
| | | } |
| | | |
| | | approveNode.setApproveNodeTime(new Date()); |
| | | /** |
| | | * 当前待审批节点序号:所有未审批节点中最小的 approveNodeOrder |
| | | */ |
| | | private Integer pendingOrder(String approveId) { |
| | | return list(new LambdaQueryWrapper<ApproveNode>() |
| | | .eq(ApproveNode::getApproveProcessId, approveId) |
| | | .eq(ApproveNode::getDeleteFlag, 0) |
| | | .eq(ApproveNode::getApproveNodeStatus, 0)) |
| | | .stream() |
| | | .map(ApproveNode::getApproveNodeOrder) |
| | | .min(Integer::compareTo) |
| | | .orElse(null); |
| | | } |
| | | |
| | | approveNodeMapper.updateById(approveNode); |
| | | /** |
| | | * 查询指定流程指定节点的全部审批节点(同节点多审批人,按 id 升序) |
| | | */ |
| | | private List<ApproveNode> nodesByOrder(String approveId, Integer order) { |
| | | return list(new LambdaQueryWrapper<ApproveNode>() |
| | | .eq(ApproveNode::getApproveProcessId, approveId) |
| | | .eq(ApproveNode::getApproveNodeOrder, order) |
| | | .eq(ApproveNode::getDeleteFlag, 0) |
| | | .orderByAsc(ApproveNode::getId)); |
| | | } |
| | | |
| | | /** |
| | | * 设置流程当前节点待审人(多值逗号分隔,兼容旧的单值字段) |
| | | */ |
| | | private void setCurrentApprovers(ApproveProcess approveProcess, List<ApproveNode> nodes) { |
| | | if (nodes == null || nodes.isEmpty()) { |
| | | approveProcess.setApproveUserCurrentIds(null); |
| | | approveProcess.setApproveUserCurrentNames(null); |
| | | approveProcess.setApproveUserCurrentId(null); |
| | | approveProcess.setApproveUserCurrentName(null); |
| | | return; |
| | | } |
| | | approveProcess.setApproveUserCurrentIds(nodes.stream().map(ApproveNode::getApproveNodeUserId) |
| | | .map(String::valueOf).collect(Collectors.joining(","))); |
| | | approveProcess.setApproveUserCurrentNames(nodes.stream().map(ApproveNode::getApproveNodeUser) |
| | | .collect(Collectors.joining(","))); |
| | | approveProcess.setApproveUserCurrentId(nodes.get(0).getApproveNodeUserId()); |
| | | approveProcess.setApproveUserCurrentName(nodes.get(0).getApproveNodeUser()); |
| | | } |
| | | |
| | | /** |
| | | * 通知当前节点全部待审人 |
| | | */ |
| | | private void notifyApproveUsers(List<Long> userIds, ApproveProcess approveProcess) { |
| | | if (userIds == null || userIds.isEmpty()) { |
| | | return; |
| | | } |
| | | List<Long> ids = userIds.stream().distinct().collect(Collectors.toList()); |
| | | if (approveProcess.getApproveType() == 8) { |
| | | sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), |
| | | approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!", |
| | | ids, |
| | | "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); |
| | | } else { |
| | | sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), |
| | | approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!", |
| | | ids, |
| | | "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 填充审批节点附件 url |
| | | */ |
| | | private void bindNodeUrl(List<ApproveNode> nodes) { |
| | | if (CollectionUtils.isEmpty(nodes)) { |
| | | return; |
| | | } |
| | | for (ApproveNode approveNode : nodes) { |
| | | List<CommonFile> commonFiles = fileMapper.selectList(new LambdaQueryWrapper<CommonFile>() |
| | | .eq(CommonFile::getCommonId, approveNode.getId()) |
| | | .eq(CommonFile::getType, FileNameType.ApproveNode.getValue())); |
| | | if (!CollectionUtils.isEmpty(commonFiles)) { |
| | | approveNode.setUrl(commonFiles.get(0).getUrl()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 临时附件迁移为正式附件 |
| | | */ |
| | | private void bindNodeFiles(ApproveNode approveNode, List<String> tempFileIds) throws IOException { |
| | | if (!CollectionUtils.isEmpty(tempFileIds) && approveNode.getApproveNodeStatus() != null |
| | | && approveNode.getApproveNodeStatus() == 1) { |
| | | tempFileService.migrateTempFilesToFormal(approveNode.getId(), tempFileIds, FileNameType.ApproveNode.getValue()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void delApproveNodeByApproveId(Long id) { |
| | | public void updateApproveNode(ApproveNode approveNode) throws IOException { |
| | | ApproveNode db = approveNodeMapper.selectById(approveNode.getId()); |
| | | if (db == null || db.getDeleteFlag() != null && db.getDeleteFlag() == 1) { |
| | | throw new RuntimeException("审批节点不存在"); |
| | | } |
| | | if (db.getApproveNodeStatus() != null && db.getApproveNodeStatus() != 0) { |
| | | throw new RuntimeException("该节点已审批,请勿重复操作"); |
| | | } |
| | | Long loginUserId = SecurityUtils.getLoginUser().getUser().getUserId(); |
| | | boolean admin = SecurityUtils.isAdmin(loginUserId); |
| | | // 管理员不受审批人限制 |
| | | if (!admin && !db.getApproveNodeUserId().equals(loginUserId)) { |
| | | throw new RuntimeException("无权审批该节点"); |
| | | } |
| | | ApproveProcess approveProcess = getApproveById(db.getApproveProcessId()); |
| | | if (approveProcess == null) { |
| | | throw new RuntimeException("审批流程不存在"); |
| | | } |
| | | if (approveProcess.getApproveStatus() == null |
| | | || (approveProcess.getApproveStatus() != 0 && approveProcess.getApproveStatus() != 1)) { |
| | | throw new RuntimeException("当前流程状态不允许审批"); |
| | | } |
| | | Integer curOrder = pendingOrder(db.getApproveProcessId()); |
| | | if (!db.getApproveNodeOrder().equals(curOrder)) { |
| | | throw new RuntimeException("尚未轮到该节点审批"); |
| | | } |
| | | |
| | | db.setApproveNodeStatus(approveNode.getApproveNodeStatus()); |
| | | db.setApproveNodeReason(approveNode.getApproveNodeReason()); |
| | | db.setApproveNodeRemark(approveNode.getApproveNodeRemark()); |
| | | db.setApproveNodeTime(new Date()); |
| | | db.setUpdateUser(loginUserId); |
| | | approveNodeMapper.updateById(db); |
| | | |
| | | // 拒绝:一票否决,立即驳回整个流程 |
| | | if (db.getApproveNodeStatus() != null && db.getApproveNodeStatus() == 2) { |
| | | approveProcess.setApproveStatus(3); |
| | | approveProcess.setApproveOverTime(new Date()); |
| | | approveProcessMapper.updateById(approveProcess); |
| | | applyBusinessStatus(approveProcess, 3); |
| | | bindNodeFiles(db, approveNode.getTempFileIds()); |
| | | return; |
| | | } |
| | | |
| | | String mode = db.getApproveMode(); |
| | | if (mode == null || mode.isEmpty()) { |
| | | mode = "or"; |
| | | } |
| | | List<ApproveNode> sameOrder = nodesByOrder(db.getApproveProcessId(), db.getApproveNodeOrder()); |
| | | // 管理员代审:当前节点其余待审记录一并通过 |
| | | if (admin) { |
| | | for (ApproveNode n : sameOrder) { |
| | | if (n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0) { |
| | | n.setApproveNodeStatus(1); |
| | | n.setApproveNodeRemark("管理员代审通过"); |
| | | n.setApproveNodeTime(new Date()); |
| | | approveNodeMapper.updateById(n); |
| | | } |
| | | } |
| | | } |
| | | boolean released; |
| | | if ("and".equals(mode)) { |
| | | // 会签:节点内所有人均同意才放行 |
| | | released = sameOrder.stream().allMatch(n -> n.getApproveNodeStatus() != null && n.getApproveNodeStatus() == 1); |
| | | } else { |
| | | // 或签:节点内任一同意即放行 |
| | | released = sameOrder.stream().anyMatch(n -> n.getApproveNodeStatus() != null && n.getApproveNodeStatus() == 1); |
| | | } |
| | | |
| | | // 会签未放行:节点内仍有待审人,流程保持审核中 |
| | | if (!released) { |
| | | List<ApproveNode> pending = sameOrder.stream() |
| | | .filter(n -> n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0) |
| | | .collect(Collectors.toList()); |
| | | approveProcess.setApproveStatus(1); |
| | | setCurrentApprovers(approveProcess, pending); |
| | | approveProcessMapper.updateById(approveProcess); |
| | | applyBusinessStatus(approveProcess, 1); |
| | | bindNodeFiles(db, approveNode.getTempFileIds()); |
| | | return; |
| | | } |
| | | |
| | | // 或签放行:同节点其余未审批记录标记为自动同意 |
| | | if (!"and".equals(mode)) { |
| | | for (ApproveNode n : sameOrder) { |
| | | if (n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0) { |
| | | n.setApproveNodeStatus(1); |
| | | n.setApproveNodeRemark("或签:其他审批人已通过"); |
| | | n.setApproveNodeTime(new Date()); |
| | | approveNodeMapper.updateById(n); |
| | | } |
| | | } |
| | | } |
| | | |
| | | List<ApproveNode> next = nodesByOrder(db.getApproveProcessId(), db.getApproveNodeOrder() + 1).stream() |
| | | .filter(n -> n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0) |
| | | .collect(Collectors.toList()); |
| | | if (next.isEmpty()) { |
| | | // 最后节点放行:流程完成 |
| | | approveProcess.setApproveStatus(2); |
| | | approveProcess.setApproveOverTime(new Date()); |
| | | setCurrentApprovers(approveProcess, new ArrayList<>()); |
| | | approveProcessMapper.updateById(approveProcess); |
| | | applyBusinessStatus(approveProcess, 2); |
| | | } else { |
| | | // 流转下一节点 |
| | | approveProcess.setApproveStatus(1); |
| | | setCurrentApprovers(approveProcess, next); |
| | | approveProcessMapper.updateById(approveProcess); |
| | | applyBusinessStatus(approveProcess, 1); |
| | | notifyApproveUsers(next.stream().map(ApproveNode::getApproveNodeUserId).collect(Collectors.toList()), approveProcess); |
| | | } |
| | | bindNodeFiles(db, approveNode.getTempFileIds()); |
| | | } |
| | | |
| | | @Override |
| | | public void delApproveNodeByApproveId(String id) { |
| | | List<ApproveNode> approveNodes = approveNodeMapper.selectList(new LambdaQueryWrapper<ApproveNode>() |
| | | .eq(ApproveNode::getApproveProcessId, id)); |
| | | UpdateWrapper<ApproveNode> 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> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null); |
| | | if (qualityTestStandard.size()>0){ |
| | | qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); |
| | | qualityInspectMapper.updateById(qualityInspect); |
| | | qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>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); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | } |