| src/main/java/com/ruoyi/account/controller/AccountFileController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/basic/controller/FileUploadController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/collaborativeApproval/vo/EnterpriseNewsVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/project/common/CommonController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application-dev-pro.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application-oa.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/account/controller/AccountFileController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,129 @@ package com.ruoyi.account.controller; 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.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.basic.mapper.StorageAttachmentMapper; import com.ruoyi.basic.mapper.StorageBlobMapper; import com.ruoyi.basic.pojo.StorageAttachment; import com.ruoyi.basic.pojo.StorageBlob; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.framework.web.domain.R; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RestController @RequiredArgsConstructor @Tag(name = "è´¦æ·é件管ç") @RequestMapping("/account/accountFile") public class AccountFileController { private final StorageAttachmentMapper storageAttachmentMapper; private final StorageBlobMapper storageBlobMapper; private final FileUtil fileUtil; @GetMapping("/listPage") @Operation(summary = "å页æ¥è¯¢éä»¶å表") public R listPage( @RequestParam Long accountId, @RequestParam String accountType, @RequestParam(defaultValue = "1") Long current, @RequestParam(defaultValue = "10") Long size) { Page<StorageBlobVO> page = new Page<>(current, size); LambdaQueryWrapper<StorageAttachment> queryWrapper = new LambdaQueryWrapper<StorageAttachment>() .eq(StorageAttachment::getRecordType, accountType) .eq(StorageAttachment::getRecordId, accountId); Long total = storageAttachmentMapper.selectCount(queryWrapper); page.setTotal(total); if (total == 0) { page.setRecords(new ArrayList<>()); return R.ok(page); } List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(queryWrapper); Map<Long, Long> blobIdToAttachmentIdMap = storageAttachments.stream() .collect(Collectors.toMap(StorageAttachment::getStorageBlobId, StorageAttachment::getId)); List<Long> storageBlobIds = storageAttachments.stream() .map(StorageAttachment::getStorageBlobId) .collect(Collectors.toList()); List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); List<StorageBlobVO> storageBlobVOS = new ArrayList<>(); for (StorageBlob storageBlob : storageBlobs) { StorageBlobVO storageBlobVO = new StorageBlobVO(); BeanUtils.copyProperties(storageBlob, storageBlobVO); storageBlobVO.setPreviewURL(fileUtil.buildSignedPreviewUrl(storageBlobVO)); storageBlobVO.setUrl(fileUtil.buildSignedPreviewUrl(storageBlobVO)); storageBlobVO.setName(storageBlob.getOriginalFilename()); storageBlobVO.setDownloadURL(fileUtil.buildSignedDownloadUrl(storageBlobVO)); storageBlobVO.setStorageAttachmentId(blobIdToAttachmentIdMap.get(storageBlob.getId())); storageBlobVOS.add(storageBlobVO); } page.setRecords(storageBlobVOS); return R.ok(page); } @PostMapping("/add") @Operation(summary = "ä¿åéä»¶") public R add(@RequestBody Map<String, Object> params) { Long accountId = params.get("accountId") != null ? Long.valueOf(params.get("accountId").toString()) : null; String accountType = params.get("accountType") != null ? params.get("accountType").toString() : null; Long storageBlobId = null; if (params.get("id") != null) { storageBlobId = Long.valueOf(params.get("id").toString()); } else if (params.get("url") != null) { String url = params.get("url").toString(); int previewIdx = url.indexOf("/preview/"); if (previewIdx >= 0) { String afterPreview = url.substring(previewIdx + "/preview/".length()); int queryIdx = afterPreview.indexOf("?"); String uidFilename = queryIdx >= 0 ? afterPreview.substring(0, queryIdx) : afterPreview; StorageBlob blob = storageBlobMapper.selectOne(new LambdaQueryWrapper<StorageBlob>() .eq(StorageBlob::getUidFilename, uidFilename).last("limit 1")); if (blob != null) { storageBlobId = blob.getId(); } } } if (accountId == null || accountType == null || storageBlobId == null) { return R.fail("åæ°ä¸å®æ´"); } StorageAttachment storageAttachment = new StorageAttachment(); storageAttachment.setRecordType(accountType); storageAttachment.setRecordId(accountId); storageAttachment.setStorageBlobId(storageBlobId); storageAttachment.setDeleted(0L); storageAttachmentMapper.insert(storageAttachment); return R.ok(); } @DeleteMapping("/del") @Operation(summary = "å é¤éä»¶") public R del(@RequestBody List<Long> ids) { if (CollectionUtils.isEmpty(ids)) { return R.fail("åæ°ä¸è½ä¸ºç©º"); } fileUtil.deleteStorageAttachmentsByStorageAttachmentIds(ids); return R.ok(); } } src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -11,7 +11,9 @@ import com.ruoyi.approve.bean.vo.ApprovalInstanceVo; import com.ruoyi.approve.mapper.ApprovalInstanceMapper; import com.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper; import com.ruoyi.approve.mapper.FinReimbursementDetailMapper; import com.ruoyi.approve.mapper.FinReimbursementMapper; import com.ruoyi.approve.mapper.FinReimbursementTravelMapper; import com.ruoyi.approve.pojo.*; import com.ruoyi.approve.service.*; import com.ruoyi.approve.utils.ApproveProcessConfigNodeUtils; @@ -94,6 +96,8 @@ private final EnterpriseNewsMapper enterpriseNewsMapper; private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper; private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper; private final FinReimbursementDetailMapper finReimbursementDetailMapper; private final FinReimbursementTravelMapper finReimbursementTravelMapper; @Override public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) { @@ -144,6 +148,13 @@ approvalInstanceDto.setInstanceNo(instanceNo); approvalInstanceDto.setStatus("PENDING"); approvalInstanceDto.setCurrentLevel(1); // 妿åç«¯ä¼ äº applicantId 使²¡ä¼ applicantNameï¼åä»ç¨æ·è¡¨æ¥è¯¢å§å if (approvalInstanceDto.getApplicantId() != null && !StringUtils.hasText(approvalInstanceDto.getApplicantName())) { SysUser applicantUser = sysUserMapper.selectUserById(approvalInstanceDto.getApplicantId()); if (applicantUser != null) { approvalInstanceDto.setApplicantName(applicantUser.getNickName()); } } boolean saved = this.save(approvalInstanceDto); if (!saved) { return false; @@ -184,6 +195,26 @@ if (ids == null || ids.isEmpty()) { return false; } // å é¤å ³èçä¸å¡æ°æ®ï¼æ¥éåçï¼ List<Long> reimbursementIds = new ArrayList<>(); List<ApprovalInstance> instances = approvalInstanceMapper.selectBatchIds(ids); for (ApprovalInstance instance : instances) { if (instance.getBusinessId() != null && instance.getBusinessType() != null) { Long businessType = instance.getBusinessType(); if (TypeEnums.TRAVEL_REIMBURSEMENT_APPROVAL.getCode().equals(businessType) || TypeEnums.EXPENSE_APPROVAL.getCode().equals(businessType)) { reimbursementIds.add(instance.getBusinessId()); } } } if (!reimbursementIds.isEmpty()) { fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.FIN_REIMBURSEMENT, reimbursementIds); finReimbursementDetailMapper.delete(Wrappers.<FinReimbursementDetail>lambdaQuery().in(FinReimbursementDetail::getReimbursementId, reimbursementIds)); finReimbursementTravelMapper.delete(Wrappers.<FinReimbursementTravel>lambdaQuery().in(FinReimbursementTravel::getReimbursementId, reimbursementIds)); finReimbursementMapper.delete(Wrappers.<FinReimbursement>lambdaQuery().in(FinReimbursement::getId, reimbursementIds)); } fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_INSTANCE, ids); int instanceRows = approvalInstanceMapper.update( src/main/java/com/ruoyi/basic/controller/FileUploadController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.ruoyi.basic.controller; import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.basic.service.StorageBlobService; import com.ruoyi.framework.web.domain.R; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequiredArgsConstructor @Tag(name = "æä»¶ä¸ä¼ ") @RequestMapping("/file") public class FileUploadController { private final StorageBlobService storageBlobService; @PostMapping("/upload") @Operation(summary = "æä»¶ä¸ä¼ ") public R upload(@RequestParam("file") List<MultipartFile> file) { List<StorageBlobVO> result = storageBlobService.upload(file, false); if (result == null || result.isEmpty()) { return R.fail("ä¸ä¼ 失败"); } StorageBlobVO vo = result.get(0); Map<String, Object> data = new HashMap<>(); data.put("id", vo.getId()); data.put("originalName", vo.getOriginalFilename()); data.put("tempPath", vo.getPreviewURL()); data.put("uidFilename", vo.getUidFilename()); data.put("contentType", vo.getContentType()); data.put("byteSize", vo.getByteSize()); return R.ok(data); } } src/main/java/com/ruoyi/collaborativeApproval/vo/EnterpriseNewsVo.java
@@ -12,4 +12,13 @@ private String createUserName; private List<StorageBlobVO> storageBlobDTOs; /** åç«¯å ¼å®¹å«åï¼æ å° storageBlobDTOs */ public List<StorageBlobVO> getAttachmentList() { return storageBlobDTOs; } public void setAttachmentList(List<StorageBlobVO> attachmentList) { this.storageBlobDTOs = attachmentList; } } src/main/java/com/ruoyi/project/common/CommonController.java
@@ -52,7 +52,7 @@ return R.ok(storageBlobService.upload(files, true)); } @GetMapping("/download/{fileName}") @GetMapping("/download/{fileName:.+}") @Anonymous public void download(@PathVariable String fileName, @RequestParam(value = "token", required = false) String token, @@ -71,7 +71,7 @@ Files.copy(file.toPath(), response.getOutputStream()); } @GetMapping("/preview/{fileName}") @GetMapping("/preview/{fileName:.+}") @Anonymous public ResponseEntity<FileSystemResource> preview(@PathVariable String fileName, @RequestParam(value = "token", required = false) String token, src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; /** @@ -118,7 +119,7 @@ */ @PostMapping("/import") @Log(title = "å¨èåå·¥å¯¼å ¥", businessType = BusinessType.IMPORT) public AjaxResult importData(@RequestPart("file") MultipartFile file) { public AjaxResult importData(@RequestPart("file") MultipartFile file) throws IOException { Boolean b = staffOnJobService.importData(file); if (b) { return AjaxResult.success("å¯¼å ¥æå"); src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -9,6 +9,8 @@ import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; public interface IStaffOnJobService extends IService<StaffOnJob> { @@ -30,7 +32,7 @@ List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob); Boolean importData(MultipartFile file); Boolean importData(MultipartFile file) throws IOException; String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception; } src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -34,10 +34,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.*; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.LocalDate; @@ -111,7 +108,8 @@ // å建ååè®°å½ StaffContract staffContract = new StaffContract(); staffContract.setStaffOnJobId(staffOnJobPrams.getId()); staffContract.setContractTerm(staffOnJobPrams.getContractTerm()); String contractTerm = staffOnJobPrams.getContractTerm(); staffContract.setContractTerm(StringUtils.isNotEmpty(contractTerm) ? contractTerm : null); staffContract.setContractStartTime(staffOnJobPrams.getContractStartTime()); staffContract.setContractEndTime(staffOnJobPrams.getContractEndTime()); return staffContractMapper.insert(staffContract); @@ -321,41 +319,36 @@ @Override @Transactional(rollbackFor = Exception.class) public Boolean importData(MultipartFile file) { try { ExcelUtil<StaffOnJobExcelDto> util = new ExcelUtil<>(StaffOnJobExcelDto.class); List<StaffOnJobExcelDto> staffOnJobs = util.importExcel(file.getInputStream()); if (CollectionUtils.isEmpty(staffOnJobs)){ return false; } // è·åææé¨é¨æ°æ® List<SysDept> sysDepts = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getDelFlag, 0)); // è·åææè§è²æ°æ® List<SysRole> sysRoles = sysRoleMapper.selectRoleAll(); staffOnJobs.forEach(staffOnJob -> { StaffOnJobDto staffOnJobDto = new StaffOnJobDto(); BeanUtils.copyProperties(staffOnJob, staffOnJobDto); // éè¿åç§°è·åé¨é¨id staffOnJobDto.setSysDeptId(// ... existing code ... sysDepts.stream() .filter(dept -> dept.getDeptName() != null && dept.getDeptName().equals(staffOnJob.getSysDeptName())) .findFirst() .map(SysDept::getDeptId) .orElse(null) ); // éè¿åç§°è·åè§è²id staffOnJobDto.setRoleId(sysRoles.stream() .filter(role -> role.getRoleName() != null && role.getRoleName().equals(staffOnJob.getRoleName())) .findFirst() .map(SysRole::getRoleId) .orElse( null)); add(staffOnJobDto); }); return true; } catch (Exception e) { e.printStackTrace(); public Boolean importData(MultipartFile file) throws IOException { ExcelUtil<StaffOnJobExcelDto> util = new ExcelUtil<>(StaffOnJobExcelDto.class); List<StaffOnJobExcelDto> staffOnJobs = util.importExcel(file.getInputStream()); if (CollectionUtils.isEmpty(staffOnJobs)){ return false; } // è·åææé¨é¨æ°æ® List<SysDept> sysDepts = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getDelFlag, 0)); // è·åææè§è²æ°æ® List<SysRole> sysRoles = sysRoleMapper.selectRoleAll(); staffOnJobs.forEach(staffOnJob -> { StaffOnJobDto staffOnJobDto = new StaffOnJobDto(); BeanUtils.copyProperties(staffOnJob, staffOnJobDto); // éè¿åç§°è·åé¨é¨id staffOnJobDto.setSysDeptId( sysDepts.stream() .filter(dept -> dept.getDeptName() != null && dept.getDeptName().equals(staffOnJob.getSysDeptName())) .findFirst() .map(SysDept::getDeptId) .orElse(null) ); // éè¿åç§°è·åè§è²id staffOnJobDto.setRoleId(sysRoles.stream() .filter(role -> role.getRoleName() != null && role.getRoleName().equals(staffOnJob.getRoleName())) .findFirst() .map(SysRole::getRoleId) .orElse( null)); add(staffOnJobDto); }); return true; } src/main/resources/application-dev-pro.yml
@@ -28,7 +28,7 @@ # å¼åç¯å¢é ç½® server: # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 port: 7003 port: 8888 servlet: # åºç¨ç访é®è·¯å¾ context-path: / @@ -71,9 +71,9 @@ druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://localhost:3306/product-inventory-management-new-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://110.167.133.1:9002/product-inventory-management-oa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 password: oa@123456.. # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é @@ -147,12 +147,12 @@ # redis é ç½® redis: # å°å host: 127.0.0.1 host: 47.114.74.44 # host: 172.17.0.1 # 端å£ï¼é»è®¤ä¸º6379 port: 6379 port: 6399 # æ°æ®åºç´¢å¼ database: 0 database: 7 # å¯ç # password: root2022! password: @@ -254,11 +254,11 @@ # æä»¶ä¸ä¼ é ç½® file: temp-dir: D:/ruoyi/temp/uploads # 临æ¶ç®å½ åæå é¤ upload-dir: D:/ruoyi/prod/uploads # æ£å¼ç®å½ åæå é¤ path: C:/Users/12631/Desktop/download/uploads # ä¸ä¼ ç®å½ temp-dir: E:/ruoyi/oa/file/temp/uploads # 临æ¶ç®å½ upload-dir: E:/ruoyi/oa/file/prod/uploads # æ£å¼ç®å½ path: E:/ruoyi/oa/file # ä¸ä¼ ç®å½ urlPrefix: /common # 龿¥åç¼ domain: http://127.0.0.1:7003 # åååç¼ domain: http://localhost:8888 # åååç¼ expired: 120 # è¿ææ¶é´(åä½:åé) useLimit: 10 # ä½¿ç¨æ¬¡æ° compress: true # æ¯å¦å缩 src/main/resources/application-oa.yml
@@ -259,7 +259,7 @@ temp-dir: /javaWork/product-inventory-management/file/temp/uploads # 临æ¶ç®å½ upload-dir: /javaWork/product-inventory-management/file/prod/uploads # æ£å¼ç®å½ path: /javaWork/product-inventory-management/file # ä¸ä¼ ç®å½ urlPrefix: /prod-api/common # 龿¥åç¼ urlPrefix: /common # 龿¥åç¼ domain: http://110.167.133.1:9001 # åååç¼ expired: 120 # è¿ææ¶é´(åä½:åé) useLimit: 10 # ä½¿ç¨æ¬¡æ°