| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.approve.mapper.ApproveNodeMapper; |
| | | import com.ruoyi.approve.mapper.ApproveProcessDeptMapper; |
| | | import com.ruoyi.approve.mapper.ApproveProcessMapper; |
| | | import com.ruoyi.approve.pojo.ApproveNode; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import com.ruoyi.approve.pojo.ApproveProcessDept; |
| | | import com.ruoyi.approve.service.IApproveNodeService; |
| | | import com.ruoyi.approve.service.IApproveProcessService; |
| | | import com.ruoyi.approve.utils.DailyRedisCounter; |
| | |
| | | import com.ruoyi.project.system.mapper.SysDeptMapper; |
| | | 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.sales.mapper.CommonFileMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.CommonFile; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.service.impl.CommonFileServiceImpl; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.LinkedHashSet; |
| | | import java.util.Map; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | @Autowired |
| | | private ApproveProcessMapper approveProcessMapper; |
| | | private ApproveProcessMapper approveProcessMapper; |
| | | @Autowired |
| | | private ApproveProcessDeptMapper approveProcessDeptMapper; |
| | | @Autowired |
| | | private TempFileServiceImpl tempFileService; |
| | | @Autowired |
| | |
| | | @Override |
| | | public void addApprove(ApproveProcessVO approveProcessVO) throws Exception { |
| | | SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser()); |
| | | SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId()); |
| | | List<Long> approveDeptIds = normalizeDeptIds(approveProcessVO.getApproveDeptIdArray(), approveProcessVO.getApproveDeptId()); |
| | | List<SysDept> sysDepts = sysDeptMapper.selectBatchIds(approveDeptIds); |
| | | Map<Long, SysDept> deptMap = sysDepts.stream().collect(Collectors.toMap(SysDept::getDeptId, dept -> dept)); |
| | | if (deptMap.size() != approveDeptIds.size()) throw new RuntimeException("部门不存在"); |
| | | SysDept sysDept = deptMap.get(approveDeptIds.get(0)); |
| | | String[] split = approveProcessVO.getApproveUserIds().split(","); |
| | | List<Long> longList = Arrays.stream(split) |
| | | .map(Long::valueOf) // 将每个 String 转换为 Long |
| | |
| | | if (CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("审核用户不存在"); |
| | | if (sysDept == null) throw new RuntimeException("部门不存在"); |
| | | if (sysUser == null) throw new RuntimeException("申请人不存在"); |
| | | String today = LocalDate.now().format(DATE_FORMAT); |
| | | Long approveId = dailyRedisCounter.incrementAndGetByDb(); |
| | | String formattedCount = String.format("%03d", approveId); |
| | | //流程 ID |
| | | String approveID = today + formattedCount; |
| | | // String today = LocalDate.now().format(DATE_FORMAT); |
| | | // Long approveId = dailyRedisCounter.incrementAndGetByDb(); |
| | | // String formattedCount = String.format("%03d", approveId); |
| | | // //流程 ID |
| | | // String approveID = today + formattedCount; |
| | | SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); |
| | | ApproveProcess approveProcess = new ApproveProcess(); |
| | | approveProcess.setApproveId(approveID); |
| | | String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "","approve_id"); |
| | | approveProcess.setApproveId(no); |
| | | approveProcess.setApproveUser(approveProcessVO.getApproveUser()); |
| | | approveProcess.setApproveUserName(sysUser.getNickName()); |
| | | approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId()); |
| | | approveProcess.setApproveDeptName(sysDept.getDeptName()); |
| | | approveProcess.setApproveDeptId(approveDeptIds.get(0)); |
| | | approveProcess.setApproveDeptName(approveDeptIds.stream().map(deptMap::get).map(SysDept::getDeptName).collect(Collectors.joining(","))); |
| | | approveProcess.setApproveDeptIdArray(approveDeptIds); |
| | | approveProcess.setApproveDeptNameArray(approveDeptIds.stream().map(deptMap::get).map(SysDept::getDeptName).collect(Collectors.toList())); |
| | | approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(","))); |
| | | approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime())); |
| | | approveProcess.setApproveReason(approveProcessVO.getApproveReason()); |
| | |
| | | approveProcess.setApproveDelete(0); |
| | | approveProcess.setApproveType(approveProcessVO.getApproveType()); |
| | | approveProcess.setCreateTime(LocalDateTime.now()); |
| | | approveProcess.setTenantId(approveProcessVO.getApproveDeptId()); |
| | | approveProcess.setTenantId(approveDeptIds.get(0)); |
| | | approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds()); |
| | | approveProcess.setApproveUserCurrentId(longList.get(0)); |
| | | approveProcess.setApproveTitle(ObjectUtils.isNotEmpty(approveProcessVO.getApproveTitle()) ? approveProcessVO.getApproveTitle() : ""); |
| | | approveProcess.setApproveUserCurrentName(sysUsers |
| | | .stream() |
| | | .filter(SysUser -> SysUser.getUserId().equals(longList.get(0))) |
| | |
| | | approveProcessMapper.updateById(approveProcess1); |
| | | } |
| | | save(approveProcess); |
| | | saveProcessDepartments(approveProcess.getId(), approveDeptIds, deptMap); |
| | | //初始化审批节点 |
| | | approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(), approveID, approveProcessVO.getApproveDeptId()); |
| | | approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(), no, approveDeptIds.get(0)); |
| | | // 附件绑定 |
| | | tempFileService.migrateTempFilesToFormal(approveProcess.getId(), approveProcessVO.getTempFileIds(), FileNameType.ApproveProcess.getValue()); |
| | | /*消息通知*/ |
| | |
| | | return sysDeptList; |
| | | } |
| | | |
| | | @Autowired |
| | | private PurchaseLedgerMapper purchaseLedgerMapper; |
| | | |
| | | @Autowired |
| | | private ShippingInfoMapper shippingInfoMapper; |
| | | |
| | | @Override |
| | | public IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess) { |
| | | IPage<ApproveProcess> approveProcessIPage = approveProcessMapper.listPage(page, approveProcess); |
| | | fillDepartmentArrays(approveProcessIPage.getRecords()); |
| | | List<ApproveProcess> records = approveProcessIPage.getRecords(); |
| | | |
| | | for (ApproveProcess record : records) { |
| | | List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() |
| | | .eq(CommonFile::getCommonId, record.getId()) |
| | | .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue())); |
| | | record.setCommonFileList(commonFiles); |
| | | List<CommonFile> allFiles = new ArrayList<>(); |
| | | |
| | | // 采购审批查询 |
| | | if (record.getApproveType() == 5) { |
| | | String contractNo = record.getApproveReason(); |
| | | PurchaseLedger ledger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() |
| | | .eq(PurchaseLedger::getPurchaseContractNumber, contractNo) |
| | | .last("limit 1")); |
| | | |
| | | if (ledger != null) { |
| | | allFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() |
| | | .eq(CommonFile::getCommonId, ledger.getId()) |
| | | .eq(CommonFile::getType, FileNameType.PURCHASE.getValue())); |
| | | } |
| | | } |
| | | |
| | | // 发货审批查询 |
| | | else if (record.getApproveType() == 7) { |
| | | String reason = record.getApproveReason(); // 格式为 "xx:...-..." |
| | | if (StringUtils.hasText(reason) && reason.contains(":")) { |
| | | // 提取冒号后面的发货单号 |
| | | String shippingNo = reason.split(":")[1]; |
| | | // 根据发货单号查询发货台账记录 |
| | | ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getShippingNo, shippingNo) |
| | | .last("limit 1")); |
| | | if (shippingInfo != null) { |
| | | // 使用发货台账的 销售台账ID 去查附件 |
| | | allFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() |
| | | .eq(CommonFile::getCommonId, shippingInfo.getSalesLedgerId()) |
| | | .eq(CommonFile::getType, FileNameType.SALE.getValue())); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 查询审批单自身的附件 |
| | | else { |
| | | allFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() |
| | | .eq(CommonFile::getCommonId, record.getId()) |
| | | .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue())); |
| | | } |
| | | |
| | | record.setCommonFileList(allFiles); |
| | | } |
| | | return approveProcessIPage; |
| | | } |
| | | |
| | | public void delByIds(List<Long> ids) { |
| | | for (Long approveId : ids) { |
| | | @Override |
| | | public void delByIds(List<Long> longs) { |
| | | ApproveProcess approveProcess; |
| | | for (Long approveId : longs) { |
| | | |
| | | // 逻辑删除审批流程 |
| | | update(new UpdateWrapper<ApproveProcess>() |
| | | .lambda() |
| | | .set(ApproveProcess::getApproveDelete, 1) |
| | | .eq(ApproveProcess::getId, approveId)); |
| | | // 删除对应的附件 |
| | | commonFileService.deleteByBusinessId(approveId, FileNameType.ApproveProcess.getValue()); |
| | | ApproveProcess approveProcess = approveProcessMapper.selectById(approveId); |
| | | .eq(ApproveProcess::getApproveId, approveId)); |
| | | |
| | | // 删除审批节点 |
| | | approveNodeService.delApproveNodeByApproveId(approveProcess.getApproveId()); |
| | | approveNodeService.delApproveNodeByApproveId(approveId); |
| | | |
| | | // 只查最新一条审批流程 |
| | | ApproveProcess latestProcess = approveProcessMapper.selectOne( |
| | |
| | | continue; |
| | | } |
| | | |
| | | |
| | | // 删除对应的消息通知 |
| | | sysNoticeService.remove(new LambdaQueryWrapper<SysNotice>() |
| | | .eq(SysNotice::getNoticeTitle, approveProcessType(latestProcess.getApproveType())) |
| | | .eq(SysNotice::getSenderId, latestProcess.getApproveUser()) |
| | | .apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", latestProcess.getApproveId())); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | // 删除对应的附件 |
| | | commonFileService.deleteByBusinessId(approveProcess.getId(), FileNameType.ApproveProcess.getValue()); |
| | | // 删除审批节点 |
| | | approveNodeService.delApproveNodeByApproveId(approveId.toString()); |
| | | approveNodeService.delApproveNodeByApproveId(approveId); |
| | | |
| | | // 只查最新一条审批流程 |
| | | ApproveProcess latestProcess = approveProcessMapper.selectOne( |
| | |
| | | one.setCommonFileList(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() |
| | | .eq(CommonFile::getCommonId, one.getId()) |
| | | .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue()))); |
| | | fillDepartmentArrays(Arrays.asList(one)); |
| | | return one; |
| | | } |
| | | |
| | |
| | | if (sysUser == null) throw new RuntimeException("申请人不存在"); |
| | | approve.setApproveUserName(sysUser.getNickName()); |
| | | approve.setApproveUser(sysUser.getUserId()); |
| | | approve.setApproveTitle(approveGetAndUpdateVo.getApproveTitle()); |
| | | //审核中不可以编辑审核人 |
| | | if (approve.getApproveStatus() != 1) { |
| | | approve.setApproveUserCurrentId(Long.parseLong(split[0])); |
| | | |
| | | approve.setApproveUserCurrentName(sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[0]))).collect(Collectors.toList()).get(0).getNickName()); |
| | | } |
| | | if (approveGetAndUpdateVo.getApproveDeptIdArray() != null || approveGetAndUpdateVo.getApproveDeptId() != null) { |
| | | if (approve.getApproveStatus() == 1) throw new RuntimeException("审核中不可以修改审批部门"); |
| | | List<Long> deptIds = normalizeDeptIds(approveGetAndUpdateVo.getApproveDeptIdArray(), approveGetAndUpdateVo.getApproveDeptId()); |
| | | List<SysDept> departments = sysDeptMapper.selectBatchIds(deptIds); |
| | | Map<Long, SysDept> deptMap = departments.stream().collect(Collectors.toMap(SysDept::getDeptId, dept -> dept)); |
| | | if (deptMap.size() != deptIds.size()) throw new RuntimeException("部门不存在"); |
| | | approve.setApproveDeptId(deptIds.get(0)); |
| | | approve.setApproveDeptName(deptIds.stream().map(deptMap::get).map(SysDept::getDeptName).collect(Collectors.joining(","))); |
| | | approve.setTenantId(deptIds.get(0)); |
| | | approveProcessDeptMapper.delete(Wrappers.<ApproveProcessDept>lambdaUpdate().eq(ApproveProcessDept::getApproveProcessId, approve.getId())); |
| | | saveProcessDepartments(approve.getId(), deptIds, deptMap); |
| | | } |
| | | updateById(approve); |
| | | //修改审批人 |
| | |
| | | } |
| | | |
| | | |
| | | private List<Long> normalizeDeptIds(List<Long> deptIds, Long deptId) { |
| | | List<Long> ids = deptIds == null || deptIds.isEmpty() ? (deptId == null ? new ArrayList<>() : Arrays.asList(deptId)) : deptIds; |
| | | if (ids.isEmpty()) throw new RuntimeException("请选择审批部门"); |
| | | Set<Long> uniqueIds = new LinkedHashSet<>(ids); |
| | | if (uniqueIds.size() != ids.size() || uniqueIds.stream().anyMatch(id -> id == null || id <= 0)) { |
| | | throw new RuntimeException("审批部门参数不正确"); |
| | | } |
| | | return new ArrayList<>(uniqueIds); |
| | | } |
| | | |
| | | private void saveProcessDepartments(Long processId, List<Long> deptIds, Map<Long, SysDept> deptMap) { |
| | | for (int i = 0; i < deptIds.size(); i++) { |
| | | ApproveProcessDept processDept = new ApproveProcessDept(); |
| | | processDept.setApproveProcessId(processId); |
| | | processDept.setApproveDeptId(deptIds.get(i)); |
| | | processDept.setApproveDeptName(deptMap.get(deptIds.get(i)).getDeptName()); |
| | | processDept.setDeptOrder(i + 1); |
| | | processDept.setDeleteFlag(0); |
| | | processDept.setCreateTime(LocalDateTime.now()); |
| | | approveProcessDeptMapper.insert(processDept); |
| | | } |
| | | } |
| | | |
| | | private void fillDepartmentArrays(List<ApproveProcess> processes) { |
| | | for (ApproveProcess process : processes) { |
| | | List<ApproveProcessDept> departments = approveProcessDeptMapper.selectList(Wrappers.<ApproveProcessDept>lambdaQuery() |
| | | .eq(ApproveProcessDept::getApproveProcessId, process.getId()) |
| | | .eq(ApproveProcessDept::getDeleteFlag, 0) |
| | | .orderByAsc(ApproveProcessDept::getDeptOrder)); |
| | | if (departments.isEmpty()) { |
| | | process.setApproveDeptIdArray(process.getApproveDeptId() == null ? new ArrayList<>() : Arrays.asList(process.getApproveDeptId())); |
| | | process.setApproveDeptNameArray(process.getApproveDeptName() == null ? new ArrayList<>() : Arrays.asList(process.getApproveDeptName())); |
| | | } else { |
| | | process.setApproveDeptIdArray(departments.stream().map(ApproveProcessDept::getApproveDeptId).collect(Collectors.toList())); |
| | | process.setApproveDeptNameArray(departments.stream().map(ApproveProcessDept::getApproveDeptName).collect(Collectors.toList())); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //审批类型获取(与前端页面对应) |
| | | private String approveProcessType(Integer approveType) { |
| | | switch (approveType) { |
| | |
| | | return "发货审批"; |
| | | case 8: |
| | | return "危险作业审批"; |
| | | case 9: |
| | | return "销售审批"; |
| | | case 10: |
| | | return "自由协同审批"; |
| | | } |
| | | return null; |
| | | } |