src/main/java/com/ruoyi/RuoYiApplication.java
@@ -18,15 +18,6 @@ { // System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(RuoYiApplication.class, args); System.out.println("(â¥â â¿â )ï¾ï¾ è¥ä¾å¯å¨æå á(´ڡ`á)ï¾ \n" + " .-------. ____ __ \n" + " | _ _ \\ \\ \\ / / \n" + " | ( ' ) | \\ _. / ' \n" + " |(_ o _) / _( )_ .' \n" + " | (_,_).' __ ___(_ o _)' \n" + " | |\\ \\ | || |(_,_)' \n" + " | | \\ `' /| `-' / \n" + " | | \\ / \\ / \n" + " ''-' `'-' `-..-' "); System.out.println("(â¥â â¿â )ï¾ï¾ è¥ä¾å¯å¨æå á(´ڡ`á)ï¾"); } } src/main/java/com/ruoyi/other/controller/TempFileController.java
@@ -18,10 +18,10 @@ private TempFileService tempFileService; @PostMapping("/upload") public AjaxResult uploadFile(MultipartFile file) { public AjaxResult uploadFile(MultipartFile file, String type) { try { return AjaxResult.success(tempFileService.uploadFile(file)); }catch (Exception e) { return AjaxResult.success(tempFileService.uploadFile(file, type)); } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } src/main/java/com/ruoyi/other/pojo/TempFile.java
@@ -16,4 +16,5 @@ private String originalName; // åå§æä»¶å private String tempPath; // 临æ¶åå¨è·¯å¾ private LocalDateTime expireTime; // è¿ææ¶é´ private String type; // å ³è表类å } src/main/java/com/ruoyi/other/service/TempFileService.java
@@ -6,5 +6,5 @@ import java.io.IOException; public interface TempFileService { TempFile uploadFile(MultipartFile file) throws IOException; TempFile uploadFile(MultipartFile file,String type) throws IOException; } src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -32,7 +32,7 @@ // ä¸ä¼ å°ä¸´æ¶ç®å½ @Override public TempFile uploadFile(MultipartFile file) throws IOException { public TempFile uploadFile(MultipartFile file,String type) throws IOException { // 1. çæä¸´æ¶æä»¶IDåè·¯å¾ String tempId = UUID.randomUUID().toString(); Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename()); @@ -52,6 +52,7 @@ tempFileRecord.setOriginalName(file.getOriginalFilename()); tempFileRecord.setTempPath(tempFilePath.toString()); tempFileRecord.setExpireTime(LocalDateTime.now().plusHours(2)); // 2å°æ¶åè¿æ tempFileRecord.setType(type); tempFileMapper.insert(tempFileRecord); return tempFileRecord; src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java
@@ -1,23 +1,22 @@ package com.ruoyi.purchase.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.purchase.pojo.InvoicePurchase; import com.ruoyi.purchase.service.IInvoicePurchaseService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.purchase.dto.InvoicePurchaseDto; import com.ruoyi.purchase.pojo.InvoicePurchase; import com.ruoyi.purchase.service.IInvoicePurchaseService; import com.ruoyi.sales.service.ICommonFileService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; /** * å票信æ¯Controller @@ -32,13 +31,15 @@ private IInvoicePurchaseService invoicePurchaseService; private ICommonFileService commonFileService; /** * æ¥è¯¢å票信æ¯å表 */ @GetMapping("/list") public TableDataInfo list(InvoicePurchase invoicePurchase) { public TableDataInfo list(InvoicePurchaseDto invoicePurchaseDto) { startPage(); List<InvoicePurchase> list = invoicePurchaseService.selectInvoicePurchaseList(invoicePurchase); List<InvoicePurchaseDto> list = invoicePurchaseService.selectInvoicePurchaseList(invoicePurchaseDto); return getDataTable(list); } @@ -48,18 +49,26 @@ @Log(title = "å票信æ¯", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, InvoicePurchase invoicePurchase) { List<InvoicePurchase> list = invoicePurchaseService.selectInvoicePurchaseList(invoicePurchase); List<InvoicePurchase> list = invoicePurchaseService.selectInvoicePurchaseLists(invoicePurchase); ExcelUtil<InvoicePurchase> util = new ExcelUtil<InvoicePurchase>(InvoicePurchase.class); util.exportExcel(response, list, "åç¥¨ä¿¡æ¯æ°æ®"); } /** * æ¥è¯¢åç¥¨ä¿¡æ¯ */ @GetMapping("/getInvoiceById") public InvoicePurchaseDto getInvoiceById(InvoicePurchaseDto invoicePurchaseDto) { return invoicePurchaseService.getInvoiceById(invoicePurchaseDto); } /** * æ°å¢ä¿®æ¹åç¥¨ä¿¡æ¯ */ @Log(title = "å票信æ¯", businessType = BusinessType.INSERT) @PostMapping ("/addOrUpdateInvoice") public AjaxResult addOrUpdateInvoice(@RequestBody InvoicePurchase invoicePurchase) { return toAjax(invoicePurchaseService.addOrUpdateInvoice(invoicePurchase)); @PostMapping("/addOrUpdateInvoice") public AjaxResult addOrUpdateInvoice(@RequestBody InvoicePurchaseDto invoicePurchaseDto) throws IOException { return toAjax(invoicePurchaseService.addOrUpdateInvoice(invoicePurchaseDto)); } /** @@ -70,4 +79,13 @@ public AjaxResult remove(@RequestBody Long[] ids) { return toAjax(invoicePurchaseService.delInvoice(ids)); } @PostMapping("/upload") public AjaxResult uploadFile(MultipartFile file, Long id, String type) { try { return AjaxResult.success(commonFileService.uploadFile(file, id, type)); } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } } src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -1,28 +1,21 @@ package com.ruoyi.purchase.controller; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; /** * éè´å°è´¦Controller @@ -94,6 +87,14 @@ } /** * æ¥è¯¢éè´ååå· */ @GetMapping("/getPurchaseNo") public List getPurchasesNo() { return purchaseLedgerService.getPurchasesNo(); } /** * æ ¹æ®éè´ååå·æ¥è¯¢äº§å */ @GetMapping("/getProduct") src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseDto.java
@@ -1,7 +1,76 @@ package com.ruoyi.purchase.dto; import com.ruoyi.sales.pojo.CommonFile; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; @Data public class InvoicePurchaseDto { private Long id; /** * éè´å°è´¦id */ private Long purchaseLedgerId; /** * éè´ååå· */ private String purchaseContractNo; /** * å ³èéå®å°è´¦ä¸»è¡¨ä¸»é® */ private Long salesLedgerId; /** * éå®ååå· */ private String salesContractNo; /** * ä¾åºååç§° */ private String supplierName; /** * åç¥¨å· */ private String invoiceNumber; /** * å票éé¢ï¼å ï¼ */ private BigDecimal invoiceAmount; /** * ç¨ç */ private BigDecimal taxRate; /** * å¼ç¥¨äººID */ private Long issUerId; /** * å¼ç¥¨äºº */ private String issUer; /** * å¼ç¥¨æ¥æ */ @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate issueDate; private List<String> tempFileIds; private List<CommonFile> CommonFiles; private String fileName; } src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -1,7 +1,7 @@ package com.ruoyi.purchase.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; @@ -17,6 +17,12 @@ * éè´ååå· */ private String purchaseContractNumber; /** * ä¾åºååç§°id */ private Long supplierId; /** * ä¾åºååç§° @@ -90,7 +96,7 @@ private List<String> tempFileIds; private List<SalesLedgerFile> SalesLedgerFiles; private List<CommonFile> SalesLedgerFiles; /** * ä¸å¡åææºå· */ src/main/java/com/ruoyi/purchase/pojo/InvoicePurchase.java
@@ -1,12 +1,13 @@ package com.ruoyi.purchase.pojo; import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; /** * å票信æ¯å¯¹è±¡ invoice_purchase @@ -26,10 +27,20 @@ private Long id; /** * éè´å°è´¦id */ private Long purchaseLedgerId; /** * éè´ååå· */ @Excel(name = "éè´ååå·") private String purchaseContractNo; /** * å ³èéå®å°è´¦ä¸»è¡¨ä¸»é® */ private Long salesLedgerId; /** * éå®ååå· @@ -52,32 +63,36 @@ /** * å票éé¢ï¼å ï¼ */ @Excel(name = "å票éé¢", readConverterExp = "å =") @Excel(name = "å票éé¢(å )") private BigDecimal invoiceAmount; /** * ç¨ç */ @Excel(name = "ç¨ç") @Excel(name = "ç¨ç(%)") private BigDecimal taxRate; /** * å¼ç¥¨äººID */ private Long issUerId; /** * å¼ç¥¨äºº */ @Excel(name = "å¼ç¥¨äºº") private String issuer; private String issUer; /** * å¼ç¥¨æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd" ,timezone = "GMT+8") @Excel(name = "å¼ç¥¨æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private Date issueDate; private LocalDate issueDate; /** * å票æä»¶ï¼PDFæ ¼å¼ï¼ */ @Excel(name = "å票æä»¶", readConverterExp = "P=DFæ ¼å¼") private String invoiceFile; /** src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -1,12 +1,12 @@ package com.ruoyi.purchase.pojo; import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * éè´å°è´¦å¯¹è±¡ purchase_ledger @@ -32,6 +32,11 @@ private String purchaseContractNumber; /** * ä¾åºååç§°id */ private Long supplierId; /** * ä¾åºååç§° */ @Excel(name = "ä¾åºååç§°") src/main/java/com/ruoyi/purchase/service/IInvoicePurchaseService.java
@@ -2,8 +2,10 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.purchase.dto.InvoicePurchaseDto; import com.ruoyi.purchase.pojo.InvoicePurchase; import java.io.IOException; import java.util.List; /** @@ -13,9 +15,13 @@ * @date 2025-05-14 */ public interface IInvoicePurchaseService extends IService<InvoicePurchase> { List<InvoicePurchase> selectInvoicePurchaseList(InvoicePurchase invoicePurchase); List<InvoicePurchaseDto> selectInvoicePurchaseList(InvoicePurchaseDto invoicePurchaseDto); int delInvoice(Long[] ids); int addOrUpdateInvoice(InvoicePurchase invoicePurchase); int addOrUpdateInvoice(InvoicePurchaseDto invoicePurchaseDto) throws IOException; InvoicePurchaseDto getInvoiceById(InvoicePurchaseDto invoicePurchaseDto); List<InvoicePurchase> selectInvoicePurchaseLists(InvoicePurchase invoicePurchase); } src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -27,4 +27,6 @@ List getProduct(PurchaseLedgerDto purchaseLedgerDto); PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto); List getPurchasesNo(); } src/main/java/com/ruoyi/purchase/service/impl/InvoicePurchaseServiceImpl.java
@@ -2,15 +2,38 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.InvoicePurchaseDto; import com.ruoyi.purchase.mapper.InvoicePurchaseMapper; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.InvoicePurchase; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IInvoicePurchaseService; import lombok.AllArgsConstructor; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.pojo.CommonFile; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.Arrays; import java.util.List; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * å票信æ¯Serviceä¸å¡å±å¤ç @@ -19,14 +42,80 @@ * @date 2025-05-14 */ @Service @AllArgsConstructor @RequiredArgsConstructor @Slf4j public class InvoicePurchaseServiceImpl extends ServiceImpl<InvoicePurchaseMapper, InvoicePurchase> implements IInvoicePurchaseService { private InvoicePurchaseMapper invoicePurchaseMapper; private final InvoicePurchaseMapper invoicePurchaseMapper; private final PurchaseLedgerMapper purchaseLedgerMapper; private final SysUserMapper userMapper; private final CommonFileMapper commonFileMapper; private final TempFileMapper tempFileMapper; @Value("${file.upload-dir}") private String uploadDir; @Override public List<InvoicePurchase> selectInvoicePurchaseList(InvoicePurchase invoicePurchase) { return invoicePurchaseMapper.selectList(new LambdaQueryWrapper<>()); public List<InvoicePurchaseDto> selectInvoicePurchaseList(InvoicePurchaseDto invoicePurchaseDto) { // æå»ºå票æ¥è¯¢æ¡ä»¶ LambdaQueryWrapper<InvoicePurchase> queryWrapper = new LambdaQueryWrapper<>(); Optional.ofNullable(invoicePurchaseDto) .ifPresent(dto -> { if (StringUtils.hasText(dto.getPurchaseContractNo())) { queryWrapper.like(InvoicePurchase::getPurchaseContractNo, dto.getPurchaseContractNo()); } if (StringUtils.hasText(dto.getSupplierName())) { queryWrapper.like(InvoicePurchase::getSupplierName, dto.getSupplierName()); } // å¤çæ¥æç±»ååæ®µ if (dto.getIssueDate() != null) { queryWrapper.eq(InvoicePurchase::getIssueDate,invoicePurchaseDto.getIssueDate()); } }); // æ¥è¯¢å票å表 List<InvoicePurchase> invoiceList = invoicePurchaseMapper.selectList(queryWrapper); // å¦ææ²¡ææ¥è¯¢å°å票ï¼ç´æ¥è¿å空å表 if (CollectionUtils.isEmpty(invoiceList)) { return Collections.emptyList(); } // æåææå票ID List<Long> invoiceIds = invoiceList.stream() .map(InvoicePurchase::getId) .collect(Collectors.toList()); // æ¹éæ¥è¯¢è¿äºåç¥¨å ³èçæä»¶ä¿¡æ¯ LambdaQueryWrapper<CommonFile> fileQueryWrapper = new LambdaQueryWrapper<>(); fileQueryWrapper.in(CommonFile::getCommonId, invoiceIds) .eq(CommonFile::getType,"3"); List<CommonFile> fileList = commonFileMapper.selectList(fileQueryWrapper); // å°æä»¶ä¿¡æ¯æ å°å°å¯¹åºçå票ID Map<Long, String> fileMap = fileList.stream() .collect(Collectors.toMap( CommonFile::getCommonId, CommonFile::getName, (existing, replacement) -> existing // 妿æå¤ä¸ªæä»¶ï¼å第ä¸ä¸ª )); // å°æä»¶ä¿¡æ¯è®¾ç½®å°å票DTOä¸ List<InvoicePurchaseDto> resultList = new ArrayList<>(); for (InvoicePurchase invoice : invoiceList) { InvoicePurchaseDto dto = new InvoicePurchaseDto(); // å°InvoicePurchaseç屿§å¤å¶å°DTO BeanUtils.copyProperties(invoice, dto); // 设置æä»¶åï¼å¦æåå¨çè¯ dto.setFileName(fileMap.getOrDefault(invoice.getId(), null)); resultList.add(dto); } return resultList; } @Override @@ -35,11 +124,115 @@ } @Override public int addOrUpdateInvoice(InvoicePurchase invoicePurchase) { if (invoicePurchase.getId() == null) { return invoicePurchaseMapper.insert(invoicePurchase); public int addOrUpdateInvoice(InvoicePurchaseDto invoicePurchaseDto) throws IOException { int i; PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(invoicePurchaseDto.getPurchaseLedgerId()); InvoicePurchase invoicePurchase = new InvoicePurchase(); BeanUtils.copyProperties(invoicePurchaseDto, invoicePurchase); invoicePurchase.setPurchaseContractNo(purchaseLedger.getPurchaseContractNumber()); invoicePurchase.setSalesContractNo(purchaseLedger.getSalesContractNo()); SysUser sysUser = userMapper.selectUserById(invoicePurchase.getIssUerId()); invoicePurchase.setIssUer(sysUser.getNickName()); invoicePurchase.setTenantId(purchaseLedger.getTenantId()); if (invoicePurchaseDto.getId() == null) { i = invoicePurchaseMapper.insert(invoicePurchase); } else { return invoicePurchaseMapper.updateById(invoicePurchase); i = invoicePurchaseMapper.updateById(invoicePurchase); } // è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ if (invoicePurchaseDto.getTempFileIds() != null && !invoicePurchaseDto.getTempFileIds().isEmpty()) { migrateTempFilesToFormal(invoicePurchase.getId(), invoicePurchaseDto.getTempFileIds()); } return i; } /** * å°ä¸´æ¶æä»¶è¿ç§»å°æ£å¼ç®å½ * * @param businessId ä¸å¡IDï¼éå®å°è´¦IDï¼ * @param tempFileIds ä¸´æ¶æä»¶IDå表 * @throws IOException æä»¶æä½å¼å¸¸ */ private void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException { if (CollectionUtils.isEmpty(tempFileIds)) { return; } // æå»ºæ£å¼ç®å½è·¯å¾ï¼æä¸å¡ç±»å忥æåç»ï¼ String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE); Path formalDirPath = Paths.get(formalDir); // ç¡®ä¿æ£å¼ç®å½åå¨ï¼éå½åå»ºï¼ if (!Files.exists(formalDirPath)) { Files.createDirectories(formalDirPath); } for (String tempFileId : tempFileIds) { // æ¥è¯¢ä¸´æ¶æä»¶è®°å½ TempFile tempFile = tempFileMapper.selectById(tempFileId); if (tempFile == null) { log.warn("ä¸´æ¶æä»¶ä¸åå¨ï¼è·³è¿å¤ç: {}", tempFileId); continue; } // æå»ºæ£å¼æä»¶åï¼å å«ä¸å¡IDåæ¶é´æ³ï¼é¿å å²çªï¼ String originalFilename = tempFile.getOriginalName(); String fileExtension = FilenameUtils.getExtension(originalFilename); String formalFilename = businessId + "_" + System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0, 8) + (com.ruoyi.common.utils.StringUtils.hasText(fileExtension) ? "." + fileExtension : ""); Path formalFilePath = formalDirPath.resolve(formalFilename); try { // æ§è¡æä»¶è¿ç§»ï¼ä½¿ç¨ååæä½ç¡®ä¿å®å ¨æ§ï¼ Files.move( Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE ); log.info("æä»¶è¿ç§»æå: {} -> {}", tempFile.getTempPath(), formalFilePath); // æ´æ°æä»¶è®°å½ï¼å ³èå°ä¸å¡IDï¼ CommonFile fileRecord = new CommonFile(); fileRecord.setCommonId(businessId); fileRecord.setName(originalFilename); fileRecord.setUrl(formalFilePath.toString()); fileRecord.setCreateTime(LocalDateTime.now()); fileRecord.setType(tempFile.getType()); commonFileMapper.insert(fileRecord); log.info("æä»¶è¿ç§»æå: {} -> {}", tempFile.getTempPath(), formalFilePath); } catch (IOException e) { log.error("æä»¶è¿ç§»å¤±è´¥: {}", tempFile.getTempPath(), e); // å¯éæ©åæ»äºå¡æè®°å½å¤±è´¥æä»¶ throw new IOException("æä»¶è¿ç§»å¼å¸¸", e); } } } @Override public InvoicePurchaseDto getInvoiceById(InvoicePurchaseDto invoicePurchaseDto) { InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(invoicePurchaseDto.getId()); InvoicePurchaseDto resultDto = new InvoicePurchaseDto(); BeanUtils.copyProperties(invoicePurchase, resultDto); // æ¥è¯¢ä¸ä¼ æä»¶ LambdaQueryWrapper<CommonFile> commonFileLambdaQueryWrapper = new LambdaQueryWrapper<>(); commonFileLambdaQueryWrapper.eq(CommonFile::getCommonId, invoicePurchaseDto.getId()) .eq(CommonFile::getType, "3"); List<CommonFile> commonFiles = commonFileMapper.selectList(commonFileLambdaQueryWrapper); resultDto.setCommonFiles(commonFiles); return resultDto; } @Override public List<InvoicePurchase> selectInvoicePurchaseLists(InvoicePurchase invoicePurchase) { return invoicePurchaseMapper.selectList(new LambdaQueryWrapper<>()); } } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.SupplierManageMapper; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.other.mapper.TempFileMapper; @@ -14,11 +16,11 @@ import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; import com.ruoyi.sales.mapper.SalesLedgerFileMapper; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -59,7 +61,9 @@ private final TempFileMapper tempFileMapper; private final SalesLedgerFileMapper salesLedgerFileMapper; private final CommonFileMapper commonFileMapper; private final SupplierManageMapper supplierManageMapper; @Value("${file.upload-dir}") private String uploadDir; @@ -87,11 +91,14 @@ //å½å ¥äºº SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId()); SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId()); // DTO转Entity PurchaseLedger purchaseLedger = new PurchaseLedger(); BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger); purchaseLedger.setTenantId(salesLedger.getTenantId()); purchaseLedger.setSalesContractNo(salesLedger.getSalesContractNo()); purchaseLedger.setSupplierName(supplierManage.getSupplierName()); purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId()); purchaseLedger.setRecorderName(sysUser.getNickName()); purchaseLedger.setBusinessPersonId(purchaseLedgerDto.getBusinessPersonId()); @@ -207,12 +214,13 @@ log.info("æä»¶è¿ç§»æå: {} -> {}", tempFile.getTempPath(), formalFilePath); // æ´æ°æä»¶è®°å½ï¼å ³èå°ä¸å¡IDï¼ SalesLedgerFile fileRecord = new SalesLedgerFile(); fileRecord.setLedgerId(businessId); CommonFile fileRecord = new CommonFile(); fileRecord.setCommonId(businessId); fileRecord.setName(originalFilename); fileRecord.setUrl(formalFilePath.toString()); fileRecord.setCreateTime(LocalDateTime.now()); salesLedgerFileMapper.insert(fileRecord); fileRecord.setType("2"); commonFileMapper.insert(fileRecord); // å é¤ä¸´æ¶æä»¶è®°å½ tempFileMapper.deleteById(tempFile); @@ -246,9 +254,9 @@ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper); // 3.æ¥è¯¢ä¸ä¼ æä»¶ LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, purchaseLedger.getId()); List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper); LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId()); List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper); // 4. è½¬æ¢ DTO PurchaseLedgerDto resultDto = new PurchaseLedgerDto(); @@ -301,6 +309,22 @@ return resultDto; } @Override public List getPurchasesNo() { LambdaQueryWrapper<PurchaseLedger> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(PurchaseLedger::getId, PurchaseLedger::getPurchaseContractNumber,PurchaseLedger::getSupplierId); // è·ååå§æ¥è¯¢ç»æ List<Map<String, Object>> result = purchaseLedgerMapper.selectMaps(queryWrapper); // å°ä¸å线å½å转æ¢ä¸ºé©¼å³°å½å return result.stream().map(map -> map.entrySet().stream() .collect(Collectors.toMap( entry -> underlineToCamel(entry.getKey()), Map.Entry::getValue)) ).collect(Collectors.toList()); } /** * ä¸å线å½å转驼峰å½å */ src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -38,7 +38,7 @@ private SalesLedgerProductMapper salesLedgerProductMapper; private final SysUserMapper userMapper; private SysUserMapper userMapper; @Override src/main/java/com/ruoyi/sales/controller/CommonFileController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ package com.ruoyi.sales.controller; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.service.ICommonFileService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/commonFile") @AllArgsConstructor public class CommonFileController extends BaseController { private ICommonFileService commonFileService; /** * éä»¶å é¤ */ @Log(title = "éä»¶å é¤", businessType = BusinessType.DELETE) @DeleteMapping("/delCommonFile") public AjaxResult delCommonFile(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(commonFileService.delCommonFileByIds(ids)); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -1,20 +1,20 @@ package com.ruoyi.sales.controller; import java.util.*; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.service.ISalesLedgerFileService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.service.ICommonFileService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * éå®å°è´¦Controller @@ -29,7 +29,7 @@ private ISalesLedgerService salesLedgerService; private ISalesLedgerFileService salesLedgerFileService; private ICommonFileService commonFileService; /** * æ¥è¯¢éå®å°è´¦å表 @@ -101,6 +101,6 @@ if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(salesLedgerFileService.deleteSalesLedgerByIds(ids)); return toAjax(commonFileService.deleteSalesLedgerByIds(ids)); } } src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,7 +1,7 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; @@ -25,7 +25,7 @@ private Boolean hasChildren = false; private List<SalesLedgerProduct> productData; private List<String> tempFileIds; private List<SalesLedgerFile> SalesLedgerFiles; private List<CommonFile> SalesLedgerFiles; private Integer Type; } src/main/java/com/ruoyi/sales/mapper/CommonFileMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ package com.ruoyi.sales.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.sales.pojo.CommonFile; public interface CommonFileMapper extends BaseMapper<CommonFile> { } src/main/java/com/ruoyi/sales/mapper/SalesLedgerFileMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/sales/pojo/CommonFile.java
ÎļþÃû´Ó src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java ÐÞ¸Ä @@ -5,17 +5,21 @@ import java.time.LocalDateTime; /** * éç¨éä»¶ä¸ä¼ 表 */ @Data @TableName("sales_ledger_file") public class SalesLedgerFile { @TableName("common_file") public class CommonFile { private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private Long id; /** éå®å°è´¦ID */ private Long ledgerId; /** å ³è表主é®D */ private Long commonId; /** æä»¶åç§° */ private String name; @@ -23,6 +27,9 @@ /** æä»¶è·¯å¾ */ private String url; /** å ³è表 */ private String type; /** å建æ¶é´ */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; src/main/java/com/ruoyi/sales/service/ICommonFileService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.ruoyi.sales.service; import com.ruoyi.sales.pojo.CommonFile; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; public interface ICommonFileService { int deleteSalesLedgerByIds(Long[] ids); CommonFile uploadFile(MultipartFile file, Long id, String type) throws IOException; int delCommonFileByIds(Long[] ids); } src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,63 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.service.ICommonFileService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.UUID; @Service @RequiredArgsConstructor public class CommonFileServiceImpl extends ServiceImpl<CommonFileMapper, CommonFile> implements ICommonFileService { private final CommonFileMapper commonFileMapper; @Value("${file.upload-dir}") private String uploadDir; @Override public int deleteSalesLedgerByIds(Long[] ids) { return commonFileMapper.deleteBatchIds(Arrays.asList(ids)); } @Override public CommonFile uploadFile(MultipartFile file, Long id, String type) throws IOException { // 1. çææ£å¼æä»¶IDåè·¯å¾ String tempId = UUID.randomUUID().toString(); Path tempFilePath = Paths.get(uploadDir, tempId + "_" + file.getOriginalFilename()); // 2. ç¡®ä¿ç®å½åå¨ Path parentDir = tempFilePath.getParent(); if (parentDir != null) { Files.createDirectories(parentDir); // éå½å建ç®å½ } // 3. ä¿åæä»¶å°ç®å½ file.transferTo(tempFilePath.toFile()); // 4. ä¿åæä»¶è®°å½ CommonFile commonFile = new CommonFile(); commonFile.setCommonId(id); commonFile.setName(file.getOriginalFilename()); commonFile.setUrl(tempFilePath.toString()); commonFile.setType(type); commonFileMapper.insert(commonFile); return commonFile; } @Override public int delCommonFileByIds(Long[] ids) { return commonFileMapper.deleteBatchIds(Arrays.asList(ids)); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -12,11 +12,11 @@ import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.SalesLedgerFileMapper; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.RequiredArgsConstructor; @@ -58,7 +58,7 @@ private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerFileMapper salesLedgerFileMapper; private final CommonFileMapper commonFileMapper; private final TempFileMapper tempFileMapper; @@ -93,9 +93,9 @@ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper); // 3.æ¥è¯¢ä¸ä¼ æä»¶ LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, salesLedger.getId()); List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper); LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); salesLedgerFileWrapper.eq(CommonFile::getCommonId, salesLedger.getId()); List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper); // 4. è½¬æ¢ DTO SalesLedgerDto resultDto = new SalesLedgerDto(); @@ -266,12 +266,13 @@ log.info("æä»¶è¿ç§»æå: {} -> {}", tempFile.getTempPath(), formalFilePath); // æ´æ°æä»¶è®°å½ï¼å ³èå°ä¸å¡IDï¼ SalesLedgerFile fileRecord = new SalesLedgerFile(); fileRecord.setLedgerId(businessId); CommonFile fileRecord = new CommonFile(); fileRecord.setCommonId(businessId); fileRecord.setName(originalFilename); fileRecord.setUrl(formalFilePath.toString()); fileRecord.setCreateTime(LocalDateTime.now()); salesLedgerFileMapper.insert(fileRecord); fileRecord.setType("1"); commonFileMapper.insert(fileRecord); // å é¤ä¸´æ¶æä»¶è®°å½ tempFileMapper.deleteById(tempFile);